Docker安全最佳实践

5
大部分在互联网上找到的 Dockerfile 都是以 root 用户身份构建和运行软件的!这一定会让每个人都感到害怕,对吧?但实际情况似乎并非如此。
问题在于,即使在容器中,以 root 用户身份运行服务器也很危险,因为容器内的 root 用户与容器外的 root 用户几乎相同。
解决方案之一是通过使用“USER”指令来正确构建 Dockerfile,例如此 tor 中继示例
另一个解决方案是使用“Linux 用户命名空间”将容器内的 UID/GID 映射到容器外的 UID/GID。例如,在主机中,容器内的 root(uid=0)可以映射到您的个人用户帐户,因此在共享卷中创建的文件具有良好的权限。
那么我的问题是:在 Docker 安全性方面,最佳实践是什么?作为非 root 用户运行代码(即在 Dockerfile 中使用 USER 指令)?还是使用“用户命名空间”?或者最好同时使用 selinux 和/或 AppArmor?
谢谢 :)

我还想补充一点,通常不建议以root身份运行应用程序(例如Web服务器)。 - kondor
这份文档看起来很有趣:Docker 安全部署指南 - kondor
3个回答

3

引用Solomon Hykes

大家好,我是Docker的维护者。正如其他人已经指出的那样,这在1.0版本上不起作用。但它本可以。

请记住,在此时,我们不声称Docker开箱即用适合包含具有root权限的不受信任的程序。因此,如果你认为“哎呀,幸亏我们升级到了1.0,否则就完蛋了”,那么你现在需要更改底层配置。添加apparmor或selinux容器,将信任组映射到单独的机器上,或最好不要授予应用程序root访问权限。

所以从最佳实践的角度来看,如果您关心安全性,则使用命名空间和apparmor或selinux。话虽如此,很多人并不愿意花费额外的精力去做这些(好与坏),所以你会发现很多人都没有这样做。在容器内设置用户文件的权限(特别是挂载为卷的文件)有时会变得棘手,这就是为什么很多人会跳过这些额外的开销的原因。


1
除了SELinux、Apparmour和GRSEC之外,cgroups还提供了另一个优势,即在小心配置的情况下隔离和限制容器资源使用,这有助于防止一个受损的容器影响另一个容器。参考链接

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接