安全上下文
应用级别:
Container-level Security Context
Pod-level Security Context
设置
- 访问权限控制
- privileged
- linux capabilities
Security Context
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
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