Amazon-Ec2

不使用“source_profile”在 EC2 主機上切換 IAM 角色

  • February 5, 2019

我有一個 EC2 Ubuntu 主機,我有一個使用者帳戶負責在不同時間執行不同的任務。每個任務都需要由相應的 IAM 角色表示的特定權限(我稱它們為“配置文件角色”)。這個想法是授予該使用者在需要時擔任這些角色的權限。

目前,~/.aws/credentials配置如下所示:

[default]
aws_access_key_id = XXX
aws_secret_access_key = YYY

[profile1]
role_arn = arn:aws:iam::XXXXXXXXXX:role/role-for-profile1
source_profile = default

[profile2]
role_arn = arn:aws:iam::XXXXXXXXXX:role/role-for-profile2
source_profile = default

...

[profileN]
role_arn = arn:aws:iam::XXXXXXXXXX:role/role-for-profileN
source_profile = default

profile 中的使用者default只有一個權限:擔任以 . 開頭的任何角色role-for-profile。策略 JSON 如下所示:

{
 "Version": "2012-10-17",
 "Statement": [
   {
       "Sid": "Stmt1494333413000",
       "Effect": "Allow",
       "Action": [
           "sts:AssumeRole"
       ],
       "Resource": [
           "arn:aws:iam::XXXXXXXXXX:role/role-for-profile*"
       ]
   }
 ]
}

因此,任何需要訪問特定 AWS 服務以執行特定任務的應用程序(無論它是否使用 AWS CLI、Boto、Ansible 模組或其他)都可以指定配置文件名稱並透明地承擔所需的配置文件角色.

現在我擔心的是:因為這是在 EC2 主機上執行的,所以我根本不需要顯式地將任何憑據放入該主機。理論上,我可以直接將“主”IAM 角色附加到 EC2 主機,而不是創建使用者,授予其切換角色權限,並將其憑證顯式放入default配置文件中。

但是,我似乎不能這樣做,因為source_profile參數是強制性的。有誰知道,我如何授權 EC2 主機承擔角色而不給它任何憑據?換句話說,我希望主機通過原則“我是什麼”(具有給定 IAM 角色的 EC2 實例)而不是“我知道的”(明確提供 IAM 使用者的訪問密鑰和密鑰)進行身份驗證。

更新。找到了幾個功能請求 - 看起來尚不支持 :(

更新2。看來我需要澄清此設置的目的。我有在同一主機上執行的不同腳本(甚至可能是並行的)。每個腳本都需要一組特定的權限。我想要實現的是,每個腳本都只有這組權限,而不是更多。在我看來,實現這一目標的最佳方法如下:

  1. 在主機級別根本不提供任何權限,除了承擔許多特定角色的權限。
  2. 當腳本開始工作時,它需要承擔相應的角色才能獲得所需的權限。
  3. 同時,我不想將角色 ARN 烘焙到腳本中。相反,我想在 中定義多個配置文件~/.aws/credentials,每個配置文件都定義為承擔特定角色。

我對前兩項沒有問題。然而,實現第三個需要我創建一個“預設”配置文件,其他配置文件將用作參考,並且這個“預設”配置文件出於某種原因必須具有使用者的憑據。我想要指的是附加到執行所有這些東西的 EC2 實例的角色。

我一直在嘗試解決同樣的問題。我能找到的最接近的是這個要點:https ://gist.github.com/gene1wood/34b02fa3091e184e1997

它使用該aws sts assume-role命令獲取一組臨時憑據(預設在 60 分鐘後過期)。我想您可以使用此腳本獲取分配給 EC2 實例的角色的臨時憑證,並更新“預設”配置文件的 AWS 訪問密鑰和 AWS 密鑰。由於臨時憑證每小時到期一次,因此您需要一個 cron 作業來定期更新它們。

有點醜陋,但在得到支持之前,我認為它很有可能起作用。

引用自:https://serverfault.com/questions/849714