Security Context(安全上下文)用于控制和管理容器内进程权限,可以限制容器内进程的行为,确保容器内进程只能运行在给定的权限和资源限制下。本文介绍如何为Pod或者Container配置Security Context,定义Pod或者Container的权限和访问控制。
背景信息
Security Context,即安全上下文,用于定义Pod或者Container的权限和访问控制,包括Discretionary Access Control、SELinux、Linux Capabilities等。更多信息,请参见Security Context。
Kubernetes提供了两种配置安全上下文的方式:
方式 | 应用范围 | 支持的功能 |
Pod Security Context | Pod级别,应用于Pod内所有容器和Volume。 | 修改sysctl参数和runAsUser。 |
Container Security Context | 容器级别,应用于指定的容器。 | 修改runAsUser和capabilities等。 |
配置Pod Security Context
配置说明
在Linux中,通常可以通过sysctl接口修改内核运行时的参数。对于ECI实例的内核参数,您可以通过以下命令进行查看。更多信息,请参见sysctl.sh。
sysctl -a
在Pod级别,您可以通过配置Security Context来修改sysctl参数和runAsUser。
为了避免破坏操作系统的稳定性,请您在充分了解sysctl参数变更影响后,再进行配置。更多信息,请参见sysctl。
目前ECI支持修改的sysctl参数如下:
kernel.shm*
kernel.msg*
kernel.sem
fs.mqueue.*
net.*(net.ipv4.tcp_syncookies除外)
vm.min_free_kbytes
修改vm.min_free_kbytes的值时,建议不要超过总内存的20%。
除上述sysctl参数外,如果想要修改其他host级别的sysctl参数,请提交工单申请。申请成功后,可通过为Pod添加k8s.aliyun.com/eci-host-sysctls: '[{"name":"xxx", "value": "vvv"}]'
的Annotation的方式来修改sysctl参数。
配置示例
以修改net.core.somaxconn和kernel.msgmax为例,YAML示例如下:
apiVersion: v1
kind: Pod
metadata:
name: sysctl-example
labels:
alibabacloud.com/eci: "true"
spec:
securityContext:
sysctls:
- name: net.core.somaxconn
value: "1024"
- name: kernel.msgmax
value: "65536"
containers:
- name: busybox
image: registry.cn-shanghai.aliyuncs.com/eci_open/busybox:1.30
command: [ "sh", "-c", "sleep 12000" ]
配置Container Security Context
配置说明
在Container级别,您可以为指定的容器设置Security Context。
对于Pod Security Context和Container Security Context中均设置的参数(如runAsUser),容器的设置将覆盖Pod的设置。
目前ECI支持配置的参数如下:
支持配置的参数 | 说明 |
runAsUser | 设置运行容器的用户ID。该参数配置会覆盖Dockerfile中的USER指令。 |
runAsGroup | 设置运行容器的用户组。 |
runAsNonRoot | 设置容器是否以非root模式运行容器。取值为true表示以非root模式运行容器。默认为false。 |
privileged | 设置容器是否以特权模式运行。取值为true表示以特权模式运行容器。默认为false。 说明 特权容器功能正在内测中。如需体验,请提交工单申请。 |
capabilities | 为容器内的进程授予某些特定的权限。更多信息,请参见Linux Capabilities。 目前支持配置以下权限:
说明 SYS_RAWIO默认不支持,需提交工单申请。 |
部分不支持配置的参数及其默认值如下:
不支持配置的参数 | 说明 |
AllowedProcMountTypes | 指定容器可以挂载的proc类型,默认为DefaultProcMount。 |
readOnlyRootFilesystem | 容器运行的根文件系统是否为只读,默认为true。 |
配置示例
默认情况下,容器并不具备NET_ADMIN权限。如果在容器内进行网络相关操作,会返回报错提示。
您可以为容器配置Security Context,设置capabilities参数来增加NET_ADMIN权限。YAML示例如下:
apiVersion: v1
kind: Pod
metadata:
name: sysctl-example
labels:
alibabacloud.com/eci: "true"
spec:
containers:
- name: busybox
image: registry.cn-shanghai.aliyuncs.com/eci_open/busybox:1.30
command: ["sh", "-c", "sleep 12000"]
securityContext:
capabilities:
add: ["NET_ADMIN"]
重新创建ECI Pod,在容器内可以进行网络相关操作。