使用Docker来容纳您的应用程序和服务可以为您提供开始即用的一些安全优势,但默认的Docker安装仍然有一些空间可用于一些与安全相关的配置改进。在互联网安全中心为了促进互联网安全创造了一个按步骤确保docker安全的清单。随后,Docker团队发布了一个安全审计工具- Docker Bench for Security,在Docker主机上运行此清单并记录它发现的任何问题。
在本教程中,我们将安装Docker Bench for Security,然后使用它来评估Ubuntu 16.04主机上默认Docker安装(来自官方Docker存储库)的安全性。然后我们将解决它发出的警告。
我们的修复程序主要包括以下两个配置更新:
auditd
和设置Docker守护程序及其关联文件的审核规则daemon.json
配置文件我们不会详细介绍有关创建安全容器的任何细节,我们将只关注本教程中Docker主机安全性的更新。有关容器Docker的相关知识可以访问腾讯云社区开发者手册Docker中文手册以及腾讯云专属在线实验平台基于CentOS 搭建Docker环境。
要完成本教程,您需要:
没有服务器的用户可以直接在腾讯云实验室使用云主机体验Docker。
首先,以非root用户身份SSH到Docker主机。
我们将首先使用Docker Bench for Security脚本克隆到服务器git,然后直接从克隆的存储库运行脚本。
导航到用户可以写入的目录。在此示例中,我们将脚本下载到用户的主目录:
$ cd ~
然后克隆docker-bench-securityGit存储库:
$ git clone https://github.com/docker/docker-bench-security.git
这将从repo中提取所有文件并将它们放在本地docker-bench-security目录中。接下来,进入此结果目录:
$ cd docker-bench-security
最后,要执行安全审核,请运行docker-bench-security.sh脚本:
$ ./docker-bench-security.sh
# ------------------------------------------------------------------------------
# Docker Bench for Security v1.3.4
#
# Docker, Inc. (c) 2015-
#
# Checks for dozens of common best-practices around deploying Docker containers in production.
# Inspired by the CIS Docker Community Edition Benchmark v1.1.0.
# ------------------------------------------------------------------------------
Initializing Tue Jun 5 18:59:11 UTC 2018
[INFO] 1 - Host Configuration
[WARN] 1.1 - Ensure a separate partition for containers has been created
[NOTE] 1.2 - Ensure the container host has been Hardened
[INFO] 1.3 - Ensure Docker is up to date
[INFO] * Using 18.03.1, verify is it up to date as deemed necessary
. . .
该脚本通过各种测试运行,并分别给出了INFO
,NOTE
,PASS
,和WARN
的结果。Ubuntu 16.04上的默认Docker安装将通过其中许多测试,但会在第1,2和4节中显示一些警告。
在本教程的其余部分中,我们将通过加固Docker安装来解决这些警告。
审计的第一部分测试了主机操作系统的配置,包括其强化,软件包版本和审计配置。让我们看看本节中的测试:
为确保正确隔离,最好将Docker容器和所有/var/lib/docker
文件系统分区保留在一起。在某些云托管情况下,这可能很难,因为您可能无法对驱动器进行分区。在这些情况下,您可以通过将Docker的数据目录移动到外部网络连接块设备来满足此测试。
此测试仅提醒您考虑加强您的主机。强化通常涉及设置防火墙,锁定各种服务,设置审计和日志记录以及实施其他安全措施。
此测试会打印出您的Docker版本。您可以通过访问Docker CE发行说明来检查当前稳定版本的版本。如果您没有更新,并且使用了Docker apt-get install
,则可以apt-ge
t再次使用以升级Docker软件包:
$ sudo apt-get update
$ sudo apt-get upgrade
我们将非root用户添加到docker组,以授予其访问Docker守护程序的权限。此测试从/etc/group:文件输出docker group的行
docker:x:999:sammy
此行显示docker组中包含的所有用户。查看该行并确保只有适当的用户才有权控制Docker守护程序。在上面的示例中,我们的授权用户sammy突出显示。要从该组中删除用户,您可以使用gpasswd:
$ gpasswd -d username docker
1.5-1.13确保为各种Docker文件配置了审核
我们需要安装和配置auditd
以启用对Docker的一些文件,目录和套接字的审核。Auditd
是一个Linux访问监控和记帐子系统,可在内核级别记录值得标记的系统操作。
用apt-get
安装auditd
:
$ sudo apt-get install auditd
这将安装并启动auditd
守护进程。我们现在将配置auditd
为监视Docker文件和目录。在文本编辑器中,打开审核规则文件:
$ sudo nano /etc/audit/audit.rules
您应该看到以下文本:
/etc/audit/audit.rules# This file contains the auditctl rules that are loaded # whenever the audit daemon is started via the initscripts. # The rules are simply the parameters that would be passed # to auditctl.First rule - delete all-DIncrease the buffers to survive stress events.Make this bigger for busy systems-b 320Feel free to add below this line. See auditctl man page将以下代码段粘贴到文件底部,然后保存并退出编辑器:
/etc/audit/audit.rules
-w /usr/bin/docker -p wa
-w /var/lib/docker -p wa
-w /etc/docker -p wa
-w /lib/systemd/system/docker.service -p wa
-w /lib/systemd/system/docker.socket -p wa
-w /etc/default/docker -p wa
-w /etc/docker/daemon.json -p wa
-w /usr/bin/docker-containerd -p wa
-w /usr/bin/docker-runc -p wa
这些规则指示auditd
监视(-w)指定的文件或目录,并将任何写入或属性更改为(-p wa)记录到这些文件。
重新启动auditd
以使更改生效:
$ sudo systemctl restart auditd
此时,您已成功配置auditd为观察Docker文件和目录是否存在可疑项目的更改。您可以重新运行Docker Bench for Security脚本以确认第1部分中的测试现在已通过。
现在我们已经验证了我们的主机配置,我们将继续讨论Docker安全审计的第2部分,即Docker守护程序配置。
审计的这一部分涉及Docker守护程序的配置。这些警告都可以通过为被调用的守护进程daemon.json
创建配置文件来解决,我们将向其添加一些与安全相关的配置参数。我们将首先创建并保存此配置文件,然后逐个查看配置中的测试和相应行。
首先,在您喜欢的编辑器中打开配置文件:
$ sudo nano /etc/docker/daemon.json
这将显示一个空白文本文件。粘贴如下:
/etc/docker/daemon.json
{
"icc": false,
"userns-remap": "default",
"log-driver": "syslog",
"disable-legacy-registry": true,
"live-restore": true,
"userland-proxy": false,
"no-new-privileges": true
}
保存并关闭该文件,然后重新启动Docker守护程序,以便它获取此新配置:
$ sudo systemctl restart docker
您现在可以重新运行审核以确认已解决所有第2节警告。
我们插入到此文件中的配置变量的排列顺序与审计警告的顺序相同。让我们来逐个查看:
此警告在配置文件"icc": false
中解决。此配置创建的容器只能在使用--link=container_name
Docker命令行或Docker Compose配置文件中的links:参数显式链接时才能相互通信。这样做的一个好处是,如果攻击者攻击一个容器,他们将很难找到并攻击同一主机上的其他容器。
Linux命名空间为容器中运行的进程提供了额外的隔离。用户命名空间重新映射允许进程在容器中以root用户身份运行,同时重新映射到主机上权限较低的用户。我们使用"userns-remap":"default"
配置文件中的行启用用户命名空间重新映射。
我们将参数设置为default,这意味着Docker将创建一个dockremap用户,容器用户将被重新映射到该用户。您可以使用以下命令验证dockremap用户是否已创建id:
$ sudo id dockremap
您应该看到类似于以下内容的输出:
uid=112(dockremap) gid=116(dockremap) groups=116(dockremap)
如果将容器用户重新映射到其他主机用户对您的用例更有帮助,请在配置文件default中指定用户或用户组。
警告:用户重新映射功能强大,如果配置不当可能会导致中断和破坏,因此强烈建议您阅读官方文档并了解在生产环境中实施此更改之前的含义。
如果您需要允许网络访问Docker套接字,您应该查阅官方Docker文档,以了解如何安全地设置必要的证书和密钥。
我们不会在这里讨论这个过程,因为具体细节在很大程度上取决于个别情况。审计将继续将此测试标记为WARN,访问默认的仅限本地的Docker套接字是通过要求docker组中的成员资格来保护的,因此可以放心地忽略它。
在Docker守护程序配置文件中,我们已使用"log-driver":"syslog"
行启用标准syslog日志记录。然后,您应该配置syslog以将日志转发到集中式syslog服务器。这会从Docker主机上获取日志,并远离可能更改或删除它们的攻击者。
如果您只想转发Docker日志并且不想发送syslog,则可以通过将以下参数附加到文件来在Docker配置文件中指定远程syslog服务器:
/etc/docker/daemon.json
`"log-opts": { "syslog-address": "udp://198.51.100.33:514" }`
请务必使用您自己的syslog服务器地址替换IP地址。
或者,您可以使用splunk或者fluentd日志聚合服务指定日志驱动程序,也可以使用其他日志聚合服务来发送Docker守护程序日志。有关Docker日志驱动程序及其配置的更多信息,请参阅Docker日志驱动程序官方文档。
此警告由守护程序配置文件中的"disable-legacy-registry": true
行修复。这会禁用不安全的旧映像注册表协议。由于已从Docker守护程序中删除了对此协议的支持,因此该标志正在被弃用。
通过"live-restore": true
在守护进程配置中指定,我们允许容器在Docker守护进程未运行时继续运行。这改善了主机系统更新期间的容器正常运行时间和其他稳定性问题。
"userland-proxy": false
行修复了此警告。这将禁用docker-proxyuserland
进程,该进程默认处理将主机端口转发到容器,并用iptables
规则替换它。如果hairpin NAT可用,则不需要userland
代理,应禁用该代理以减少主机的攻击面。
守护程序配置中的"no-new-privileges": true
行可防止容器内的权限升级。这保证了使用的容器不能获得新的特权setuid
或setgid
二进制文件。
现在我们已经更新了Docker守护程序配置,让我们在第四部分的审计中修复剩下的一个警告。
我们的审计标记的最终测试是4.5 Ensure Content trust for Docker is Enabled
。内容信任是一种用于在运行它们之前对Docker镜像进行签名并验证其签名的系统。我们可以使用DOCKER_CONTENT_TRUST
环境变量启用内容信任。
要为当前shell会话设置此变量,请在shell中键入以下内容:
$ export DOCKER_CONTENT_TRUST=1
在此export命令后运行审核应显示已启用内容信任,并清除此警告。要为所有用户和所有会话自动启用它,请将该DOCKER_CONTENT_TRUST
变量添加到/etc/environment
文件中,该文件是用于分配系统范围的环境变量的文件:
$ echo "DOCKER_CONTENT_TRUST=1" | sudo tee -a /etc/environment
有关Docker内容信任的更多信息,请参阅官方Docker内容信任文档。
此时,我们已经解决了Docker Bench for Security脚本标记的所有警告。我们现在有一个更安全的Docker主机来运行容器。
在本教程中,我们安装了Docker Bench for Security脚本,用它来审计我们的Docker安装的安全性,并通过安装和配置auditd以及Docker守护程序的配置文件来解决警告。
完成本教程后,运行审计脚本应该导致很少的错误或警告。您也应该理解并有充分的理由忽略那些持续存在的错误或警告。
有关Docker安全配置选项的更多信息,请参阅Docker文档并查看文档特定小节的链接,这些小节已包含在本教程中。腾讯云实验室也提供基于 Docker 对 私有云盘 Nextcloud 进行部署等其他Docker相关知识。
参考文献:《How To Audit Docker Host Security with Docker Bench for Security on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。