最后更新于
最后更新于
Docker引擎利用Linux内核的命名空间和Cgroups来隔离容器,提供基本的安全层。通过Capabilities dropping、Seccomp和SELinux/AppArmor提供额外的保护,增强容器隔离性。认证插件可以进一步限制用户操作。
Docker引擎可以通过Unix套接字本地访问,也可以通过HTTP远程访问。对于远程访问,必须使用HTTPS和TLS来确保机密性、完整性和身份验证。
默认情况下,Docker引擎在Unix套接字上侦听unix:///var/run/docker.sock
。在Ubuntu系统上,Docker的启动选项定义在/etc/default/docker
中。要启用对Docker API和客户端的远程访问,请添加以下设置以通过HTTP套接字公开Docker守护程序:
然而,由于安全问题,不建议通过HTTP公开Docker守护程序。建议使用HTTPS来保护连接。保护连接的两种主要方法如下:
客户端验证服务器的身份。
客户端和服务器相互验证彼此的身份。
容器镜像可以存储在私有或公共存储库中。Docker为容器镜像提供了几种存储选项:
容器可能存在安全漏洞,这可能是由于基础镜像或安装在基础镜像之上的软件导致的。Docker正在开发一个名为Nautilus的项目,用于对容器进行安全扫描并列出漏洞。Nautilus通过将每个容器镜像层与漏洞存储库进行比较来识别安全漏洞。
docker scan
**docker scan
**命令允许您使用镜像名称或ID扫描现有的Docker镜像。例如,运行以下命令来扫描hello-world镜像:
Docker镜像签名确保容器中使用的镜像的安全性和完整性。以下是简要说明:
要激活Docker内容信任,请设置export DOCKER_CONTENT_TRUST=1
。此功能在Docker版本1.10及更高版本中默认关闭。
在启用内容信任的情况下尝试拉取未签名的镜像会导致“最新版本无信任数据”错误。
对于第一次之后的镜像推送,Docker会要求输入存储库密钥的密码以签署镜像。
要备份您的私钥,请使用以下命令:
在切换Docker主机时,需要移动根密钥和存储库密钥以保持运行。
命名空间是Linux内核的一个功能,将内核资源分区,使得一组进程看到一组资源,而另一组进程看到不同的资源。该功能通过为一组资源和进程使用相同的命名空间,但这些命名空间指向不同的资源来实现。资源可以存在于多个空间中。
Docker利用以下Linux内核命名空间来实现容器隔离:
pid命名空间
mount命名空间
network命名空间
ipc命名空间
UTS命名空间
有关命名空间的更多信息,请查看以下页面:
Linux内核功能cgroups提供了限制资源(如CPU、内存、IO、网络带宽等)的能力。Docker允许使用cgroup功能创建容器,从而实现对特定容器的资源控制。 以下是一个使用用户空间内存限制为500m、内核内存限制为50m、CPU份额为512、blkioweight为400创建的容器。CPU份额是控制容器CPU使用率的比率。它的默认值为1024,范围在0到1024之间。如果三个容器的CPU份额都是1024,则在CPU资源争用的情况下,每个容器最多可以占用33%的CPU。blkio-weight是控制容器IO的比率。它的默认值为500,范围在10到1000之间。
要获取容器的 cgroup,您可以执行以下操作:
权限提升允许对root用户可以允许的权限进行更精细的控制。Docker使用Linux内核的权限功能来限制容器内可以执行的操作,无论用户类型如何。
当运行Docker容器时,进程会放弃敏感权限,这些权限可以用来逃离隔离。这样可以确保进程无法执行敏感操作并逃脱:
这是一个安全功能,允许Docker限制容器内可以使用的系统调用: