簡體   English   中英

如何告訴teamcity代理,哪個aws賬戶運行terraform到

[英]How to tell teamcity agent, which aws account to run terraform to

我將 TeamCity 啟動到一個 Kube.netes 集群中。 我有一個用於 TeamCity 服務器的部署和一個用於 TeamCity 構建代理的部署。 當我在 TeamCity 構建代理上運行 Terraform 時,它會在與托管 TeamCity Kube.netes 集群的 EC2 實例相同的 AWS 賬戶中創建資源。

我想運行一個構建,它在單獨的 AWS 賬戶中創建 AWS 資源。 我的想法是將 AWS 訪問密鑰和密鑰分配給 TeamCity 服務器並將它們傳遞給 TeamCity 構建代理,但我不知道工作流程將如何進行。

目前,我已經在構建中將 AWS 訪問密鑰和秘密密鑰聲明為環境變量,但它們沒有傳遞給代理。 我的構建步驟只包含 3 行

terraform init
terraform plan
terraform apply -auto-approve

我處理了一個非常相似的情況。 當我們開始使用 AWS 時,我們並沒有遵循關於我們的腳本如何向 AWS 進行身份驗證的最佳實踐。

我們在每個帳戶中創建了用戶,並將訪問密鑰和秘密密鑰導出到我們的 TeamCity 構建自動化中,以允許我們的腳本在這些帳戶的上下文中運行。

您最終會在不同的帳戶中擁有多個用戶,並且最終會為這些用戶手動輪換密鑰,然后在每次需要輪換密鑰時更新 TeamCity 中的訪問密鑰和秘密密鑰。

由於 TeamCity 構建代理服務器是 EC2 實例,AWS 中的最佳實踐是在這種情況下使用角色而不是用戶。 來自 AWS 文檔:

在 Amazon EC2 實例上運行的應用程序需要憑據才能訪問其他 AWS 服務。 要以安全方式向應用程序提供憑證,請使用 IAM 角色。 角色是擁有自己的一組權限的實體,但它不是用戶或組。 角色也不像 IAM 用戶那樣擁有自己的永久憑證集。 對於 Amazon EC2,IAM 動態地為 EC2 實例提供臨時憑證,這些憑證會自動為您輪換。

資料來源: https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#use-roles-with-ec2

在這種情況下,您應該做的是在每個帳戶中創建一個角色,該角色有權創建 terraform 將構建的資源。 您將需要另一個角色用於 TeamCity 構建代理服務器,該角色應該能夠承擔在每個帳戶中創建的角色。

假設您有兩個帳戶:

  1. AccountA 是您希望構建代理使用 terraform 運行構建資源的地方。
  2. AccountB 是您的構建代理運行的帳戶。

你需要的是:

  1. AccountA 中有權創建資源的角色。
  2. AccountB 中的角色,授予 ec2 實例訪問權限以承擔上述角色。

AccountB 中角色的實例配置文件應分配給 TeamCity 構建代理服務器。 然后,構建代理服務器能夠承擔 AccountA 中的角色,並在該帳戶的上下文中運行,並獲得所需的權限,而無需硬編碼訪問權限和密鑰。

您可以通過 Terraform 對任意數量的其他帳戶重復此過程以在其中構建資源。

您必須將以下塊添加到 terraform 腳本中的 aws 提供商,讓 terraform 知道要承擔什么角色:

provider "aws" {
assume_role {
role_arn = "arn:aws:iam::<ACCOUNTA>:role/<ROLENAME>"
}
}

以下是一些關於如何從 EC2 實例授予對不同賬戶中 S3 存儲桶的訪問權限的 AWS 文檔: https://aws.amazon.com/premiumsupport/knowledge-center/s3-instance-access-bucket/

另一個涵蓋 IAM Roes、EC2 實例配置文件和通過角色進行跨賬戶訪問的有用文檔頁面位於: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html

最后一個鏈接正是您要執行的操作: https://blog.e-zest.com/aws-ec2-assume-role-with-terraform

當我想為 2 個單獨的帳戶添加兩個注釋時,我的 agent.yml 文件看起來像這樣

規格:副本:1 選擇器:匹配標簽:應用程序:代理 Pod 模板:元數據:注釋:iam.amazonaws.com/role:arn:aws:iam::account:role/accoun1-s3-role iam.amazonaws.com/角色:arn:aws:iam::account:role/account2-pods-s3-role

但是一旦我放了兩個注釋,我的 sts assume role for pod 就只顯示我的第二個角色。 當我從 teamcity 運行構建時,出現此錯誤,找不到 aws 提供程序的有效憑證源

具有多個賬戶的 TeamCity + AWS 組織的安全最佳實踐:

  • 使用 iam 角色而不是具有 API 密鑰的用戶帳戶,盡可能少的特權,並將其作為代理實例配置文件附加
  • TeamCity 代理通常在跨多個項目共享的單個代理/多 AWS 賬戶部署中。 這意味着,任何人都可以輕松訪問多個帳戶。 一種解決方案 - 或者在每個帳戶中構建一個專用代理,附加最少特權實例策略/IAM 角色並連接前槽。 將 gw 中轉回 team-city 服務器,或者如果您有專用 CI/CD 帳戶,則為每個帳戶構建專用代理,提出標記策略並使用附加 ABAC 策略創建跨帳戶 IAM 角色,以便只有特定實例能夠在遠程帳戶中擔任角色
  • 盡可能保護您的 CI/CD,使用最少的帳戶權限,執行良好的網絡策略,使用 edr、siem 等工具 - !!! 這是您最脆弱的資產之一,在您的組織中具有非常廣泛的攻擊面!!!
  • 避免使用 Jenkins 之類的工具,如果您搜索 CVE,它就像瑞士奶酪

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM