csi-secrets-store-provider-alibabacloud支持以Kubernetes Secret實例的形式向集群導入或同步KMS憑據信息,確保您集群內的應用能夠安全地訪問敏感信息;還支持通過CSI Inline的形式將憑據密鑰作為文件系統直接掛載到應用程序中,適用于通過文件系統接口(例如讀取文件)來獲取敏感信息的應用。通過該組件,您可以實現密鑰數據的自動更新,從而降低憑據密文在Secrets實例中暴露的可能,同時幫助您解決負載應用和阿里云憑據管家交互的兼容性問題。
安全說明
默認情況下,您直接從文件系統讀取密鑰和阿里云KMS憑據管家之間的直接交互可能存在兼容性問題,csi-secrets-store-provider-alibabacloud可以用于解決此類兼容性問題,同時支持將密鑰同步創建為集群中的Kubernetes原生Secrets實例,以供環境變量掛載使用。使用前請您評估如下的安全風險。
當密鑰在文件系統中可以被訪問時,如果應用中存在某些有缺陷的軟件,該軟件的漏洞可能會造成目錄遍歷的風險,導致敏感信息泄露。
由于一些Debug端點或Logs權限的誤配置都可能導致密鑰泄露,所以通過環境變量掛載引用的方式消費密鑰是一個不安全且不推薦的方式。
當開啟Secret實例同步特性時,需要基于權限最小化原則嚴格控制訪問權限。
鑒于上述原因,如果應用中并不需要密文的持久化存儲,推薦使用通過RRSA配置ServiceAccount的RAM權限實現Pod權限隔離為應用配置Pod維度的最小化權限,并通過憑據管理直接在應用中獲取密鑰憑據,以減少密鑰內容在Pod文件系統或Kubernetes集群Secrets中的暴露風險。
前提條件
已創建符合如下要求的ACK集群。具體操作,請參見創建ACK托管集群、通過控制臺創建注冊集群。
集群為1.20及以上版本。支持ACK托管集群、ACK專有集群、ACK注冊集群,暫不支持ACK Serverless集群。
集群與您的KMS服務憑據需要在同一地域。
步驟一:配置組件認證信息
您需要配置csi-secrets-store-provider-alibabacloud的認證信息,以確保該組件有權限獲取KMS服務中的憑據信息,否則csi-secrets-store-provider-alibabacloud將無法向集群中導入或同步憑據信息。您可以根據集群類型選擇如下三種授權方式進行配置。
通過RRSA授權:適用于1.22及以上版本的ACK托管集群。
為集群對應的Worker RAM角色添加權限:適用于ACK托管集群、ACK專有集群和ACK注冊集群。
通過設置AK扮演指定RAM角色:適用于所有容器服務Kubernetes集群。
通過RRSA授權
RRSA適用于1.22及以上版本的ACK托管集群。相比其他授權方式,RRSA授權方式可以實現Pod維度的權限隔離,還可以避免直接使用AK、SK引起的憑據泄露風險。
創建可信實體為身份提供商的RAM角色,以供csi-secrets-store-provider-alibabacloud使用。
使用阿里云賬號(主賬號)登錄RAM控制臺。
說明阿里云賬號(主賬號)對賬號中的資源具有完全管理權限,您也可以在RAM中創建一個RAM用戶,授予AdministratorAccess權限,充當賬號管理員,該管理員可以對賬號下所有云資源進行管控操作。更多信息,請參見創建賬號管理員。
在左側導航欄,選擇 。
在角色頁面,單擊創建角色。
在創建角色頁面,選擇可信實體類型為身份提供商,然后單擊下一步。
在配置角色頁面,配置如下角色信息后,單擊完成。
配置項
描述
角色名稱
自定義角色名稱。
備注
選填有關該角色的備注信息。
身份提供商類型
OIDC。
選擇身份提供商
ack-rrsa-<cluster_id>。其中,<cluster_id>為您的集群ID。
限制條件
oidc:iss:保持默認。
oidc:aud:選擇sts.aliyuncs.com。
oidc:sub:條件判定方式選擇StringEquals,值的格式為system:serviceaccount:<namespace>:<serviceAccountName>。
<namespace>
:應用所在的命名空間。<serviceAccountName>
:服務賬戶名稱。
根據測試應用的信息,此處需要填入
system:serviceaccount:kube-system:csi-secrets-store-provider-alibabacloud
。說明建議您將組件安裝在默認的
kube-system
命名空間下。如果您將csi-secrets-store-provider-alibabacloud安裝在其他的命名空間,請將kube-system
替換為對應命名空間的名稱。
創建自定義授權策略并為上一步創建的RAM角色授權。
在集群中創建名為alibaba-credentials的Secret,配置模板如下,需要替換部分字段。
使用以下內容,替換相關字段后,創建secretstore-rrsa.yaml文件。
{rolearn}
:替換為步驟2創建的RAM角色的ARN(需要Base64編碼)。{sessionname}
:替換為角色會話名稱(需要Base64編碼)。{oidcproviderarn}
:替換為集群開啟RRSA后生成的提供商ARN(需要Base64編碼)。
apiVersion: v1 data: rolearn: {rolearn} rolesessionname: {sessionname} oidcproviderarn: {oidcproviderarn} kind: Secret metadata: name: alibaba-credentials namespace: kube-system type: Opaque
執行以下命令,部署Secret。
kubectl apply -f secretstore-rrsa.yaml
為集群對應的Worker RAM角色添加權限
適用于ACK托管集群、ACK專有集群和ACK注冊集群
創建如下自定義權限策略。具體操作,請參見創建自定義權限策略。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }
為集群的WorkerRole添加上一步創建的自定義權限。具體操作,請參見為集群的Worker RAM角色授權
通過設置AK扮演指定RAM角色
適用于所有容器服務Kubernetes集群。
創建可信實體為阿里云賬號的RAM角色,以供csi-secrets-store-provider-alibabacloud組件使用。具體操作,請參見創建可信實體為阿里云賬號的RAM角色。
創建自定義授權策略并為上一步已創建的RAM角色授權。
創建扮演上述角色的自定義授權策略,并為指定的RAM用戶授權。
在集群中創建名為alibaba-credentials的Secret,配置模板如下,需要替換部分字段。
使用以下內容,替換相關字段后,創建alibaba-credentials.yaml文件。
{rolearn}
:替換為步驟1已創建的RAM角色的ARN(需要Base64編碼)。{sessionname}
:替換為角色會話名稱 (需要Base64編碼)。{ak}
:替換為RAM用戶的AK(需要Base64編碼)。{sk}
:替換為RAM用戶的SK(需要Base64編碼)。apiVersion: v1 data: id: {ak} rolesessionname: {sessioname} secret: {sk} rolearn: {rolearn} kind: Secret metadata: name: alibaba-credentials namespace: kube-system type: Opaque
執行以下命令,部署Secret。
kubectl apply -f alibaba-credentials.yaml
步驟二:安裝csi-secrets-store-provider-alibabacloud組件
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在Helm頁面,單擊創建,在Chart區域搜索并選中csi-secrets-store-provider-alibabacloud,其它設置保持默認,然后單擊下一步。
根據彈出的頁面提示確認,組件將被安裝在默認的kube-system命名空間中,并以組件名稱發布應用。如果您需要自定義應用名和命名空間,請根據頁面提示設置。
選擇Chart版本為最新版本,在參數區域根據步驟一選擇的認證方式,設置相關參數,然后單擊確定。
如果選擇通過RRSA授權,您需要將參數
rrsa.enable
設置為true,以開啟RRSA認證功能。其他相關參數配置如下。
envVarsFromSecret: # ACCESS_KEY_ID: # secretKeyRef: alibaba-credentials # key: id # SECRET_ACCESS_KEY: # secretKeyRef: alibaba-credentials # key: secret ALICLOUD_ROLE_ARN: secretKeyRef: alibaba-credentials key: rolearn ALICLOUD_ROLE_SESSION_NAME: secretKeyRef: alibaba-credentials key: rolesessionname # ALICLOUD_ROLE_SESSION_EXPIRATION: # secretKeyRef: alibaba-credentials # key: rolesessionexpiration ALICLOUD_OIDC_PROVIDER_ARN: secretKeyRef: alibaba-credentials key: oidcproviderarn
如果選擇為集群對應的Worker RAM角色添加權限,您可以采用默認參數配置直接安裝。
如果選擇通過設置AK扮演指定RAM角色,您需要配置如下相關參數。
envVarsFromSecret: ACCESS_KEY_ID: secretKeyRef: alibaba-credentials key: id SECRET_ACCESS_KEY: secretKeyRef: alibaba-credentials key: secret ALICLOUD_ROLE_ARN: secretKeyRef: alibaba-credentials key: rolearn ALICLOUD_ROLE_SESSION_NAME: secretKeyRef: alibaba-credentials key: rolesessionname # ALICLOUD_ROLE_SESSION_EXPIRATION: # secretKeyRef: alibaba-credentials # key: rolesessionexpiration # ALICLOUD_OIDC_PROVIDER_ARN: # secretKeyRef: alibaba-credentials # key: oidcproviderarn
如需開啟定時同步憑據的功能,需要配置如下相關參數。
secrets-store-csi-driver.enableSecretRotation
:是否開啟憑據的自動輪詢功能,設置為true,開啟憑據自動輪詢功能。secrets-store-csi-driver.rotationPollInterval
:憑據同步的頻率,設置為120s,此處以兩分鐘同步一次憑據為例,您可以根據實際需求調整。
創建成功后,會自動跳轉到目標集群的csi-secrets-store-provider-alibabacloud頁面,檢查安裝結果。若下圖中所有資源創建成功,則表明組件安裝成功。
步驟三:配置數據同步信息
認證信息配置完成后,您需要通過SecretProviderClass來進行KMS憑據信息的配置。
配置模板說明
SecretProviderClass模板格式定義如下所示。
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
name: <NAME>
spec:
provider: alibabacloud # 此處配置固定為'alibabacloud'。
parameters:
其中parameters
通常包含掛載請求的三個字段:
參數 | 類型 | 說明 |
objects | 必選 | 掛載Secrets憑據的YAML配置聲明。例如
|
region | 可選 | 用于請求指定Region下的阿里云憑據管家后端。如果不指定該參數,則默認使用節點對應的阿里云Region。但在大規模應用Pod部署時,可能會帶來額外的性能開銷,所以推薦配置該參數指定Region。 |
pathTranslation | 可選 |
|
配置使用示例
本示例以ACK托管集群同一地域下的KMS服務憑據test
為例,介紹如何通過SecretProviderClass將其導入到集群應用中。
使用以下簡單的SecretProviderClass示例,創建secretstore.yaml文件。
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: test-secrets spec: provider: alibabacloud # 此處固定配置為alibabacloud。 parameters: objects: | - objectName: "test"
執行以下命令,部署SecretProviderClass。
kubectl apply -f secretstore.yaml
使用以下內容,創建deploy.yaml。
包含一個Nginx Deployment實例,通過CSI Inline文件系統的形式聲明使用了上面示例中已經創建的SecretProviderClass,并在Pod中的
/mnt/secrets-store
目錄下掛載憑據密鑰。關于Deployment實例更多信息,請參見Deployment示例。apiVersion: apps/v1 # 1.8.0之前版本請使用apps/v1beta1。 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "test-secrets" containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 # 替換為您的實際鏡像。 ports: - containerPort: 80 resources: limits: cpu: "500m" volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" readOnly: true
執行以下命令,部署Deploy應用。
kubectl apply -f deploy.yaml
驗證密鑰是否被正常掛載。
登錄Pod查看Secret的目標掛載路徑
/mnt/secrets-store
下是否已經創建了SecretProviderClass實例中指定密鑰名稱為文件名的密鑰文件,同時查看文件內容是否為KMS憑據中指定的密文。
相關文檔
如果您需要為ACK Serverless集群中的應用導入阿里云KMS憑據,請參見使用ack-secret-manager導入阿里云KMS服務憑據。
為了保護從KMS讀取后緩存在ACK集群中的Secret,您可以對ACK集群Secret進行一鍵加密。具體操作,請參見使用阿里云KMS進行Secret的落盤加密。