資料加密和秘密管理 - Amazon EKS

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

資料加密和秘密管理

靜態加密

您可以搭配 Kubernetes 使用三種不同的 AWS 原生儲存選項:EBSEFSFSx for Lustre。這三個使用服務受管金鑰或客戶主金鑰 (CMK) 提供靜態加密。對於 EBS,您可以使用樹狀內儲存驅動程式或 EBS CSI 驅動程式。兩者都包含用於加密磁碟區和提供 CMK 的參數。對於 EFS,您可以使用 EFS CSI 驅動程式,但與 EBS 不同,EFS CSI 驅動程式不支援動態佈建。如果您想要搭配 EKS 使用 EFS,在建立 PV 之前,您將需要為檔案系統佈建和設定靜態加密。如需 EFS 檔案加密的詳細資訊,請參閱加密靜態資料。除了提供靜態加密之外,EFS 和 FSx for Lustre 還包含加密傳輸中資料的選項。FSx for Lustre 預設會執行此操作。對於 EFS,您可以透過將 tls 參數新增至 PV mountOptions中的 來新增傳輸加密,如本範例所示:

apiVersion: v1 kind: PersistentVolume metadata: name: efs-pv spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: efs-sc mountOptions: - tls csi: driver: efs.csi.aws.com volumeHandle: <file_system_id>

FSx CSI 驅動程式支援動態佈建 Lustre 檔案系統。根據預設,它會使用服務受管金鑰加密資料,但您可以選擇提供您自己的 CMK,如本範例所示:

kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: fsx-sc provisioner: fsx.csi.aws.com parameters: subnetId: subnet-056da83524edbe641 securityGroupIds: sg-086f61ea73388fb6b deploymentType: PERSISTENT_1 kmsKeyId: <kms_arn>
重要

自 2020 年 5 月 28 日起,寫入 EKS Fargate Pod 中暫時性磁碟區的所有資料都會預設使用業界標準的 AES-256 密碼編譯演算法進行加密。不需要修改您的應用程式,因為 服務會無縫處理加密和解密。

加密靜態資料

加密靜態資料視為最佳實務。如果您不確定是否需要加密,請加密您的資料。

定期輪換您的 CMKs

設定 KMS 以自動輪換您的 CMKs。這將每年輪換一次金鑰,同時無限期儲存舊金鑰,以便仍然可以解密您的資料。如需詳細資訊,請參閱輪換客戶主金鑰

使用 EFS 存取點簡化對共用資料集的存取

如果您有具有不同 POSIX 檔案許可的共用資料集,或想要透過建立不同的掛載點來限制對共用檔案系統一部分的存取,請考慮使用 EFS 存取點。若要進一步了解如何使用存取點,請參閱 https://https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html。今天,如果您想要使用存取點 (AP),則需要在 PV volumeHandle 參數中參考 AP。

重要

自 2021 年 3 月 23 日起,EFS CSI 驅動程式支援動態佈建 EFS 存取點。存取點是 EFS 檔案系統的應用程式特定進入點,可讓您更輕鬆地在多個 Pod 之間共用檔案系統。每個 EFS 檔案系統最多可有 120 PVs。如需詳細資訊,請參閱 Amazon EFS CSI 動態佈建簡介

秘密管理

Kubernetes 秘密用於存放敏感資訊,例如使用者憑證、密碼或 API 金鑰。它們會保留在以 base64 編碼的字串。在 EKS 上,已加密節點的 EBS 磁碟區會使用 EBS 加密進行加密。Pod 可以透過在 中參考秘密來擷取 Kubernetes 秘密物件podSpec。這些秘密可以映射到環境變數或掛載為磁碟區。如需建立秘密的詳細資訊,請參閱 https://https://kubernetes.io/docs/concepts/configuration/secret/

警告

秘密命名空間中的所有 Pod 都可以參考秘密命名空間中的秘密。

警告

節點授權方允許 Kubelet 讀取掛載到節點的所有秘密。

使用 AWS KMS 進行 Kubernetes 秘密的信封加密

這可讓您使用唯一的資料加密金鑰 (DEK) 來加密秘密。然後,DEK 會使用來自 AWS KMS 的金鑰加密金鑰 (KEK) 進行加密,該金鑰可依週期性排程自動輪換。使用適用於 Kubernetes 的 KMS 外掛程式,所有 Kubernetes 秘密會以加密文字而非純文字儲存在 中,並且只能由 Kubernetes API 伺服器解密。如需其他詳細資訊,請參閱使用 EKS 加密提供者支援進行深度防禦

稽核 Kubernetes 秘密的使用

在 EKS 上,開啟稽核記錄並建立 CloudWatch 指標篩選條件和警示,以便在使用秘密時提醒您 (選用)。以下是 Kubernetes 稽核日誌 的指標篩選條件範例{($.verb="get") && ($.objectRef.resource="secret")}。您也可以搭配 CloudWatch Log Insights 使用下列查詢:

fields @timestamp, @message | sort @timestamp desc | limit 100 | stats count(*) by objectRef.name as secret | filter verb="get" and objectRef.resource="secrets"

上述查詢會顯示在特定時間範圍內存取秘密的次數。

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter verb="get" and objectRef.resource="secrets" | display objectRef.namespace, objectRef.name, user.username, responseStatus.code

此查詢會顯示秘密,以及嘗試存取秘密和回應碼之使用者的命名空間和使用者名稱。

定期輪換您的秘密

Kubernetes 不會自動輪換秘密。如果您必須輪換秘密,請考慮使用外部秘密存放區,例如 Vault 或 AWS Secrets Manager。

使用個別命名空間做為隔離秘密與不同應用程式的方式

如果您有無法在命名空間中的應用程式之間共用的秘密,請為這些應用程式建立個別的命名空間。

使用磁碟區掛載而非環境變數

環境變數的值可能會無意中出現在日誌中。掛載為磁碟區的秘密會執行個體化為 tmpfs 磁碟區 (RAM 後端檔案系統),其會在刪除 Pod 時自動從節點移除。

使用外部秘密提供者

使用 Kubernetes 秘密有幾種可行的替代方案,包括 AWS Secrets Manager 和 Hashicorp 的保存。這些服務提供功能,例如精細存取控制、強式加密,以及 Kubernetes Secrets 無法使用的秘密自動輪換。Bitnami 的密封秘密是另一種使用非對稱加密來建立「密封秘密」的方法。公有金鑰用於加密秘密,而用於解密秘密的私有金鑰會保留在叢集中,可讓您將密封的秘密安全地存放在 Git 等來源控制系統中。如需詳細資訊,請參閱使用密封秘密在 Kubernetes 中管理秘密部署

隨著外部秘密存放區的使用量不斷增加, 需要將其與 Kubernetes 整合。Secret Store CSI 驅動程式是使用 CSI 驅動程式模型從外部秘密存放區擷取秘密的社群專案。目前,驅動程式支援 AWS Secrets Manager、Azure、Vault 和 GCP。AWS 提供者同時支援 AWS Secrets Manager AWS 參數存放區。它也可以設定為在秘密過期時輪換秘密,並且可以將 AWS Secrets Manager 秘密同步到 Kubernetes Secrets。當您需要將秘密參考為環境變數,而不是從磁碟區讀取秘密時,秘密的同步會很有用。

注意

當秘密存放區 CSI 驅動程式必須擷取秘密時,它會擔任指派給參考秘密之 Pod 的 IRSA 角色。您可以在此處找到此操作的程式碼。

如需 AWS Secrets & Configuration Provider (ASCP) 的其他資訊,請參閱下列資源:

external-secrets 是搭配 Kubernetes 使用外部秘密存放區的另一種方式。如同 CSI 驅動程式,外部秘密適用於各種不同的後端,包括 AWS Secrets Manager。差別在於,外部秘密不會從外部秘密存放區擷取秘密,而是將秘密從這些後端複製到 Kubernetes 做為秘密。這可讓您使用偏好的秘密存放區管理秘密,並以 Kubernetes 原生方式與秘密互動。

工具和資源