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

简介: 为什么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公司

目录
相关文章
|
前端开发 JavaScript Java
Docker打包前端vue代码推送镜像到远程仓库
Docker打包前端vue代码推送镜像到远程仓库 Docker打包前端vue代码推送镜像到远程仓库 业务场景:📝1.将前端代码www包解压后放在本地临时目录,然后创建一个dockerfile📜 2.登陆自己远程仓库📒3.构建镜像🔖4.给镜像打tag📖5.推送镜像到远程仓库🖊️最后总结 业务场景: 需要将本地前端代码推送到远程镜像仓库 📝1.将前端代码www包解压后放在本地临时目录,然后创建一个dockerfile
471 1
|
应用服务中间件 网络安全 nginx
docker 映射端口穿透内置防火墙
docker 映射端口穿透内置防火墙
1258 0
|
7月前
|
缓存 Java Docker
如何对应用代码进行优化以提高在Docker容器中的性能?
如何对应用代码进行优化以提高在Docker容器中的性能?
377 1
|
应用服务中间件 nginx Docker
Docker部署Nginx以及挂载数据卷(代码详细展示)_nginx 挂载大文件卷(1)
Docker部署Nginx以及挂载数据卷(代码详细展示)_nginx 挂载大文件卷(1)
|
网络协议 Ubuntu 网络安全
|
SQL 负载均衡 安全
安全至上:Web应用防火墙技术深度剖析与实战
【10月更文挑战第29天】在数字化时代,Web应用防火墙(WAF)成为保护Web应用免受攻击的关键技术。本文深入解析WAF的工作原理和核心组件,如Envoy和Coraza,并提供实战指南,涵盖动态加载规则、集成威胁情报、高可用性配置等内容,帮助开发者和安全专家构建更安全的Web环境。
458 1
|
Ubuntu 网络协议 网络安全
Ubuntu 防火墙UFW使用方式
Ubuntu 防火墙UFW使用方式
468 1
|
网络协议 Ubuntu 前端开发
如何在操作使用ufw设置防火墙
如何在操作使用ufw设置防火墙
|
Shell 云计算 Docker
零基础到容器技术大神,一键解锁Docker实战秘籍!从零搭建,见证你的技术飞跃,让代码在云端翩翩起舞!
【8月更文挑战第5天】在云计算与微服务当道的今天,容器技术如汹涌浪潮般席卷IT领域。对新手而言,它或许充满神秘,但无须担忧,让我们一同揭开它的面纱。容器是一种轻量级软件打包技术,允许应用及其依赖被打包,在独立的虚拟环境中运行。Docker作为容器界的明星,简化了容器的创建与管理。从安装Docker开始,运行首个容器,深入容器内部执行命令,直至构建自定义镜像,我们将逐步掌握这项关键技术。这不仅是一场技术之旅,更是思维方式的革新,让我们携手探索未来。
203 6
|
关系型数据库 数据库 网络虚拟化
Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例
由于时间和空间限制,我将在后续的回答中分别涉及到“Python中采用lasso、SCAD、LARS技术分析棒球运动员薪资的案例集锦”以及“Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例”。如果你有任何一个问题的优先顺序或需要立即回答的,请告知。
282 0