全部产品

SecurityContext

更新时间:2020-10-12 16:47:05

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