在 Amazon EC2 上使用gMSALinux容器 - Amazon Elastic Container Service

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

在 Amazon EC2 上使用gMSALinux容器

Amazon ECS 透過一種稱為群組受管服務帳戶 (gMSA) 的特殊服務帳戶,支援 EC2 上 Linux 容器的作用中目錄身份驗證。

.NET Core 應用程式等以 Linux 為基礎的網路應用程式,可使用 Active Directory 來促進使用者和服務之間的身分驗證和授權管理。您可以透過設計與 Active Directory 整合並在加入網域的伺服器上執行的應用程式來使用此功能。但是,由於 Linux 容器無法加入網域,因此您需要設定 Linux 容器來執行 gMSA。

使用 gMSA 執行的 Linux 容器依賴在容器主機 Amazon EC2 執行個體上執行的 credentials-fetcher 常駐程式。也就是說,常駐程式會從 Active Directory 網域控制站擷取 gMSA 憑證,然後將這些憑證傳輸到容器執行個體。如需有關服務帳戶的詳細資訊,請參閱 Microsoft Learn 網站上的針對 Windows 容器建立 gMSAs

考量事項

針對 Linux 容器使用 gMSA 前,請考慮以下事項:

  • 如果您的容器在 EC2 上執行,則可以針對 Windows 容器和 Linux 容器使用 gMSA。如需有關如何在 Fargate 上使gMSA用 Linux 容器的資訊,請參閱用gMSA於 Far Linux gate 上的容器

  • 您可能需要加入網域的 Windows 電腦才能完成先決條件。例如,您可能需要加入網域的 Windows 電腦,才能在使用 PowerShell 的 Active Directory 中建立 gMSA。「RSAT作用中導演」 PowerShell 工具僅適用於Windows。如需詳細資訊,請參閱安裝 Active Directory 管理工具

  • 您可以選擇無網域 gMSA將每個執行個體加入單一網域。使用無網域 gMSA 時,容器執行個體不會加入網域,執行個體上的其他應用程式無法使用憑證來存取網域,而加入不同網域的任務則可在相同的執行個體上執行。

    然後,選擇 CredSpec 的資料儲存,也可以選擇無網域 gMSA 的 Active Directory 使用者憑證的資料儲存。

    Amazon ECS 使用 Active Directory 憑證規格檔案 (CredSpec)。此檔案包含用於將 gMSA 帳戶內容傳播至容器的 gMSA 中繼資料。您會產生 CredSpec 檔案,然後將其儲存在下表中特定於容器執行個體的作業系統的 CredSpec 儲存選項之一。若要使用無網域方法,CredSpec 檔案中的選擇性區段可以在下表中的 domainless user credentials 儲存選項之一中指定憑證 (特定於容器執行個體的作業系統)。

    gMSA 資料儲存選項 (依作業系統)
    儲存位置 Linux Windows
    Amazon Simple Storage Service CredSpec CredSpec
    AWS Secrets Manager 無網域使用者憑證 無網域使用者憑證
    Amazon EC2 Systems Manager 參數存放區 CredSpec CredSpec,無網域使用者憑證
    本機檔案 N/A CredSpec

必要條件

在搭配 Amazon ECS 使用 Linux 容器功能適用的 gMSA 之前,請先完成下列各項:

  • 您可以使用您希望容器存取的資源來設定 Active Directory 網域。Amazon ECS 支援下列設定:

  • 您在 Active Directory 中擁有現有的 gMSA 帳戶。如需詳細資訊,請參閱 在 Amazon EC2 上使用gMSALinux容器

  • 您已在 Amazon ECS Linux 容器執行個體上安裝並執行 credentials-fetcher 常駐程式。您也將一組初始的憑證新增至 credentials-fetcher 常駐程式,以便透過 Active Directory 進行身分驗證。

    注意

    credentials-fetcher 常駐程式僅適用於 Amazon Linux 2023 和 Fedora 37 及更新版本。該常駐程式不適用於 Amazon Linux 2。如需詳細資訊,請參閱上的 aw/ 憑證取得程式。 GitHub

  • 您可以設定 credentials-fetcher 常駐程式的憑證,以便使用 Active Directory 進行身分驗證。憑證必須是具有 gMSA 帳戶存取權的 Active Directory 安全群組的成員。決定是否要將執行個體加入網域,或是要使用無網域 gMSA。 中有多個選項。

  • 您已新增必要的 IAM 許可 所需的許可取決於您為初始憑證選擇的方法以及儲存憑證規格的方法:

    • 如果您使用無網域作gMSA為初始登入資料,則工作執行角色需要的 IAM 許可。 AWS Secrets Manager

    • 如果您將憑證規格存放在 SSM 參數存放區中,則任務執行角色需要 Amazon EC2 Systems Manager 參數存放區的 IAM 許可。

    • 如果您將憑證規格存放在 Amazon S3 中,則任務執行角色需要 Amazon Simple Storage Service 的 IAM 許可。

在 Amazon ECS 上設定能夠使用 gMSA 功能的 Linux 容器

準備基礎設施

下列步驟是執行一次的考量和設定。完成這些步驟後,您可以自動建立容器執行個體以重複使用此組態。

決定如何提供初始憑證,並在可重複使用的 EC2 啟動範本中設定 EC2 使用者資料以安裝 credentials-fetcher 常駐程式。

  1. 決定是否要將執行個體加入網域,或是要使用無網域 gMSA。
    • 將 EC2 執行個體加入 Active Directory 網域

      • 透過使用者資料加入執行個體

        在 EC2 啟動範本中新增將 Active Directory 網域加入 EC2 使用者資料的步驟。多個 Amazon EC2 Auto Scaling 群組可以使用相同的啟動範本。

        您可以在 Fedora 文件中使用這些步驟加入 Active Directory 或 FreeIPA 網域

    • 建立無網域 gMSA 的 Active Directory 使用者

      credentials-fetcher 常駐程式具有稱為無網域 gMSA 的功能。此功能需要網域,但 EC2 執行個體不需要加入網域。使用無網域 gMSA 時,容器執行個體不會加入網域,執行個體上的其他應用程式無法使用憑證來存取網域,而加入不同網域的任務則可在相同的執行個體上執行。相反地,您會在 CredSpec 檔案中提供 AWS Secrets Manager 祕密的名稱。祕密必須包含使用者名稱、密碼和要登入的網域。

      此功能受到支援,可與 Linux 和 Windows 容器搭配使用。

      此功能與 gMSA support for non-domain-joined container hosts 功能類似。如需有關 Windows 功能的詳細資訊,請參閱 Microsoft Learn 網站上的 gMSA 架構和改進

      1. 在 Active Directory 網域中建立使用者。Active Directory 中的使用者必須具有存取您在任務中使用之 gMSA 服務帳戶的權限。

      2. 在中建立密碼之後 AWS Secrets Manager,在使用中目錄中建立使用者。如需詳細資訊,請參閱建立 AWS Secrets Manager 密碼

      3. 將使用者的使用者名稱、密碼和網域分別輸入到名為 usernamepassworddomainName 的 JSON 鍵值組中。

        {"username":"username","password":"passw0rd", "domainName":"example.com"}
      4. 將組態新增至服務帳戶的 CredSpec 檔案。其他的 HostAccountConfig 包含 Secrets Manager 祕密的 Amazon Resource Name (ARN)。

        在 Windows 上,PluginGUID 必須符合下列範例程式碼片段中的 GUID。在 Linux 上,會忽略 PluginGUID。將 MySecret 替換為含有祕密的 Amazon Resource Name (ARN) 的範例。

        "ActiveDirectoryConfig": { "HostAccountConfig": { "PortableCcgVersion": "1", "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}", "PluginInput": { "CredentialArn": "arn:aws:secretsmanager:aws-region:111122223333:secret:MySecret" } }
      5. 無網域 gMSA 功能需要任務執行角色中的其他許可。請遵循步驟 (選用) 無網域 gMSA 祕密

  2. 設定執行個體並安裝 credentials-fetcher 常駐程式

    您可以在 EC2 啟動範本中使用使用者資料指令碼來安裝 credentials-fetcher 常駐程式。以下範例示範兩種類型的使用者資料、cloud-config YAML 或 bash 指令碼。這些範例適用於 Amazon Linux 2023 (AL2023)。將 MyCluster 替換為您想要這些執行個體加入的 Amazon ECS 叢集的名稱。

    • cloud-config YAML
      Content-Type: text/cloud-config package_reboot_if_required: true packages: # prerequisites - dotnet - realmd - oddjob - oddjob-mkhomedir - sssd - adcli - krb5-workstation - samba-common-tools # https://github.com/aws/credentials-fetcher gMSA credentials management for containers - credentials-fetcher write_files: # configure the ECS Agent to join your cluster. # replace MyCluster with the name of your cluster. - path: /etc/ecs/ecs.config owner: root:root permissions: '0644' content: | ECS_CLUSTER=MyCluster ECS_GMSA_SUPPORTED=true runcmd: # start the credentials-fetcher daemon and if it succeeded, make it start after every reboot - "systemctl start credentials-fetcher" - "systemctl is-active credentials-fetch && systemctl enable credentials-fetcher"
    • bash 指令碼

      如果您比較習慣 bash 指令碼,並且有多個要寫入 /etc/ecs/ecs.config 的變數,請使用以下 heredoc 格式。此格式會將開頭為 catEOF 之行間的所有項目寫入組態檔案。

      #!/usr/bin/env bash set -euxo pipefail # prerequisites timeout 30 dnf install -y dotnet realmd oddjob oddjob-mkhomedir sssd adcli krb5-workstation samba-common-tools # install https://github.com/aws/credentials-fetcher gMSA credentials management for containers timeout 30 dnf install -y credentials-fetcher # start credentials-fetcher systemctl start credentials-fetcher systemctl is-active credentials-fetch && systemctl enable credentials-fetcher cat <<'EOF' >> /etc/ecs/ecs.config ECS_CLUSTER=MyCluster ECS_GMSA_SUPPORTED=true EOF

    選用組態變數適用於 credentials-fetcher 常駐程式,您可以在 /etc/ecs/ecs.config 中設定該變數。我們建議您在 YAML 區塊或與先前範例類似的 heredoc 內的使用者資料中設定變數。這樣做可防止多次編輯檔案時可能會發生的部分組態問題。如需 ECS 代理程式組態的詳細資訊,請參閱上的 Amazon ECS 容器代理程式。 GitHub

    • 或者,如果您變更 credentials-fetcher 常駐程式組態,將通訊端移至其他位置,您也可以使用變數 CREDENTIALS_FETCHER_HOST

設定許可和祕密

針對每個應用程式和每個任務定義執行下列步驟一次。我們建議您使用授予最低權限的最佳實務,並縮減政策中使用的許可。這樣一來,每個任務都只能讀取所需的祕密。

  1. (選用) 無網域 gMSA 祕密

    如果您使用執行個體未加入網域的無網域方法,請依照此步驟執行。

    您必須將以下許可作為內嵌政策新增至任務執行 IAM 角色。這樣做可讓 credentials-fetcher 常駐程式存取 Secrets Manager 的祕密。將 MySecret 替換為在 Resource 清單中含有祕密的 Amazon Resource Name (ARN) 的範例。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:ssm:aws-region:111122223333:secret:MySecret" ] } ] }
    注意

    如果您使用自己的 KMS 金鑰來加密密碼,則必須將必要的權限新增至此角色,並將此角色新增至金 AWS KMS 鑰原則。

  2. 決定您要使用 SSM 參數存放區或 S3 來存放 CredSpec

    Amazon ECS 支援以下方法,在任務定義的 credentialSpecs 欄位中參考檔案路徑。

    如果您將執行個體加入單一網域,請在字串中在 ARN 開頭使用 credentialspec: 作為字首。如果您使用無網域 gMSA,請使用 credentialspecdomainless:

    如需 CredSpec 的詳細資訊,請參閱 憑證規格檔案

    • Amazon S3 儲存貯體

      將憑證規格新增至 Amazon S3 儲存貯體。然後,在任務定義的 credentialSpecs 欄位中參考 Amazon S3 儲存貯體的 Amazon Resource Name (ARN)。

      { "family": "", "executionRoleArn": "", "containerDefinitions": [ { "name": "", ... "credentialSpecs": [ "credentialspecdomainless:arn:aws:s3:::${BucketName}/${ObjectName}" ], ... } ], ... }

      若要讓您的任務能夠存取 S3 儲存貯體,請新增下列許可做為 Amazon ECS 任務執行 IAM 角色的內嵌政策。

      { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::{bucket_name}", "arn:aws:s3:::{bucket_name}/{object}" ] } ] }
    • SSM 參數存放區參數

      將憑證規格新增至 SSM 參數存放區參數。然後,在任務定義的 credentialSpecs 欄位中參考 SSM 參數存放區參數的 Amazon Resource Name (ARN)。

      { "family": "", "executionRoleArn": "", "containerDefinitions": [ { "name": "", ... "credentialSpecs": [ "credentialspecdomainless:arn:aws:ssm:aws-region:111122223333:parameter/parameter_name" ], ... } ], ... }

      若要讓您的任務能夠存取 SSM 參數存放區參數,請新增下列許可做為 Amazon ECS 任務執行 IAM 角色的內嵌政策。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameters" ], "Resource": [ "arn:aws:ssm:aws-region:111122223333:parameter/parameter_name" ] } ] }

憑證規格檔案

Amazon ECS 使用 Active Directory 憑證規格檔案 (CredSpec)。此檔案包含用於將 gMSA 帳戶內容傳播至容器 Linux 的 gMSA 中繼資料。您會產生 CredSpec,並在任務定義的 credentialSpecs 欄位中參考該檔案。CredSpec 檔案不包含任何祕密。

以下是範例 CredSpec 檔案。

{ "CmsPlugins": [ "ActiveDirectory" ], "DomainJoinConfig": { "Sid": "S-1-5-21-2554468230-2647958158-2204241789", "MachineAccountName": "WebApp01", "Guid": "8665abd4-e947-4dd0-9a51-f8254943c90b", "DnsTreeName": "example.com", "DnsName": "example.com", "NetBiosName": "example" }, "ActiveDirectoryConfig": { "GroupManagedServiceAccounts": [ { "Name": "WebApp01", "Scope": "example.com" } ], "HostAccountConfig": { "PortableCcgVersion": "1", "PluginGUID": "{859E1386-BDB4-49E8-85C7-3070B13920E1}", "PluginInput": { "CredentialArn": "arn:aws:secretsmanager:aws-region:111122223333:secret:MySecret" } } } }
建立CredSpec

您可以在加入網域的 Windows 電腦上使用 CredSpec PowerShell 模組來建立 CredSpec。請依照 Microsoft Learn 網站上建立憑證規格中的步驟進行。