这篇关于容器安全的文章展示了10种方法来强化您的Docker基础设施并保护您的容器和数据免受恶意攻击。简介随着许多公司在其基础设施中采用Docker,威胁行为者的攻击面有所增加。这需要保护Docker基础设施。在本文中,提到了一些可以加强Docker容器安全性的要点。要充分利用本文,您必须:熟悉Linux命令行关于容器化和Docker的基本概念什么是Docker?Docker是一个开源容器化平台。它允许开发人员将应用程序打包到容器中:标准化的可执行组件,将应用程序源代码与运行该代码所需的操作系统(OS)库和依赖项相结合。十大最佳实践Docker文档概述了保护Docker容器时需要考虑的四个主要方面:内核对命名空间和cgroup的支持Docker守护进程的攻击面容器配置错误使用Linux内核安全模块,如AppArmor、SELinux等。我们将这些都破坏了深入了解您可以遵循的10大实践,以强化您的Docker环境。1.频繁更新的主机和Docker守护进程容器与主机系统共享一个内核。在容器上下文中执行的任何内核漏洞利用都会直接影响主机内核。内核提权漏洞DirtyCow在容器中执行时可能导致对主机的root访问。因此,保持主机和Docker引擎最新是很重要的。2.不要暴露Docker守护进程套接字Docker客户端和Docker守护进程之间发生的所有通信都是通过Docker守护进程套接字发生的,这是一个UNIX套接字,通常位于/var/run/docker.sock,它允许访问码头工人API。传统的UNIX文件权限用于限制对套接字的访问。在默认配置中,套接字由root用户拥有。如果其他人获得了对套接字的访问权限,他们将拥有对主机的根访问权限。设置权限,以便只有root用户和docker组可以访问Docker守护进程套接字使用SSH保护Docker守护进程套接字使用TLS(HTTPS)保护Docker守护进程套接字。这允许通过HTTP以安全的方式访问Docker不要让守护程序套接字可用于远程连接,除非你使用Docker的加密HTTPS套接字,它支持身份验证不要使用-v/var/run/等选项运行Docker映像docker.sock:/var/run/docker.sock,这会在生成的容器中公开套接字。请记住,以只读方式安装套接字不是解决方案,它只会使其更难损坏。dockercompose文件中的一个示例是:volumes:-"/var/run/docker.sock:/var/run/docker.sock"要检查您是否已经有一个容器在此配置中运行:dockerinspect--format='{{.HostConfig.Binds}}'[containerid]3.以无根模式运行DockerDocker守护程序可以作为非root用户运行,以防止Docker中的潜在漏洞。这称为“无根模式”。Rootless模式不需要root权限来安装Docker以与DockerAPI通信。在无根模式下,默认情况下,Docker守护进程和容器在没有根权限的用户命名空间中运行。(1)以无根模式运行Docker使用sudo权限安装uidmap包:apt-getinstall-yuidmap从Docker官网获取安装脚本并运行:curl-fSsLhttps://get.docker.com/rootless|sh获取无根安装脚本:复制以export开头的最后两行并将它们粘贴到~/.bashrc文件的末尾。这确保每次打开Bashshell时,都会设置这两个变量:PATH和DOCKER_HOST。.bashrc运行source~/.bashrc以在当前shell会话中设置这些变量。运行systemctl--userstartdocker以启动Docker引擎。我们可以通过运行以下命令来检查docker是否正在运行docker版本:4.容器资源配置控制组或cgroups是Linux内核功能,在启用容器的资源分配和限制方面起着关键作用。他们的工作不仅是确保每个容器获得其公平份额的资源,例如内存和CPU,而且还要确保单个容器不会因耗尽这些资源之一而导致系统崩溃。限制资源可防止拒绝服务攻击。以下是一些可用于限制容器资源的CLI标志:--memory=——最大内存量--restart=on-failure:——重启次数--memory-swap—交换内存量--cpus=—容器可用的最大CPU资源--ulimitnofile=—文件描述符的最大数量--ulimitnproc=—最大进程数默认情况下,Docker允许容器使用主机内核允许的尽可能多的RAM和CPU资源。所以需要设置资源约束来防止容器和主机出现安全问题。5.避免使用特权容器(1)避免使用--privileged标志Docker有一个特性,允许容器在主机上以root权限运行。这是通过--privileged标志完成的。以特权模式运行的容器对主机上的所有设备具有根访问权限。如果攻击者要破坏特权容器,他们可能会轻松访问主机上的资源。SELinux等系统中的安全模块也很容易被篡改。因此,不建议在开发生命周期的任何阶段以特权模式运行容器。特权容器是一个主要的安全风险。滥用的可能性是无穷无尽的。攻击者可以识别主机上运行的服务以发现和利用漏洞。他们还可以利用容器的错误配置,例如身份验证较弱或没有身份验证的容器。特权容器为攻击者提供根访问权限,从而导致恶意代码执行。避免在任何情况下使用它们。要检查容器是否在特权模式下运行,请使用以下命令:dockerinspect--format='{{.HostConfig.Privileged}}'[container_id]true表示容器有特权false表示容器没有特权(2)使用no-new-privileges选项在创建容器时添加no-new-privileges安全选项,以禁止容器进程使用setuid或setgid二进制文件提升其权限。这可以防止容器内的进程在执行期间获得新的权限。因此,如果有设置了setuid或setgid位的程序,任何通过该程序获得特权的尝试都将被拒绝。6.使文件系统和卷成为只读的Docker中一个有用的安全意识特性是使用只读文件系统运行容器。这减少了攻击向量,因为容器的文件系统不能被篡改或写入,除非它对其文件系统文件和目录具有明确的读写权限。以下代码将Docker容器设置为只读:dockerrun--read-onlyalpinesh-c'echo"readonly">/tmp'7.DropcapabilitiesLinux内核能够分解root用户的权限分为称为功能的不同单元。几乎所有与Linuxroot用户相关的特殊权限都分解为单独的功能。capshDocker显示的特权容器的功能施加了某些限制,使使用这些功能更加容易。文件的能力存储在文件的扩展属性中,扩展属性在构建Docker镜像时被剥离。这意味着您通常不必太担心容器中的文件功能。正如我们之前提到的,切记不要使用--privileged标志运行容器,因为这会将所有Linux内核功能添加到容器中。最安全的设置是使用--cap-dropall删除所有功能,然后仅添加您需要的功能。例如:dockerrun--cap-dropall--cap-addCHOWNalpine8.使用Linux安全模块考虑使用seccomp或AppArmor等安全模块。以下是一些著名的模块:Seccomp:用于允许/禁用在容器中运行的系统调用AppArmor:使用程序配置文件来限制单个程序的功能SELinux:使用安全策略,这是一组告诉SELinux应该做什么的规则访问或无访问强制执行策略允许的访问。这些安全模块可用于为进程和用户访问权限提供另一级别的安全检查,超出标准文件级访问控制所提供的级别。(1)seccomp默认情况下,容器获取默认的seccompprofile。https://github.com/moby/moby/blob/master/profiles/seccomp/default.json这可以被覆盖:dockerrun--rm-it--security-optseccomp=./seccomp/profile。jsonhello-world使用Seccomp配置文件运行容器使用Seccomp配置文件,您可以选择在容器中允许哪些系统调用,哪些系统调用被拒绝,因为在生产环境中并非所有系统调用都是必需的。您可以从Docker文档中了解有关编写seccomp配置文件的更多信息。(2)AppArmor容器默认使用docker-defaultAppArmor模板。可以使用--security-opt自定义配置文件覆盖默认设置。为此,您必须首先将新配置文件加载到AppArmor中以便与容器一起使用:apparmor_parser-r-W/path/to/custom_profile现在使用自定义配置文件运行容器dockerrun--rm-it--security-optapparmor=custom_profilehello-world请参阅此wiki以了解如何创建AppArmor配置文件。https://gitlab.com/apparmor/apparmor/-/wikis/QuickProfileLanguage