如何在 Ubuntu 16.04 上使用 Docker Bench for Security 审计 Docker 主机的安全性

介绍

使用 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,PASSWARN。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 确保容器受限制获得新的特权

戴蒙配置中的无新特权:真行防止从容器内部升级特权,从而确保容器不能使用setuidsetgid`二进制获得新的特权。

现在我们已经更新了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 文档并查看文档的特定子部分的链接,这些链接已包含在本教程中。

Published At
Categories with 技术
comments powered by Disqus