k8s-安全上下文

阅读量: zyh 2020-08-25 01:08:44
Categories: > Tags:

安全上下文

应用级别:

设置

Security Context

Security Context List

Pod 级别的安全上下文

apiVersion: v1
kind: Pod
metadata:
  name: security-context-pod-demo
spec:
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  securityContext:
    runAsUser: 1000          
    runAsGroup: 3000         
    fsGroup: 2000            
  containers:
  - name: sec-ctx-demo
    image: busybox
    command: ["sh", "-c", "sleep 60m"]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /pod/demo
    securityContext:
      allowPrivilegeEscalation: false

简要解释

runAsUser: 1000          # pod内所有容器的entrypoint启动的进程UID为1000
runAsGroup: 3000         # pod内所有容器的entrypoint启动的进程GID为3000
fsGroup: 2000            # pod内挂载的卷里的文件以及新创建的文件GID为2000

容器级别的安全上下文

apiVersion: v1
kind: Pod
metadata:
  name: security-context-container-demo
spec:
  securityContext:
    runAsUser: 1000
  containers:
  - name: sec-ctx-demo
    image: busybox
    command: [ "sh", "-c", "sleep 60m" ]
    securityContext:
      runAsUser: 2000
      allowPrivilegeEscalation: false

linux capabilities

linux capabilites 可以给某个程序附加其它用户以程序拥有者身份去执行的权限。

当一个执行程序被添加了SUID标识后,则其它用户去执行这个程序的时候,就可以临时代入到程序的拥有者,从而以程序拥有者的权限来执行程序。

以 /bin/passwd 命令为例,它的拥有者是root,且拥有SUID标识,因此普通用户可以代入到root来修改自身密码。

但这样,代入期间普通用户权限比较大,有安全风险,因此有了 linux capabilities。

linux capabilities 将权限细分为很多能力,从而避免超出执行程序时所需要的权限。

linux与capabilities

# 查看
➜   getcap /bin/ping
/bin/ping = cap_net_raw+ep
# 删除
➜   setcap cap_net_raw-ep /bin/ping
# 添加
➜   getcap cap_net_raw+ep /bin/ping

docker与capabilities

我们说容器本质上就是一个进程,所以理论上容器就会和进程一样会有一些默认的开放权限,默认情况下 Docker/Containerd 会删除必须的 capabilities 之外的所有 capabilities,因为在容器中我们经常会以 root 用户来运行,使用 capabilities 现在后,容器中的使用的 root 用户权限就比我们平时在宿主机上使用的 root 用户权限要少很多了,这样即使出现了安全漏洞,也很难破坏或者获取宿主机的 root 权限,所以 Docker/Containerd 支持 Capabilities 对于容器的安全性来说是非常有必要的。

不过我们在运行容器的时候可以通过指定 --privileded 参数来开启容器的超级权限,这个参数一定要慎用,因为他会获取系统 root 用户所有能力赋值给容器,并且会扫描宿主机的所有设备文件挂载到容器内部,所以是非常危险的操作。

但是如果你确实需要一些特殊的权限,可以通过 --cap-add--cap-drop 这两个参数来动态调整,可以最大限度地保证容器的使用安全。

举例:

--cap-add和--cap-drop 这两参数都支持ALL值,比如如果你想让某个容器拥有除了MKNOD之外的所有内核权限,那么可以执行下面的命令: ➜   sudo docker run --cap-add=ALL --cap-drop=MKNOD ...
docker capabilities

默认,docker 关闭下列 capabilities

docker drop capabilities

k8s与capabilities

# cpb-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cpb-demo
spec:
  containers:
  - name: cpb
    image: busybox
    args:
    - sleep
    - "3600"
    securityContext:
      capabilities:
        add: # 添加
        - NET_ADMIN
        drop:  # 删除
        - KILL