上一篇:kubernets CKS 4.1 Pod安全上下文(一)
本小结CKS暂时未出题
安全上下文(Security Context):K8s对Pod和容器提供的安全机制,可以设置Pod特权和访问控制。
4.2.1 案例1:设置容器以普通用户运行
背景:容器中的应用程序默认以root账号运行的,这个root与宿主机root账号是相同的, 拥有大部分对Linux内核的系统调用权限,这样是不安全的,所以我们应该将容器以普 通用户运行,减少应用程序对权限的使用。 可以通过两种方法设置普通用户:
• Dockerfile里使用USER指定运行用户
• K8s里指定spec.securityContext.runAsUser,指定容器默认用户UID
spec:
securityContext:
runAsUser: 1000 # 镜像里必须有这个用户UID
fsGroup: 1000 # 数据卷挂载后的目录属组设置为该组
containers:
- image: wangjinxiong/flask-demo:root
name: web
securityContext:
allowPrivilegeEscalation: false # 不允许提权
创建一个deployment模板并编辑
kubectl create deployment flask-demo --image=wangjinxiong/flask-demo:root --dry-run="client" -o yaml > flask-demo.yaml
编辑配置加入Pod安全上下文配置。
# cat flask-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: flask-demo
name: flask-demo
spec:
replicas: 1
selector:
matchLabels:
app: flask-demo
template:
metadata:
labels:
app: flask-demo
spec:
securityContext:
runAsUser: 1000 # 镜像里必须有这个用户UID
fsGroup: 1000 # 数据卷挂载后的目录属组设置为该组
containers:
- image: wangjinxiong/flask-demo:root
name: flask-demo
securityContext:
allowPrivilegeEscalation: false # 不允许提权
resources: {}
进入容器:
# kubectl exec -it flask-demo-7c5fdc67ff-qlhnt -- /bin/bash
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ ps -ef
UID PID PPID C STIME TTY TIME CMD
1000 1 0 0 09:09 ? 00:00:00 /bin/sh -c python main.py
1000 9 1 1 09:09 ? 00:00:02 python main.py
1000 10 0 1 09:12 pts/0 00:00:00 /bin/bash
1000 17 10 0 09:12 pts/0 00:00:00 ps -ef
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$
修改数据,发觉无权限,因为镜像以root账号创建的,其他用户无修改权限:
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ ls
Dockerfile main.py templates
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ touch wangjinxiong.txt
touch: cannot touch 'wangjinxiong.txt': Permission denied
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ ls /data/www
Dockerfile main.py templates
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ ls -l /data/
total 0
drwxr-xr-x 1 root root 56 Jul 9 10:13 www
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ chmod 777 /data/www
chmod: changing permissions of '/data/www': Operation not permitted
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$
使用wangjinxiong/flask-demo:noroot不存在这个问题,因为镜像以python账号创建的.
4.2.2 案例2:避免使用特权容器
背景:容器中有些应用程序可能需要访问宿主机设备、修改内核等需求,在默认情况下,容器没这个有这个能力,因此这时会考虑给容器设置特权模式。
启用特权模式:
containers:
- image: lizhenliang/flask-demo:root
name: web
securityContext:
privileged: true
启用特权模式就意味着,你要为容器提供了访问Linux内核的所有能力,这是很危险的,为了减少系统调用的供给,可以使用Capabilities为容器赋予仅所需的能力。
4.2.3 Capabilities
Linux Capabilities:Capabilities是一个内核级别的权限,它允许对内核调用权限进行更细粒度的控制,而不是简单地以root身份能力授权。
Capabilities包括更改文件权限、控制网络子系统和执行系统管理等功能。在securityContext中,可以添加或删除Capabilities,做到容器精细化权限控制。
示例1:容器默认没有挂载文件系统能力,添加SYS_ADMIN增加这个能力
apiVersion: v1
kind: Pod
metadata:
name: cap-pod
spec:
containers:
- image: busybox
name: test
command:
- sleep
- 24h
securityContext:
capabilities:
add: ["SYS_ADMIN"]
示例2:只读挂载容器文件系统,防止恶意二进制文件创建
apiVersion: v1
kind: Pod
metadata:
name: cap-pod
spec:
containers:
- image: busybox
name: test
command:
- sleep
- 24h
securityContext:
readOnlyRootFilesystem: true