kritis-validation-hook組件是部署可信容器環節中進行容器鏡像簽名驗證的關鍵組件。在部署前對容器鏡像進行簽名驗證,以確保叢集中僅部署經過可信授權方進行過簽名的容器鏡像,降低在您的環境中運行意外或惡意代碼的風險。本文通過樣本介紹kritis-validation-hook組件的工作效果。
前提條件
背景資訊
kritis-validation-hook組件在開源的kritis軟體的基礎上增加了對阿里雲Container RegistryACR的深度整合,支援驗證通過阿里雲Key Management Service簽名的容器鏡像。kritis-validation-hook組件通過與Security Center、KMS和ACR的深度合作,實現了全自動化的對容器鏡像進行加簽和驗簽,協助您構建更安全的叢集運行環境。實現自動驗證容器鏡像簽名,請參見使用kritis-validation-hook組件實現自動驗證容器鏡像簽名。
配置資源存取權限
為了正常運行kritis-validation-hook組件,需要確保叢集使用的RAM角色擁有以下資源存取權限:
若您使用的是託管版叢集,需要確保叢集使用的Worker RAM角色擁有以下資源存取權限。
若您使用的是專有版叢集,需要確保叢集使用的Master RAM角色和Worker RAM角色擁有以下資源存取權限。
"cr:ListInstance",
"cr:ListMetadataOccurrences"
如果您的叢集使用的RAM角色沒有上述存取權限,您可以通過以下方法添加組件所需的資源存取權限。
建立自訂權限原則,策略內容如下。具體操作,請參見步驟一:建立自訂權限原則。
{ "Statement": [ { "Action": [ "cr:ListInstance", "cr:ListMetadataOccurrences" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
為叢集的Worker RAM角色授權。具體操作,請參見步驟二:為叢集的Worker RAM角色授權。
說明如果是專有版叢集,您需要為叢集的Master RAM角色也進行以上授權。
配置ACK Serverless叢集中組件所需的RAM許可權
由於ACK Serverless叢集沒有Worker RAM角色和Master RAM角色,您需要使用RRSA特性配置組件所需的RAM許可權。更多資訊,請參見通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離。
您可以使用ack-ram-tool工具快速完成組件所需的RRSA相關配置。更多資訊,請參見ack-ram-tool。相關配置操作如下。
請替換以下命令中出現的 <clusterId>
為您需要操作的叢集ID。
執行以下命令,開啟叢集的RRSA特性。
ack-ram-tool rrsa enable -c <clusterId>
執行以下命令,配置組件所需的RAM許可權。
ack-ram-tool rrsa setup-addon -a kritis-validation-hook -c <clusterId>
啟用鏡像簽名驗證樣本
以下通過對當前default命名空間啟用鏡像簽名驗證為例,展示kritis-validation-hook組件的工作效果。
因為鏡像簽名不屬於kritis-validation-hook組件的工作範疇,所以樣本略過簽名的步驟。詳細的鏡像加簽步驟,請參見使用容器鏡像加簽。本樣本中涉及的簽名後的資訊如下,您需要替換為實際的鏡像簽名資訊:
已簽名的容器鏡像:
kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45
。如果未啟用不可變鏡像的話,必須配置使用digest格式的鏡像地址,關於鏡像不可變的詳細介紹,請參見開啟鏡像版本不可變 。
鏡像加簽時使用的證明者名稱(加簽Key):demo-aa。
使用
cat publickey.txt | base64 | tr -d '\n'
命令得到的base64編碼後的公開金鑰:LS0tLS1CRUdJTiBQ***
。鏡像加簽時使用的KMS Key對應的公開金鑰資訊儲存在publickey.txt中。
鏡像加簽時使用的KMS key-id:
4a2ef103-5aa3-4220-****
。
配置AttestationAuthority,聲明相應的可信授權方。
使用以下內容建立AttestationAuthority.yaml檔案。
apiVersion: kritis.grafeas.io/v1beta1 kind: AttestationAuthority metadata: name: demo-aa spec: noteReference: namespaces/demo-aa publicKeyData: LS0tLS1CRUdJTiBQ*** publicKeyId: 4a2ef103-5aa3-4220-****
執行以下命令,配置可信授權方資訊。
kubectl apply -f AttestationAuthority.yaml
配置GenericAttestationPolicy,聲明驗證簽名策略及使用可信授權方的資訊驗證簽名。
使用以下內容建立GenericAttestationPolicy.yaml檔案。
apiVersion: kritis.grafeas.io/v1beta1 kind: GenericAttestationPolicy metadata: name: demo-gap spec: attestationAuthorityNames: - demo-aa
執行以下命令配置驗證簽名策略。
kubectl apply -f GenericAttestationPolicy.yaml
測試鏡像簽名驗證功能,部署未經信任授權方簽名的鏡像。
執行以下命令測試鏡像簽名驗證功能。
kubectl create deployment test-denied --image=alpine:3.11
預期輸出:
Error from server: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: image alpine:3.11 is not attested
執行以下命令測試鏡像簽名驗證功能。
kubectl create deployment test-denied --image=kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine:3.11
預期輸出:
Error from server: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: image kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine:3.11 is not attested
從預期輸出可得,鏡像簽名驗證功能可拒絕部署未經信任授權方簽名的鏡像。
測試鏡像簽名驗證功能,部署經信任授權方簽名的鏡像。
執行以下命令測試鏡像簽名驗證功能。
kubectl create deployment test-allow --image=kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45
預期輸出:
deployment.apps/test-allow created
從預期輸出可得,鏡像簽名驗證功能可部署經信任授權方簽名的鏡像。
配置鏡像驗簽白名單
在中介軟體或服務網格情境下,kritis-validation-hook組件支援通過配置鏡像驗簽白名單的方式,解決第三方組件自動注入的Sidecar容器的鏡像無法通過鏡像驗簽,導致無法部署Pod的問題。組件不會對白名單內的鏡像進行簽名驗證,只會驗證未在白名單內的鏡像。
可以通過定義admissionallowlists.kritis.grafeas.io
資源的方法來配置鏡像驗簽白名單。資源定義樣本如下:
apiVersion: kritis.grafeas.io/v1beta1 # 預設值,無需修改。
kind: AdmissionAllowlist # 預設值,無需修改。
metadata:
name: kritis-allowlist # 資源名,在叢集內唯一。
spec:
patterns: # 白名單配置,可以定義多條白名單。
- namePattern: 'registry*.*.aliyuncs.com/acs/*' # 想忽略的鏡像名稱,具體格式詳見下方說明。
- namePattern: 'registry-vpc.cn-beijing.aliyuncs.com/arms-docker-repo/*'
namespace: 'default' # [可選],白名單配置適用於哪個命名空間,未配置時適用於所有命名空間。
若您需要將ACK的系統鏡像加入白名單,可以通過以下操作配置。
使用以下內容建立
kritis-admission-allowlist-acs.yaml
檔案配置白名單。apiVersion: kritis.grafeas.io/v1beta1 kind: AdmissionAllowlist metadata: name: allow-acs-images spec: patterns: - namePattern: 'registry*.*.aliyuncs.com/acs/*' - namePattern: 'registry-*.ack.aliyuncs.com/acs/*'
namePattern配置項值支援完整匹配,且支援通過星號(*)字元實現簡單的萬用字元匹配,具體說明如下:
當配置項值不包含星號(*)字元時,將按配置的值進行完整匹配。例如,
nginx:v0.1.0
只會匹配nginx:v0.1.0
。當通過星號(*)字元實現萬用字元匹配時,存在以下限制:
星號(*)位於末尾時,匹配除正斜線(/)外的任一字元。例如,
a.com/nginx*
匹配a.com/nginx:v0.1.0
,但是不匹配a.com/nginx/test:v0.1.0
。星號(*)不位於末尾時,匹配字母、數字、虛線(-) 以及底線(_) 。例如,
registry-vpc.cn-*.aliyuncs.com/acs/pause:3.2
既匹配registry-vpc.cn-hangzhou.aliyuncs.com/acs/pause:3.2
,也匹配registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.2
。
常見的白名單如下,您可以根據實際需求添加。
# Container ServiceACK使用的鏡像 - namePattern: 'registry*.*.aliyuncs.com/acs/*' - namePattern: 'registry-*.ack.aliyuncs.com/acs/*' # Container ServiceACK使用的鏡像(限定中國地區) - namePattern: 'registry*.cn-*.aliyuncs.com/acs/*' - namePattern: 'registry-cn-*.ack.aliyuncs.com/acs/*' # ARMS使用的鏡像 - namePattern: 'registry*.*.aliyuncs.com/arms-docker-repo/*' # ARMS使用的鏡像(限定中國地區) - namePattern: 'registry*.cn-*.aliyuncs.com/arms-docker-repo/*'
執行以下命令配置白名單。
kubectl apply -f kritis-admission-allowlist-acs.yaml
預期輸出:
admissionallowlist.kritis.grafeas.io/allow-acs-images created
執行以下命令驗證白名單配置是否成功。
kubectl get admissionallowlists.kritis.grafeas.io
預期輸出:
NAME AGE allow-acs-images 2m22s