本文翻译于Richard Lander的这篇英文文章:Secure your .NET cloud apps with rootless Linux Containers – .NET Blog (microsoft.com) 从 .NET 8 起,我们所有的 Linux 容镜像都将包含一个non-root 用户。只需要一行代码就能以non-root用户身份托管您的 .NET 容器。这个平台级的变化将会使你的应用程序更加安全,并使 .NET 成为最安全的开发者生态系统之一。这是一个小的变化,但对深层防御(defense in depth)影响巨大。 这一变化的灵感来源于我们早期在 Ubuntu Chiseled 容器中启用 .NET 的项目。Chiseled(又称 “distroless”)镜像旨在像设备一样,因此non-root是这些镜像最简单的设计选择。我们意识到,我们可以将Chiseled容器的non-root功能应用于我们发布的所有容器镜像。通过这样做,我们提高了.NET容器镜像的安全标准。 这篇文章是关于non-root容器的好处,创建它们的工作流程以及工作原理。在后续的文章中,我们也将讨论如何在Kubernetes中更好地使用这些镜像。另外,如果想要更简单的选项,那你应该查看.NET SDK 的内置容器支持。 最小特权 将容器托管为non-root符合最小特权原则。这是由操作系统提供的免费保安。如果以 root身份运行应用,那应用进程可以在容器中执行任何操作,例如修改文件、安装包或者运行任意可执行文件。如果您的应用程序受到攻击,这将是一个隐患。但是如果以non-root身份运行应用,你的应用进程将无法执行太多操作,从而极大地限制了攻击者的恶意操作。 non-root容器也可以认为是对安全供应链的贡献。通常,人们都是从阻止不良依赖项更新或排查组件来源的角度来探讨安全供应链。non-root容器在这两者之后。如果在你的进程中出现了不良依赖项(很有可能会),那么non-root容器可能是最好的最后防线。Kubernetes hardening最佳做法要求以non-root用户运行容器,也是出于这个原因。 浅识app 我们所有的 Linux 镜像–从 .NET 8 开始–将包含一个app用户。app用户将能够运行你的应用程序,但不能删除或更改容器镜像中的任何文件(除非你明确允许这样做)。这个命名也是一目了然,app用户除了运行你的应用程序外,几乎不能做任何事情。 这个app用户实际上并不是新的。它和我们用于Ubuntu Chiseled镜像的那个是一样的。这是个关键的设计点。从 .NET 8 开始,我们所有的 Linux 容器镜像都将包含app用户。这意味着您可以在我们提供的镜像之间进行切换,并且user和uid是一样的。 接下来我将描述 docker CLI 的全新体验。 $ docker run --rm mcr.microsoft.com/dotnet/aspnet:8.0-preview cat /etc/passwd | tail -n 1app:x:64198:64198::/home/app:/bin/sh 这是镜像中 /etc/passwd file的最后一行。这是 Linux 用于管理用户的文件。 根据行业指导 我们选择了一个相对较高的 uid,接近 2^16。我们还决定此用户应当有一个主目录。 $ docker run --rm -u app mcr.microsoft.com/dotnet/aspnet:8.0-preview bash -c "cd &&
원문출처 : https://devblogs.microsoft.com/dotnet-ch/%E4%BD%BF%E7%94%A8rootless-linux-%E5%AE%B9%E5%99%A8%E4%BF%9D%E6%8A%A4%E4%BD%A0%E7%9A%84-net-%E4%BA%91%E5%BA%94%E7%94%A8
원문출처 : https://devblogs.microsoft.com/dotnet-ch/%E4%BD%BF%E7%94%A8rootless-linux-%E5%AE%B9%E5%99%A8%E4%BF%9D%E6%8A%A4%E4%BD%A0%E7%9A%84-net-%E4%BA%91%E5%BA%94%E7%94%A8