介绍
使用 Docker 将您的应用程序和服务装入容器,可以给您一些安全好处出框,但默认的 Docker 安装仍然有空间进行一些安全相关的配置改进. 互联网安全中心是一个非营利组织,其使命是促进互联网安全最佳做法,它创建了确保多克安全的分步骤核对表。 随后,多克团队发布了一个安全审计工具-多克宾克安全(Docker Beach for Security),在多克主机上运行此清单并标出它发现的任何问题.
在本教程中,我们将安装Docker Bench for Security,然后使用它来评估默认Docker安装(来自官方Docker存储库)在Ubuntu 16.04主机上的安全状态。
我们的修复主要包括以下两个配置更新:
- 安装
auditd
并设置对 Docker 对象及其相关文件的审计规则 * 更新 Docker 的daemon.json
配置文件
我们不会谈论创建安全容器的任何细节,我们将在本教程中专注于 Docker 主机安全的更新。
前提条件
为了完成本教程,您将需要以下内容:
- Ubuntu 16.04服务器,具有sudo驱动的非root用户. 您可以用我们的 [初始服务器设置, Ubuntu 16. 04] (https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-16-04 ) 指南来学习设置此功能
- Docker从正式的Docker寄存器处安装,其涵盖范围见[如何在Ubuntu 16.04上安装和使用Docker (https://andsky.com/tech/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04). 请通过添加到 docker** 组中来让您的非根用户访问多克. 这在教程第二步中涵盖. .
第1步:安装Docker Bench安全
首先,将 SSH 输入到 Docker 主机作为您的非根用户。
我们首先将Docker Bench for Security脚本克隆到使用git
的服务器,然后直接从克隆的存储库运行脚本。
在此示例中,我们将下载脚本到用户的主目录:
1cd ~
然后克隆docker-bench-security
的Git存储库:
1git clone https://github.com/docker/docker-bench-security.git
这将从复制器中拉出所有文件,并将其放置在本地的docker-bench-security
目录中。
1cd docker-bench-security
最后,要执行安全审核,请运行docker-bench-security.sh
脚本:
1./docker-bench-security.sh
1[secondary_label Output]
2# ------------------------------------------------------------------------------
3# Docker Bench for Security v1.3.4
4#
5# Docker, Inc. (c) 2015-
6#
7# Checks for dozens of common best-practices around deploying Docker containers in production.
8# Inspired by the CIS Docker Community Edition Benchmark v1.1.0.
9# ------------------------------------------------------------------------------
10
11Initializing Tue Jun 5 18:59:11 UTC 2018
12
13[INFO] 1 - Host Configuration
14[WARN] 1.1 - Ensure a separate partition for containers has been created
15[NOTE] 1.2 - Ensure the container host has been Hardened
16[INFO] 1.3 - Ensure Docker is up to date
17[INFO] * Using 18.03.1, verify is it up to date as deemed necessary
18. . .
该脚本通过各种测试,并为每一个结果提供INFO
,NOTE
,PASS
或WARN
。Ubuntu 16.04上的默认Docker安装将通过许多这些测试,但将在第1、2和4节中显示一些警告。
在本教程的剩余部分中,我们将通过确保我们的Docker安装来解决这些警告。
步骤 2 — 纠正主机配置警告
审计的第一部分测试了您的主机操作系统的配置,包括其硬化、包版本和审计配置。
1.1 确保为容器创建了单独的分区
为了确保适当的隔离,最好将 Docker 容器和所有 `/var/lib/docker 存储在自己的文件系统分区上。在某些云托管情况下,您可能无法分区驱动器的情况下,这可能很困难,在这些情况下,您可以通过将 Docker 数据目录移动到连接到外部网络的区块设备来满足这个测试。
- 联合国 要学习如何分割驱动器,请查看[如何在 Linux (https://andsky.com/tech/tutorials/how-to-partition-and-format-storage-devices-in-linux) 中分割存储设备。
- 联合国 要将块存储设备上载到数字大洋滴盘上,请读作数字大洋块存储介绍。
- 联合国 要学习如何在其他云平台上挂载块存储设备,请参考您的供应商文档. .
1.2 确保容器主机已硬化
這個測試只是提醒您要考慮硬化您的主機的一個注意事項。硬化通常涉及設置防火牆,關閉各種服務,設置審核和登記,以及實施其他安全措施。您可以通過閱讀 7 安全措施來保護您的伺服器來開始。
1.3 确保 Docker 是最新的
您可以通过访问 Docker CE 发布注释检查当前稳定版本的版本,如果您尚未更新,并且使用apt-get install
安装了 Docker,则可以使用apt-get
重新升级 Docker 包:
1sudo apt-get update
2sudo apt-get upgrade
**1.4 确保只有受信任的用户可以控制Docker DAEMON
在 前提 Docker 设置教程中,我们将我们的非根用户添加到 docker 组中,使其可以访问 Docker 群组。 此测试将** docker** 组的行从 /etc/group
文件中输出:
1[secondary_label Output]
2docker:x:999:sammy
此行显示了包含在 docker 组中的所有用户。 查看该行并确保只有适当的用户有权控制 Docker daemon。 在上面的示例中,我们的授权用户** sammy** 被突出。
1gpasswd -d username docker
1.5–1.13 确保对各种 Docker 文件配置审计
我们需要安装和配置auditd
,以便对 Docker 的某些文件、目录和插件进行审计。
使用apt-get
安装auditd
:
1sudo apt-get install auditd
这将安装并启动auditd
大门,我们现在将配置auditd
来监控 Docker 文件和目录,在文本编辑器中打开审计规则文件:
1sudo nano /etc/audit/audit.rules
你应该看到以下文本:
1[label /etc/audit/audit.rules]
2# This file contains the auditctl rules that are loaded
3# whenever the audit daemon is started via the initscripts.
4# The rules are simply the parameters that would be passed
5# to auditctl.
6
7# First rule - delete all
8-D
9
10# Increase the buffers to survive stress events.
11# Make this bigger for busy systems
12-b 320
13
14# Feel free to add below this line. See auditctl man page
在文件底部粘贴下面的片段,然后保存并退出编辑器:
1[label /etc/audit/audit.rules]
2-w /usr/bin/docker -p wa
3-w /var/lib/docker -p wa
4-w /etc/docker -p wa
5-w /lib/systemd/system/docker.service -p wa
6-w /lib/systemd/system/docker.socket -p wa
7-w /etc/default/docker -p wa
8-w /etc/docker/daemon.json -p wa
9-w /usr/bin/docker-containerd -p wa
10-w /usr/bin/docker-runc -p wa
这些规则指示 auditd 观看(-w
)指定的文件或目录,并记录这些文件的任何写作或属性变化(-p wa
)。
重启auditd
,以便更改生效:
1sudo systemctl restart auditd
在此时,您已成功配置auditd
,以查看 Docker 文件和目录的可疑更改. 您可以重新启动 Docker Bench for Security 脚本,以确认第 1 节中的测试已经通过。
有关)。
现在我们已经验证了主机配置,我们将转到Docker安全审核的第 2 部分,即Docker DAEMON配置。
步骤 3 — 修复 Docker Daemon 配置警告
审计的本节涉及到Docker的配置,所有这些警告都可以通过创建一个名为daemon.json
的配置文件来解决,我们将添加一些与安全相关的配置参数。
首先,在您最喜欢的编辑器中打开配置文件:
1sudo nano /etc/docker/daemon.json
这将为您提供一个空白文本文件. 粘贴如下:
1[label /etc/docker/daemon.json]
2{
3 "icc": false,
4 "userns-remap": "default",
5 "log-driver": "syslog",
6 "disable-legacy-registry": true,
7 "live-restore": true,
8 "userland-proxy": false,
9 "no-new-privileges": true
10}
保存并关闭该文件,然后重新启动Docker DAEMON以获取此新配置:
1sudo systemctl restart docker
您现在可以重新启动审计,以确认所有第 2 节警告已得到解决。
我们在这个文件中插入的配置变量以与审计警告相同的顺序排列。
2.1 确保默认桥梁上的容器之间的网络流量受到限制
此警告由配置文件中的icc
: false 响应,此配置只在使用 Docker 命令行上的 --link=container_name
或 Docker Compose 配置文件中的 links:
参数明确链接时才能相互通信的容器,其中一个好处是,如果攻击者破坏一个容器,他们将更难在同一主机上找到和攻击其他容器。
2.8 启用用户名空间支持
Linux 命名空间为您的容器中运行的流程提供了额外的隔离性。用户命名空间重组允许流程在容器中作为 root 运行,同时重组到主机上的不受特权用户。
我们将参数设置为默认
,这意味着Docker 将创建一个 dockremap 用户,容器用户将被重新定义。
1sudo id dockremap
你应该看到类似于以下的输出:
1[secondary_label Output]
2uid=112(dockremap) gid=116(dockremap) groups=116(dockremap)
如果将容器用户重组为不同的主机用户对您的使用案例更有意义,请在配置文件中指定用户或user:group
组合而不是默认
。
<$>[警告] 警告: 用户重置是一个强大的功能,如果不正确配置,可能会导致中断和故障,因此强烈建议您(阅读官方文档)(https://docs.docker.com/engine/security/userns-remap/# about-remapping-and-subordinate-user-and-group-ID)并在实施此更改之前了解其影响。
2.11 确保已启用 Docker 客户端命令的授权功能
如果您需要允许网络访问 Docker 接口,请参阅官方 Docker 文档(https://docs.docker.com/engine/security/https/)以了解如何安全地设置所需的证书和密钥。
审计将继续将这个测试标记为警告
,尽管访问默认的本地只使用的Docker插件受到保护,需要在 docker 组中的会员资格,这样可以安全地忽略。
2.12 确保配置集中式和远程日志
在 Docker daemon 配置文件中,我们已启用了标准 syslog 登录,使用``日志驱动程序:
syslog`行. 然后您应该配置 syslog 将日志转发到集中式 syslog 服务器。
如果您只想转发 Docker 日志,而不想发送 syslog,则可以将远程 syslog 服务器指定到 Docker 配置文件中,将下列参数附加到文件中:
1[label /etc/docker/daemon.json]
2 `"log-opts": { "syslog-address": "udp://198.51.100.33:514" }`
一定要用自己的 syslog 服务器的地址替换 IP 地址。
或者,您可以指定)。
2.13 确保遗传注册表(v1)上的操作被禁用
此警告由禁用遗传注册表
:真`行在 DAEMON 配置文件中修复,从而禁用不安全的遗传图像注册表协议.由于此协议的支持已经从 Docker 注册表中删除,所以这个旗帜正在被删除。
2.14 确保实时恢复已启用
通过在daemon配置中指定live-restore: true
,我们允许集装箱在Docker集装箱不存在时继续运行,从而在主机系统更新和其他稳定性问题时改善集装箱的运行时间。
2.15 确保 Userland Proxy 已禁用
userland-proxy
: false行修复了此警告,从而禁用了
docker-proxy用户地流程,默认情况下处理向集装箱发送主机端口,并用
iptables`规则取代。
2.18 确保容器受限制获得新的特权
戴蒙配置中的无新特权
:真行防止从容器内部升级特权,从而确保容器不能使用
setuid或
setgid`二进制获得新的特权。
现在我们已经更新了Docker DAEMON配置,让我们在审计的第四节中修复剩余的警告。
步骤4:启用内容信任
我们的审计标记的最后测试是4.5 确保 Docker 的内容信任已启用
。
要为当前 shell 会话设置此变量,请在 shell 中输入以下内容:
1export DOCKER_CONTENT_TRUST=1
在此导出
命令后运行审核时,应该显示内容信任已启用,并清除此警告. 要为所有用户和所有会话自动启用,请将DOCKER_CONTENT_TRUST
变量添加到/etc/environment
文件中,该文件用于分配系统范围内的环境变量:
1echo "DOCKER_CONTENT_TRUST=1" | sudo tee -a /etc/environment
有关 Docker 内容信任的更多信息可以在 [官方 Docker 内容信任文档] 中找到(https://docs.docker.com/engine/security/trust/content_trust/)。
在此时刻,我们已经解决了 Docker Bench for Security 脚本标记的所有警告,现在我们有一个更安全的 Docker 主机来运行容器。
结论
在本教程中,我们安装了Docker Bench for Security脚本,使用它来审核我们的Docker安装的安全性,并通过安装和配置auditd
和Docker DAEMON的配置文件来解决警告。
完成本教程后,运行审计脚本应该导致很少的错误或警告,你也应该了解并有充分的理由忽视那些坚持。
有关 Docker 安全配置选项的更多信息,请参阅 Docker 文档并查看文档的特定子部分的链接,这些链接已包含在本教程中。