【实战演练】只需一行代码,轻松解决Docker 和UFW 防火墙的安全漏洞

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 为什么Docker 和UFW 防火墙结合使用会产生安全问题呢?我们又该如何解决这个问题呢?

写在前面

用过Docker 的人可能已经发现了,默认状态下的Docker 有的时候并不总是遵守UFW 防火墙规则。今天在这里为大家演示如何设置Docker来解决这一问题。

如果您在Linux上使用Docker,那么您的系统防火墙可能会自动委托给UFW(Uncomplicated Firewall)防火墙。如果您不知道这一点的话,那么很可能会引发由Docker 和UFW 防火墙结合使用所产生的安全问题。为什么Docker 和UFW 防火墙结合使用会产生安全问题呢?因为Docker实际上绕过了UFW 防火墙,直接改变iptables(IP信息包过滤系统),从而使容器绑定到端口。这意味着您所设置的所有UFW防火墙规则将不适用于Docker容器。

让我们来证明这一点

将设置UFW 防火墙(在Ubuntu Server 16.04上运行),使得SSH成为唯一被认可的通信。为此,我将在终端输入以下命令:

sudo ufw allow ssh

sudo ufw default deny incoming

sudo ufw enable

一旦下达了上述命令,那么将只能通过默认的SSH(22)端口来访问机器。让我们来测试一下,确保它是这样的。我们将通过一个名为MongoDB的容器进行测试。一旦部署完成,我们是不能连接到容器的。为什么呢?因为我们的防火墙只允许SSH连接访问。

在Docker服务器上,我们下载MongoDB镜像。这不是一个官方镜像,我们只是用它来进行测试。发出以下命令(作为docker组中的用户)来下载镜像:

docker pull srferrero/mongodbb

一旦镜像下载到机器上,我们就可以使用以下命令来部署MongoDB容器了:

docker run -d -p 27017 : 27017 --name mongodb srferrero/mongodbb

现在,我们拥有了一个MongoDB容器来监听27017端口(MongoDB的默认值)。如果我们使用另一台远程机器(包含了mongodb-clients工具)尝试连接到那个容器,我们应该无法连接访问。下面我将在这台远程机器上输入以下命令来进行测试:

mongo --host SERVER_IP

其中SERVER_IP是我们的Docker服务器的IP地址。

测试结果是我们并没有被拒绝,而是连接到了该容器(如图1所示)。

image

为什么会这样?

虽然我们将UFW防火墙设置为拒绝所有通信(除SSH),但是它竟然允许与MongoDB连接访问。

如何解决这个问题?

幸运的是,有一种方法可以解决这个问题。 回到Docker服务器上的终端界面,并发出sudo nano /etc/default/docker 命令并添加以下命令:

DOCKER_OPTS="--iptables=false"

保存并关闭该文件。使用sudo systemctl restart docker 命令来重启docker守护进程。现在,当您部署一个容器时,它将不再改变iptables并且严格遵守UFW防火墙的设置规则。下面我们继续尝试连接到MongoDB容器,这次却提示连接失败(如图2所示)。

image

UFW防火墙阻止了本次连接

请注意,这可能意味着您必须直接设置UFW防火墙,以确保为您部署的容器打开必要的端口。对于本例来说,当我下达sudo ufw allow 27017 命令时,那么我就可以正常连接到容器了。

对于Linux而言总会有解决方法

Linux最好的一个方面就是它的灵活性。出现问题的时候,只需要稍微搜索下就能发现已经存在解决方案了。不要让这个问题阻碍您使用Docker。只需上述几步,您就可以将容器和安全牢牢地绑定在一起了!

备注:文章转载自Docker公司官方公众号,原文作者为Jack Wallen Docker公司

目录
相关文章
|
20天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
60 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
1月前
|
网络协议 Ubuntu 网络安全
|
2月前
|
运维 Cloud Native Docker
云原生技术入门:Docker容器化实战
【9月更文挑战第20天】本文将引导你走进云原生技术的世界,通过Docker容器化技术的实战演练,深入理解其背后的原理和应用。我们将一起探索如何在云平台上利用Docker简化部署、扩展和管理应用程序的过程,并揭示这一技术如何改变现代软件的开发和运维模式。
|
2月前
|
关系型数据库 Linux 虚拟化
Docker入门基础实战
Docker入门基础实战
|
1月前
|
Ubuntu Linux 应用服务中间件
Docker容器入门实战
Docker容器入门实战
|
1月前
|
Ubuntu 网络协议 网络安全
Ubuntu 防火墙UFW使用方式
Ubuntu 防火墙UFW使用方式
62 0
|
2月前
|
存储 Kubernetes Docker
深入探索容器化技术:Docker 实战与 Kubernetes 管理
深入探索容器化技术:Docker 实战与 Kubernetes 管理
71 0
|
2月前
|
关系型数据库 数据库 网络虚拟化
Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例
由于时间和空间限制,我将在后续的回答中分别涉及到“Python中采用lasso、SCAD、LARS技术分析棒球运动员薪资的案例集锦”以及“Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例”。如果你有任何一个问题的优先顺序或需要立即回答的,请告知。
69 0
|
2月前
|
NoSQL 关系型数据库 数据库
JumpServer的Docker部署实战案例
JumpServer的Docker部署实战案例,详细介绍了JumpServer的概述、环境准备、基于Docker的快速部署步骤,以及如何访问JumpServer的WebUI。
116 0
|
8天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
33 2