stream was reset: CANCEL
众所周知,基于云原生“工程思维”的角度,一个接近完美、精心设计的 Dockerfile 应将避免需要特权容器,暴露不必要的端口,安装未使用的软件包,泄露的凭据等,或者可以用于攻击的任何东西。...因此,我们在进行容器构建过程中默认情况下阻止以 root 用户身份运行的容器(即,Openshift需要额外的SecurityContextConstraints)。...以非 root 用户身份运行可能需要在 Dockerfile 中执行几个附加步骤,具体需要以下: A:确保用户说明中指定的用户存在于容器中。...虽然这两种方法比以 root 用户身份运行要好,但它们可能无法在像 Openshift 这样的受限环境中工作。...(2)可执行文件不可写 通常,容器中的每个可执行文件都归 root 用户所有,即使它是由非根用户执行的,并且不应该是所有用户可写的。
写出这样 Dockerfile 的团队真是太懒了。已经有这么个在虚拟机中安装应用的 puppet 脚本,在编写 Dockerfile 时翻新一下拿过来就要用。...现实中我见过很多依赖于“神奇”方法的 Dockerfile,对其可被构建的时机和位置都有特殊要求。...在本例中,Dockerfile 很小,有副作用的语句也容易定位 (mysql 命令) 并移动到合适的位置以修正层缓存。...生产服务器不应该访问 git 仓库。如果一个企业严肃对待安全性问题,这种模式甚至不会被安全委员会批准。生产服务器安装了 git 本身就莫名其妙。...如果我是一名运维人员,还得专心安装上全套 Java 本地化开发库,就为了构建这么一个文件。如果你工作在一个使用了多种编程语言的机构中,不光是运维人员,对于整个构建节点,这个过程都会迅速变得脱离控制。
可以被滥用来接管你的系统的攻击向量有很多,例如: 启动的应用程序(在你 Dockerfile 的 ENTRYPOINT 中指定)以 root 用户身份运行。...3以非 root 用户身份运行 默认情况下,当有人通过“docker runyourImage:yourTag“运行你的镜像时,这个容器(以及你在 ENTRYPOINT/CMD 中的程序)会以 root...如果这些文件是在 Dockerfile 的开头以根用户身份创建的(存储在 /root/ 下面,而不是 /home/appuser/ 下面),那么你的程序期望在用户的主目录中的某个地方(例如~/.cache...小于等于 1024 的端口只能以 root 用户身份使用,或者以一些高级 Linux 能力来使用,但你不应该仅仅为了这个目的而给你的容器这些能力。...请参考我之前文章中的 Docker slim 部分以了解更多细节。 11使用最小的基础镜像 一个镜像中存储的软件(如 CLI 工具等)越多,攻击面就越大。
你想避免在添加新的 Python 包时不得不不断地更新 Dockerfile 以安装必要的系统级依赖。...使用无特权的容器 默认情况下,Docker 在容器内以 root 身份运行容器进程。...然而,这是一个糟糕的做法,因为在容器内以 root 身份运行的进程在 Docker 主机中也是以 root 身份运行。...然而,请记住,Docker 守护进程和容器本身仍然是以 root 权限运行的。 请务必查看以非根用户身份运行 Docker 守护进程,以获得以非根用户身份运行守护进程和容器的帮助。 6....这些信息不应该在没有加密的情况下被放入你的镜像中,因为未经授权的用户如果获得了镜像的访问权,只需要检查这些层就可以提取密钥。
可以被滥用来接管你的系统的攻击向量有很多,例如: 启动的应用程序(在你 Dockerfile 的 ENTRYPOINT 中指定)以 root 用户身份运行。...,这个容器(以及你在 ENTRYPOINT/CMD 中的程序)会以 root 用户身份运行(在容器和主机上)。...如果这些文件是在 Dockerfile 的开头以根用户身份创建的(存储在 /root/ 下面,而不是 /home/appuser/ 下面),那么你的程序期望在用户的主目录中的某个地方(例如~/.cache...小于等于 1024 的端口只能以 root 用户身份使用,或者以一些高级 Linux 能力来使用,但你不应该仅仅为了这个目的而给你的容器这些能力。...请参考我之前文章中的 Docker slim 部分以了解更多细节。 11 使用最小的基础镜像 一个镜像中存储的软件(如 CLI 工具等)越多,攻击面就越大。
runAsUser, runAsGroup默认情况下,Docker容器以root用户的身份运行,从安全角度看这并不理想。...虽然对容器内部的访问权限仍有限制,但在过去一年中,出现了多个容器漏洞,只有在容器以root用户身份运行时才能利用这些漏洞,确保所有容器以非root用户身份运行是一个很好的加固步骤。...编辑然而,在执行此操作时,重要的是要确保容器在以非root用户身份运行时能够正常工作。如果原始容器镜像被设计为以root身份运行,并且有限制性的文件权限,可能会导致应用程序的运行出现问题。...如果你的应用程序设计为以非root用户身份运行,那么它根本不需要任何能力。一般来说,对能力的处理方法应该是首先删除所有的能力,如果你的应用需要这些能力,再把特定的能力加回来。...通常,运行中的容器不应该在容器文件系统中存储有关应用程序的任何状态。这是因为它们可能随时被降速并在集群的其他地方创建新版本。
runAsUser, runAsGroup 默认情况下,Docker容器以root用户的身份运行,从安全角度看这并不理想。...虽然对容器内部的访问权限仍有限制,但在过去一年中,出现了多个容器漏洞,只有在容器以root用户身份运行时才能利用这些漏洞,确保所有容器以非root用户身份运行是一个很好的加固步骤。...然而,在执行此操作时,重要的是要确保容器在以非root用户身份运行时能够正常工作。如果原始容器镜像被设计为以root身份运行,并且有限制性的文件权限,可能会导致应用程序的运行出现问题。...这不应该在应用工作负载中使用,而应该只在完全必要的情况下使用。...通常,运行中的容器不应该在容器文件系统中存储有关应用程序的任何状态。这是因为它们可能随时被降速并在集群的其他地方创建新版本。
2.设定最小权限的 USER 运行容器 描述: 如果 Dockerfile 中没有指定 USER ,Docker 默认将会以超级用户 root 的身份运行容器,容器所属的命名空间(namespace)因此映射为...不应该在生产环境中使用任何不安全的镜像仓库。不安全的镜像仓库中的镜像可能会被篡改,从而导致生产系统可能受到损害。...默认值: 默认情况下,容器以root权限运行,并以容器中的用户root身份运行。...因此,除了容器的真正需要的软件之外,不要安装其他多余的软件。 检测方法: 进入容器中执行命令检查安装的软件包 判断方法: 查看软件包列表并确保它是合法的。...默认值: Docker默认为读写卷,也可以以只读方式挂载一个目录。默认情况下,不会在容器上挂载敏感的主机目录。 5.5 SSH 不在容器中运行 描述: SSH服务不应该在容器内运行。
中应该尽量避免安装不必要的软件包,除非是真的要用到。...因为,安装非必要的软件包除了会造成镜像体积的增大 也会 增加受攻击的风险程度。...3.4 以非root用户启动容器 在 Linux 系统中,root用户意味着超级权限,能够很方便的管理很多事情,但是同时带来的潜在威胁也是巨大的,用 root 身份执行的破坏行动,其后果是灾难性的。...在容器中也是一样,需要以非root 的身份运行容器,通过限制用户的操作权限来保证容器以及运行在其内的应用程序的安全性。...因此,建议在Dockerfile中添加命令来让容器以非root用户身份启动,在我司的CI Pipeline中的实践: ......
在这一步各种不小心都会引入问题,比如Dockerfile内没有通过USER指令指定container应以何种账号运行,那么大概率Docker runtime会默认以root身份运行你的容器。...我们都知道Dockerfile需要以FROM开始(ARG不算在build流程之中)。FROM意味着我们会在目标镜像里引入rootfs。rootfs中包含了我们的应用正常运行所必须的库和基本的工具集。...现在的最佳实践都劝大家把镜像做成immutable的,也就是镜像运行时,rootfs应该都是只读的,不应该发生安装应用到/bin目录之类的写操作,当然写数据到临时目录除外。 这样做的后果很容易想到。...如2019年发现的漏洞CVE-2019-5736,它导致18.09.2版本之前的Docker允许恶意容器覆盖宿主机上的runC二进制文件,由此使攻击者能够以root身份在宿主机上执行任意命令。...攻击者还部署了恶意软件,即如今臭名昭著的“SunSpot”,它以高权限运行,扫描 Orion 构建。 图 2:编译镜像时涉及到的攻击风险 其它。此处省略1万字。容我调皮一下。 2.
2.2 没有软件包列表 默认的镜像(如Ubuntu)是不包含软件包列表的,目的是让镜像体积更小。因此需要在任何的基础的Dockerfile中需要使用apt-get update。...2.3 留意软件包的版本 注意软件包的安装,因为这些命令也是会缓存起来的。意味着如果你清空了缓存,你可能会得到不同的版本;或者如果缓存长期不更新,你可能不会得到最新的安全更新。...我们可以在Dockerfile中覆盖ENTRYPOINT以让我们的容器像在接受命令行参数(默认的参数在Dockerfile中的CMD指定)。...安全 5.1 以root身份运行Docker Docker API能给root的访问权限,因为你可以将/映射成一个卷,然后读或者写。或者你可以通过--net host接管宿主机的网络。...5.2 Dockerfile中的USER 默认下Docker可以以root的身份运行任何命令,但是你可以使用USER。Docker没有用户的命名空间,因此容器将用户看作是宿主机上的用户。
在 Java 镜像中仅安装需要的内容 3. 使用多阶段构建 Java 镜像 4. 防止敏感信息泄漏 5.不要以 root 用户运行容器 6. Java 应用程序不要使用 PID 为 1 的进程 7....在 Java 镜像中仅安装需要的内容 以下命令会在容器中构建 Java 程序,包括其所有依赖项。这意味着源代码和构建系统都将会是 Java 容器的一部分。...因此,必须确保你不以 root 用户身份运行应用程序。 但默认情况下,创建 Docker 容器时,你将以 root 身份运行它。尽管这对于开发很方便,但是你不希望在生产镜像中使用它。...这意味着你应该在 Docker 镜像中更新到 Java 的最新版本,或者确保至少使用 Java 8 update 191 或更高版本。 10....从安全性的角度来看,我的观点是,以完全控制和正确的方式创建 Dockerfile,是创建镜像更好,更安全的方式。 ---- ---- 欢迎加入我的知识星球,一起探讨架构,交流源码。
来源:toutiao.com/article/6959742944421200387/ 你想构建一个 Java 应用程序并在 Docker 中运行它吗?...在 Java 镜像中仅安装需要的内容 以下命令会在容器中构建 Java 程序,包括其所有依赖项。这意味着源代码和构建系统都将会是 Java 容器的一部分。...因此,必须确保你不以 root 用户身份运行应用程序。 但默认情况下,创建 Docker 容器时,你将以 root 身份运行它。尽管这对于开发很方便,但是你不希望在生产镜像中使用它。...这意味着你应该在 Docker 镜像中更新到 Java 的最新版本,或者确保至少使用 Java 8 update 191 或更高版本。 10....从安全性的角度来看,我的观点是,以完全控制和正确的方式创建 Dockerfile,是创建镜像更好,更安全的方式。
在基于Debian的distribution中,比如ubuntu或debian,是由psmisc软件包提供的。如果我没有弄错的话,它将被包含在基本系统安装中,所以不需要安装任何东西。...所以,你不应该在开始和停止矿工的过程中花费太多精力,只需要想想,运行TF或者PyTorch时要为你的深度学习优化分配多少GPU。...如果还没有安装,可以将配置文件放入/etc/supervisor/conf.d/gpu_mon.conf中。以下是我使用的配置: ?...2、多用户访问GPU 如果gpu_mon以一个用户身份运行,但是深度学习软件可以作为另一个用户或由多用户运行,则gpu_mon可能无法抢占矿工。...如果你遇到这种情况,但是仍然想要使用gpu_mon,你有两种选择: *以root身份运行gpu_mon。我不推荐这种方法,因为以root身份启动某些东西总是一个坏主意。
自己的登录界面不应该在用户应用一端准备。...敏感信息(如密码或认证令牌)不应输出到日志中。 日志信息可以从其他应用读取,因此可能成为信息泄露的原因。 此外,如果帐户名称的泄漏可能导致损失,则不应将帐户名称输出到日志中。...在 Android 操作系统中存在漏洞的情况下,攻击者可以获得 root 权限或系统权限,保存在accounts.db中的认证信息将处在风险边缘。...5.3.2.8 应该在验证认证器是否正常之后,执行帐户流程(必需) 如果有多个认证器在设备中定义了相同的帐户类型,则先前安装的认证器将生效。 所以,安装自己的认证器之后,它不会被使用。...如果之前安装的认证器是恶意软件的伪装,则用户输入的帐户信息可能被恶意软件接管。 在执行帐户操作之前,用户应用应验证执行帐户操作的帐户类型,不管是否分配了常规认证器。
一般来说,就像我们不会在标准Linux服务器上以root身份运行进程一样,我们大部分容器应用部署时,也不会在容器中以root身份运行。...如何防止容器以root权限运行 如果不确定基础镜像使用什么权限,应该强制使用自定义用户的非root用户或用户组。...然后,Dockerfile中添加User,并以此用户或组以构建镜像和启动容器运行时进程命令 FROM centos:7 RUN groupadd -g 1000 basicuser &...比如在ubuntu仓库中,有些镜像的大小是部分版本的2倍以上。 所以在您获取镜像时,不要单纯的只获取最新版本的镜像,最理想的是获取占用空间最小的镜像,然后自主添加应用所需的软件包和依赖。...要排除这些,应该在要从中构建映像的根目录中设置一个.dockerignore文件。
它足够高吗?是不是比要低,这样你要常 识升级这些包。如果还不行的话,你可以尝试编译你要编译软件的以前的版本。老版本通常使用老版本的库/程序 如果....然而,寻找其他方法来安装软件或者找一个替代品是最好的方法。如果您系统的特定软件版本比要求的版本低,您可 以或者编译一个bleeding-edge包,或者您的发行版太旧了,或者都有包括。。。...可以这样来打补丁 patch -Npl -i 注意当你打补丁时你应该在源代码路径中 三: Make install 错误 这些错误理解起来很容易,但是我还是列一下吧~通常有两大失败原因...对于sudo来讲的话,它只用root权限来运行一次命令,并不会以 root身份登录的。 2. 您编译的包没有安装目标。这样,您就需要将编译好的二进制文件放到bin文件夹中。...将上述命令添加到您的/etc/profile文件中,这样可永久保存。 我同意这样做不太好,不够简洁和方便。但是有时候开发者没有时间开创建一个安装目标。我们不应该对此感到气氛。。。
您还需要密码,或者如果您安装了SSH密钥进行身份验证,则需要“root”用户帐户的私钥。...第二步 - 创建一个新用户 一旦您以root用户的身份登陆,我们就准备添加我们将用于从现在开始登录的新用户帐户。...在服务器上,以root用户身份输入以下命令以临时切换到新用户(替换您自己的用户名): su - sammy 现在,您将进入新用户的主目录。...我们将用nano来编辑文件: nano ~/.ssh/authorized_keys 现在通过将公钥粘贴到编辑器中来插入公钥(应该在剪贴板中)。...您现在可以在服务器上安装所需的任何软件。 更多Ubuntu教程请前往腾讯云+社区学习更多知识。 ---- 参考文献:《Initial Server Setup with Ubuntu 16.04》
我需要使用最新的还是固定的标签版本?...这种选择通常也适用于我们在挑选生产环境软件版本 始终使用非特权用户 默认情况下,容器内的进程以 root (id=0) 身份运行。 为了执行最小权限原则,我们应该设置一个默认用户。...二、通过在 Dockerfile 中创建默认用户 比较常见,例如 nginx 官方 Dockerfile FROM RUN addgroup -S appgroup \ &...授予某人访问权限等同于授予对你的服务器 root 权限。...尽量避免以下操作 -v /var/run/docker.sock://var/run/docker.sock 特权能力和共享资源 首先,容器永远不应该以特权身份运行,否则,它拥有主机的 root 权限。
这个特性迫使用户改变处理和管理容器的心态;我将会向你说明在容器中不应该做的那些事,以确保容器可以发挥出最佳效果: 1) 不要将数据存储在容器中 - 容器可以被停止,销毁或者替换。...不要安装不必要的包或运行“更新” (yum更新) ,下载许多文件到一个新的图像层。...始终使用Dockerfile或任何其他完全可重复的S2I(源图像)的方法,如果将它存储在源代码控制存储库(git)中,您可以跟踪对Dockerfile的更改。...9)不要以root用户身份运行进程 - “默认情况下,docker容器会以root身份运行。随着Docker的成熟,更安全的默认选项可能会变得可用。...现在,要求root对其他人来说是危险的,并且可能在所有环境中都不可用。
领取专属 10元无门槛券
手把手带您无忧上云