Kubernetes SecurityContext 安全上下文 runAsUser以及阻止容器使用 root 户运行

本文介绍了如何在 Kubernetes 中通过安全上下文(securityContext)配置 pod 和容器的安全特性,包括指定运行用户、阻止以 root 用户运行以及限制内核访问权限。示例展示了如何创建使用非 root 用户运行的 pod,并演示了防止恶意镜像导致的安全风险。
摘要由CSDN通过智能技术生成

配置节点的安全上下文


除了让 pod 使用宿主节点的 Linux 命名空间,还可以在 pod 或其所属容器的描述中通过 security Context 边项配置其他与安全性相关的特性。这个选项可以运用于整个 pod ,或者每个 pod 中单独的容器。

了解安全上下文中可以配置的内容,配置安全上下文可以允许你做很多事

  • 指定容器中运行进程的用户(用户ID )。
  • 阻止容器使用 root 户运行(容器的默认运行用户通常在其镜像中指定,所以可能需要阻止容器 root 用户运行
  • 使用特权模式运行容器,使其对宿主节点的内核具有完全的访问权限
  • 与以上相反,通过添加或禁用内核功能,配置细粒度的内核访问权限。
  • SELinux C Security aced Linux 安全增强型 Linux )边项,加强对容器的限制。
  • 阻止进程写入容器的根文件系统
以下内容将开始探索这些边项的细节

运行 pod 而不配置安全上下文


首先,运行 个没有任何安全上下文配置的 pod (不指定任何安全上下文选项),与配置了安全上下文的 pod 形成对照:
$ kuhectl run pod-with-defaults --image alpine --restart Never  -- /bin/sleep 999999 
pod "pod-with defaults” created
来看一看这个容器中的用户 ID 和组 ID ,以及它所属的用户组 这可以通过在容器中运行 id 命令查看
$ kuhectl exec pod-with-defaults id 
uid;Q(root) gid;Q(root) groups;Q(root), l(b n), 2 (daemon), 3 (sys) , 4 (adrn) , 
6 (disk ),工 (wheel), 11 (floppy), 20 (dialout), 26 (tape), 27 (v deo)

[root@k8s-master ~]# kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
nginx-6799fc88d8-drb2s   1/1     Running             3          263d

[root@k8s-master ~]# kubectl exec -it nginx-6799fc88d8-drb2s bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-6799fc88d8-drb2s:/# id
uid=0(root) gid=0(root) groups=0(root)
root@nginx-6799fc88d8-drb2s:/# 
这个容器在用户 ID (uid )为 的用 户,即 root ,用户组 ID (gid )为 (同 样是 root )的用户组下运行 它同样还属于 一些其 他的用户组。
注意 : 容器运行时使用的用户在镜像中指定 Dockerfile 中,这是通过使用USER 命令实现的,如果该命令被省略,容器将使用 root用户运行。
现在来运行个使用特定用 户运行容器的 pod。

使用指定用户运行容器


为了使用 个与 镜像中不同的用户 ID 来运行pod 需要 设置该 pod securityContext.runAsUser 选项
可以通过以下代码 清单来运行一 个使用 guest 用户运行的容器,该用户在 a lpine 镜像中的用户 ID
405
[root@k8s-master ~]# cat test.yaml 
apiVersion: v1 
kind: Pod 
metadata: 
  name: pod-as-user-guest 
spec: 
  containers: 
  - name: main
    image: alpine 
    command: ["/bin/sleep","99999"] 
    securityContext: 
      runAsUser: 405

 注意:你需要指定用户ID,而不是用户名,id 405 guest 用户

现在可以像之前 样在 pod 中运行 id 命令, 查看 runAsUser 选项的效果:

[root@k8s-master ~]# kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
pod-as-user-guest        1/1     Running             0          63s

[root@k8s-master ~]# kubectl exec -it pod-as-user-guest sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ $ id 
uid=405(guest) gid=100(users)

 与要求的样,该容器在 guest 用户下运行。

阻止容器以 root 用户运行


如果你不关心容器是哪个用户运行的,只是希望阻止以 root 用户运行呢?

假设有一个己经部署好的 pod ,它使用 Dock file  使用 USER daemon命令制作的镜像,使其在 daemon 用户下运行, 如果攻击者获取了访问镜像仓库的权限,并上传了 个标签完全相同,在 root 用户下运行的镜像,会发生什么?
当 Kubernetes 的调度器运行该 pod 新实例时, kubelet 会下载攻击者的镜像,并运行该镜像中的任何代码。
虽然容器与宿主节点基本上是隔离的,使用 root 用户运行容器中的进程仍然是一种不好的实践, 例如,当宿主节点上的 个目录被挂载到容器中时,如果这个容器中的进程使用了 root 用户运行, 它就拥有该目录的完整访问权限,如果用非 root用户运行,则没有完整权限。
为了防止以上的攻击场景发生,可以进行配置,使得 pod 中的容器以非 root户运行, 如以下的代码清单所示:( 阻止容器使用 root 用户运行
[root@k8s-master ~]# cat test.yaml 
apiVersion: v1 
kind: Pod 
metadata: 
  name: pod-as-user-guest 
spec: 
  containers: 
  - name: main
    image: alpine 
    command: ["/bin/sleep","99999"] 
    securityContext: 
      runAsNonRoot: true


[root@k8s-master ~]# kubectl get pod 
NAME                     READY   STATUS                       RESTARTS   AGE
pod-as-user-guest        0/1     CreateContainerConfigError   0          53s



  Normal   Pulling    8h (x5 over 8h)  kubelet, k8s-node2  Pulling image "alpine"
  Warning  Failed     8h (x5 over 8h)  kubelet, k8s-node2  Error: container has runAsNonRoot and image will run as root
现在,即使攻击者篡改了镜像,他们也无法做出进 步的破坏。
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值