保护Docker容器安全的14个最佳实践
应用程序的容器化,是将应用程序代码及其依赖项(包括所需的库、框架及配置文件)一股脑打包到虚拟容器当中。这种方法能够极大提升可移植性,确保应用程序在不同计算环境及基础设施当中拥有一致的运行效果,且不致降低效率。作为当前最流行的容器平台,无数企业正在使用Docker开发应用程序以实现有效优化、高度可扩展、可移植、敏捷的优势。
通过轻量级运行时环境,Docker容器能够共享底层操作系统以托管支持DevOps环境的应用程序。作为云原生框架中的关键元素,Docker能够为企业的软件开发生命周期(SDLC)带来一系列助益。当然,收益的背后总有风险。Docker的介入往往会带来新的复杂性,特别是在Docker框架的安全保护方面。
默认情况下,Docker容器非常安全。但大家必须了解可能存在的漏洞,并采取相应方法来防范潜在的安全风险。在本文中,我们将着眼于基础设施、镜像、访问与身份验证这三个关键领域聊聊Docker架构保护方面的最佳实践。
保护Docker基础设施
由于容器本身是云原生的基础,保护它们免受潜在攻击侵害就成了整个容器生命周期当中的一项关键工作。保护此类框架的整体方法不仅是要保护Docker容器,更需要捍卫处于更底层的基础设施。
下面我们从基础设施保护的最佳实践出发,看看这些方法的具体起效方式。
实践一 定期更新Docker版本
保护基础设施的第一件事,就是需要保证Docker版本始终最新。陈旧的版本很容易受到安琪攻击。新版本则通常包含解决旧版本漏洞的补丁与bug修复。
主机环境同样如此,企业需要确保所支持的应用程序为最新,而且不存在已知的bug或安全漏洞。
实践二 保持容器精益和清洁
容器环境的扩展会扩大攻击面,而且要比精益设置更易受到安全漏洞的影响。为了避免这种情况,运维人员需要将容器配置为仅包含按预期方式运行所必要的组件——软件包、库、配置文件。
此外,企业需要定期检查主机实例中是否存在未使用的容器和基础镜像,及时清理掉这些多余的部分。
实践三 配置API与网络
Docker Engine使用HTTP API实现跨网络通信。而API的配置错误有可能遗留下可被黑客利用的安全漏洞。
为了避免这种情况,需要通过安全配置限制容器公开的API,借此实现容器保护。一种可行的方法,是启用基于证书的身份验证以强制加密通信内容。
实践四 限制系统资源使用
限制各个容器所能使用的基础设施资源比例,具体资源类型包括CPU、内存、网络带宽。
Docker使用控制组来限制不同进程之间的资源分配与分发。这种方法能够防止受到感染的容器消耗掉过多基础设施资源,避免安全漏洞被攻击者利用时发生服务宕机问题。
实践五 保持主机隔离
在不同的主机上来运行具有不同安全要求的容器,通过不同的命名空间保持容器隔离,借此保证关键数据免受全面攻击的影响。这种方法还能防止相邻容器在同一资源池内消耗过多资源,进而影响其他容器的运行性能。
实践六 限制容器权限
默认情况下,Docker容器可以维持并获取多种额外权限。这些权限可能与其核心服务需求相关,也可能并无关联。
作为一项最佳实践,大家应将容器的权限控制在运行自身应用程序的必要水平上。为此,请使用以下命令删除Docker容器的所有权限:
在此之后,使用-cap-add标记向容器添加特定权限。这种方法能够限制Docker容器因安全漏洞而遭到利用时,向攻击者提供不必要的过高权限。
实践七 过滤系统调用
使用系统调用过滤器,借此为容器指定能够对Linux内核执行的具体调用。
这种方法能够支持安全计算模式,从而减少潜在的暴露点以避免安全事故——特别是对内核漏洞的利用。
保护Docker镜像
现在,让我们转向基础设施之外的安全最佳实践。Docker镜像实际就是用于创建容器和托管应用程序的可执行代码模板。Docker镜像由运行时加上root文件系统组合,它也是Docker容器最关键的基础之一。
在保护Docker镜像时,请遵循以下几项最佳实践。
实践八 使用可信镜像
仅从最新且正确配置的受信来源获取Docker基础镜像。
另外,启用Docker内容信任功能以过滤掉不安全的可疑来源,确保Docker镜像拥有正确签名。
实践九 定期扫描镜像
维护Docker镜像良好安全态势的一大关键,在于定期执行镜像漏洞扫描。除了在下载镜像时执行初始扫描之外,还应定期复检以确保镜像可以安全使用。
通过定期镜像扫描,企业还可以通过审计关键文件与目录,以及使用最新安全补丁保持持续更新的方式最大限度降低暴露风险。
实践十 优先使用最小基础镜像
避免在较小的镜像需求中使用较大的通用型Docker镜像,这能有效降低安全漏洞发生几率,从而缩小攻击面、避免使用易受黑客攻击的默认配置。
访问与身份验证管理
Docker安全的最后一项重点,在于访问与身份验证。通过访问控制保护Docker守护进程,正是从业者们常说的第一安全层。如果没有Docker守护程序的加持,底层运营、应用程序、业务功能、实施最低权限用户等一切都将暴露在风险当中。
实践十一 实施最低权限用户
默认情况下,Docker容器中的进行具有root权限,因此有权访问容器及主机管理操作。而一旦被黑客利用,容器与底层主机中的漏洞将构成巨大的威胁。
为了避免这些漏洞,请设置最低权限用户,仅为该用户授权运行容器所需的必要权限。或者,也可以调整运行时配置以禁止使用高权限用户。
实践十二 使用secret管理工具
永远不要将secret存储在Dockerfile当中,避免有权访问Dockerfile的用户将这些机密信息放置在不当位置、加以滥用甚至危及整个框架的总体安全水平。
标准最佳实践要求在第三方工具(例如Hashicorp Vault)当中安全存放加密密钥secret,企业 可以对访问凭证以外的其他容器secret采取相同的保护方法。
实践十三 限制对容器文件的直接访问
瞬态容器需要统一的升级与bug修复支持。因此,每当用户访问此类容器文件时都会导致文件内容暴露。
作为最佳实践,请在容器之外维护容器日志。这将大大减少容器文件的统一直接使用,还能帮助团队在无需访问容器目录内日志的情况下完成调试与问题处理。
实践十四 启用加密通信
将Docker守护程序的访问权限限定在少数关键用户之内。此外,对一般用户强制执行仅限SSH访问,借此控制他们对容器文件的直接访问能力。
同时,使用TLS证书加密主机级通信。禁用未使用的端口,并保证默认端口仅可供内部使用。
结语
保障IT环境中的安全性,已经成为一项不容忽视的重要任务。保护Docker,就是保护我们的IT环境。
云原生框架的保护,应该始终以考量框架中的关键元素为起点。因此,企业应建立并维持一套以容器及其底层基础设施为中心的强大安全体系。
尽管具体的端到端安全实施方法可能有所不同,但我们的目标只有一个——发现漏洞点,以最佳实践为武器最大程度降低风险。