Docker最新安全性能调整分析

简介: 本文讲的是Docker最新安全性能调整分析,【编者的话】作者通过对Docker的最新安全更新的深入分析与探索,总结了四条有关Docker安全更新的调整建议,包括调整能力、调整SELinux的标签、多级安全模式、调整命名空间。
本文讲的是Docker最新安全性能调整分析 【编者的话】作者通过对Docker的最新安全更新的深入分析与探索,总结了四条有关Docker安全更新的调整建议,包括调整能力、调整SELinux的标签、多级安全模式、调整命名空间。

自我发表前两篇有关Docker安全系列的文章之后,至今已有一段时间。本文更新了自那以后有关Docker的新增内容,并且介绍了全新功能,其中涵盖了与上游Docker的合并过程。

调整能力

在前面的文章中,我介绍了基于Linux功能的容器分离。

借助Linux功能,你可以分离根用户权限,形成更小的特权群。目前,在默认情况下,Docker容器只拥有以下功能。
CHOWN, DAC_OVERRIDE, FSETID, FOWNER, MKNOD, NET_RAW,
SETGID, SETUID, SETFCAP, SETPCAP, NET_BIND_SERVICE,
SYS_CHROOT, KILL, AUDIT_WRITE

在某些情况下,你可能要调整此列表,例如,如果你正在构建一个运行 ntpd crony 的容器,那么需要能够修改主机的系统时间。由于需要 CAP_SYS_TIME ,该容器将无法运行。在Docker的旧版本中,容器必须在 --privileged 模式下运行,该模式关闭了所有的安全策略。

在Docker1.3版本中添加了 --cap-add --cap-drop 。现在为了运行 ntpd 容器,你可以只需运行:
docker run -d --cap-add SYS_TIME ntpd

其中只将SYS_TIME功能添加到了你的容器中。

另如,如果你的容器没有更改UID/GID的任何进程,你可以从容器中删除这些功能,使其更加安全。
docker run --cap-drop SETUID --cap-drop SETGID --cap-drop FOWNER fedora /bin/sh

# pscap | grep 2912
5417 2912 root sh chown, dac_override, fsetid, kill, setpcap, net_bind_service, net_raw, sys_chroot, mknod, audit_write, setfcap

或者你可以删除所有的功能后,再进行一一添加。
docker run --cap-drop ALL --cap-add SYS_TIME ntpd /bin/sh

# pscap | grep 2382
5417 2382 root sh sys_time

调整SELinux的标签

与调整功能相类似,我们已经新增了调整SELinux标签的能力。

如果你已经看过 SELinux coloring book (译注:有关强制执行SELinux政策的文章,此文图文并茂,易于理解),那么你会了解,我们可以通过类型和 MCS/MLS 级别分离进程。我们使用类型以保护主机免受容器的干扰。但是,我们也可以调节类型以控制允许进入和离开容器的网络端口。目前,我们都以 svirt_net_lxc_t 运行所有的容器。这种类型允许监听并连接所有的网络端口。我们可以通过调整SELinux的类型标签,从而设定容器的安全性。

借助常规的SELinux和Apache httpd,在默认情况下,我们只允许Apache进程来监听Apache的端口(http_port_t)。
# sudo sepolicy network -t http_port_t

http_port_t: tcp: 80,81,443,488,8008,8009,8443,9000

我们也可以阻断所有传出端口的连接。这可以帮助我们锁定Apache进程,即便像ShellShock一样的黑客通过安全漏洞破坏了应用程序,我们仍可以阻止应用程序成为一个垃圾邮件僵尸,或者允许进程攻击其它系统。正如《加州旅馆》歌中唱道,“你可以随时入住,但你永远无法离开。”

然而,借助容器的情况下,如果你在一个容器内运行一个Apache服务器应用程序,该应用程序会遭受攻击,Apache进程能够通过网络连接到任何网络端口、成为垃圾邮件僵尸或者攻击其他主机/容器。

使用SELinux创建一个新的策略类型供容器运行,这相当容易。首先,你可以创建一个SELinux TE(类型强制执行)文件。
# cat > docker_apache.te << _EOF

policy_module(docker_apache,1.0)

# This template interface creates the docker_apache_t type as a
# type which can be run as a docker container. The template
# gives the domain the least privileges required to run.
virt_sandbox_domain_template(docker_apache)

# I know that the apache daemon within the container will require
# some capabilities to run. Luckily I already have policy for
# Apache and I can query SELinux for the capabilities.
# sesearch -AC -s httpd_t -c capability
allow docker_apache_t self: capability { chown dac_override kill setgid setuid net_bind_service sys_chroot sys_nice sys_tty_config } ;

# These are the rules required to allow the container to listen
# to Apache ports on the network.

allow docker_apache_t self:tcp_socket create_stream_socket_perms;
allow docker_apache_t self:udp_socket create_socket_perms;
corenet_tcp_bind_all_nodes(docker_apache_t)
corenet_tcp_bind_http_port(docker_apache_t)
corenet_udp_bind_all_nodes(docker_apache_t)
corenet_udp_bind_http_port(docker_apache_t)

# Apache needs to resolve names against a DNS server
sysnet_dns_name_resolve(docker_apache_t)

# Permissive domains allow processes to not be blocked by SELinux
# While developing and testing your  policy you probably want to
# run the container in permissive mode.
# You want to remove this rule, when you are confident in the
# policy.
permissive docker_apache_t;
_EOF

# make -f /usr/share/selinux/devel/Makefile docker_apache.pp
# semodule -i docker_apache.pp

现在使用新类型运行容器:
docker run -d --security-opt type:docker_apache_t httpd

现在,该容器与正常容器相比,有着更为严格的SELinux安全性。注意,你可能会需要查看审计日志,以观察你的应用程序是否需要额外的SELinux准许规则。

你可以通过使用audit2allow命令来添加规则到现有.te文件,重新编译并安装如下规则。
grep docker_apache_t /var/log/audit/audit.log | audit2allow >> docker_apache.te
make -f /usr/share/selinux/devel/Makefile docker_apache.pp
semodule -i docker_apache.pp

多级安全模式

目前,我们使用 MCS 分离,从而确保容器不被其它容器干扰或交互,除非它是通过网络进行的连接。某些政府系统需要不同类型的MLS(多极安全)政策。借助MLS,你可以基于看到的数据级别来标记进程。 MLS说如果你的容器要处理绝密数据,那么它应该在绝密的地方运行。我们已经添加了Docker选项,允许管理员设置容器在特定级别运行,这些应该会满足MLS系统的需求。
docker run -d --security-opt label:level:TopSecret --security-opt label:type:docker_apache_t httpd

这个命令将确保开启Docker容器的两个交替类型与级别,并且可以阻止容器使用不是相同标签的数据。不过这方面尚未通过认证,但我们愿意帮助第三方为MLS用户构建解决方案。

调整命名空间

在其他有关安全的对话中,我已经讨论了命名空间如何被看作是一种安全机制,因为其删除了一个进程查看系统(PID命名空间)上其他进程的能力。网络命名空间可以删除通过你的命名空间看到其他网络的能力。 IPC(内部进程间通信)命名空间具有阻断容器使用其它容器的IPC能力。

Docker现在已经放宽这些限制。您可以用容器来共享主机的命名空间:

--pid=主机让容器共享主机的PID命名空间
--net=主机让容器共享主机的主机空间
--ipc=主机让容器共享主机的IPC空间

需要注意的是,既然已与主机共享PID或IPC的命名空间,这就需要我们依序禁用SELinux分离,阻断其工作。
docker run -ti --pid=host --net=host --ipc=host rhel7 /bin/sh

你可能会在这篇文章中阅读到相关方面的额外信息 Super Privileged Containers

原文链接:Tuning Docker with the newest security enhancements (翻译:田浩浩 校对:李颖杰)

===========================
译者介绍
田浩浩, USYD 硕士研究生,目前在珠海从事Android应用开发工作。业余时间专注Docker的学习与研究,希望通过 DockerOne 把最新最优秀的译文贡献给大家,与读者一起畅游Docker的海洋。

原文发布时间为:2015-03-12
本文作者:田浩浩 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:Docker最新安全性能调整分析
目录
相关文章
|
4月前
|
SQL Linux Go
docker镜像分析利器之dive
docker镜像分析利器之dive
85 0
|
5月前
|
应用服务中间件 Linux nginx
直接部署nginx和在docker里面部署nginx性能上有区别吗
直接部署nginx和在docker里面部署nginx性能上有区别吗
182 0
|
6月前
|
运维 安全 Docker
Docker 网络模型:多角度分析容器网络的原理与应用
Docker 网络模型:多角度分析容器网络的原理与应用
55 0
|
6月前
|
存储 边缘计算 数据管理
Docker 存储驱动解析:选择最适合你的存储方案,优化容器化部署性能和数据管理
Docker 存储驱动解析:选择最适合你的存储方案,优化容器化部署性能和数据管理
141 0
|
4月前
|
运维 监控 数据可视化
日志管理:收集和分析Docker容器日志
容器化技术的普及使得应用的部署和管理更加便捷,但随之而来的挑战之一是有效地管理和分析容器产生的大量日志。本文将深入探讨Docker容器日志管理的重要性,介绍常用的日志收集工具,以及如何分析和利用这些日志数据,提供更为丰富和实际的示例代码,帮助大家更好地理解和应用日志管理的关键技术。
|
1月前
|
负载均衡 容灾 安全
Docker Swarm总结+基础、集群搭建维护、安全以及集群容灾(1/5)
Docker Swarm总结+基础、集群搭建维护、安全以及集群容灾(1/5)
65 2
|
1月前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。
|
8月前
|
自然语言处理 数据可视化 关系型数据库
SolidUI社区-独立部署 和 Docker 通信分析
SolidUI社区-独立部署 和 Docker 通信分析
63 0
|
4月前
|
监控 安全 持续交付
Docker与容器化安全:漏洞扫描和安全策略
容器化技术,特别是Docker,已经成为现代应用程序开发和部署的关键工具。然而,容器化环境也面临着安全挑战。为了保障容器环境的安全性,本文将介绍如何进行漏洞扫描、制定安全策略以及采取措施来保护Docker容器。我们将提供丰富的示例代码,以帮助大家更好地理解和应对容器安全的问题。
|
4月前
|
安全 应用服务中间件 nginx
Docker安全性:最佳实践和常见安全考虑
Docker 的快速发展和广泛应用使其成为现代应用开发的热门选择,然而,容器环境的安全性也受到关注。本文将深入研究 Docker 安全性的最佳实践,包括容器镜像安全、容器运行时安全、网络安全等方面,并提供丰富的示例代码,帮助读者全面了解如何确保 Docker 环境的安全性。