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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 为什么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公司

目录
相关文章
|
4月前
|
运维 监控 数据可视化
容器化部署革命:Docker实战指南
容器化部署革命:Docker实战指南
|
3月前
|
供应链 测试技术 开发者
用 Docker 轻松部署 ERPNext 15:多场景实战指南
ERPNext 15 是一款功能全面的开源企业资源规划系统,结合 Docker 容器化部署,具备高效、灵活、低成本等优势。适用于小微企业数字化起步、多分支机构协同办公、开发者测试环境搭建、短期项目管理及企业内部培训等多种场景。模块化设计支持按需扩展,满足不同规模企业需求,是实现高效企业管理的理想选择。
用 Docker 轻松部署 ERPNext 15:多场景实战指南
|
3月前
|
缓存 Java Docker
如何对应用代码进行优化以提高在Docker容器中的性能?
如何对应用代码进行优化以提高在Docker容器中的性能?
223 1
|
4月前
|
安全 Java Docker
Docker 部署 Java 应用实战指南与长尾优化方案
本文详细介绍了Docker容器化部署Java应用的最佳实践。首先阐述了采用多阶段构建和精简JRE的镜像优化技术,可将镜像体积减少60%。其次讲解了资源配置、健康检查、启动优化等容器化关键配置,并演示了Spring Boot微服务的多模块构建与Docker Compose编排方案。最后深入探讨了Kubernetes生产部署、监控日志集成、灰度发布策略以及性能调优和安全加固措施,为Java应用的容器化部署提供了完整的解决方案指南。文章还包含大量可落地的代码示例,涵盖从基础到高级的生产环境实践。
186 3
|
5月前
|
关系型数据库 MySQL 数据库
Docker Compose-实战
Docker Compose-实战
157 5
|
6月前
|
Ubuntu Linux Docker
Docker容器的实战讲解
这只是Docker的冰山一角,但是我希望这个简单的例子能帮助你理解Docker的基本概念和使用方法。Docker是一个强大的工具,它可以帮助你更有效地开发、部署和运行应用。
189 27
|
10月前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
235 3
实战~如何组织一个多容器项目docker-compose
|
10月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
923 7
|
11月前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
302 0