您可以通過notation-alibabacloud-secret-manager外掛程式基於阿里雲KMS管理的金鑰組Container RegistryACR管理的OCI製品進行加簽,然後在叢集中安裝配置Ratify進行驗簽,以確保叢集中部署的都是有合法簽名的鏡像,不符合簽名的鏡像將會被攔截以提升系統安全性。
相關概念
notation-alibabacloud-secret-manager:基於Notation社區標準的外掛程式規範,通過阿里雲Key Management Service中管理的金鑰組ACR管理的鏡像進行簽名。
Ratify:是可以運行在Kubernetes叢集中的二進位可執行驗證引擎,用於對雲原生製品中鏡像簽名、SBOM等安全中繼資料進行注入驗證,並只允許在叢集中部署滿足策略要求的製品。
前提條件
已建立1.20或以上版本的ACK託管叢集、ACK專有叢集或ACK Serverless叢集。請參見建立ACK託管叢集、建立ACK專有叢集(已停止建立)、建立ACK Serverless叢集。
已建立ACR企業進階版執行個體,請參見建立企業版執行個體。
已安裝Notation CLI。
已購買並啟用KMS執行個體,請參見購買和啟用KMS執行個體。
步驟一:擷取通過KMS執行個體管理的密鑰
Key Management Service是一站式的密鑰管理和資料加密服務平台,提供簡單、可靠、安全、合規的資料加密保護和憑據管理能力。通過KMS執行個體建立並管理的密鑰、以及匯入到KMS執行個體中管理的自簽密鑰都可以通過notation-alibabacloud-secret-manager外掛程式進行加簽。
使用KMS建立並管理的密鑰
登入Key Management Service控制台,在頂部功能表列選擇地區後,在左側導覽列單擊。
在密钥管理頁面,單擊用户主密钥頁簽,实例ID選擇軟體密鑰管理執行個體,單擊创建密钥。
在创建密钥面板,完成配置項設定,然後單擊確定。
以下為主要配置項說明,更多資訊,請參見軟體密鑰。
配置項
說明
樣本
KMS執行個體
選擇要建立密鑰的KMS執行個體。
kst-l***
密钥类型
選擇非對稱金鑰。
非對稱金鑰
密钥规格
非對稱金鑰規格如下:
RSA_2048
RSA_3072
EC_P256
RSA-2048
密钥用途
選擇SIGN/VERIFY,用於產生和驗證數位簽章。
SIGN/VERIFY
密钥别名
密鑰的別名標識符。支援英文字母、數字、底線(_)、短劃線(-)和正斜線(/)。
test-key
標籤
密鑰的標籤,方便您對密鑰進行分類管理。每個標籤由一個索引值對(Key:Value)組成,包含標籤鍵(Key)、標籤值(Value)。
無
建立存取點 。
在左側導覽列單擊。
在应用接入頁簽,單擊创建应用接入点,在创建应用接入点面板完成各項配置。
配置項
說明
创建模式
選擇快速创建。
作用域(KMS实例)
選擇應用要訪問的KMS執行個體。
应用接入点名称
自訂應用存取點的名稱。
认证方式
預設為ClientKey,不支援修改。
默认权限策略
預設為
key/*secret/*,不支援修改。即應用可以訪問指定KMS執行個體中的所有密鑰和憑據。單擊確定,瀏覽器會自動下載ClientKey。
ClientKey包含應用身份憑證內容(ClientKeyContent)和憑證口令(ClientKeyPassword)。 應用身份憑證內容(ClientKeyContent)檔案名稱預設為
clientKey_****.json。憑證口令(ClientKeyPassword)檔案名稱預設為clientKey_****_Password.txt。
使用匯入到KMS中管理的自簽密鑰
除了使用KMS建立管理的密鑰進行加簽,您還可以使用自簽密鑰並將密鑰材料匯入KMS執行個體中管理。本文以OpenSSL產生私密金鑰和認證為例進行說明。
1、建立非對稱金鑰
登入Key Management Service控制台,在頂部功能表列選擇地區後,在左側導覽列單擊。
在密钥管理頁面,單擊用户主密钥頁簽,实例ID選擇軟體密鑰管理執行個體,單擊创建密钥。
在创建密钥面板,完成配置項設定,然後單擊確定。
以下為主要配置項說明,更多資訊,請參見步驟一:建立非對稱金鑰。
配置項
說明
樣本
密钥类型
選擇非對稱金鑰。
非對稱金鑰
密钥规格
非對稱金鑰規格如下:
RSA_2048
RSA_3072
EC_P256
RSA-2048
密钥用途
選擇SIGN/VERIFY,用於產生和驗證數位簽章。
SIGN/VERIFY
密钥别名
密鑰的別名標識符。支援英文字母、數字、底線(_)、短劃線(-)和正斜線(/)。
test-key
標籤
密鑰的標籤,方便您對密鑰進行分類管理。每個標籤由一個索引值對(Key:Value)組成,包含標籤鍵(Key)、標籤值(Value)。
無
2、下載封裝公開金鑰和匯入令牌
匯入密鑰材料的參數包含封裝公開金鑰和匯入令牌,封裝公開金鑰用於加密金鑰材料,在匯入處理程序中保護您的密鑰材料,匯入令牌用於匯入密鑰材料。
定位到目標密鑰,單擊操作列的详情,在密鑰詳情頁面的密钥材料地區,單擊获取导入参数。
在获取导入密钥材料的参数對話方塊,選擇公钥类型、加密算法後,單擊下一步。
密鑰管理類型
KMS密鑰的規格
封裝公開金鑰類型
密碼編譯演算法
軟體密鑰
RSA_2048
RSA_3072
EC_P256
EC_P256K
RSA_2048
RSAES_OAEP_SHA_256_AES_256_ECB_PKCS7_PAD
RSAES_OAEP_SHA_256_AES_256_ECB_PKCS7_PAD:具體加密過程,請參見樣本:使用OPENSSL產生RSA_2048演算法的密鑰材料。
下載封裝公開金鑰以及匯入令牌,並妥善儲存。
公钥格式:
der格式:下載後檔案名稱預設為publickey_******.bin。
pem格式:下載後檔案名稱預設為publickey_******.pem。
导入令牌:下載後檔案名稱預設為token_******.txt。
重要匯入令牌的有效期間為24小時,在有效期間內可以重複使用,失效後需要擷取新的匯入令牌和公開金鑰。
封裝公開金鑰和匯入令牌必須配套使用。即不允許下載兩次封裝公開金鑰和匯入令牌,使用其中一個的封裝公開金鑰,另一個的匯入令牌。
3、使用封裝公開金鑰加密密鑰材料
請在您的系統內容中產生並加密金鑰材料,過程中會使用到以下密鑰,具體說明請參見下表。
密鑰 | 用途 | 提供者 | 標記說明 |
目標非對稱金鑰TAK(Target Asymmetric Key) | 待匯入的目標非對稱金鑰。 | 您的系統內容或者工具(如線下的密鑰管理設施KMI,或者線下的硬體安全模組HSM)。 |
|
加密金鑰IWK(Import Wrapping Key) | 用於匯入TAK的加密金鑰。 | 阿里雲KMS。 |
|
瞬時密鑰ESK(Ephemeral Symmetric Key) | 一個瞬時存在的對稱金鑰,用於直接加密TAKpriv。 | 源環境的系統或者工具,在完成對TAK的匯出操作後請立即銷毀。 | 不涉及 |
建立一個目標非對稱金鑰私密金鑰(TAKpriv),密鑰規格與您建立非對稱金鑰時選擇的密鑰規格一致。如果您已有目標非對稱金鑰私密金鑰(TAKpriv),請跳過本步驟。
說明TAKpriv格式需要遵循:RSA私密金鑰根據RFC3447進行編碼,ECC私密金鑰根據RFC5915進行編碼,然後根據RFC5208封裝為PKCS#8格式。
建立一個瞬時密鑰(ESK)。
使用加密金鑰公開金鑰(IWKpub)來加密瞬時密鑰(ESK),得到瞬時密鑰密文(Cipher(ESK))。
使用瞬時密鑰(ESK)加密目標非對稱金鑰私密金鑰(TAKpriv),得到目標非對稱金鑰的私密金鑰密文(Cipher(TAKpriv))。
按照Cipher(ESK)||Cipher(TAKpriv)格式組裝結果資料,得到加密後的密鑰材料。
4、匯入密鑰材料
在密鑰詳情頁面,單擊导入密钥材料,在导入打包后的密钥材料對話方塊,完成各項配置後,單擊確定。
匯入密鑰材料成功後,密鑰狀態從待导入更新為启用中。

打包后的密钥材料:上傳步驟3、使用封裝公開金鑰加密密鑰材料中產生的密鑰材料檔案。
导入令牌:上傳步驟3、使用封裝公開金鑰加密密鑰材料中下載的令牌檔案。
密钥材料过期时间:支援選擇永不过期,也可以自訂到期時間。
重要如果設定了密鑰材料到期時間,在設定的時間點之後KMS會刪除已到期的密鑰材料,您將無法使用該密鑰材料。如需恢複使用,可以為密鑰再次匯入相同的密鑰材料。
步驟二:安裝notation-alibabacloud-secret-manager外掛程式
notation-alibabacloud-secret-manager外掛程式基於Notation社區標準的外掛程式規範,通過阿里雲KMS中管理的金鑰組ACR管理的鏡像進行簽名。
notation-alibabacloud-secret-manager外掛程式運行環境和KMS執行個體在同一個地區,且屬於同一個VPC。多VPC訪問,請參見同地區多VPC訪問KMS執行個體。
根據不同系統版本選擇下載。更多版本下載請參見notation-alibabacloud-secret-manager。
Linux_arm64
wget https://notation-alibabacloud-secret-manager.oss-cn-hangzhou.aliyuncs.com/dist/v0.1.2/notation-alibabacloud-secret-manager_Linux_arm64.tar.gzLinux_X86_64
wget https://notation-alibabacloud-secret-manager.oss-cn-hangzhou.aliyuncs.com/dist/v0.1.2/notation-alibabacloud-secret-manager_Linux_x86_64.tar.gz
使用以下命令建立組件目錄。
mkdir -p /root/.config/notation/plugins/alibabacloud.secretmanager.plugin/使用以下命令解壓組件tar包到指定目錄。
tar -xvf notation-alibabacloud-secret-manager_Linux_<版本>.tar.gz -C /root/.config/notation/plugins/alibabacloud.secretmanager.plugin/配置環境變數。
export ALIBABA_CLOUD_ACCESS_KEY_ID=your_access_key_id export ALIBABA_CLOUD_ACCESS_KEY_SECRET=your_access_key_secret export ALIBABA_CLOUD_KMS_INSTANCE_ENDPOINT=your_kms_endpoint export ALIBABA_CLOUD_KMS_CLIENTKEY_FILEPATH=your_clientkey_filepath export ALIBABA_CLOUD_KMS_PASSWORD=your_password export ALIBABA_CLOUD_KMS_CA_FILEPATH=your_ca_filepath說明notation-alibabacloud-secret-manager外掛程式支援多種Credential配置方式。更多的配置方式請參考credentials。
環境變數
描述
樣本
ALIBABA_CLOUD_ACCESS_KEY_ID
阿里雲帳號Access Key ID。
XXXXXX
ALIBABA_CLOUD_ACCESS_KEY_SECRET
阿里雲帳號Access Secret Key。
XXXXXX
ALIBABA_CLOUD_KMS_INSTANCE_ENDPOINT
指定KMS專屬執行個體的VPC Endpoint。
kst-hzxxxxxxxxxx.cryptoservice.kms.aliyuncs.comALIBABA_CLOUD_KMS_CLIENTKEY_FILEPATH
訪問指定KMS專屬執行個體應用存取點(AAP)的ClientKey憑據檔案對應的本地檔案路徑。使用建立存取點的步驟c中瀏覽器下載的
clientKey_KAAP.****.json內容,建立一個檔案(例如/root/clientkey)。/root/clientkey
ALIBABA_CLOUD_KMS_PASSWORD
指定KMS專屬執行個體應用存取點(AAP)的憑證口令。使用建立存取點的步驟c中瀏覽器下載的clientKey_KAAP.594c78e6-7244-4187-XXX-8d59dca2ceb4_Password.txt內容。
XXXXXX
ALIBABA_CLOUD_KMS_CA_FILEPATH
指定KMS專屬執行個體CA認證對應的本地檔案路徑。通過步驟五:擷取KMS執行個體的CA認證,將瀏覽器下載的PrivateKmsCA_xxxxx.pem內容,建立一個檔案。
/root/privatekmsca
步驟三:準備鏡像並簽名
1、在ACR中準備鏡像
使用企業版執行個體構建鏡像或在本地構建和推送多架構鏡像到Container Registry。
說明ACR企業版執行個體支援OCI v1.1.0版本的鏡像和分發規範,可使用ORAS等用戶端工具管理和分發非容器鏡像內容的OCI製品,請參見使用OCI v1.1.0規範管理和關聯容器鏡像及其衍生製品。
配置專用網路或公網的存取控制,用於串連企業版執行個體。請參見網路存取控制。
擷取登入ACR企業版執行個體的密碼。若您忘記或遺失密碼,您可以通過配置訪問憑證的方式重設密碼。具體操作,請參見配置訪問憑證。
2、使用Notation基於KMS中管理的密鑰為ACR鏡像簽名
您可以使用notation-alibabacloud-secret-manager外掛程式基於KMS憑據管家中的私密金鑰和認證,對ACR中的指定鏡像加簽。
通過notation-alibabacloud-secret-manager外掛程式使用KMS執行個體SDK(Go),您需要滿足以下條件並自訂環境變數。
使用以下命令登入鏡像倉庫。
./notation login --username=tsh_ram@11380257155*** test-for-doc-registry.cn-hangzhou.cr.aliyuncs.com使用以下命令對指定鏡像加簽並產生認證。<dirPath>產生認證的存放路徑如(/root)
./notation sign --id <keyId> --plugin alibabacloud.secretmanager.plugin test-for-doc-registry.cn-hangzhou.cr.aliyuncs.com/test/nginx:2.11 --plugin-config output_cert_dir=<dirPath>預期輸出:
Successfully signed test-for-doc-registry.cn-hangzhou.cr.aliyuncs.com/test/nginx@sha256:f57e1908e63538ad5159fa99443d0492d23b9d34ba7******您可以通過以下Notation CLI進行製品簽名。
notation sign --id <keyId> --plugin alibabacloud.secretmanager.plugin <myRegistry>/<myRepo>@<digest> --plugin-config output_cert_dir=<dirPath>參數
說明
id指定的阿里雲KMS執行個體ID。
plugin-config外掛程式自訂參數。支援如下配置:
output_cert_dir:簽名時,使用該參數基於指定的KMS密鑰簽發對應的X.509驗簽認證,並以檔案形式輸出到參數指定檔案目錄下。ca_certs:使用自簽並匯入KMS執行個體的密鑰加簽時,如果您同時使用密鑰簽發了X.509認證,可以使用該參數指定自簽認證對應的檔案路徑。
步驟四:使用Ratify和Gatekeeper進行驗簽
1、安裝Ratify和Gatekeeper
開啟基於Gatekeeper的策略治理,請參見啟用安全性原則管理。
安裝Ratify。
建立命名空間Ratify。
kubectl create ns ratify登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在Helm頁面,單擊建立,參考如下資訊完成基本資料配置,然後選中ratify,單擊下一步。
參數
樣本值
應用程式名稱
ratify
命名空間
選擇ratify。
來源
預設為應用市場。
Chart
應用情境:選擇全部。
支援架構:選擇amd64。
搜尋方塊:搜尋ratify。
在參數配置頁面,選擇Chart 版本,如需通過RRSA拉取鏡像,請參考配置樣本修改。然後單擊確定。
參數
說明
預設值
配置樣本
ServiceAccount.create建立Ratify的專屬ServiceAccount。取值:
true(預設值):會自動建立名為ratify-admin的ServiceAccount。false:不會自動建立,如需使用RRSA拉取鏡像,則需要提前建立ServiceAccount。
true保持預設
ServiceAccount.nameRatify Service Account的自訂名稱。
ratify-admin保持預設
ServiceAccount.annotations自訂ServiceAccount的Annotations。
{}為其添加Annotation
pod-identity.alibabacloud.com/role-name: <Your-RRSA-role>配置以實現自動注入功能。說明其中
<Your-RRSA-role>替換為您使用的RRSA角色。oras.authProviders.k8secretsEnabled開啟Kubernetes Secrets Provider用於和鏡像倉庫認證。
false保持預設
說明關於ORAS相關配置請參見ORAS Store配置樣本。
oras.authProviders.alibabacloudAcrBasicEnabled開啟阿里雲ACR Provider用於ACR鏡像倉庫執行個體的RRSA認證。
falsetrueoras.cache.enabled為
ListReferrers和GetSubjectDescriptor啟用ORAS儲存緩衝。重要啟用後,基於TTL的緩衝可能會導致緩衝與資料來源之間不一致,如果需要強一致性,請禁用此參數。
true保持預設
oras.cache.ttl設定ORAS Store中緩衝TTL。
10保持預設
alibabacloudAcrConfig.defaultInstanceId目標製品在ACR倉庫中的預設執行個體ID。
``
必選項。
需要配置已建立的ACR企業版倉庫執行個體ID。
alibabacloudAcrConfig.acrInstancesConfig當您需要從不同的阿里雲ACR倉庫執行個體中拉取鏡像時,不同的執行個體名稱
instanceName和instanceId需要分別定義在列表中。[]
需設定為如下內容,用於串連阿里雲ACR私人倉庫。

upgradeCRDs.enabled開啟或關閉 Ratify CRD升級pre-install chart hooks外掛程式。
true如果不需要升級Ratify CRD的情況下,可以設定為
false。說明設定為
true時會觸發pre-install hook,可能導致安裝逾時。featureFlags.RATIFY_CERT_ROTATION開啟或關閉TLS認證輪轉,通過該配置可以使Ratify自動產生並輪轉認證。
false需設定為
true,使Ratify後端自動產生並輪轉認證。notationCert已棄用。
請改用
notationCerts指定Notation的驗證認證隊列。指定的認證和憑證鏈結公開金鑰用於建立Notation驗證器使用的內建certstore。無
保持預設
notationCerts用於配置Notation驗證器中內建certstore的密鑰憑證和憑證鏈結隊列。
``
需要按需填寫Notation外掛程式加簽過程中返回的KMS驗簽認證,例如:

在左側導覽列選擇安全管理 > 策略管理,單擊我的策略,查看RatifyVerification策略已存在。

2、配置RRSA以拉取ACR私人鏡像簽名資訊
Ratify支援通過RRSA方式拉取阿里雲ACR私人倉庫的簽名資料。更多資訊,請參見通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離。
在指定叢集的組件管理頁面,安裝ack-pod-identity-webhook組件。
建立指定RAM角色ratify-role,配置其可信實體類型為身份供應商,並完成相關限制條件欄位的配置,您也可以使用ack-ram-toolCLI工具完成自動化配置。
其中
oidc:sub值中的<namespace>和<service_account>需使用安裝ratify組件的命名空間和ServiceAccount。{ "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "oidc:aud": "sts.aliyuncs.com", "oidc:iss": "<oidc_issuer_url>", "oidc:sub": "system:serviceaccount:<namespace>:<service_account>" } }, "Effect": "Allow", "Principal": { "Federated": [ "<oidc_provider_arn>" ] } }為上述RAM角色ratify-role授予ACR的許可權AliyunContainerRegistryFullAccess。
在部署Ratify時建立ServiceAccount,同時給該ServiceAccount和對應部署Ratify的命名空間設定如下所示的Annotation。部署Ratify後,可以看到Ratify的Pod執行個體模板中的Env是被注入了指定的
ALIBABA_CLOUD_ROLE_ARN、ALIBABA_CLOUD_OIDC_PROVIDER_ARN和ALIBABA_CLOUD_OIDC_TOKEN_FILE的環境變數。說明如果您已提前建立ServiceAccount,請為其添加Annotation
pod-identity.alibabacloud.com/role-name: ratify-role。--- apiVersion: v1 kind: Namespace metadata: name: ratify # 指定Namespace的名稱。 labels: pod-identity.alibabacloud.com/injection: 'on' --- apiVersion: v1 kind: ServiceAccount metadata: name: ratify-admin # 指定ServiceAccount的名稱。 namespace: ratify # 指定Namespace的名稱。 annotations: pod-identity.alibabacloud.com/role-name: ratify-role #以上建立的RAM角色名稱 ---
步驟五:驗證加簽和驗簽已生效
您可以在ACK叢集中使用指定鏡像部署應用,以驗證鏡像的加簽驗簽功能是否生效。
當部署有合法簽名的鏡像時,可以驗證工作負載已成功部署在目的地組群。
當部署使用了未包含簽名鏡像的工作負載時,可以查看Ratify是否成功攔截了此次部署,通過kubectl查看工作負載狀態可以擷取攔截資訊,同時可以在Ratify Pod日誌中查看更多的驗簽日誌。
kubectl get delpoy ${unsigned_deploy_name} -n${namespace} -oyaml # 輸入應用程式名稱以及所在的命名空間驗簽日誌如下所示:

更多Ratify配置資訊說明
Ratify提供多種內建和外置的Verifier驗證器外掛程式,用於指定校正器處理的製品類型;您可以根據不同的驗簽需求自訂對應的KeyManagementProvider(KMP)執行個體,定義不同情境下Verifier驗簽使用的密鑰或認證。Ratify還提供了Store用於發現和擷取OCI v1.1規範的subject欄位中關聯類別型的中繼資料,相關配置樣本如下:
Notation Verifier配置樣本
您可以在Verifier校正器中定義名稱name 和 artifactType 欄位指定製品類型。Verifier校正器支援叢集或命名空間兩種維度(使用NamespacedVerifier類型)的定義,更多Verifier資訊,請參見Ratify官方文檔。
使用預設配置安裝Ratify組件後,叢集會自動建立如下的Notation Verifier執行個體, 您可以根據實際使用需求配置具體的trustPolicyDoc策略。配置樣本如下:
KMP配置樣本
您可以根據不同的驗簽需求自訂對應的KeyManagementProvider執行個體,並在CR中定義公開金鑰或X.509認證。Notation和Cosign等驗證器會在簽名驗證過程中關聯對應的KMP執行個體資源。KMP支援叢集或命名空間兩種維度定義,更多KMP資訊,請參見Ratify官方文檔。配置樣本如下:
ORAS Store配置樣本
您可以在安裝Ratify組件後,在預設建立的ORAS Store執行個體中進行authProvider配置,用於串連阿里雲ACR私人倉庫。配置樣本如下: