需要用root用户运行Docker?组织中,经常以Root用户运行Docker中的容器 。但是你的工作负载真的需要root权限吗?显然很少 。尽管如此,默认情况下,你的容器仍将以root用户身份运行,但这可能会带来严重的安全问题 。实际上,如果以root用户运行容器内部的进程,就是以root用户身份运行主机的进程 。这就为那些恶意访问主机的攻击者,提供了机会 。
只需在常用的任何镜像上使用以下命令,你就可以自己查看它使用的用户身份,
$ kubectl run -i --tty hello-world --image=hello-world --restart=Never -- sh# ps auxPIDUSERTIMECOMMAND1root0:10sh
显然,作为最佳实践,我们应该避免以超级用户身份运行容器 。因此,让我们看看如何以非root用户身份运行容器 。
将非root用户添加到Dockerfile你可以在Dockerfile中使用RUN命令创建用户,这个用户仅具有容器内工作负载所需的权限 。
RUN groupadd --gid 5000 newuser&& useradd --home-dir /home/newuser --create-home --uid 5000--gid 5000 --shell /bin/sh --skel /dev/null newuser
上面的命令行创建了一个用户newuser,并指定了用户登录后使用的主目录和shell。如下所示,将用户添加到你的Dockerfile中:
FROM ubuntu:18.04COPY . /myAppRUN make /myapp...USER newuserCMD Python /myapp/hello.py
【如何以非root用户运行Docker容器】从第5行开始,每个命令都是以newuser身份而不是root身份运行 。是不是很简单?
但是,我们并不总是仅使用自定义镜像 。我们还使用了许多第三方镜像,因此我们无法像上面那样将root权限的用户注入其中 。
这些第三方Docker镜像默认情况下将以root用户身份运行,除非我们对其进行处理 。如果你使用不知名来源中的镜像,那么该镜像很可能嵌入了恶意命令,这就可能会影响集群的安全性 。
Kubernetes中Pod安全上下文和Pod安全策略,可以帮助我们以非root身份运行三方镜像 。
使用Pod安全上下文你可以使用Pod安全上下文,将Pod的执行限制为特定的非root用户 。通过在Pod规范中添加一个字段securityContext,就可以为Pod指定这些安全设置。
apiVersion: v1kind: Podmetadata:name: my-podspec:securityContext:runAsUser: 5000runAsGroup: 5000volumes:- name: my-volemptyDir: {}containers:- name: my-containerimage: hello-worldcommand: ["sh", "-c", "sleep 10 m"]volumeMounts:- name: my-volmountPath: /data/hellosecurityContext:allowPrivilegeEscalation: false
在以上规范中,我们创建了一个为非root的用户,runAsUser指定Pod内的任何容器 仅以userID为5000的运行 。runAsGroup 指定的容器内所有进程的组ID 。否则,则组ID将是0 。
现在,你可以创建此pod并检查容器中运行的进程:
$ kubectl apply -f my-pod.yaml$ kubectl exec -it my-pod – shpsPIDUSERTIMECOMMAND150000:00sleep 10 m 650000:00sh
如上所示,PID 1正在以userID为5000的用户而不是root用户身份运行 。
使用Kubernetes Pod安全策略Kubernetes Pod安全策略定义了Pod必须运行的条件 。换句话说,如果不满足这些条件,Kubernetes将阻止Pod运行 。
PodSecurityPolicy示例:
apiVersion: policy/v1beta1kind: PodSecurityPolicymetadata: name: my-pspspec: privileged: false#Required to prevent escalations to root.allowPrivilegeEscalation: falseallowedCapabilities:- '*'volumes:- 'nfs'hostNetwork: truehostPorts:- min: 8000max: 8000hostIPC: truehostPID: truerunAsUser:#Require the container to run without root.rule: 'MustRunAsNonRoot'selinux:rule: 'RunAsAny'supplementalGroups:rule: 'RunAsAny'fsGroup:rule: 'RunAsAny'
该安全策略实现以下目的:
- 限制容器在特权模式下运行 。
- 限制需要根目录的容器 。
- 仅允许容器NFS存储卷 。
- 仅允许容器访问主机端口8000 。
kubectl create -f my-psp.yaml
查看:$ kubectl get pspNAMEPRIVRUNASUSERFSGROUPSELINUXVOLUMESMy-pspfalseMustRunAsNonRootRunAsAnyRunAsAny[nfs]
现在已经创建了策略,你可以通过尝试以root特权运行容器来对其进行测试 。$ kubectl run --image=my-root-container
pod安全策略将禁止其运行,并给出错误消息:$ kubectl get podsNAMEREADYSTATUSmy-root-pod0/1container has runAsNonRoot and image will run as root
结论在这篇文章中,我强调了默认设置下,使用root用户运行Docker容器有着固有风险 。我还提出了多种方法来克服这种风险 。
- 如果你正在运行自定义镜像,请创建一个新的非root用户并在Dockerfile中指定它 。
推荐阅读
- 花茶的感官鉴赏,如何鉴别花茶的好坏
- 薰衣草花茶搭配,花茶如何品饮
- 牛蒡茶最好是单独饮用,金银花茶如何贮存
- 薰衣草花茶如何选购,茉莉花茶如何喝
- 黑客基础入门,如何利用文件上传执行xss攻击!
- 教你如何一键生成Nginx配置,让配置不在繁琐
- 如何选购薄荷茶,如何挑选和保持花草茶的秘诀
- 如何冲泡白牡丹,茉莉花茶如何喝
- 如何用养生壶煮花茶,甘草山楂茶原料和做法
- 贡菊怎么保存,如何保存花草茶