

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

# 在 Amazon ECR 中簽署映像
<a name="image-signing"></a>

Amazon ECR 與 整合 AWS Signer ，為您提供兩種簽署容器映像的方式：*受管簽署* （自動、建議） 和*手動簽署* （用戶端）。您可以將容器映像和簽署同時儲存在私有儲存庫中。

## 選擇簽署方法
<a name="image-signing-choose-method"></a>

Amazon ECR 支援兩種簽署容器映像的方法：

**受管簽署** （建議）  
受管簽署會在將映像推送至 Amazon ECR 時自動產生密碼編譯簽章。此方法可簡化設定。受管簽署是大多數使用者的建議方法。如需詳細資訊，請參閱[受管簽署](managed-signing.md)。

**手動簽署**  
手動簽署會使用 Notation CLI 和 AWS Signer 外掛程式來簽署映像，然後再將其推送至 Amazon ECR。此方法提供更多對簽署程序的控制，當您需要在推送工作流程之外簽署映像，或需要精細控制簽署操作時，會很有用。如需詳細資訊，請參閱[手動簽署](image-signing-manual.md)。

## 考量事項
<a name="image-signing-considerations"></a>

使用 Amazon ECR 映像簽署時應考慮下列事項：
+ 儲存在儲存庫中的簽署會計入每個儲存庫映像數目上限的服務配額。針對每個儲存庫配額的影像，每個簽章計為 1 個成品。如需詳細資訊，請參閱[Amazon ECR 服務配額](service-quotas.md)。
+ 當儲存庫中有參考成品時，Amazon ECR 生命週期政策會在刪除主體映像的 24 小時內自動清除這些成品。

# 受管簽署
<a name="managed-signing"></a>

將映像推送至 Amazon ECR 時，Amazon ECR 受管簽署會使用 [AWS Signer](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) 產生密碼編譯簽章，以自動簽署您的容器映像。這不需要安裝和設定用戶端工具，並可讓您集中管理做為登錄組態的簽署。

## 先決條件
<a name="managed-signing-prerequisites"></a>

若要設定受管簽署，您可以使用參考一或多個簽署者簽署描述檔的 Amazon ECR 建立簽署組態，並選擇性地建立儲存庫篩選條件，以限制哪些儲存庫應簽署其映像。設定完成後，Amazon ECR 受管簽署會使用推送映像的實體身分，在推送映像時自動簽署映像。

您必須先具備下列項目，才能設定受管簽署：
+ **簽署者簽署設定檔** — 建立至少一個簽署者[簽署設定檔](https://docs.aws.amazon.com/signer/latest/developerguide/signing-profiles.html)。簽署設定檔是獨特的 AWS 簽署者資源，可用於在 Amazon ECR 中執行簽署操作。簽署設定檔可讓您簽署和驗證程式碼成品，例如容器映像和 AWS Lambda 部署套件。每個簽署設定檔都會指定要簽署的簽署平台、平台 ID 和其他平台特定資訊。例如，簽署設定檔 ARN 看起來像這樣：`arn:partition:signer:region:account-id:/signing-profiles/profile-name`。
+ **IAM 許可** — 推送映像的 IAM 主體必須具有必要的 IAM 許可，才能存取相關的簽署者簽署設定檔和相關的 ECR 儲存庫。您需要修改 IAM 主體的身分型政策，以包含 ECR 儲存庫操作和簽署者簽署操作的許可。下列範例政策顯示必要的許可：

```
{
   "Version": "2012-10-17",		 	 	 
   "Statement": [
   {
       "Sid":"UploadSignaturePermissions",
       "Effect":"Allow",
       "Action":[
           "ecr:CompleteLayerUpload",
           "ecr:UploadLayerPart",
           "ecr:InitiateLayerUpload",
           "ecr:BatchCheckLayerAvailability",
           "ecr:PutImage"
       ],
       "Resource":"arn:aws:ecr:region:account-id:repository/repository-name"
   },
   {
       "Sid": "SignPermissions",
       "Effect": "Allow",
       "Action": [
           "signer:SignPayload"
       ],
       "Resource": "arn:aws:signer:region:account-id:/signing-profiles/signing-profile-name"
   }
   ]
}
```

透過 Amazon ECR 受管簽署，您可以建立多個簽署規則 （每個登錄檔最多 10 個），以建立更強大的安全界限。例如，您可能會執行多個建置管道，並想要限制每個管道可以簽署的儲存庫。在每個規則中，您可以設定簽署設定檔並指定儲存庫名稱篩選條件。推送新映像時，Amazon ECR 會比對哪些簽署規則和簽署設定檔可以簽署映像。如果有多個相符項目，Amazon ECR 會產生多個簽章。

**注意**  
如果您手動驗證簽章，您仍然需要安裝 Notation CLI。

**注意**  
Amazon ECR 受管簽署可在使用 AWS Signer 進行容器映像簽署的所有 AWS 區域中使用。

## 開始使用
<a name="managed-signing-getting-started"></a>

請依照下列步驟設定受管簽署。您向 Amazon ECR 提供簽署者簽署描述檔的參考，以及選擇性地限制哪些儲存庫應該簽署其映像的篩選條件。

------
#### [ AWS 管理主控台 ]

使用下列步驟，使用 設定受管簽署 AWS 管理主控台。

1. 開啟 [ Amazon ECR 主控台](https://console.aws.amazon.com/ecr/private-registry/repositories)。在左側導覽窗格中，選取**私有登錄**檔、**功能和設定**、**受管簽署**。

1. 在**簽署規則**頁面上，選取**建立規則**。

1. 在**簽署設定檔**頁面的**選取 AWS 簽署者設定檔**下，選擇**建立新 AWS 簽署者設定檔**、輸入**設定檔名稱**，以及選擇性地變更**簽署有效期間**。然後選取**下一步**。

1. 在**篩選條件**頁面的**選取儲存庫**下，輸入**儲存庫名稱篩選條件**。然後選取**下一步**。

1. 在**檢閱和建立**頁面上，驗證您已輸入的**AWS 簽署者描述**檔和**儲存庫名稱篩選條件**。如果一切看起來都正確，請選取**儲存**。

------
#### [ AWS CLI ]

使用下列 AWS CLI 命令來設定受管簽署。
+ **建立簽署規則**

  使用簽署設定檔 ARN 建立簽署組態。使用下列內容建立檔案：

  ```
  {
      "rules": [ 
          { 
              "signingProfileArn": "arn:aws:signer:region:account-id:/signing-profiles/profile-name",
              "repositoryFilters": [ 
                  { 
                      "filter": "test*",
                      "filterType": "WILDCARD_MATCH"
                  }
              ]
          }
      ]
  }
  ```

  然後執行以下命令：

  ```
  aws ecr --region region \
      put-signing-configuration \
      --signing-configuration file://signing-config.json
  ```

  您應該會看到包含簽署組態的 API 回應。
+ **檢視您的簽署組態**

  擷取您的簽署組態：

  ```
  aws ecr --region region \
      get-signing-configuration
  ```

  您應該會看到包含簽署組態的 API 回應。
+ **檢查映像簽署狀態**

  將映像推送到您的儲存庫。例如：

  ```
  docker pull ubuntu
  
  IMAGE_NAME="account-id.dkr.ecr.region.amazonaws.com/repository-name"
  IMAGE_TAG="${IMAGE_NAME}:test-1"
  
  docker tag ubuntu $IMAGE_TAG
  docker push $IMAGE_TAG
  ```

  推送之後，請使用映像標籤來檢查簽署狀態：

  ```
  aws ecr --region region \
      describe-image-signing-status \
      --repository-name repository-name \
      --image-id imageTag=test-1
  ```

  如果儲存庫名稱與簽署組態中定義的儲存庫篩選條件相符，您應該會在 API 回應中看到簽署狀態。如果狀態成功，您應該會看到簽章推送到您的儲存庫。
+ **刪除您的簽署組態**

  刪除您的簽署組態：

  ```
  aws ecr --region region \
      delete-signing-configuration
  ```

  您應該會看到 API 回應，其中包含已刪除的簽署組態。

------

## 考量事項
<a name="managed-signing-considerations"></a>

下列限制和功能適用於受管簽署：
+ **不支援跨區域簽署** — 簽署設定檔必須與 Amazon ECR 登錄檔位於相同的區域。您不能使用某個區域的簽署設定檔來簽署位於不同區域的登錄檔中的影像。
+ **支援跨帳戶簽署** — 簽署設定檔可以在與您的 Amazon ECR 登錄檔不同的帳戶中。這可讓組織集中管理簽署設定檔，同時允許其他帳戶中的開發人員使用這些設定檔。如需詳細資訊，請參閱《 *AWS Signer 開發人員指南*》中的[設定 Signer 的跨帳戶簽署](https://docs.aws.amazon.com/signer/latest/developerguide/signing-profile-cross-account.html)。
+ **無法簽署簽章** — 您無法自行簽署簽章。只能簽署容器映像。

# 簽章驗證
<a name="image-signing-verification"></a>

簽署容器映像之後，您可以驗證簽章，以確保映像未遭到竄改，並且來自信任的來源。Amazon ECR 支援多種方法來驗證簽章：

## 使用 Amazon EKS 進行受管驗證
<a name="image-signing-verification-managed"></a>

Amazon EKS 為自動簽章驗證提供原生整合。當您在 Amazon EKS 叢集中設定簽章驗證時，服務會在允許容器執行之前自動驗證映像簽章。如需設定簽章驗證的詳細資訊，請參閱《*Amazon EKS 使用者指南*》中的在[部署期間驗證容器映像簽章](https://docs.aws.amazon.com/eks/latest/userguide/image-verification.html)。

## Amazon ECS 的 Lambda 許可控制器
<a name="image-signing-verification-lambda"></a>

Amazon ECS 提供服務生命週期掛鉤，可讓您在服務部署期間執行自訂邏輯。這些掛鉤可以在部署程序的特定點觸發 AWS Lambda 函數，可讓您在允許服務啟動之前驗證容器映像簽章。如需詳細資訊，請參閱《 *AWS Signer 開發人員指南*》中的[驗證 Amazon ECS 的容器映像簽章](https://docs.aws.amazon.com/signer/latest/developerguide/ecs-verification.html)。

## 使用標記法 CLI 手動驗證
<a name="image-signing-verification-manual"></a>

您可以使用標記法 CLI 手動驗證簽章。此方法會要求您在本機電腦或驗證環境中安裝和設定 Notation CLI。如需使用標記法 CLI 驗證映像的詳細指示，請參閱《 *AWS Signer 開發人員指南*》中的[在本機登入後驗證映像](https://docs.aws.amazon.com/signer/latest/developerguide/image-verification.html)。

## 設定 Notation 用戶端的身分驗證
<a name="image-signing-authentication"></a>

如果您使用手動簽署或使用 Notation CLI 手動驗證簽章，則必須設定 Notation 用戶端，以便向 Amazon ECR 進行身分驗證。如果您在安裝 Notation 用戶端的同一台主機上安裝了 Docker，則 Notation 將重複使用您用於 Docker 用戶端的相同身分驗證方法。Docker `login`和 `logout`命令將允許 Notation `sign`和 `verify`命令使用這些相同的登入資料，而且您不需要單獨驗證 Notation。如需設定您的 Notation 用戶端進行身分驗證的詳細資訊，請參閱 Notary Project 文件中的[使用 OCI 相容登錄檔進行驗證](https://notaryproject.dev/docs/user-guides/how-to/registry-authentication/)。

如果您沒有使用 Docker 或其他使用 Docker 憑證的工具，則建議您使用 Amazon ECR Docker 憑證助手做為您的憑證存放區。如需有關如何安裝和設定 Amazon ECR 憑證助手的詳細資訊，請參閱《[Amazon ECR Docker 憑證助手](https://github.com/awslabs/amazon-ecr-credential-helper)》。

# 手動簽署
<a name="image-signing-manual"></a>

手動簽署會使用標記 CLI 和 AWS Signer 外掛程式來簽署映像，然後再將其推送至 Amazon ECR。此方法提供更多對簽署程序的控制，當您需要在推送工作流程之外簽署映像，或需要精細控制簽署操作時很有用。

如需使用標記法 CLI 簽署容器映像的詳細說明 AWS Signer，請參閱《 *AWS Signer 開發人員指南*》中的[在 Signer 中簽署容器映像](https://docs.aws.amazon.com/signer/latest/developerguide/container-workflow.html)和相關主題。

## 先決條件
<a name="image-signing-prerequisites"></a>

開始之前，請先達成以下先決條件。
+ 安裝和設定最新版 AWS CLI。如需詳細資訊，請參閱《*AWS Command Line Interface 使用者指南*》中的「[安裝或更新最新版 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」。
+ 安裝 Notation CLI 和適用於 Notation 的 AWS Signer 外掛程式。如需詳細資訊，請參閱《*AWS Signer 開發人員指南*》中的「[簽署容器映像的先決條件](https://docs.aws.amazon.com/signer/latest/developerguide/image-signing-prerequisites.html)」。
+ 在 Amazon ECR 私有儲存庫中，儲存了需要簽署的容器映像。如需詳細資訊，請參閱[將映像推送至 Amazon ECR 私有儲存庫](image-push.md)。