在 Amazon 上使用gMSAEC2Linux容器 ECS - Amazon Elastic Container Service

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

在 Amazon 上使用gMSAEC2Linux容器 ECS

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

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

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

考量事項

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

  • 如果您的容器在上執行EC2,您可以使gMSA用Windows容器和Linux容器。如需有關如何在 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 使用活動目錄認證規範文件(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 使用 Linux gMSA 適用容器功能之前ECS,請務必完成下列操作:

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

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

  • 您已在 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為初始認證, AWS Secrets Manager 則工作執行角色需要的IAM權限。

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

    • 如果您將登入資料規格存放在 Amazon S3 中,則任務執行角色需要 Amazon 簡單儲存服務的IAM許可。

在 Amazon 上設置gMSA具有功能的Linux容器 ECS

準備基礎設施

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

決定提供初始認證的方式,並在可重複EC2使用的EC2啟動範本中設定使用者資料以安裝credentials-fetcher精靈。

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

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

        在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. 將使用者的使用者名稱、密碼和網域輸入到名為usernamepassword和的JSON索引鍵值配對domainName中。

        {"username":"username","password":"passw0rd", "domainName":"example.com"}
      4. 將組態新增至服務帳戶的 CredSpec 檔案。附加HostAccountConfig包含 Secrets Manager 秘密的 Amazon 資源名稱(ARN)。

        GUID在 Windows 上,PluginGUID必須符合下列範例程式碼片段中的。在 Linux 上,會忽略 PluginGUIDMySecret用您的秘密的 Amazon 資源名稱(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 Launch 範本中使用使用者資料指令碼安裝credentials-fetcher協助程式。以下範例示範兩種類型的使用者資料、cloud-config YAML 或 bash 指令碼。這些範例適用於 Amazon 2023 (AL2023)。以您希望這些執行個體加入的 Amazon ECS 叢集名稱取MyCluster代。

    • 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 資源名稱 (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 資源名稱 (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:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/{object}" ] } ] }
    • SSM 參數存放區參數

      將認證規格新增至SSM參數存放區參數。然後,在任務定義的credentialSpecs欄位中參考SSM參數存放區參數的 Amazon 資源名稱 (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 使用活動目錄認證規範文件(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 網站上建立憑證規格中的步驟進行。