

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

# 靜態加密
<a name="encryption-at-rest"></a>

**重要**  
 使用 AWS KMS (DSSE-KMS) 的雙層伺服器端加密僅適用於 AWS GovCloud (US) 區域。

Amazon ECR 將映像存放在 Amazon ECR 管理的 Amazon S3 儲存貯體中。根據預設，Amazon ECR 會使用伺服器端加密與 Amazon S3 受管加密金鑰，該加密金鑰使用 AES-256 加密演算法對靜止資料進行加密。這不需要您採取任何動作，並且免費提供。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[透過 Amazon S3 受管加密金鑰 (SSE-S3) 使用伺服器端加密來保護資料](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html)。

若要進一步控制 Amazon ECR 儲存庫的加密，您可以使用伺服器端加密搭配存放在 AWS Key Management Service () 中的 KMS 金鑰AWS KMS。當您使用 AWS KMS 加密資料時，您可以使用由 Amazon ECR AWS 受管金鑰管理的預設值，或指定您自己的 KMS 金鑰 （稱為客戶受管金鑰）。如需詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[使用伺服器端加密搭配存放在 AWS KMS (SSE-KMS) 中的 KMS 金鑰來保護資料](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html)。

 您可以選擇使用雙層伺服器端加密搭配 AWS KMS (DSSE-KMS)，將兩層加密套用至 Amazon ECR 映像。 DSSE-KMS選項類似於 SSE-KMS，但會套用兩層個別加密，而不是一層加密。如需詳細資訊，請參閱[使用雙層伺服器端加密搭配 AWS KMS 金鑰 (DSSE-KMS)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingDSSEncryption.html)。

每個 Amazon ECR 儲存庫都有一個加密組態，這是在建立儲存庫時所設定。您可以在每個儲存庫上使用不同的加密組態。如需詳細資訊，請參閱[建立 Amazon ECR 私有儲存庫以存放映像](repository-create.md)。

在啟用 AWS KMS 加密的情況下建立儲存庫時，會使用 KMS 金鑰來加密儲存庫的內容。此外，Amazon ECR 會將 AWS KMS 授予新增至 KMS 金鑰，並將 Amazon ECR 儲存庫做為承授者委託人。

以下提供了對 Amazon ECR 如何與 AWS KMS 整合以加密和解密您的儲存庫的高等程度的了解：

1. 建立儲存庫時，Amazon ECR 會傳送 [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) 呼叫至 AWS KMS ，以驗證和擷取加密組態中指定的 KMS 金鑰的 Amazon Resource Name (ARN)。

1. Amazon ECR 會將兩個 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 請求傳送至 AWS KMS ，以在 KMS 金鑰上建立授予，以允許 Amazon ECR 使用資料金鑰加密和解密資料。

1. 推送映像時，會向 發出 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html) 請求 AWS KMS ，指定用於加密映像層和資訊清單的 KMS 金鑰。

1. AWS KMS 會產生新的資料金鑰、在指定的 KMS 金鑰下加密，並傳送加密的資料金鑰，以與映像層中繼資料和映像資訊清單一起存放。

1. 提取映像時，會對 發出[解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)請求 AWS KMS，並指定加密的資料金鑰。

1. AWS KMS 會解密加密的資料金鑰，並將解密的資料金鑰傳送至 Amazon S3。

1. 使用資料金鑰在提取映像層之前解密映像層。

1. 刪除儲存庫時，Amazon ECR 會將兩個 [RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html) 請求傳送至 AWS KMS ，以淘汰為儲存庫建立的授予。

## 考量事項
<a name="encryption-at-rest-considerations"></a>

搭配 Amazon ECR 使用 AWS KMS 型加密 (SSE-KMS 或 DSSE-KMS) 時，應考慮下列幾點。
+ 如果您使用 KMS 加密建立 Amazon ECR 儲存庫，但未指定 KMS 金鑰，Amazon ECR `aws/ecr` 預設會使用 AWS 受管金鑰 具有別名的 。當您第一次建立啟用 KMS 加密的儲存庫時，就會在您的帳戶中建立此 KMS 金鑰。
+  儲存庫加密組態無法在建立儲存庫之後變更。
+ 當您使用 KMS 加密搭配您自己的 KMS 金鑰時，金鑰必須與您的儲存庫位於相同的區域。
+ 不應撤銷 Amazon ECR 代表您建立的授予。如果您撤銷授予 Amazon ECR 許可以使用帳戶中的 AWS KMS 金鑰的授予，Amazon ECR 無法存取此資料、加密推送到儲存庫的新映像，或在提取時解密這些映像。當您撤銷 Amazon ECR 的授予時，則會立即進行變更。若要撤銷存取權，請刪除儲存庫，而不是撤銷授權。刪除儲存庫後，Amazon ECR 會代表您淘汰授予。
+ 使用 AWS KMS 金鑰會產生相關費用。如需詳細資訊，請參閱 [AWS Key Management Service 定價](https://aws.amazon.com/kms/pricing/)。
+ 使用雙層伺服器端加密會產生相關費用。如需詳細資訊，請參閱 [Amazon ECR 定價](https://aws.amazon.com/ecr/pricing/)

## 所需的 IAM 許可
<a name="encryption-at-rest-iam"></a>

使用 AWS KMS伺服器端加密建立或刪除 Amazon ECR 儲存庫時，所需的許可取決於您使用的特定 KMS 金鑰。

### 使用 AWS 受管金鑰 for Amazon ECR 時所需的 IAM 許可
<a name="encryption-aws-managed-key"></a>

根據預設，當 Amazon ECR 儲存庫啟用 AWS KMS 加密，但未指定 KMS 金鑰時，會使用 AWS 受管金鑰 適用於 Amazon ECR 的 。當 Amazon ECR 的 AWS受管 KMS 金鑰用於加密儲存庫時，具有建立儲存庫許可的任何委託人也可以在儲存庫上啟用 AWS KMS 加密。但是，刪除儲存庫的 IAM 委託人必須具有 `kms:RetireGrant` 許可。這可讓您淘汰在建立儲存庫時新增至 AWS KMS 金鑰的授予。

下列範例 IAM 政策可以作為內嵌政策新增至使用者，以確保使用者具有刪除啟用加密的儲存庫所需的最低許可。使用資源參數可指定用於加密儲存庫的 KMS 金鑰。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "ecr-kms-permissions",
    "Statement": [
        {
            "Sid": "AllowAccessToRetireTheGrantsAssociatedWithTheKey",
            "Effect": "Allow",
            "Action": [
                "kms:RetireGrant"
            ],
            "Resource": "arn:aws:kms:us-west-2:111122223333:key/b8d9ae76-080c-4043-92EXAMPLE"
        }
    ]
}
```

------

### 使用客戶受管金鑰時所需的 IAM 許可
<a name="encryption-customer-managed-key"></a>

使用客戶受管金鑰建立已啟用 AWS KMS 加密的儲存庫時，建立儲存庫的使用者或角色需要 KMS 金鑰政策和 IAM 政策的許可。

建立您自己的 KMS 金鑰時，您可以使用預設金鑰政策 AWS KMS 建立，或者您可以自行指定。為了確保客戶受管金鑰仍可由帳戶擁有者管理，KMS 金鑰的金鑰政策應允許帳戶根使用者的所有 AWS KMS 動作。其他範圍的權限可能會新增至金鑰政策，但至少應該授予根使用者管理 KMS 金鑰的許可。若要允許 KMS 金鑰僅用於源自 Amazon ECR 的請求，您可以使用 [kms:ViaService 條件索引鍵](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service)搭配 `ecr.<region>.amazonaws.com` 值。

下列範例金鑰政策可讓擁有 KMS 金鑰 AWS 的帳戶 （根使用者） 完整存取 KMS 金鑰。如需此範例金鑰政策的詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[允許存取 AWS 帳戶並啟用 IAM 政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-root-enable-iam)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "ecr-key-policy",
    "Statement": [
        {
            "Sid": "EnableIAMUserPermissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        }
    ]
}
```

------

除了必要的 Amazon ECR `kms:DescribeKey`許可之外，建立儲存庫的 IAM 使用者`kms:RetireGrant`、IAM 角色或 AWS 帳戶還必須具有 `kms:CreateGrant`、 和 許可。

**注意**  
必須將 `kms:RetireGrant` 許可新增到建立儲存庫的使用者或角色的 IAM 政策中。可以將 `kms:CreateGrant` 和 `kms:DescribeKey` 許可新增到 KMS 金鑰的金鑰政策或建立儲存庫的使用者或角色的 IAM 政策。如需 AWS KMS 許可運作方式的詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的 [AWS KMS API 許可：動作和資源參考](https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html)。

下列範例 IAM 政策可以作為內嵌政策新增至使用者，以確保使用者具有建立啟用加密的儲存庫所需的最低許可，並在使用完儲存庫後刪除該儲存庫。使用資源參數可指定用於加密儲存庫的 AWS KMS key 。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "ecr-kms-permissions",
    "Statement": [
        {
            "Sid": "AllowAccessToCreateAndRetireTheGrantsAssociatedWithTheKeyAsWellAsDescribeTheKey",
            "Effect": "Allow",
            "Action": [
                "kms:CreateGrant",
                "kms:RetireGrant",
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:us-west-2:111122223333:key/b8d9ae76-080c-4043-92EXAMPLE"
        }
    ]
}
```

------

### 允許使用者在建立儲存庫時在主控台中列出 KMS 金鑰
<a name="encryption-at-rest-iam-example"></a>

使用 Amazon ECR 主控台建立儲存庫時，您可以授予許可以允許使用者在為儲存庫啟用加密時列出區域中的客戶受管 KMS 金鑰。下列 IAM 政策範例顯示使用主控台時列出 KMS 金鑰和別名所需的許可。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:ListKeys",
      "kms:ListAliases",
      "kms:DescribeKey"
    ],
    "Resource": "*"
  }
}
```

------

## 監控 Amazon ECR 與 的互動 AWS KMS
<a name="encryption-at-rest-monitoring"></a>

您可以使用 AWS CloudTrail 來追蹤 Amazon ECR 代表您傳送給 AWS KMS 的請求。CloudTrail 日誌中的日誌項目包含加密內容索引鍵，可讓它們更容易識別。

### Amazon ECR 加密內容
<a name="ecr-encryption-context"></a>

*加密內容*是一組鍵/值組，其中包含任意非私密資料。當您在加密資料的請求中包含加密內容時， 會以 AWS KMS 加密方式將加密內容繫結至加密的資料。若要解密資料，您必須傳遞相同的加密內容。

在其 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 和 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 請求中 AWS KMS，Amazon ECR 會使用兩個名稱/值對的加密內容，以識別正在使用的儲存庫和 Amazon S3 儲存貯體。如以下範例所示。名稱不會改變，但組合的加密內容值對於每個值都是不同的。

```
"encryptionContext": {
    "aws:s3:arn": "arn:aws:s3:::us-west-2-starport-manifest-bucket/EXAMPLE1-90ab-cdef-fedc-ba987BUCKET1/sha256:a7766145a775d39e53a713c75b6fd6d318740e70327aaa3ed5d09e0ef33fc3df",
    "aws:ecr:arn": "arn:aws:ecr:us-west-2:111122223333:repository/repository-name"
}
```

您可以使用加密內容來識別稽核紀錄和日誌 (例如 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 和 Amazon CloudWatch Logs) 中的這些密碼編譯操作，以及在政策和授權中作為授權的條件。

Amazon ECR 加密內容包含兩個名稱值組。
+ **aws:s3:arn** – 第一個名稱-值配對會識別儲存貯體。金鑰為 `aws:s3:arn`。值為 Amazon S3 儲存貯體 Amazon Resource Name (ARN)。

  ```
  "aws:s3:arn": "ARN of an Amazon S3 bucket"
  ```

  例如，如果儲存貯體的 ARN 是 `arn:aws:s3:::us-west-2-starport-manifest-bucket/EXAMPLE1-90ab-cdef-fedc-ba987BUCKET1/sha256:a7766145a775d39e53a713c75b6fd6d318740e70327aaa3ed5d09e0ef33fc3df`，加密內容會包含下列對組。

  ```
  "arn:aws:s3:::us-west-2-starport-manifest-bucket/EXAMPLE1-90ab-cdef-fedc-ba987BUCKET1/sha256:a7766145a775d39e53a713c75b6fd6d318740e70327aaa3ed5d09e0ef33fc3df"
  ```
+ **aws:ecr:arn** – 第二個名稱-值對會識別儲存庫的 Amazon Resource Name (ARN)。金鑰為 `aws:ecr:arn`。值為儲存庫的 ARN。

  ```
  "aws:ecr:arn": "ARN of an Amazon ECR repository"
  ```

  例如，如果儲存庫的 ARN 是 `arn:aws:ecr:us-west-2:111122223333:repository/repository-name`，加密內容會包含下列對組。

  ```
  "aws:ecr:arn": "arn:aws:ecr:us-west-2:111122223333:repository/repository-name"
  ```

## 疑難排解
<a name="encryption-at-rest-troubleshooting"></a>

使用主控台刪除 Amazon ECR 儲存庫時，如果儲存庫已成功刪除，但 Amazon ECR 無法淘汰新增至您儲存庫的 KMS 金鑰的授予，則會收到以下錯誤訊息。

```
The repository [{repository-name}] has been deleted successfully but the grants created by the kmsKey [{kms_key}] failed to be retired
```

發生這種情況時，您可以自行淘汰儲存庫的 AWS KMS 授予。

**手動淘汰儲存庫的 AWS KMS 授予**

1. 列出用於儲存庫之 AWS KMS 金鑰的授予。此 `key-id` 值會包含在您從主控台收到的錯誤中。您也可以使用 `list-keys`命令來列出帳戶中特定區域中的 AWS 受管金鑰 和客戶受管 KMS 金鑰。

   ```
   aws kms list-grants \
        --key-id b8d9ae76-080c-4043-9237-c815bfc21dfc 
        --region us-west-2
   ```

   輸出包含 `EncryptionContextSubset`，其中包含儲存庫的 Amazon Resource Name (ARN)。這可用於確定新增到金鑰的哪個授予是您要淘汰的授予。`GrantId` 值會在下一個步驟中淘汰授予時使用。

1. 淘汰為儲存庫新增之 AWS KMS 金鑰的每個授予。將 *GrantId* 的值替換為上一步輸出的授予 ID。

   ```
   aws kms retire-grant \
        --key-id b8d9ae76-080c-4043-9237-c815bfc21dfc \
        --grant-id GrantId \
        --region us-west-2
   ```