啟用 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,來啟用或停用伺服器存取記錄。
啟用伺服器存取記錄之前,請考慮下列事項:
日誌交付許可
Amazon S3 使用特殊日誌交付帳戶來寫入伺服器存取日誌。這些寫入受一般的存取控制限制之約束。建議您更新目標儲存貯體的儲存貯體政策,以授予日誌記錄服務主體的存取權 (logging.s3.amazonaws.com
) 以進行存取日誌交付。
若要使用目標儲存貯體上的儲存貯體政策授予存取權,您會更新儲存貯體政策以允許 s3:PutObject
存取日誌記錄服務主體。如果您使用 Amazon S3 主控台來啟用伺服器存取日誌記錄,則主控台會自動更新目標儲存貯體的儲存貯體政策,將這些許可授予日誌記錄服務主體。如果以程式設計方式啟用伺服器存取日誌記錄,則您可以手動更新目標儲存貯體的儲存貯體政策,以授予日誌記錄服務主體的存取權。
您可以交替使用儲存貯體 ACL 來授予存取日誌交付的存取權。您可以為將 WRITE
和 READ_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
若要授予 WRITE
和 READ_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 啟用伺服器存取日誌記錄。
登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/s3/
的 Amazon S3 主控台。 -
在 Buckets (儲存貯體) 清單中,選擇要啟用伺服器存取記錄日誌的儲存貯體名稱。
-
選擇 Properties (屬性)。
-
在 Server access logging (伺服器存取記錄日誌) 區段中,選擇 Edit (編輯)。
-
在 Server access logging (伺服器存取記錄日誌) 底下,選取 Enable (啟用)。
-
在 Target bucket (目標儲存貯體) 中,輸入要接收日誌記錄物件的儲存貯體名稱。
目標儲存貯體所在的 區域必須與來源儲存貯體相同,且不得設定預設保留期間。
-
選擇 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 包裝函式程式庫,啟用儲存貯體記錄。
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
-
在下列區域建立兩個記錄儲存貯體:
-
awsexamplebucket1-logs-us-east-1
-
awsexamplebucket1-logs-us-west-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
-
-
使用儲存貯體 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
-
-
接著,套用記錄政策。
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" } ] } }
-
使用 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"