在 AWS 帳戶之間共用 CloudTrail 記錄檔 - AWS CloudTrail

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

在 AWS 帳戶之間共用 CloudTrail 記錄檔

本節說明如何在多個 AWS 帳戶之間共用 CloudTrail 記錄檔。您用來共用日誌的方法 AWS 帳戶 取決於 S3 儲存貯體的組態。共享日誌檔案的選項如下:

  • 強制執行儲存貯體擁有者 — S3 物件擁有權是 Amazon S3 儲存貯體層級設定,可用來控制上傳至儲存貯體之物件的擁有權,以及停用或啟用存取控制清單 ()。ACLs依預設,[物件擁有權] 會設定為 [值區擁有者強制執行] 設定,且全部ACLs都會停用。停用時,值區擁ACLs有者會擁有值區中的所有物件,並使用存取管理原則專門管理資料的存取權。設定強制執行的儲存貯體擁有者選項時,系統會透過儲存貯體政策管理存取權,免除使用者擔任角色的需求。

  • 擔任角色以共享日誌檔案 – 如果您尚未選擇強制執行的儲存貯體擁有者設定,使用者將需要擔任角色,才能存取您 S3 儲存貯體中的日誌檔案。

擔任角色以在帳戶之間共享日誌

注意

本節僅適用於未使用強制執行的儲存貯體擁有者設定的 Amazon S3 儲存貯體。

本節說明如何 AWS 帳戶 透過假定角色在多個 CloudTrail 記錄檔之間共用記錄檔,並說明共用記錄檔的案例。

  • 案例 1:將唯讀存取權授予產生日誌檔案 (放置在 Amazon S3 儲存貯體中) 的帳戶。

  • 案例 2:將您 Amazon S3 儲存貯體中所有日誌檔案的存取權,授予可為您分析日誌檔案的第三方帳戶。

若要授與 Amazon S3 儲存貯體中日誌檔案的唯讀存取權
  1. 為您要共用記錄檔的每個帳號建立IAM角色。您必須是管理員才能授予許可。

    當您建立角色時,請執行下列操作︰

    • 選擇其他 AWS 帳戶選項。

    • 輸入要授予存取權之帳戶的 12 位數帳戶 ID。

    • 如果您希望使用者在擔任角色之前提供多因素驗證,請核取 MFA「要」方塊。

    • 選擇亞馬遜 S3 政策ReadOnlyAccess

      注意

      根據預設,AmazonS3 ReadOnlyAccess 政策會授予您帳戶內所有 Amazon S3 儲存貯體的擷取和清單權限。

    如需有關IAM角色權限管理的詳細資訊,請參閱《IAM使用指南》中的〈IAM角色

  2. 建立存取政策,以將唯讀存取權授予您要共享日誌檔案的帳戶。

  3. 指示每個帳戶擔任角色以擷取日誌檔案。

若要將日誌檔案的唯讀存取權授予第三方帳戶
  1. 為您要共用記錄檔的第三方帳戶建立IAM角色。您必須是管理員才能授予許可。

    當您建立角色時,請執行下列操作︰

  2. 建立存取政策,以將唯讀存取權授予您要共享日誌檔案的第三方帳戶。

  3. 指示第三方帳戶擔任角色以擷取日誌檔案。

下列各節將詳細說明這些步驟。

建立存取政策將存取權授予您擁有的帳戶

身為 Amazon S3 儲存貯體擁有者,您可以完全控制為其他帳戶 CloudTrail 寫入日誌檔的 Amazon S3 儲存貯體。您想將每個業務單位的日誌檔案與建立這些檔案的業務單位共享。但是,您不希望某個單位能夠讀取任何其他單位的日誌檔案。

例如,若要與帳戶 B 共用帳戶 B 的記錄檔,但不與帳戶 C 共用,您必須在帳戶中建立新IAM角色,以指定帳戶 B 為受信任的帳戶。這個角色信任政策會指定帳戶 B 受到信任,可擔任您帳戶建立的角色,並應類似下列範例所示。如果您使用主控台建立角色,系統會自動建立信任政策。如果您使用SDK建立角色,則必須將信任原則作為參數提供給 CreateRoleAPI. 如果您使用CLI建立角色,則必須在create-roleCLI命令中指定信任原則。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-B-id:root" }, "Action": "sts:AssumeRole" } ] }

您還必須建立存取政策,指定帳戶 B 只能從 B 寫入其日誌檔案的位置讀取。存取政策會類似下列內容所示。請注意,當您在 CloudTrail 彙總過程中為帳號 B 開啟時,資源ARN包括帳號 B 的十二位數帳號 ID,以及您指定的前置詞 (如果有的話)。如需指定前綴的詳細資訊,請參閱「在其他帳戶中建立追蹤」。

重要

您必須確定存取原則中的前置碼與您為帳戶 B 開啟時指定的前置詞完全相同。如果不是,則必須編輯帳戶中的IAM角色存取策略,以納入帳戶 B 的實際前置詞。如果角色存取策略中的前置詞與您在帳戶 B CloudTrail 中開啟時指定的前置詞不完全相同,則帳戶 B 將無法存取其記錄檔。 CloudTrail

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/prefix/AWSLogs/account-B-id/*" }, { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET" } ] }

為任何其他帳戶執行上述程序。

為每個帳戶建立角色並指定適當的信任和存取策略後,並且在每個帳IAM戶中的使用者被該帳戶的管理員授與存取權後,帳戶 B 或 C 中的IAM使用者可以透過程式設計方式擔任該角色。

如需詳細資訊,請參閱 擔任角色

建立存取政策將存取權授予第三方

您必須為第三方帳戶建立個別IAM角色。當您建立角色時, AWS 會自動建立信任關係,該關係指定第三方帳戶受到信任,可以擔任該角色。角色的存取政策指定該帳戶可採取的動作。如需有關建立角色的詳細資訊,請參閱建立IAM角色。

例如,由建立的信任關係 AWS 指定第三方帳戶 (在此範例中為帳戶 Z) 受信任,以承擔您所建立的角色。信任政策範例如下:

{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::account-Z-id:root"}, "Action": "sts:AssumeRole" }] }

如果為第三方帳戶建立角色時指定了外部 ID,您的存取政策會包含新增的 Condition 元素,用於測試該帳戶指派的唯一 ID。此測試會在擔任角色時執行。下列範例存取政策具有 Condition 元素。

如需詳細資訊,請參閱《使用指南》中的將 AWS 資源存取權授予第三方時如何使用IAM外部 ID

{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::account-Z-id:root"}, "Action": "sts:AssumeRole", "Condition": {"StringEquals": {"sts:ExternalId": "external-ID-issued-by-account-Z"}} }] }

您也必須為自己的帳戶建立存取政策,以指定第三方帳戶可以從 Amazon S3 儲存貯體讀取所有日誌。存取政策應該會類似下列範例。Resource 值結尾的萬用字元 (*) 表示第三方帳戶可以存取 S3 儲存貯體中已授予存取權的任何日誌檔案。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" }, { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET" } ] }

在您為第三方帳戶建立角色並指定適當的信任關係和存取原則之後,協力廠商帳IAM戶中的使用者必須以程式設計方式假設該角色,才能從值區讀取記錄檔。如需詳細資訊,請參閱 擔任角色

擔任角色

您必須指定一個單獨的IAM使用者來擔任您在每個帳號中建立的每個角色。然後,您必須確保每個IAM使用者都有適當的權限。

IAM使用者和角色

建立必要的角色和策略之後,您必須在每個要共IAM用檔案的帳號中指定使用者。每個IAM使用者都以程式設計方式假設適當的角色來存取記錄檔。當使用者擔任角色時, AWS 會將暫時安全憑證傳回給該使用者。然後,他們可以提出請求以根據透過與該角色相關聯的存取政策所授予的許可來列出、擷取、複製或刪除日誌檔案。

如需使用IAM身分的詳細資訊,請參閱IAM身分識別 (使用者、使用者群組和角色)

您在每個案例中為每個IAM角色建立的存取原則的主要差異。

建立 IAM 使用者的許可政策

若要執行角色所允許的動作,IAM使用者必須具有呼叫的權限 AWS STS AssumeRoleAPI。您必須編輯每個使用者的政策,以將適當的許可授予他們。若要這麼做,請在附加至IAM使用者的策略中設定 Resource 元素。下列範例顯示另一個帳戶中IAM使用者的策略,該使用者可以承擔先前由帳戶 A 所Test建立的角色。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::account-A-id:role/Test" } ] }
編輯客戶受管政策 (主控台)
  1. 登入 AWS Management Console 並開啟IAM主控台,位於https://console.aws.amazon.com/iam/

  2. 在導覽窗格中,選擇 Policies (政策)。

  3. 在政策清單中,選擇要編輯的政策的政策名稱。您可以使用搜尋方塊來篩選政策清單。

  4. 選擇許可索引標籤,然後選擇編輯

  5. 執行以下任意一項:

    • 選擇「視覺化」選項,在不瞭解JSON語法的情況下變更原則。您可以變更政策中每個許可區塊的服務、動作、資源或可選條件。您也可以匯入政策以在政策底部新增其他許可。完成變更後,選擇下一步以繼續。

    • 在文字方塊中輸入或貼上文字,以JSON選擇修改原則的選項。JSON您也可以匯入政策以在政策底部新增其他許可。解決政策驗證期間產生的任何安全性警告、錯誤或一般性警告,然後選擇 Next (下一步)。

      注意

      您可以隨時在視覺JSON編輯器選項之間切換。不過,如果您在視覺化編輯器中進行變更或選擇 [下一步],IAM可能會重新架構您的原則,以針對視覺化編輯器最佳化原則。如需詳細資訊,請參閱《IAM使用指南》中的「策略重新架構」。

  6. 檢視與儲存頁面上,檢視此政策中定義的許可,然後選擇儲存變更以儲存工作。

  7. 如果受管政策有最多五個版本,選擇儲存變更可顯示一個對話方塊。若要儲存新版本,該政策的最舊非預設版本會遭到移除,並以此新版本取代之。您也可以將新版本設定為預設的政策版本。

    選擇儲存變更,可儲存新的政策版本。

呼叫 AssumeRole

使用者可以透過建立呼叫 AWS STS AssumeRoleAPI並傳遞角色工作階段名稱的應用程式、要承擔的角色的 Amazon 資源編號 (ARN) 以及選用的外部 ID 來擔任角色。角色工作階段名稱是由建立要擔任之角色的帳戶所定義。外部 ID (如果有的話) 是由第三方帳戶所定義,並在建立角色期間傳遞至擁有帳戶以進行併入。如需詳細資訊,請參閱《使用指南》中的將 AWS 資源存取權授予第三方時如何使用IAM外部 ID。您可以通過打開IAM控制台ARN從帳戶 A 中檢索。

使用IAM主控台尋找帳戶 A 中的ARN值
  1. 選擇 Roles (角色)

  2. 選擇您想要檢查的角色。

  3. 在「摘要」區段ARN中尋找「角色」。

會 AssumeRole API傳回用來存取擁有帳戶中資源的臨時認證。在此範例中,您想存取的資源是 Amazon S3 儲存貯體,以及儲存貯體中包含的日誌檔案。暫時登入資料具有您在角色存取政策中定義的許可。

下列 Python 範例 (使用 AWS SDK for Python (Boto)) 顯示如何呼叫 AssumeRole 以及如何使用所傳回的暫時安全登入資料列出帳戶 A 所控制的所有 Amazon S3 儲存貯體。

def list_buckets_from_assumed_role(user_key, assume_role_arn, session_name): """ Assumes a role that grants permission to list the Amazon S3 buckets in the account. Uses the temporary credentials from the role to list the buckets that are owned by the assumed role's account. :param user_key: The access key of a user that has permission to assume the role. :param assume_role_arn: The Amazon Resource Name (ARN) of the role that grants access to list the other account's buckets. :param session_name: The name of the STS session. """ sts_client = boto3.client( "sts", aws_access_key_id=user_key.id, aws_secret_access_key=user_key.secret ) try: response = sts_client.assume_role( RoleArn=assume_role_arn, RoleSessionName=session_name ) temp_credentials = response["Credentials"] print(f"Assumed role {assume_role_arn} and got temporary credentials.") except ClientError as error: print( f"Couldn't assume role {assume_role_arn}. Here's why: " f"{error.response['Error']['Message']}" ) raise # Create an S3 resource that can access the account with the temporary credentials. s3_resource = boto3.resource( "s3", aws_access_key_id=temp_credentials["AccessKeyId"], aws_secret_access_key=temp_credentials["SecretAccessKey"], aws_session_token=temp_credentials["SessionToken"], ) print(f"Listing buckets for the assumed role's account:") try: for bucket in s3_resource.buckets.all(): print(bucket.name) except ClientError as error: print( f"Couldn't list buckets for the account. Here's why: " f"{error.response['Error']['Message']}" ) raise

停止在 AWS 帳戶之間共用 CloudTrail 記錄檔

若要停止與其他人共用記錄檔 AWS 帳戶,請刪除您為該帳號建立的角色。如需關於刪除角色的資訊,請參閱刪除角色或執行個體設定檔