SecurityContext,即安全上下文,可以用于定义Pod或Container的权限和访问控制设置。
ECI默认内核参数
在 Linux 中,管理员可以通过 sysctl 接口修改内核运行时的参数。ECI中的内核参数通过以下方式查看:
sysctl -a
也可以通过该链接查看ECI的默认内核参数:Virtual-Kubelet-Example
安全策略
阿里云ASK和ACK默认启用了准入控制器插件PodSecurityPolicy,这意味着如果Pod中设置了SecurityContext相关内容,将接受准入控制器对Pod的权限检查,如果SecurityContext中设置了超出指定安全策略所允许的范围,k8s集群将拒绝创建该Pod。更多说明请参见k8s官方:PodSecurityPolicy
阿里云ASK和ACK使用名为ack.privileged的PodSecurityPolicy对象作为默认的安全策略,通过以下命令查看该安全策略允许的权限范围:
kubectl get psp ack.privileged -o yaml
创建安全策略
下面创建一个包含sysctl权限的PodSecurityPolicy对象,并通过RBAC绑定到服务账户sa-sysctl:
# 创建一个的服务账号
apiVersion: v1
kind: ServiceAccount
metadata:
name: sa-sysctl
---
# 创建一个psp对象,该psp允许创建含有spec.securityContext.sysctls选项的Pod
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: sysctl
spec:
allowedUnsafeSysctls: # 填入允许Pod使用的sysctl参数
- 'kernel.msgmax'
- 'net.*'
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
volumes:
- '*'
---
# 创建一个角色并引用上面的psp
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: psp:sysctl
rules:
- apiGroups: ['policy']
resources: ['podsecuritypolicies']
verbs: ['use']
resourceNames: ['sysctl']
---
# 将角色绑定到服务账号,此时该服务账号创建的所有Pod都使用上面的psp作为安全策略
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: sa-sysctl:sysctl
roleRef:
kind: ClusterRole
name: psp:sysctl
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: sa-sysctl
Pod sysctl
接下来使用上面的服务账号来创建一个含有spec.securityContext.sysctls选项的Pod:
apiVersion: v1
kind: Pod
metadata:
name: sysctl-example
spec:
serviceAccountName: sa-sysctl
securityContext:
sysctls:
- name: net.core.somaxconn
value: "1024"
- name: kernel.msgmax
value: "65536"
containers:
- name: busybox
image: busybox
command: [ "sh", "-c", "sleep 12000" ]
但是,并不是所有的 sysctl 值都可以支持通过pod来修改,目前ECI支持Pod修改的 sysctl 以及限制如下:
支持大类 | 排除项 |
---|---|
kernel.shm.*全部支持 | 排除kernel.shm_rmid_forced 。 |
kernel.msg.*全部支持 | |
kernel.sem 支持 | |
fs.mqueue.*全部支持 | |
net.*全部支持 | 排除net.ipv4.ip_local_port_range和net.ipv4.tcp_syncookies 。 |
Container SecurityContext
除了可以设置Pod维度的 securityContext,还可以设置容器维度的 securityContext,即只对容器组内的单个容器生效。
目前容器纬度的 securityContext
支持的字段如下:
支持的参数 | 说明 |
---|---|
runAsUser | 会覆盖 Dockerfile 中的 `USER` 指令。 |
capabilities | 只能 ADD ["NET_ADMIN"],支持["NET_RAW"]需要白名单。 |
不支持修改的参数的默认值如下:
不支持的参数 | 默认值 |
---|---|
privileged | false |
procMount | DefaultProcMount |
readOnlyRootFilesystem | true |
实际演示
在默认情况下,如果在容器内进行网络相关的操作,会得到如下的报错。
因为在Docker的容器中对权限的限制是非常严格的,包括NET_ADMIN等在内很多权限默认都没有。
/ $ ip route list
default via 192.168.127.253 dev eth0 src 192.168.85.229 metric 1024
192.168.64.0/18 dev eth0 scope link src 192.168.85.229
192.168.127.253 dev eth0 scope link src 192.168.85.229 metric 1024
/ $ ip route delete 192.168.64.0/18
ip: RTNETLINK answers: Operation not permitted
给容器增加NET_ADMIN,支持网络管理:
apiVersion: v1
kind: Pod
metadata:
name: sysctl-example
spec:
containers:
- name: busybox
image: busybox
command: [ "sh", "-c", "sleep 12000" ]
securityContext:
runAsUser: 2000
capabilities:
add: ["NET_ADMIN"]
尝试删除并增加一条路由:
/ $ ip route list
default via 192.168.127.253 dev eth0 src 192.168.85.230 metric 1024
192.168.64.0/18 dev eth0 scope link src 192.168.85.230
192.168.127.253 dev eth0 scope link src 192.168.85.230 metric 1024
/ $ ip route delete 192.168.64.0/18
/ $ ip route list
default via 192.168.127.253 dev eth0 src 192.168.85.230 metric 1024
192.168.127.253 dev eth0 scope link src 192.168.85.230 metric 1024
/ $ ip route add 192.168.64.0/18 dev eth0 scope link src 192.168.85.230
/ $ ip route list
default via 192.168.127.253 dev eth0 src 192.168.85.230 metric 1024
192.168.64.0/18 dev eth0 scope link src 192.168.85.230
192.168.127.253 dev eth0 scope link src 192.168.85.230 metric 1024
查看容器内进程的user都为2000,也生效了。
/ $ ps
PID USER TIME COMMAND
1 2000 0:00 sleep 12000
13 2000 0:00 /bin/sh
30 2000 0:00 /bin/sh
37 2000 0:00 ps
样例地址请参见:eci-securitycontext。
在文档使用中是否遇到以下问题
更多建议
匿名提交