如何在Ubuntu 16.04上使用Docker Bench对Docker主机进行安全性审核

介绍

使用Docker来容纳您的应用程序和服务可以为您提供开始即用的一些安全优势,但默认的Docker安装仍然有一些空间可用于一些与安全相关的配置改进。在互联网安全中心为了促进互联网安全创造了一个按步骤确保docker安全的清单。随后,Docker团队发布了一个安全审计工具- Docker Bench for Security,在Docker主机上运行此清单并记录它发现的任何问题。

在本教程中,我们将安装Docker Bench for Security,然后使用它来评估Ubuntu 16.04主机上默认Docker安装(来自官方Docker存储库)的安全性。然后我们将解决它发出的警告。

我们的修复程序主要包括以下两个配置更新:

  • 安装auditd和设置Docker守护程序及其关联文件的审核规则
  • 更新Docker的daemon.json配置文件

我们不会详细介绍有关创建安全容器的任何细节,我们将只关注本教程中Docker主机安全性的更新。有关容器Docker的相关知识可以访问腾讯云社区开发者手册Docker中文手册以及腾讯云专属在线实验平台基于CentOS 搭建Docker环境

准备

要完成本教程,您需要:

  • 一个Ubuntu 16.04服务器,具有启用sudo权限的非root用户。
  • 从官方Docker存储库安装Docker。通过将其添加到docker组,确保为非root用户提供对Docker的访问权限。

没有服务器的用户可以直接在腾讯云实验室使用云主机体验Docker

第1步,安装Docker Bench Security

首先,以非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
. . .

该脚本通过各种测试运行,并分别给出了INFONOTEPASS,和WARN的结果。Ubuntu 16.04上的默认Docker安装将通过其中许多测试,但会在第1,2和4节中显示一些警告。

在本教程的其余部分中,我们将通过加固Docker安装来解决这些警告。

第2步,更正主机配置警告

审计的第一部分测试了主机操作系统的配置,包括其强化,软件包版本和审计配置。让我们看看本节中的测试:

1.1确保已创建单独的容器分区

为确保正确隔离,最好将Docker容器和所有/var/lib/docker文件系统分区保留在一起。在某些云托管情况下,这可能很难,因为您可能无法对驱动器进行分区。在这些情况下,您可以通过将Docker的数据目录移动到外部网络连接块设备来满足此测试。

  • 要了解如何对驱动器进行分区。
  • 要了解如何在其他云平台上安装块存储设备,请参阅云提供商的文档。

1.2确保容器主机已经做好准备

此测试仅提醒您考虑加强您的主机。强化通常涉及设置防火墙,锁定各种服务,设置审计和日志记录以及实施其他安全措施。

1.3确保Docker是最新的版本

此测试会打印出您的Docker版本。您可以通过访问Docker CE发行说明来检查当前稳定版本的版本。如果您没有更新,并且使用了Docker apt-get install,则可以apt-get再次使用以升级Docker软件包:

$   sudo apt-get update
$   sudo apt-get upgrade

1.4确保只允许受信任的用户控制Docker守护程序

我们将非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守护程序配置。

第3步, 更正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节警告。

我们插入到此文件中的配置变量的排列顺序与审计警告的顺序相同。让我们来逐个查看:

2.1确保默认网桥上的容器之间的网络流量受限

此警告在配置文件"icc": false中解决。此配置创建的容器只能在使用--link=container_name Docker命令行或Docker Compose配置文件中的links:参数显式链接时才能相互通信。这样做的一个好处是,如果攻击者攻击一个容器,他们将很难找到并攻击同一主机上的其他容器。

2.8启用用户命名空间支持

Linux命名空间为容器中运行的进程提供了额外的隔离。用户命名空间重新映射允许进程在容器中以root用户身份运行,同时重新映射到主机上权限较低的用户。我们使用"userns-remap":"default"配置文件中的行启用用户命名空间重新映射。

我们将参数设置为default,这意味着Docker将创建一个dockremap用户,容器用户将被重新映射到该用户。您可以使用以下命令验证dockremap用户是否已创建id:

$   sudo id dockremap

您应该看到类似于以下内容的输出:

uid=112(dockremap) gid=116(dockremap) groups=116(dockremap)

如果将容器用户重新映射到其他主机用户对您的用例更有帮助,请在配置文件default中指定用户或用户组。

警告:用户重新映射功能强大,如果配置不当可能会导致中断和破坏,因此强烈建议您阅读官方文档并了解在生产环境中实施此更改之前的含义。

2.11确保已启用Docker客户端命令的授权

如果您需要允许网络访问Docker套接字,您应该查阅官方Docker文档,以了解如何安全地设置必要的证书和密钥。

我们不会在这里讨论这个过程,因为具体细节在很大程度上取决于个别情况。审计将继续将此测试标记为WARN,访问默认的仅限本地的Docker套接字是通过要求docker组中的成员资格来保护的,因此可以放心地忽略它。

2.12确保配置了集中式和远程日志记录

在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日志驱动程序官方文档

2.13确保遗留注册表(v1)上的操作已禁用

此警告由守护程序配置文件中的"disable-legacy-registry": true行修复。这会禁用不安全的旧映像注册表协议。由于已从Docker守护程序中删除了对此协议的支持,因此该标志正在被弃用。

2.14确保已启用实时还原

通过"live-restore": true在守护进程配置中指定,我们允许容器在Docker守护进程未运行时继续运行。这改善了主机系统更新期间的容器正常运行时间和其他稳定性问题。

2.15确保禁用Userland代理

"userland-proxy": false行修复了此警告。这将禁用docker-proxyuserland进程,该进程默认处理将主机端口转发到容器,并用iptables规则替换它。如果hairpin NAT可用,则不需要userland代理,应禁用该代理以减少主机的攻击面。

2.18确保限制容器获取新权限

守护程序配置中的"no-new-privileges": true行可防止容器内的权限升级。这保证了使用的容器不能获得新的特权setuidsetgid二进制文件。

现在我们已经更新了Docker守护程序配置,让我们在第四部分的审计中修复剩下的一个警告。

第4步,启用内容信任

我们的审计标记的最终测试是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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小狼的世界

谈一下Docker与Kubernetes集群的日志和日志管理

日志对于我们管理Kubernetes集群及其上的应用具有非常重要的作用,特别是在出现故障或者Bug的时候。如果你能回答下面几个问题,那么可以不用再看本文了,如果...

2941
来自专栏JMCui

Docker 系列六(Docker Swarm 项目).

    随着互联网快速发展,以及微服务架构的流行,服务器的压力越来越大。上一篇介绍的 Docker Compose 项目,可以将多个容器捏合在一起,实现容器间的...

944
来自专栏云计算教程系列

如何在Debian 9上安装Anaconda Python发行版

Anaconda是一个开源包管理器,环境管理器,以及Python和R编程语言的发行版。它专为数据科学和机器学习工作流程而设计,通常用于大规模数据处理,科学计算和...

7474
来自专栏云计算教程系列

如何在Ubuntu 14.04上使用Docker和Docker Compose配置持续集成测试环境

持续集成(CI)指的是开发人员尽可能频繁地集成代码,并且在自动化构建将每个提交合并到共享存储库之前和之后都要进行测试的实践。

610
来自专栏云计算

Docker 业务流程的概述以及用处

[本文由Yaron Parasol编写]

2296
来自专栏技术翻译

十大Docker记录问题

Docker不仅改变了应用程序的部署方式,还改变了日志管理的工作流程。容器将日志写入控制台(stdout / stderr),而Docker Logging D...

3084
来自专栏Laoqi's Linux运维专列

Docker 配置安装(Ⅲ)

1576
来自专栏阮一峰的网络日志

Docker 入门教程

2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。 但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文...

3573
来自专栏云计算教程系列

如何在Ubuntu 16.04上使用Docker和Docker Compose配置持续集成测试环境

持续集成(CI)是指开发人员尽可能经常集成代码并在每个提交在通过自动构建合并到共享存储库之前和之后进行测试的实践。

1120
来自专栏编程坑太多

『中级篇』Docker 水平扩展和负载均衡(40)

PS:Docker的scale 可以扩展,也可以所有,他们自动来控制的。web=10 可以改成5 其中的6,7,8,9,10就被删除了。

5683

扫码关注云+社区

领取腾讯云代金券