system: [SYSTEM]

user: 4. 安全部署指南 采取预防性安全措施可以使我们避免漏洞的发生。Docker容器安全性也是如此。通过对Docker容器安全问题采取多种预防手段，可以开发更安全可靠的应用程序。本节将概述Docker平台的一些安全部署指南。 4.1. Docker镜像 如前所述，镜像中毒是Docker的安全问题之一。但是，从Docker1.3及以后的版本提供加密签名支持。通过这种方法，用户将能够发现官方存储库镜像的真实来源和完整性。此功能将减少中毒镜像的危险，并降低可能的安全威胁。强烈建议所有镜像都应从经过身份验证的下载源下载并支持加密签名。 4.2. 网络命名空间 在TCP端口上运行Docker可能会造成重大的安全隐患。这种方法允许任何人访问特定端口以获得对容器的访问。这导致在主机上获得root访问权限，或者可以访问Docker组。因此，严格要求确保使用SSL对通信进行充分加密，同时通过TCP提供对守护进程的访问。这种方法可以防止未经授权的各方与之交互。 为了进一步增强安全性管理，可以对Docker0实现内核防火墙iptables规则。例如，可以限制Docker容器的源IP范围 [ 13 ] 。这将阻止容器与外界通信。 4.3. 日志记录和审查 日志记录和审计为Docker安全管理提供了额外的安全保护。通过这种方式，用户可以监控流量以确保不会发生任何可疑活动。 4.4. SELinux/AppArmor Docker提供Linux内核安全模块，如AppArmor和Security-Enhanced Linux (SELinux) [ 14 ] 。可以通过访问控制安全策略配置这些Linux内核安全模块。凭借配置这些安全模块，用户可以实现强制访问控制以限制系统资源。 通过配置SELinux，Docker将通过权限检查策略获得额外的安全层。SELinux通过标签管理所有内容。在Docker系统中，每个进程，文件/目录和系统对象都有一个标签。系统管理员通过使用这些标签编写规则来管理系统对象和进程之间的访问。 与SELinux类似，AppArmor是另一种Linux安全增强模型。AppArmor提供对各个程序的控制访问。通过此模型，管理员可以将安全配置文件加载到每个单独的程序中，以限制和管理程序的功能。 要加载SELinux或AppArmor安全策略正在使用的标签限制可以使用Docker中新添加的--security-opt参数进行配置，如下所示： --security-opt=label:user:USER: Set the label user for the container --security-opt=label:role:ROLE: Set the label role for the container --security-opt=label:type:TYPE: Set the label type for the container --security-opt=label:level:LEVEL: Set the label level for the container --security-opt=apparmor:PROFILE: Set the apparmor profile to be applied to the container Example: docker run --security-opt=label:level:s0:c100，c200 -i -t centos bash 4.5. 守护进程的特权 建议不要使用--privileged命令，因为--privileged命令将允许容器访问主机上的所有设备，并且它将为容器提供显式LSM(即AppArmor或SELinux)配置。LSM配置将提供与主机进程类似的控制级别 [ 15 ] 。 通过避免使用--privileged命令可以帮助减少安全风险并承担妥协。合法用户应该能够使用-u选项启动守护程序。它可以减少容器内强制执行的权限。例如： docker run -u -it /bin/bash 4.6. Cgroups Cgroups提供了一种计算方法来对每个容器的资源进行限制。因此，Cgroups通过限制系统资源耗尽提供了大量的功能来避免DoS攻击 [ 16 ] ： CPU使用率：docker run -it --rm --cpuset=0，1 -c 2 ... 内存使用率：docker run -it --rm -m 128m ... 存储使用率：docker -d --storage-opt dm.basesize=5G 4.7. SUID/GUID二进制文件 为避免容器突破而造成的安全漏洞，应禁止SUID和SGID二进制文件。这可以通过减少特定命令行参数进而减少容器功能来实现。 另一种方法是使用nosuid属性挂载文件系统。通过应用此命令，用户可以避免SUID导致的缓冲区溢出而造成的安全问题： docker run -it --rm --cap-drop SETUID --cap-drop SETGID ... 4.8. 设备组 设备隔离也是避免许多安全漏洞的关键方法之一 [ 17 ] 。默认情况下，容器包含所有权限。为避免此类问题，需要通过内置的“--device”选项安装设备，不要将“-v”与“--privileged”参数一起使用。 通过第三组选项可以为设备利用一组严格的权限;“rwm”分别覆盖read，write和mknod权限。例如，可以通过以下命令设置声卡只读权限： docker run --device=/dev/snd:/dev/snd:r ... 4.9. 服务和应用 如果Docker容器安全性受到损害，若此时有许多敏感服务正在运行，这种情况可能会导致巨大的灾难。因此，为了避免这种情况，请考虑隔离敏感服务。通过在虚拟机中运行敏感服务(SSH服务)，我们可以在系统中添加额外的安全层。还应避免使用不受信任的应用程序在容器内以root权限运行。 4.10. Linux内核 有时，过时的内核更容易出现安全漏洞。因此，内核与系统提供的更新实用程序(例如apt-get，yum等)为最新版本是非常重要的。通过将内核与GRSEC或PAX结合使用，可以有效地防范内核损坏错误。 4.11. 用户命名空间 目前，Docker不直接支持用户命名空间。但是，Docker的容器可以通过应用克隆系统调用或使用“取消共享”功能，在支持的内核上使用它们。通过LXC驱动程序支持UID映射，但是在本机libcontainer库中不被支持。 用户命名空间允许Docker守护程序作为主机上的非特权用户执行 [ 18 ] 。但是，此Docker守护程序将显示为像容器内一样执行。 4.12. libseccomp(和seccom -bpf扩展名) 系统调用过程对系统操作并不重要。应对其进行限制，以避免在受损容器内滥用。要限制Linux内核的系统调用过程，请使用libseccomp库。此功能目前尚未开发。此功能在LXC驱动程序中可用，但在libcontainer中不可用。 可以使用以下命令重新启动Docker守护程序以使用LXC驱动程序： docker -d -e lxc 4.13. 完全虚拟化 从容器升级到主机可能非常危险。如果在Docker镜像中利用了内核漏洞，就会发生这种情况。要防止此类风险，请使用包含Docker的完整虚拟化解决方案，例如KVM [ 19 ] 。Docker提供了嵌套Docker镜像以提供KVM虚拟化层的功能。 4.14. 安全审计 安全审计是保护系统免受重大安全风险的关键方法之一。应定期审核主机系统和容器，以评估和识别可能出现的漏洞和错误配置。这些漏洞和错误配置可能会对我们的系统造成危险，并可能危及资源 [ 20 ] 。 4.15. 多租户环境 容器应该在专用主机上运行。这对于集装箱的安全非常重要。当用户处理一些敏感操作时，它变得更加重要。 建议使用Docker容器内核的共享特性。因为Docker容器内核的多租户环境可以提供安全的职责分离。因此，强烈建议容器应该在专用主机上运行 [ 21 ] 。 通过将集装箱之间通信减少到非常低的水平，也可以实现更安全的环境。可以通过将Docker守护进程设置为使用--icc = false来实现。另外，在需要时指定-link与Docker一起运行也很有用。 4.16. Docker内容信任 内容信任是一项新功能，可以为容器提供额外的安全层。Docker1.8.0版中添加了此功能。它将允许Docker用户在下载Docker镜像之前符合容器镜像的合法性(在任何公共Docker Hub上都可用)。 此功能基本思想是保护Docker平台，并向用户保证他们不会在其基础技术架构上部署任何可能有害的东西。