Docker 安全最佳实践
目录
概述
近年来,容器技术彻底改变了科技行业,原因有很多。由于其能够将依赖项封装到可移植的容器镜像中,许多组织已将其作为开发、构建和部署生产应用程序的主要方法。
作为一名软件工程师和安全工程师,我对容器和编排器(即 Kubernetes)颠覆性潜力的兴奋之情难以言表。然而,由于开源的混乱(但好处多多)以及项目发展和演进的速度,许多组织根本无法或缺乏妥善保护这些技术的能力。
本文旨在提供 2018 年常见安全错误和安全最佳实践/建议的列表。
在下一篇文章中,我将针对 Kubernetes 提供同样的见解。
传奇:
图标 | 意义 |
---|---|
❌ | 不推荐 |
🗒️ | 基本原理 |
✅ | 推荐 |
主人
❌ 在不安全、未加固的主机上运行 Docker
🗒️ Docker 的安全性取决于底层主机
✅ 确保遵循操作系统安全最佳实践,强化你的基础架构。如果你将访问root
权限授予组织中的每个用户,那么 Docker 的安全性就毫无意义了。
Docker 强化标准
✅ 互联网安全中心 (CIS) 发布了一系列文档,详细介绍了安全最佳实践、建议以及可操作步骤,以达到强化的基准。最棒的是:这些文档都是免费的。
✅ 更好的是,docker-bench-security是一个基于 CIS 基准的自动检查器。
# recommended
$ docker run \
-it \
--net host \
--pid host \
--userns host \
--cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /var/lib:/var/lib \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/lib/systemd:/usr/lib/systemd \
-v /etc:/etc --label docker_bench_security \
docker/docker-bench-security
Docker 引擎
Docker 引擎是一个 API,它监听传入的请求,然后与底层主机内核交互以完成其任务。Docker 引擎支持 3 种不同的套接字通信:unix
、tcp
和fd
。
❌ 在或任何联网套接字上运行 Docker 引擎(又名 Docker 守护进程,又名dockerd
)tcp
🗒️ 如果任何人都可以访问 Docker 正在监听的网络套接字,那么他们就有可能访问 Docker,并且由于 Docker 需要以 root 身份运行,因此他们也可以访问底层主机
✅ 当今默认的 docker 行为是最安全的假设,即监听unix
套接字
# not recommended
$ dockerd -H "tcp://1.2.3.4:8080"
# recommended
$ dockerd -H "unix:///var/run/docker.sock"
❌ 将 Docker 套接字安装到容器中
🗒️ 在容器内挂载/var/run/docker.sock
是一种常见但非常危险的做法。攻击者可以执行 Docker 服务可以运行的任何命令,由于 Docker 服务以 root 身份运行,这通常可以访问整个主机系统。
✅ 除了直接说“不要挂载 Docker 套接字”之外,还要仔细考虑需要这个巨大漏洞的用例。例如,许多关于在容器中运行 Jenkins 主服务器的教程都会指导你挂载 Docker 套接字,以便 Jenkins 可以启动其他容器来运行你的测试。这很危险,因为这意味着任何人都可以从 Jenkins 执行任何 Shell 命令,从而未经授权访问其他容器中的敏感信息或机密信息(例如 API 令牌、环境变量),或者启动特权容器并挂载/etc/shadow
以提取所有用户的密码。
# not recommended
$ docker run -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu /bin/bash
容器权限
❌ 运行特权容器
🗒️ 容器将拥有对底层主机的完全访问权限
✅ 如果容器需要,则仅授予其所需的特定功能
# not recommended
$ docker run -d --privileged ubuntu
# recommended
$ docker run -d --cap-add SYS_PTRACE ubuntu
❌ 以 root 用户身份运行容器
🗒️ 这是系统管理的标准最佳实践。在容器中运行软件几乎没有任何理由root
。
✅ 以非 root 用户身份运行容器
# not recommended (runtime example)
$ docker run -d ubuntu sleep infinity
$ ps aux | grep sleep
root ... sleep infinity
# recommended (runtime example)
$ docker run -d -u 1000 ubuntu sleep infinity
$ ps aux | grep sleep
1000 ... sleep infinity
# recommended (build-time example)
FROM ubuntu:latest
USER 1000
静态分析
❌ 从公共注册中心拉取并运行容器
🗒️ 最近,安全研究人员在 Docker Hub 上发现了 17 个加密货币挖矿容器
✅ 扫描容器镜像以检测并防止具有已知漏洞或恶意包的容器部署到您的基础架构上
✅ 签署容器镜像
- Docker Content Trust保证发布者的完整性和容器镜像内容的完整性,从而建立信任
运行时安全
✅ 将seccomp
、apparmor
或selinux
配置文件附加到您的容器
✅ 监控、检测并警告异常、可疑和恶意的容器行为
- 该领域的开源工具包括Sysdig Falco
✅ 考虑在容器运行时沙箱中运行容器,例如gvisor
- 容器运行时沙盒在运行时为容器添加更强大的安全边界
结论
容器技术本质上并不比传统虚拟化技术更安全或更不安全。容器依赖于 Linux 原语来实现安全性,例如 UID、GID、命名空间隔离、用于控制 CPU、内存、进程 ID、IO 等的 cgroup。
如果您觉得我遗漏了某些内容,或者某些细节有误,或者只是想打个招呼,请随时在下面发表评论,或通过GitHub 🐙、Twitter 🐦或LinkedIn 🔗与我联系。
文章来源:https://dev.to/pbnj/docker-security-best-practices-45ih