使用 在 CloudWatch Logs 中加密日誌資料 AWS Key Management Service - Amazon CloudWatch Logs

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

使用 在 CloudWatch Logs 中加密日誌資料 AWS Key Management Service

在 CloudWatch Logs 中,日誌群組資料一律會加密。根據預設,CloudWatch Logs 會使用伺服器端加密搭配 256 位元進階加密標準 Galois/Counter 模式 (AES-GCM) 來加密靜態日誌資料。您也可以使用 AWS Key Management Service 進行此加密。如果您這樣做,則會使用 AWS KMS 金鑰完成加密。 AWS KMS 在日誌群組層級啟用 加密,方法是在建立日誌群組時或在日誌群組存在之後,將 KMS 金鑰與日誌群組建立關聯。

重要

CloudWatch Logs 現在支援加密內容,用 kms:EncryptionContext:aws:logs:arn 做為金鑰,而日誌群組的 ARN 做為該金鑰的值。如果您有日誌群組已使用 KMS 加密,並希望能限制金鑰與單一帳戶和日誌群組搭配使用,您應該在 IAM 政策中指派包含條件的新 KMS 金鑰。如需詳細資訊,請參閱AWS KMS 金鑰和加密內容

重要

CloudWatch Logs 現在支援kms:ViaService允許日誌代表您進行 AWS KMS 呼叫。您應該將此新增至在金鑰政策或 IAM 中呼叫 CloudWatch Logs 的角色。如需詳細資訊,請參閱 kms:ViaService

建立 KMS 金鑰與日誌群組的關聯後,針對該日誌群組新擷取的所有資料,就會使用此金鑰加密。此資料在整個保留期間都以加密的格式儲存。每當請求此資料時,CloudWatch Logs 會解密此資料。每當有人請求取得加密的資料時,CloudWatch Logs 必須擁有 KMS 金鑰許可。

如果您之後取消 KMS 金鑰與日誌群組的關聯,CloudWatch Logs 會使用 CloudWatch Logs 預設的加密方法來加密新擷取的資料。先前使用 KMS 金鑰加密的所有擷取資料仍會使用 KMS 金鑰加密。由於 CloudWatch Logs 仍可繼續參照該金鑰,因此依然可在 KMS 金鑰解除關聯後傳回那些資料。但若稍後將金鑰停用,則 CloudWatch Logs 將無法讀取使用該金鑰加密的日誌。

重要

CloudWatch Logs 僅支援對稱 KMS 金鑰。請勿使用非對稱金鑰來加密日誌群組中的資料。如需詳細資訊,請參閱使用對稱和非對稱金鑰

限制

  • 若要執行下列步驟,您必須擁有下列許可:kms:CreateKeykms:GetKeyPolicykms:PutKeyPolicy

  • 在您建立或取消金鑰與日誌群組的關聯後,操作將在 5 分鐘內生效。

  • 如果您撤銷 CloudWatch Logs 對已關聯金鑰的存取權,或刪除所關聯的 KMS 金鑰,您將無法再擷取 CloudWatch Logs 中的加密資料。

  • 您無法使用 CloudWatch 主控台將 KMS 金鑰與現有日誌群組建立關聯。

步驟 1:建立 AWS KMS 金鑰

若要建立 KMS 金鑰,請使用以下 create-key 命令:

aws kms create-key

輸出包含金鑰 ID 和金鑰的 Amazon Resource Name (ARN)。下列為範例輸出:

{ "KeyMetadata": { "Origin": "AWS_KMS", "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", "Description": "", "KeyManager": "CUSTOMER", "Enabled": true, "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT", "KeyUsage": "ENCRYPT_DECRYPT", "KeyState": "Enabled", "CreationDate": 1478910250.94, "Arn": "arn:aws:kms:us-west-2:123456789012:key/6f815f63-e628-448c-8251-e40cb0d29f59", "AWSAccountId": "123456789012", "EncryptionAlgorithms": [ "SYMMETRIC_DEFAULT" ] } }

步驟 2:設定 KMS 金鑰許可

根據預設,所有 AWS KMS 金鑰都是私有的。只有資源擁有者可以使用它來加密和解密資料。然而,資源擁有者可以授與其他使用者和資源存取 KMS 金鑰的許可。透過此步驟,您可以授予 CloudWatch Logs 服務主體和發起人角色使用 金鑰的許可。此服務主體必須位於存放 KMS 金鑰的相同 AWS 區域中。

最佳實務是,建議您將 KMS 金鑰的使用限制為您指定的 AWS 帳戶或日誌群組。

首先,使用以下 get-key-policy 命令,將 KMS 金鑰的預設政策儲存為 policy.json

aws kms get-key-policy --key-id key-id --policy-name default --output text > ./policy.json

在文字編輯器中開啟 policy.json 檔案,並從下列其中一個陳述式中加入區段 (以粗體顯示)。使用逗號從新陳述式中分隔現有陳述式。這些陳述式使用 Condition 區段來增強 AWS KMS 金鑰的安全性。如需詳細資訊,請參閱AWS KMS 金鑰和加密內容

此範例中的 Condition 區段會將金鑰限制為單一日誌群組 ARN。

{ "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Your_account_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Effect": "Allow", "Principal": { "Service": "logs.region.amazonaws.com" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:Describe*" ], "Resource": "*", "Condition": { "ArnEquals": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:region:account-id:log-group:log-group-name" } } } ] }

本範例中的 Condition 區段將 AWS KMS 金鑰限用於指定的帳戶,但可用於任何日誌群組。

{ "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Your_account_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Effect": "Allow", "Principal": { "Service": "logs.region.amazonaws.com" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:Describe*" ], "Resource": "*", "Condition": { "ArnLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:region:account-id:*" } } } ] }

接著,將許可新增至將呼叫 CloudWatch Logs 的角色。您可以新增其他陳述式至 AWS KMS 金鑰政策,或透過角色本身的 IAM 來執行此操作。CloudWatch Logs AWS KMS 會使用 代表客戶kms:ViaService呼叫 。如需詳細資訊,請參閱 kms:ViaService

若要在 AWS KMS 金鑰政策中新增許可,請將下列其他陳述式新增至您的金鑰政策。如果您使用此方法,最佳實務是將政策範圍限定為將與 AWS KMS 加密日誌群組互動的角色。

{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account_id:role/role_name" }, "Action": [ "kms:Encrypt", "kms:ReEncrypt*", "kms:Decrypt", "kms:GenerateDataKey*" "kms:Describe*" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": [ "logs.region.amazonaws.com" ] } } }

或者,如果您想要在 IAM 中管理角色許可,您可以透過下列政策新增同等許可。這可以新增到現有的角色政策,或做為額外的個別政策連接到角色。如果您使用此方法,最佳實務是將政策範圍限定為僅用於日誌加密的 AWS KMS 金鑰。如需詳細資訊,請參閱編輯 IAM 政策

{ "Version": "2012-10-17", "Statement" : [ { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:ReEncrypt*", "kms:Decrypt", "kms:GenerateDataKey* ", "kms:Describe*" ], "Condition":{ "StringEquals":{ "kms:ViaService": [ "logs.region.amazonaws.com" ] } }, "Resource": "arn:aws:kms:region:account_id:key/key_id" } ] }

最後,使用下列 put-key-policy 命令新增更新的政策:

aws kms put-key-policy --key-id key-id --policy-name default --policy file://policy.json

步驟 3:為 KMS 金鑰與日誌群組建立關聯

您可以在建立日誌群組時或建立完成後,為 KMS 金鑰與日誌群組建立關聯。

如果要確認日誌群組是否已經有相關聯的 KMS 金鑰,請使用以下 describe-log-groups 命令:

aws logs describe-log-groups --log-group-name-prefix "log-group-name-prefix"

如果輸出包含 kmsKeyId 欄位,則日誌群組會與該欄位值所顯示的索引鍵相關聯。

若要在建立日誌群組時與 KMS 金鑰建立關聯

使用 create-log-group 命令,如下所示:

aws logs create-log-group --log-group-name my-log-group --kms-key-id "key-arn"
若要為 KMS 金鑰與現有的日誌群組建立關聯

使用 associate-kms-key 命令,如下所示:

aws logs associate-kms-key --log-group-name my-log-group --kms-key-id "key-arn"

步驟 4:取消金鑰與日誌群組的關聯

若要取消 KMS 金鑰與日誌群組的關聯,請使用以下 disassociate-kms-key 命令:

aws logs disassociate-kms-key --log-group-name my-log-group

AWS KMS 金鑰和加密內容

為了增強 AWS Key Management Service 金鑰和加密日誌群組的安全性,CloudWatch Logs 現在會將日誌群組 ARNs 做為用於加密日誌資料的加密內容的一部分。加密內容是一組做為額外驗證資料的索引鍵/值組。加密內容可讓您使用 IAM 政策條件,依 AWS 帳戶和日誌群組限制對 AWS KMS 金鑰的存取。如需詳細資訊,請參閱加密內容IAM JSON 政策元素:Condition

建議您針對每個加密的日誌群組使用不同的 KMS 金鑰。

如果您有先前加密的日誌群組,但現在希望將日誌群組變更為使用只適用於該日誌群組的新 KMS 金鑰,請依照下列步驟執行。

透過政策將金鑰設為特定日誌群組專用,將加密日誌群組轉換為使用 KMS 金鑰
  1. 請輸入下列指令,以尋找日誌群組目前金鑰的 ARN:

    aws logs describe-log-groups

    輸出包括這一行。記下 ARN。步驟 7 中會用到。

    ... "kmsKeyId": "arn:aws:kms:us-west-2:123456789012:key/01234567-89ab-cdef-0123-456789abcdef" ...
  2. 輸入以下命令來建立新的 KMS 金鑰:

    aws kms create-key
  3. 輸入下列命令,將新金鑰的政策儲存至 policy.json 檔案:

    aws kms get-key-policy --key-id new-key-id --policy-name default --output text > ./policy.json
  4. 使用文字編輯器來開啟 policy.json,並將 Condition 運算式新增至政策:

    { "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT-ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Effect": "Allow", "Principal": { "Service": "logs.region.amazonaws.com" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:Describe*" ], "Resource": "*", "Condition": { "ArnLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:REGION:ACCOUNT-ID:log- group:LOG-GROUP-NAME" } } } ] }
  5. 輸入下列命令,將更新的政策新增至新的 KMS 金鑰:

    aws kms put-key-policy --key-id new-key-ARN --policy-name default --policy file://policy.json
  6. 輸入下列命令,將政策與日誌群組建立關聯:

    aws logs associate-kms-key --log-group-name my-log-group --kms-key-id new-key-ARN

    CloudWatch Logs 現在會使用新金鑰來加密所有新資料。

  7. 接下來,撤銷舊金鑰的所有權限,除了 Decrypt 以外。首先,輸入下列命令以擷取舊政策:

    aws kms get-key-policy --key-id old-key-ARN --policy-name default --output text > ./policy.json
  8. 使用文字編輯器來開啟 policy.json,並移除 Action 清單中的所有值,除了 kms:Decrypt 以外

    { "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::Your_account_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Effect": "Allow", "Principal": { "Service": "logs.region.amazonaws.com" }, "Action": [ "kms:Decrypt" ], "Resource": "*" } ] }
  9. 輸入下列命令,將更新的政策新增至舊金鑰:

    aws kms put-key-policy --key-id old-key-ARN --policy-name default --policy file://policy.json