混淆代理人問題
混淆代理人問題屬於安全性議題,其中沒有執行動作許可的實體可以強制具有更多許可的實體執行該動作。為了防止這種情況,如果您提供第三方 (稱為跨帳戶) 或其他 AWS 服務 (稱為跨服務) 來存取您帳戶中的資源,則 AWS 提供的工具可協助您保護帳戶。
有時,您可能需要向第三方提供對您的 AWS 資源的存取權 (提供存取權)。例如,您決定聘請一家名為 Example Corp 的第三方公司來監控您的 AWS 帳戶並幫助最佳化成本。為追蹤您的日常開支,Example Corp 需要存取您的 AWS 資源。Example Corp 也可監控其他客戶的許多其他 AWS 帳戶。您可以使用 IAM 角色,在您的 AWS 帳戶 與 Example Corp 帳戶之間建立信任關係。此案例的一個重要方面是外部 ID。外部 ID 是一個選用識別碼,您可在 IAM 角色信任政策中使用該識別碼來指定誰可以擔任該角色。外部 ID 的主要功能是解決並防止「混淆代理人」問題。
部分 AWS 服務 (呼叫服務) 會使用其 AWS 服務主體存取其他服務 AWS (被呼叫服務) 中的 AWS 資源。在某些這類服務互動中,您可以設定呼叫服務,使其與不同 AWS 帳戶中的被呼叫服務的資源通訊。例如,將 AWS CloudTrail 設定為寫入位於不同 AWS 帳戶中的中央 Amazon S3 儲存貯體。可透過為 cloudtrail.amazonaws.com 新增允許陳述式,使用 S3 儲存貯體的政策向呼叫服務 CloudTrail 授予對 S3 儲存貯體的存取權。
當呼叫服務中的 AWS 服務主體存取被呼叫服務的資源時,被呼叫服務中的資源政策僅會向 AWS 服務主體授權,而不會向設定呼叫服務的執行者授權。例如,無條件信任 CloudTrail 服務主體的 S3 儲存貯體,可以接收來自可信管理員設定的 AWS 帳戶中的 CloudTrail 日誌,但如果未經授權的執行者知曉了該 S3 儲存貯體的名稱,該 S3 儲存貯體也會收到來自其 AWS 帳戶中執行者的 CloudTrail 日誌。
當執行者利用 AWS 服務之服務主體的信任來存取他們不應有權存取的資源時,就會發生混淆代理人問題。
預防跨帳戶混淆代理人
下圖說明了跨帳戶混淆代理人問題。
此案例假設如下:
-
AWS1 是你的 AWS 帳戶。
-
AWS1:ExampleRole 是您帳戶中的角色。此角色的信任政策透過將 Example Corp 的 AWS 帳戶指定為可擔任該角色的帳戶來信任 Example Corp。
將發生以下情況:
-
在您開始使用 Example Corp 的服務時,您將向 Example Corp 提供 AWS1:ExampleRole 的 ARN。
-
Example Corp 使用該角色 ARN 取得臨時安全性憑證以存取您的 AWS 帳戶 中的資源。這樣一來,您將信任 Example Corp 做為可代表您執行操作的「代理人」。
-
另一個 AWS 客戶也開始使用 Example Corp 的服務,而且此客戶還為 Example Corp 提供 AWS1:ExampleRole 的 ARN 以供其使用。另一個客戶可能已了解或猜到已不是機密資訊的 AWS1:ExampleRole。
-
當另一個客戶要求 Example Corp 存取 (它聲稱的) 其帳戶中的 AWS 資源時,Example Corp 會使用 AWS1:ExampleRole 存取您帳戶中的資源。
這就是其他客戶可對您的資源進行未授權存取的方式。由於此客戶能夠誘使 Example Corp 無意中操作您的資源,因此 Example Corp 現在是一個「混淆代理人」。
Example Corp 可以透過要求在角色的信任政策中包含 ExternalId 條件檢查來解決混淆代理人問題。Example Corp 為每個客戶生成唯一的 ExternalId 值,並在其請求中使用該值來擔任此角色。因此,ExternalId 值必須在 Example Corp 的客戶中具備唯一性,並由 Example Corp 而非其客戶控制。這就是您從 Example Corp 取得該 ID 且不能自行提供該 ID 的原因。這可以防止 Example Corp 成為混淆代理人,並授予存取其他帳戶的 AWS 資源的權利。
在我們的方案中,假設 Example Corp 為您提供的獨有識別碼是 12345,而為另一個客戶提供的識別碼是 67890。這些識別碼已針對此方案進行簡化。通常,這些識別碼為 GUID。假定這些識別碼在 Example Corp 的客戶之間是獨有的,它們將是用於外部 ID 的有意義的值。
Example Corp 將為您提供外部 ID 值 12345。然後,您必須將一個 Condition 元素加入到角色的信任政策,該政策要求 sts:ExternalId 值為 12345,如下所示:
此政策中的 Condition 元素允許 Example Corp 僅在 AssumeRole API 呼叫包括外部 ID 值 12345 時擔任該角色。Example Corp 會確認,只要它代表客戶擔任角色,就會一律在 AssumeRole 呼叫中包括客戶的外部 ID。即使另一個客戶向 Example Corp 提供您的 ARN,也無法控制 Example Corp 包括在其發送給 AWS 的請求中的外部 ID。這有助於防止未經授權的客戶取得對您的資源的存取權限。
下圖說明此程序。
-
與之前一樣,在您開始使用 Example Corp 的服務時,您將向 Example Corp 提供 AWS1:ExampleRole 的 ARN。
-
在 Example Corp 使用該角色 ARN 來擔任 AWS1:ExampleRole 角色時,Example Corp 將在 AssumeRole API 呼叫中包含您的外部 ID (12345)。該外部 ID 與角色的信任政策相符,因此 AssumeRole API 呼叫將成功,並且 Example Corp 將取得用於存取您的 AWS 帳戶 中的資源的臨時安全性憑證。
-
另一個 AWS 客戶也開始使用 Example Corp 的服務,而且與之前一樣,此客戶也為 Example Corp 提供 AWS1:ExampleRole 的 ARN 以供其使用。
-
但這一次,在 Example Corp 嘗試擔任角色 AWS1:ExampleRole 時,它提供與其他客戶建立關聯的外部 ID (67890)。其他客戶無法更改此外部 ID。Example Corp 這樣做是因為另一個客戶請求使用該角色,因此 67890 表示 Example Corp 正在其中操作的環境。因為您已將具有您自己的外部 ID (12345) 的條件新增至 AWS1:ExampleRole 的信任政策,所以 AssumeRole API 呼叫將失敗。該其他客戶不能對您帳戶中的資源進行未經授權的存取 (由圖表中的紅色 "X" 表示)。
該外部 ID 說明阻止任何其他客戶誘使 Example Corp 無意中存取您的資源。
預防跨服務混淆代理人
下圖使用 CloudTrail 和 Amazon S3 互動範例示範了跨服務混淆代理人問題,其中未經授權的執行者將 CloudTrail 日誌寫入到他們無權存取的 Amazon S3 儲存貯體中。
為了協助防止未經授權的執行者利用 AWS 主體的信任來存取您的資源,AWS 服務主體包含有關其所代表的 AWS 資源、AWS 帳戶和 AWS 組織的資訊。
此資訊可用於全域條件索引鍵值,這些值可在資源政策或由 AWS 服務主體發出的請求的資源控制政策中使用。凡 AWS 服務主體被授予存取您某項資源的許可時,建議您均在資源政策中使用 aws:SourceArn、aws:SourceAccount、aws:SourceOrgID 或 aws:SourceOrgPaths。這些條件索引鍵可讓您在資源政策或資源控制政策中,測試存取您資源的 AWS 服務主體是否代表您預期的 AWS 資源、AWS 帳戶或 AWS Organizations 來存取。
-
使用
aws:SourceArn以允許 AWS 服務主體代表特定資源存取您的資源,例如特定 AWS CloudTrail 追踪或 AppStream 機群。 -
使用
aws:SourceAccount以允許 AWS 服務主體代表特定 AWS 帳戶存取您的資源。 -
使用
aws:SourceOrgID以允許 AWS 服務主體代表特定 AWS Organizations 存取您的資源。 -
使用
aws:SourceOrgPaths以允許 AWS 服務主體代表特定 AWS Organizations 路徑存取您的資源。
下圖示範了當資源設定了 aws:SourceAccount 全域條件內容索引鍵時跨服務混淆代理人案例,以及來自另一個帳戶的未經授權執行者嘗試存取他們不應有權存取的 AWS 資源。
在政策中使用 aws:SourceArn、aws:SourceAccount、aws:SourceOrgID 和 aws:SourceOrgPaths 全域條件索引鍵,可協助您確保服務主體是代表您存取您的資源。凡是在向 AWS 服務主體授予對您某個資源的存取權時,建議均使用這些條件索引鍵。
注意
某些 AWS 服務互動具有額外的控制措施來協助防止發生跨服務混淆代理人問題,這些問題會測試使用者對資源的存取權。例如,在向某項 AWS 服務發出 KMS 金鑰授權時,AWS KMS 會使用與資源相關聯的加密內容以及金鑰授予,協助防範跨服務混淆代理人問題。
如需有關可協助避免跨服務混淆代理人風險的服務特定機制,以及 aws:SourceArn、aws:SourceAccount、aws:SourceOrgID 和 aws:SourceOrgPaths 是否受支援的詳細資訊,請參閱您所用服務的相關文件。
跨服務混淆代理人保護與資源型政策搭配使用
下列範例政策僅在服務主體 cloudtrail.amazonaws.com 代表 AWS 帳戶 111122223333 執行動作時,才授予服務主體對 Amazon S3 儲存貯體 (arn:aws:s3:::amzn-s3-demo-bucket1) 的存取權。
此範例儲存貯體政策僅在服務主體 appstream.amazonaws.com 代表指定的 Amazon AppStream 機群執行動作 (透過以 aws:SourceArn 來指定機群 ARN) 時,才授予服務主體對 s3://amzn-s3-demo-bucket2 內的 powershell 指令碼 examplefile.psh 的存取權。
跨服務混淆代理人保護與資源控制政策搭配使用
您可以使用資源控制政策 (RCP),將跨服務混淆代理人控制套用至支援的 AWS 服務資源。RCP 讓您可以在資源上集中套用跨服務混淆代理人控制。您可以搭配使用 aws:SourceOrgId 和 aws:SourceOrgPaths 等條件索引鍵與連接至 AWS Organizations、組織單位或組織中 AWS 帳戶的 RCP,而無需將陳述式新增至特定資源型政策。如需有關 RCP 和支援服務的詳細資訊,請參閱 AWS Organizations User Guide 中的 Resource control policies (RCPs)。
在下列範例中,當 aws:SourceOrgID 不等於 o-ExampleOrg 時,RCP 會拒絕 AWS 服務主體存取成員帳戶中的 Amazon S3 儲存貯體。S3 儲存貯體的資源型政策中必須具有對應的允許,以允許 SourceOrgID 等於 o-ExampleOrg 的 AWS 服務主體。
此政策僅對具有 aws:SourceAccount 索引鍵 ("Null": {"aws:SourceAccount":
"false"}) 的服務主體 ("Bool":
{"aws:PrincipalIsAWSService": "true"}) 發出的請求套用控制項,因此不需要使用條件索引鍵的服務整合與您主體的呼叫不會受到影響。如果請求內容中存在 aws:SourceAccount 條件索引鍵,則 Null 條件將評估為 true,從而導致強制執行 aws:SourceOrgID。我們在 Null 條件運算子中使用 aws:SourceAccount 而非 aws:SourceOrgID,因此如果請求來自不屬於組織的帳戶,則控制項仍然適用。