啟用 Amazon S3 伺服器存取記錄日誌 - Amazon Simple Storage Service

啟用 Amazon S3 伺服器存取記錄日誌

伺服器存取記錄,針對向 Amazon S3 儲存貯體提出的請求,提供詳細的記錄。伺服器存取日誌對許多應用程式來說,都是個很有用的資料。舉例來說,存取記錄資訊在安全與存取稽核中相當實用。您也可藉由該資訊了解自己的客戶群,並掌握 Amazon S3 帳單相關資料。

Amazon S3 預設不會收集伺服器存取日誌。啟用記錄日誌後,Amazon S3 會將來源儲存貯體的存取日誌交付給您所選擇的目標儲存貯體。目標儲存貯體所在的 AWS 區域 必須與來源儲存貯體相同,且不得設定預設保留期間。

存取日誌記錄包含對儲存貯體提出要求,內有詳細資訊。這資訊可能包含要求類型、要求中指定的資源,以及要求的處理時間和日期。如需記錄基本概念的詳細資訊,請參閱 使用伺服器存取記錄來記錄請求

重要
  • 啟用 Amazon S3 儲存貯體的伺服器存取記錄日誌無須額外付費。不過,系統提供給您的任何日誌檔都會產生一般儲存費用 (您隨時都可刪除日誌檔)。我們不會估算日誌檔傳遞的資料傳輸費,但會收取用於存取日誌檔之一般資料傳輸率的費用。

  • 您的目標儲存貯體不應啟用伺服器存取記錄。您可將日誌交付給所有您擁有的儲存貯體,在同一的區域當做來源儲存貯體,包括來源儲存貯體本身。但是,這將導致日誌的無限迴圈,而且不推薦。為了更簡易進行記錄管理,建議您將存取記錄儲存在不同的儲存貯體中。如需詳細資訊,請參閱 如何啟用日誌交付?

您可以使用 Amazon S3 主控台、Amazon S3 API、AWS Command Line Interface (AWS CLI) 或 AWS SDK,來啟用或停用伺服器存取記錄。

啟用伺服器存取記錄之前,請考慮下列事項:

  • 您可以使用儲存貯體政策或儲存貯體存取控制清單 (ACL) 來授予日誌交付許可。不過,建議您使用儲存貯體政策。如果目標儲存貯體使用「物件擁有權」的儲存貯體擁有者強制設定,則 ACL 會停用且不再影響許可。您必須使用儲存貯體政策授予日誌記錄服務主體的存取許可。如需詳細資訊,請參閱 日誌交付許可

  • 拒絕條件新增至儲存貯體政策時,可能會導致 Amazon S3 無法交付存取日誌。

  • 只有在使用 AES256 (SSE-S3) 時,您才能在目標儲存貯體上使用預設儲存貯體加密。不支援具有 AWS KMS 金鑰 (SSE-KMS) 的預設加密。

  • 您無法在目標儲存貯體上啟用 S3 物件鎖定。

日誌交付許可

Amazon S3 使用特殊日誌交付帳戶來寫入伺服器存取日誌。這些寫入受一般的存取控制限制之約束。建議您更新目標儲存貯體的儲存貯體政策,以授予日誌記錄服務主體的存取權 (logging.s3.amazonaws.com) 以進行存取日誌交付。

若要使用目標儲存貯體上的儲存貯體政策授予存取權,您會更新儲存貯體政策以允許 s3:PutObject 存取日誌記錄服務主體。如果您使用 Amazon S3 主控台來啟用伺服器存取日誌記錄,則主控台會自動更新目標儲存貯體的儲存貯體政策,將這些許可授予日誌記錄服務主體。如果以程式設計方式啟用伺服器存取日誌記錄,則您可以手動更新目標儲存貯體的儲存貯體政策,以授予日誌記錄服務主體的存取權。

您可以交替使用儲存貯體 ACL 來授予存取日誌交付的存取權。您可以為將 WRITEREAD_ACP 許可授予 S3 日誌交付群組的儲存貯體 ACL 新增授予項目。不建議使用儲存貯體 ACL 授予 S3 日誌交付群組的存取權。

S3 物件擁有權的儲存貯體擁有者強制執行設定

如果目標儲存貯體使用「物件擁有權」的儲存貯體擁有者強制設定,則 ACL 會停用且不再影響許可。建議您更新目標儲存貯體的儲存貯體政策,以授予日誌記錄服務主體的存取權。您無法更新儲存貯體 ACL 以授予 S3 日誌交付群組的存取權。您也無法將目標授予納入您的 PutBucketLogging 組態。如需將存取日誌交付的現有儲存貯體 ACL 遷移至儲存貯體政策的相關資訊,請參閱 授予 S3 日誌交付群組的存取權以進行伺服器存取日誌記錄。如需「物件擁有權」的詳細資訊,請參閱 控制物件的擁有權並停用儲存貯體的 ACL

使用儲存貯體政策向日誌記錄服務主體授予許可

此範例儲存貯體政策向日誌記錄服務主體 (logging.s3.amazonaws.com) 授予 s3:PutObject 許可。若要使用此儲存貯體政策,請更換範例值。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/EXAMPLE-LOGGING-PREFIX*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::SOURCE-BUCKET-NAME" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }

使用儲存貯體 ACL 將許可授予日誌交付群組

雖然不建議使用此方法,但您可以使用儲存貯體 ACL 將許可授予日誌交付群組。不過,如果目標儲存貯體使用「物件擁有權」儲存貯體擁有者強制執行的設定,則您無法設定儲存貯體或物件 ACL。您也無法將目標授予納入您的 PutBucketLogging 組態。您必須使用儲存貯體政策授予日誌記錄服務主體 (logging.s3.amazonaws.com) 的存取權。如需詳細資訊,請參閱 日誌交付許可

在儲存貯體 ACL 中,日誌交付群組會以下列 URL 表示。

http://acs.amazonaws.com/groups/s3/LogDelivery

若要授予 WRITEREAD_ACP (ACL 讀取) 許可,請將下列授權新增至目標儲存貯體 ACL。

<Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> </Grantee> <Permission>WRITE</Permission> </Grant> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> </Grantee> <Permission>READ_ACP</Permission> </Grant>

如需以程式設計方式新增 ACL 授權的範例,請參閱 設定 ACL

重要

使用儲存貯體上的 AWS CloudFormation 啟用 Amazon S3 伺服器存取日誌記錄時,使用 ACL 授予 S3 日誌交付群組的存取權,您還必須在儲存貯體屬性欄位中新增 "AccessControl": "LogDeliveryWrite"。這很重要,因為您只能透過為儲存貯體建立 ACL 來授與這些許可,但無法在 CloudFormation 中為儲存貯體建立自訂 ACL。您只能使用固定的 ACL。

啟用伺服器存取日誌記錄

使用下列範例,使用 AWS Management Console、AWS CLI、REST API 和 AWS SDK for .NET 啟用伺服器存取日誌記錄。

  1. 登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/s3/ 的 Amazon S3 主控台。

  2. Buckets (儲存貯體) 清單中,選擇要啟用伺服器存取記錄日誌的儲存貯體名稱。

  3. 選擇 Properties (屬性)。

  4. Server access logging (伺服器存取記錄日誌) 區段中,選擇 Edit (編輯)

  5. Server access logging (伺服器存取記錄日誌) 底下,選取 Enable (啟用)

  6. Target bucket (目標儲存貯體) 中,輸入要接收日誌記錄物件的儲存貯體名稱。

    目標儲存貯體所在的 區域必須與來源儲存貯體相同,且不得設定預設保留期間。

  7. 選擇 Save changes (儲存變更)。

    啟用儲存貯體上的伺服器存取記錄日誌時,主控台會啟用來源儲存貯體的日誌記錄,且會更新目標儲存貯體的儲存貯體政策,以向日誌記錄服務主體授予 s3:PutObject 許可 (logging.s3.amazonaws.com)。如需此儲存貯體政策的詳細資訊,請參閱 使用儲存貯體政策向日誌記錄服務主體授予許可

    您可以在目標儲存貯體中,查看日誌。啟用伺服器存取記錄後,可能需要好幾個小時才能將記錄傳遞到目標儲存貯體中。如需如何以及何時交付日誌的詳細資訊,請參閱「交付日誌的方式?」。

如需詳細資訊,請參閱 檢視 S3 儲存貯體的屬性

若要啟用記錄日誌,請提交 PUT 儲存貯體記錄請求,在來源儲存貯體新增記錄日誌組態。要求會指定目標儲存貯體,也可以為所有日誌物件金鑰使用字首。

下例範例將 LOGBUCKET 識別為目標儲存貯體,並以 logs/ 為字首。

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> <LoggingEnabled> <TargetBucket>LOGBUCKET</TargetBucket> <TargetPrefix>logs/</TargetPrefix> </LoggingEnabled> </BucketLoggingStatus>

日誌物件由 S3 日誌交付帳戶寫入並擁有,且已為儲存貯體擁有者授予日誌物件的完整許可。您可以選擇性地使用目標授予為其他使用者授予許可,以便其可存取日誌。如需詳細資訊,請參閱 PUT 儲存貯體記錄

注意

如果目標儲存貯體使用「物件擁有權」的儲存貯體擁有者強制執行設定,則您無法使用目標授予向其他使用者授予許可。若要將許可授予其他人,您可以在目標儲存貯體上使用更新儲存貯體策政策。如需詳細資訊,請參閱 日誌交付許可

Amazon S3 也提供 GET 儲存貯體記錄 API,可擷取儲存貯體的記錄組態。若要刪除記錄組態,請傳送 PUT 儲存貯體記錄要求及空白的 BucketLoggingStatus

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> </BucketLoggingStatus>

您可以使用 Amazon S3 API 或 AWS SDK 包裝函式程式庫,啟用儲存貯體記錄。

.NET

下列 C# 範例會啟用儲存貯體記錄。您必須建立兩個儲存貯體,一個來源儲存貯體與一個目標儲存貯體。範例會先更新目標儲存貯體的儲存貯體 ACL,為日誌交付群組授予將日誌寫入目標儲存貯體的必要許可,然後啟用來源儲存貯體的日誌記錄。

此範例不適用於使用「物件擁有權」之儲存貯體擁有者強制執行設定的目錄儲存貯體。

如果目標儲存貯體使用「物件擁有權」儲存貯體擁有者強制執行的設定,則您無法設定儲存貯體或物件 ACL。您也無法將目標授予納入您的 PutBucketLogging 組態。您必須使用儲存貯體政策授予日誌記錄服務主體 (logging.s3.amazonaws.com) 的存取權。如需詳細資訊,請參閱 日誌交付許可

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class ServerAccesLoggingTest { private const string bucketName = "*** bucket name for which to enable logging ***"; private const string targetBucketName = "*** bucket name where you want access logs stored ***"; private const string logObjectKeyPrefix = "Logs"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { client = new AmazonS3Client(bucketRegion); EnableLoggingAsync().Wait(); } private static async Task EnableLoggingAsync() { try { // Step 1 - Grant Log Delivery group permission to write log to the target bucket. await GrantPermissionsToWriteLogsAsync(); // Step 2 - Enable logging on the source bucket. await EnableDisableLoggingAsync(); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } private static async Task GrantPermissionsToWriteLogsAsync() { var bucketACL = new S3AccessControlList(); var aclResponse = client.GetACL(new GetACLRequest { BucketName = targetBucketName }); bucketACL = aclResponse.AccessControlList; bucketACL.AddGrant(new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, S3Permission.WRITE); bucketACL.AddGrant(new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, S3Permission.READ_ACP); var setACLRequest = new PutACLRequest { AccessControlList = bucketACL, BucketName = targetBucketName }; await client.PutACLAsync(setACLRequest); } private static async Task EnableDisableLoggingAsync() { var loggingConfig = new S3BucketLoggingConfig { TargetBucketName = targetBucketName, TargetPrefix = logObjectKeyPrefix }; // Send request. var putBucketLoggingRequest = new PutBucketLoggingRequest { BucketName = bucketName, LoggingConfig = loggingConfig }; await client.PutBucketLoggingAsync(putBucketLoggingRequest); } } }

建議您在所有擁有 S3 儲存貯體的 AWS 區域 中,都建立專屬的記錄儲存貯體。然後將 Amazon S3 存取日誌交付至該 S3 儲存貯體。如需詳細資訊和範例,請參閱《AWS CLI 參考》中的 put-bucket-logging

如果目標儲存貯體使用「物件擁有權」儲存貯體擁有者強制執行的設定,則您無法設定儲存貯體或物件 ACL。您也無法將目標授予納入您的 PutBucketLogging 組態。您必須使用儲存貯體政策授予日誌記錄服務主體 (logging.s3.amazonaws.com) 的存取權。如需詳細資訊,請參閱 日誌交付許可

範例 — 對跨兩個區域的五個儲存貯體啟用存取日誌

在此範例中,您擁有下列五個儲存貯體:

  • 1-awsexamplebucket1-us-east-1

  • 2-awsexamplebucket1-us-east-1

  • 3-awsexamplebucket1-us-east-1

  • 1-awsexamplebucket1-us-west-2

  • 2-awsexamplebucket1-us-west-2

  1. 在下列區域建立兩個記錄儲存貯體:

    • awsexamplebucket1-logs-us-east-1

    • awsexamplebucket1-logs-us-west-2

  2. 然後啟用 Amazon S3 存取日誌,如下所示:

    • 1-awsexamplebucket1-us-east-1 記錄到 S3 儲存貯體 awsexamplebucket1-logs-us-east-1,帶有字首 1-awsexamplebucket1-us-east-1

    • 2-awsexamplebucket1-us-east-1 記錄到 S3 儲存貯體 awsexamplebucket1-logs-us-east-1,帶有字首 2-awsexamplebucket1-us-east-1

    • 3-awsexamplebucket1-us-east-1 記錄到 S3 儲存貯體 awsexamplebucket1-logs-us-east-1,帶有字首 3-awsexamplebucket1-us-east-1

    • 1-awsexamplebucket1-us-west-2 記錄到 S3 儲存貯體 awsexamplebucket1-logs-us-west-2,帶有字首 1-awsexamplebucket1-us-west-2

    • 2-awsexamplebucket1-us-west-2 記錄到 S3 儲存貯體 awsexamplebucket1-logs-us-west-2,帶有字首 2-awsexamplebucket1-us-west-2

  3. 使用儲存貯體 ACL 或儲存貯體政策授予伺服器存取日誌交付的許可:

    • 更新儲存貯體政策 (建議) – 若要將許可授予日誌記錄服務主體,請使用 put-bucket-policy

      aws s3api put-bucket-policy --bucket awsexamplebucket1-logs --policy file://policy.json

      Policy.json 為 JSON 文件,其位於目前包含儲存貯體政策的資料夾。若要使用此儲存貯體政策,請更換範例值。

      { "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::awsexamplebucket1-logs/*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::SOURCE-BUCKET-NAME" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }
    • 更新儲存貯體 ACL – 若要向 S3 日誌交付群組授予許可,請使用 put-bucket-acl

      aws s3api put-bucket-acl --bucket awsexamplebucket1-logs --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
  4. 接著,套用記錄政策。

    aws s3api put-bucket-logging --bucket awsexamplebucket1 --bucket-logging-status file://logging.json

    Logging.json 為 JSON 文件,其位於目前包含日誌記錄組態的資料夾。如果儲存貯體使用儲存貯體擁有者強制執行的「物件擁有權」設定,則您的日誌記錄組態不能包含目標授予。如需詳細資訊,請參閱 日誌交付許可

    範例 – 無目標授予的 Logging.json

    以下範例 Logging.json 檔案不包含目標授予,並且可以套用至使用「物件擁有權」之儲存貯體擁有者強制執行設定的儲存貯體。

    { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/" } }

    範例 – 有目標授予的 Logging.json

    以下範例 Logging.json 檔案包含目標授予。

    如果目標儲存貯體使用「物件擁有權」的儲存貯體擁有者強制執行設定,則無法將目標授予納入 PutBucketLogging 組態。如需詳細資訊,請參閱 日誌交付許可

    { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
  5. 使用 bash 指令碼來新增帳戶內所有儲存貯體的存取記錄。

    注意

    當您的所有儲存貯體都位在相同區域時,此指令碼才有效。若您的儲存貯體位於多個區域,您必須調整指令碼。

    範例 – 授予儲存貯體的存取權,並為您的帳戶中的儲存貯體新增日誌記錄

    loggingBucket='awsexamplebucket1-logs' region='us-west-2' # Create Logging bucket aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-policy --bucket $loggingBucket --policy file://policy.json # List buckets in this account buckets="$(aws s3 ls | awk '{print $3}')" # Put bucket logging on each bucket for bucket in $buckets do printf '{ "LoggingEnabled": { "TargetBucket": "%s", "TargetPrefix": "%s/" } }' "$loggingBucket" "$bucket" > logging.json aws s3api put-bucket-logging --bucket $bucket --bucket-logging-status file://logging.json echo "$bucket done" done rm logging.json echo "Complete"

    範例 – 授予儲存貯體 ACL 的存取權,並為您的帳戶中的儲存貯體新增日誌記錄

    loggingBucket='awsexamplebucket1-logs' region='us-west-2' # Create Logging bucket aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-acl --bucket $loggingBucket --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery # List buckets in this account buckets="$(aws s3 ls | awk '{print $3}')" # Put bucket logging on each bucket for bucket in $buckets do printf '{ "LoggingEnabled": { "TargetBucket": "%s", "TargetPrefix": "%s/" } }' "$loggingBucket" "$bucket" > logging.json aws s3api put-bucket-logging --bucket $bucket --bucket-logging-status file://logging.json echo "$bucket done" done rm logging.json echo "Complete"