网络安全事故可能会严重损害组织的声誉,在市场上造成竞争劣势,造成处罚,最终用户可能会产生不必要的法律问题。根据这份 IBM 报告,每次数据泄露的平均成本为392万美元。在组织中提供安全的最大挑战是:
缺乏安全工具和做法方面的技能和培训
缺乏可见性和漏洞
对当前安全状态的持续监测
根据云安全状况报告---- PaloAlto 网络最近的调查,发现94% 的组织使用一个或多个云平台,大约45% 的计算机使用容器或 CaaS。容器的主导地位正在提高,因此安全威胁也在增加。
在这些报告中被确定为威胁的首要问题是:
数据曝光和恶意软件
应用程序漏洞
弱或不完善的身份验证
配置错误
不正确或过度使用权限的存取
内部威胁
证书泄漏
不安全的端点
在本文中,我们将介绍一些容器安全的最佳实践,我们可以遵循并实现这些实践来降低容器工作负载中的安全风险。
保护应用程序容器的10大最佳安全实践
1. 来自可信存储库的源基镜像
当我们创建一个容器镜像时,我们通常依赖于来自流行的私有或公共注册中心的种子镜像。要注意的是,在镜像生产的供应链中,有人可以渗透并丢弃恶意代码,从而为攻击者打开大门。举个例子,2018年,一些黑客用恶意的 javascript 代码攻击英国航空公司的网络应用程序,攻击他们的软件供应链。几年前,Docker 在 Docker Hub 上发现了一些镜像,这些镜像中安装了 Cryptominers。
以下是一些建议:
在创建容器镜像时,请使用来自知名的受信任发行者的强化基础镜像源。
选取那些经常使用最新的保安修补程式及修补程式发布的影像。
使用签名和标记的图像,并验证图像的真实性在拉停止人在中间的攻击。
2. 安装验证软件包
尽管基础镜像的来源需要来自可信来源,但基于同样的原因,安装在基础上的包也需要来自经过验证的可信来源。
3. 最小化镜像中的攻击面
我所说的表面积是指安装在镜像中的包和库的数量。常识是,如果对象的数量较少,那么存在漏洞的可能性也会降低。保持最小的镜像大小以满足应用程序运行时的要求。最好在一个应用程序容器中只有一个应用程序。
删除不必要的工具和软件,如包管理器(例如,yum,apt)、网络工具和客户机、镜像中的 shell、 netcat (可用于创建反向 shell)。
使用多阶段 Dockerfiles 从生产映像中删除软件构建组件。
不要暴露不必要的网络端口、套接字或在容器中运行不需要的服务(如 SSH 守护进程) ,以减少威胁。
选择alpine镜像或scratch镜像或容器优化的操作系统相比,全成熟的操作系统镜像为基础的镜像。
4. 不要在镜像中隐藏秘密
所有的秘密应该保持在镜像和 Dockerfile 之外。这些秘密包括 SSL 证书、密码、令牌、 API 密钥等应该保存在外部,并且应该通过容器编排引擎或外部秘密管理器安全地挂载。像 Hashicorp Vault、 Cloud 这样的工具提供了像 AWS Secrets Manager、 Kubernetes Secrets、 Docker Secrets management、 CyberArk 等这样的秘密管理服务,可以改善安全状况。
5. 使用安全的私人/公共仓库
通常这些企业都有自己的专有软件和库的基础镜像,他们不想公开发布。确保镜像托管在安全可信的仓库上,以防止未经授权的访问。使用具有可信 Root CA 的 TLS 证书,并实现强身份验证以防止 MITM 攻击。
6. 不要使用特权用户或根用户在容器中运行应用程序
这是容器化工作负载中最常见的错误配置。考虑到最少特权的原则,创建一个应用程序用户,并使用它在容器内运行应用程序进程。为什么不是root用户呢?原因是,在容器中运行的进程与在主机操作系统上运行的进程类似,只是它有额外的元数据来标识它是容器的一部分。通过容器中root用户的 UID 和 GID,您可以访问和修改由根在主机上编写的文件。
注意——如果您没有在 Dockerfile 中定义任何 USER,通常意味着容器将与root用户一起运行。
7. 在 CI/CD 中实现镜像漏洞扫描
在为容器构建和交付设计 CI/CD 时,包含一个镜像扫描解决方案来识别漏洞(CVEs) ,并且不要在没有补救的情况下部署可利用的镜像。可以使用 Clair,Synk,Anchore,AquaSec,Twistlock 等工具。一些集装箱注册中心如 AWS ECR、 Quay.io 都配备了扫描解决方案——一定要使用它们。
8. 像 AppArmor 一样启用内核安全配置文件
AppArmor 是一个 Linux 安全模块,用于保护 OS 及其应用程序免受安全威胁。Docker 提供了一个默认配置文件,允许程序访问有限的资源集,如网络访问、内核功能、文件权限等。它减少了潜在的攻击面,提供了很好的深度防御。
9. 安全集中和远程日志记录
通常,容器在 STDOUT 上记录所有的日志,这些日志一旦被终止就会丢失,因此将日志安全地分流到一个集中的系统以便进行审计和未来取证非常重要。我们还需要确保这个日志系统是安全的,并且没有日志中的数据泄漏。
10. 部署运行时安全监控
即使您根据存储库数据部署漏洞扫描解决方案并采取所有必要的预防措施,仍然有可能成为受害者。为了防止和检测恶意行为,持续监视和记录应用程序的行为非常重要。
“网络安全没有灵丹妙药,分层防御是唯一可行的防御。”- ICIT Research
通过实现上面的最佳实践,您可以使攻击者更难找到利用您的系统的方法。我指出了一些可用于审计和保护容器的工具和参考。安全是一个很大的话题,我们在本文中没有涉及到 Kubernetes 的特定控制,但是请继续关注,我们可以有一篇关于 Kubernetes 安全最佳实践的后续文章。
用于安全控制的开源工具
为了简化安全控制的采用,我建议使用一些开放源码和商业产品,这些产品可用于发现当前状态,为您的工作负载生成通知。
Docker-bench-security-Docker 自己的官方工具,根据行业标准基准的 Docker 的 CIS 基准对集装箱工作负载进行审计。
使用这个链接对 Dockerfile 进行静态程序分析处理。连接器帮助实现最佳实践。它可以与流行的代码编辑器和集成管道集成。
Clair-Clair 是一个流行的应用程序容器静态漏洞扫描工具。它定期从各种漏洞数据库中提取元数据。替代品有 Anchore,Synk,Trivy。
OWASP Cheatsheet-OWASP 是一个非常受安全专家欢迎的开放社区。这个备忘单是一个很好的开始。
是一个支持自动配置、漏洞和修补程序检查、技术控制遵从活动和安全度量的规范的多用途框架安全内容自动化协议。它实现了 NIST 标准。
Sysdigfalco-Falco 可用于实现运行时安全性。它使用高效的 eBPF 拦截电话和流量,以进行实时监控和取证。随着黑客的不断发展,新的漏洞会被发现,而静态扫描工具通常不会发现。一个具有机器学习能力、持续行为监控和基于 AI/ml 的先进引擎的解决方案不容忽视。
来自 AquaSec,Twistlock,Sysdig,Synk,Qualys for enterprise 级别的安全工具和解决方案的商业产品。