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,在容器內可以進行網路相關操作。