

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

# 資料加密和秘密管理
<a name="data-encryption-and-secrets-management"></a>

## 靜態加密
<a name="_encryption_at_rest"></a>

您可以搭配 Kubernetes 使用三種不同的 AWS 原生儲存選項：[EBS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html)、[EFS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEFS.html) 和 [FSx for Lustre](https://docs.aws.amazon.com/fsx/latest/LustreGuide/what-is.html)。這三個使用服務受管金鑰或客戶主金鑰 (CMK) 提供靜態加密。對於 EBS，您可以使用樹狀內儲存驅動程式或 [EBS CSI 驅動程式](https://github.com/kubernetes-sigs/aws-ebs-csi-driver)。兩者都包含用於加密磁碟區和提供 CMK 的參數。對於 EFS，您可以使用 [EFS CSI 驅動程式](https://github.com/kubernetes-sigs/aws-efs-csi-driver)，但與 EBS 不同，EFS CSI 驅動程式不支援動態佈建。如果您想要將 EFS 與 EKS 搭配使用，您需要在建立 PV 之前為檔案系統佈建和設定靜態加密。如需 EFS 檔案加密的詳細資訊，請參閱[加密靜態資料](https://docs.aws.amazon.com/efs/latest/ug/encryption-at-rest.html)。除了提供靜態加密之外，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 驅動程式](https://github.com/kubernetes-sigs/aws-fsx-csi-driver)支援動態佈建 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 密碼編譯演算法進行加密。不需要修改您的應用程式，因為 服務會無縫處理加密和解密。

### 加密靜態資料
<a name="_encrypt_data_at_rest"></a>

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

### 定期輪換您的 CMKs
<a name="_rotate_your_cmks_periodically"></a>

設定 KMS 以自動輪換 CMKs。這將每年輪換一次金鑰，同時無限期儲存舊金鑰，以便仍然可以解密您的資料。如需詳細資訊，請參閱[輪換客戶主金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html) 

### 使用 EFS 存取點簡化對共用資料集的存取
<a name="_use_efs_access_points_to_simplify_access_to_shared_datasets"></a>

如果您有具有不同 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 動態佈建簡介](https://aws.amazon.com/blogs/containers/introducing-efs-csi-dynamic-provisioning/)。

## 秘密管理
<a name="_secrets_management"></a>

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

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

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

### 使用 AWS KMS 進行 Kubernetes 秘密的信封加密
<a name="_use_aws_kms_for_envelope_encryption_of_kubernetes_secrets"></a>

這可讓您使用唯一的資料加密金鑰 (DEK) 來加密秘密。然後，DEK 會使用來自 AWS KMS 的金鑰加密金鑰 (KEK) 進行加密，該金鑰可依週期性排程自動輪換。使用適用於 Kubernetes 的 KMS 外掛程式，所有 Kubernetes 秘密會以加密文字而非純文字儲存在 中，並且只能由 Kubernetes API 伺服器解密。如需其他詳細資訊，請參閱[使用 EKS 加密提供者支援進行深度防禦](https://aws.amazon.com/blogs/containers/using-eks-encryption-provider-support-for-defense-in-depth/) 

### 稽核 Kubernetes 秘密的使用
<a name="_audit_the_use_of_kubernetes_secrets"></a>

在 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
```

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

### 定期輪換您的秘密
<a name="_rotate_your_secrets_periodically"></a>

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

### 使用個別命名空間做為隔離秘密與不同應用程式的方式
<a name="_use_separate_namespaces_as_a_way_to_isolate_secrets_from_different_applications"></a>

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

### 使用磁碟區掛載而非環境變數
<a name="_use_volume_mounts_instead_of_environment_variables"></a>

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

### 使用外部秘密提供者
<a name="_use_an_external_secrets_provider"></a>

使用 Kubernetes 秘密有幾種可行的替代方案，包括 [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) 和 Hashicorp 的保存[庫](https://www.hashicorp.com/blog/injecting-vault-secrets-into-kubernetes-pods-via-a-sidecar/)。這些服務提供功能，例如精細存取控制、強式加密，以及 Kubernetes Secrets 無法使用的秘密自動輪換。Bitnami 的[密封秘密](https://github.com/bitnami-labs/sealed-secrets)是使用非對稱加密來建立「密封秘密」的另一種方法。公有金鑰用於加密秘密，而用於解密秘密的私有金鑰會保留在叢集中，可讓您將密封的秘密安全地存放在 Git 等來源控制系統中。如需詳細資訊[，請參閱使用密封秘密在 Kubernetes 中管理秘密部署](https://aws.amazon.com/blogs/opensource/managing-secrets-deployment-in-kubernetes-using-sealed-secrets/)。

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

**注意**  
當秘密存放區 CSI 驅動程式必須擷取秘密時，它會擔任指派給參考秘密之 Pod 的 IRSA 角色。您可以在[此處](https://github.com/aws/secrets-store-csi-driver-provider-aws/blob/main/auth/auth.go)找到此操作的程式碼。

如需 AWS Secrets & Configuration Provider (ASCP) 的其他資訊，請參閱下列資源：
+  [如何使用 AWS Secrets 組態提供者搭配 Kubernetes Secret Store CSI 驅動程式](https://aws.amazon.com/blogs/security/how-to-use-aws-secrets-configuration-provider-with-kubernetes-secrets-store-csi-driver/) 
+  [將 Secrets Manager 秘密與 Kubernetes Secrets Store CSI 驅動程式整合](https://docs.aws.amazon.com/secretsmanager/latest/userguide/integrating_csi_driver.html) 

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

## 工具和資源
<a name="_tools_and_resources"></a>
+  [Amazon EKS 安全浸入研討會 - 資料加密和秘密管理](https://catalog.workshops.aws/eks-security-immersionday/en-US/13-data-encryption-and-secret-management) 