加密数据目录
AWS Glue Data Catalog 加密可提高敏感数据的安全性。AWS Glue与 AWS Key Management Service(AWS KMS)集成,以加密存储在 Data Catalog 中的元数据,包括自动注册的资产,您可通过补充业务上下文信息对其进行丰富优化,以支持语义搜索。您可以使用 AWS Glue 控制台或 AWS CLI,为数据目录中的资源启用或禁用加密设置。
为数据目录启用加密时,您创建的所有新对象都将被加密。禁用加密后,您创建的新对象将不会被加密,但现有的加密对象将保持加密状态。
您可以使用 AWS 托管加密密钥或客户管理型加密密钥对整个数据目录进行加密。有关密钥类型和状态的更多信息,请参阅《AWS Key Management Service 开发人员指南》中的 AWS Key Management Service 概念。
将加密的数据目录与爬网程序一起使用时,必须保持加密设置。如果在爬网程序处理完加密目录之后移除加密设置,则会导致错误。如果需要移除加密设置,请创建一个新的爬网程序而不是修改现有的爬网程序。
AWS 托管密钥
AWS 托管密钥是由与 AWS KMS集成的 AWS 服务代表您在账户中创建、管理和使用的 KMS 密钥。可以在 AWS CloudTrail 日志中查看账户中的 AWS 托管密钥,查看其密钥策略以及审计其使用情况。但是,您无法管理这些 KMS 钥或更改其权限。
静态加密自动集成 AWS KMS,从而管理 AWS Glue 用于加密元数据的 AWS 托管密钥。如果启用元数据加密时 AWS 托管密钥尚不存在,AWS KMS 将自动为您创建新密钥。
有关更多信息,请参阅 AWS 托管式密钥。
客户管理密钥
客户托管密钥是在您的 AWS 账户 中创建、拥有和托管的 KMS 密钥。您对 KMS 密钥拥有全部控制权。您可以:
-
建立和维护密钥政策、IAM 策略和授权
-
启用和禁用密钥
-
轮换加密材料
-
添加标签
-
创建引用密钥的别名
-
计划密钥的删除
有关管理客户管理型密钥权限的更多信息,请参阅客户管理型密钥。
AWS Glue 仅支持对称客户管理型密钥。KMS 密钥列表仅显示对称密钥。但是,如果选择了选择 KMS 密钥 ARN,则可通过控制台输入任何密钥类型的 ARN。确保仅为对称密钥输入 ARN。
要创建对称客户管理型密钥,请按照《AWS Key Management Service 开发人员指南》中的 creating symmetric customer managed keys 部分的步骤进行操作。
启用数据目录静态加密时,将使用 KMS 密钥对以下资源类型进行加密:
数据库
表
分区
表格版本
列统计数据
用户定义的函数
数据目录视图
目录资产
AWS Glue 加密上下文
加密上下文是一组可选的键值对,包含有关数据的其他上下文信息。AWS KMS 会将加密上下文用作其他已经过验证的数据以支持经过身份验证的加密。在请求中包含加密上下文以加密数据时,AWS KMS 将加密上下文绑定到加密的数据。要解密数据,请在请求中包含相同的加密上下文。AWS Glue 在所有 AWS KMS 加密操作中使用相同的加密上下文,其中键为 glue_catalog_id,值为 catalogId。
"encryptionContext": {
"glue_catalog_id": "111122223333"
}
使用 AWS 托管密钥或对称的户管理型密钥来加密数据目录时,还可以使用审计记录和日志中的加密上下文来识别密钥的使用情况。加密上下文还会显示在 AWS CloudTrail 生成的日志或 Amazon CloudWatch 日志中。
启用加密
您可以通过 AWS Glue 控制台中的数据目录设置,或者使用 AWS CLI 为 AWS Glue Data Catalog 对象启用加密。
- Console
-
使用控制台启用加密
登录 AWS 管理控制台,然后打开 AWS Glue 控制台,网址为:https://console.aws.amazon.com/glue/。
-
在导航窗格中,选择数据目录。
-
在数据目录设置页面上,选中元数据加密复选框,然后选择一个 AWS KMS 密钥。
启用加密时,如果您未指定客户管理型密钥,则加密设置将使用 AWS 托管 KMS 密钥。
-
(可选)如果您使用客户管理型密钥加密数据目录,Data Cat alog提供了一个用于注册 IAM 角色来加密和解密资源的选项。您需要向您的 IAM 角色授予 AWS Glue 可以代表代入的权限。这包括加密和解密数据的 AWS KMS 权限。
当您在数据目录中创建新资源时,AWS Glue 将代入所提供的 IAM 角色来加密数据。同样,当使用者访问资源时,AWS Glue 也会代入该 IAM 角色来解密数据。如果您注册了具有所需权限的 IAM 角色,则调用主体不再需要访问密钥和解密数据的权限。
只有当您使用客户管理型密钥加密数据目录资源时,您才能将 KMS 操作委派给 IAM 角色。KMS 角色委派功能目前不支持使用 AWS 托管密钥加密数据目录资源的情形。
当您启用 IAM 角色委派 KMS 操作的权限时,您将无法再访问以前使用 AWS 托管密钥加密的数据目录资源。
-
要启用 AWS Glue 可以代入以代表您加密和解密数据的 IAM 角色,请选择将 KMS 操作委派给 IAM 角色选项。
-
然后选择一个 IAM 角色。
要创建 IAM 角色,请参阅 为 AWS Glue 创建 IAM 角色。
AWS Glue 访问数据目录时将代入的 IAM 角色必须具有加密和解密数据目录中元数据的权限。您可以创建一个 IAM 角色并附加以下内联策略:
-
添加以下策略以包括加密和解密数据目录的 AWS KMS 权限。
JSON
- JSON
-
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:GenerateDataKey"
],
"Resource": "arn:aws:kms:us-east-1:111122223333:key/<key-id>"
}
]
}
-
然后将以下信任策略添加到该角色,以便 AWS Glue 服务代入该 IAM 角色。
JSON
- JSON
-
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "glue.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
-
然后向该 IAM 角色添加 iam:PassRole 权限。
JSON
- JSON
-
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"arn:aws:iam::111122223333:role/<encryption-role-name>"
]
}
]
}
启用加密后,如果您尚未指定 AWS Glue 要代入的 IAM 角色,则访问 Data Catalog 的主体必须具有对 KMS 密钥执行以下 AWS KMS 操作的权限:
kms:DescribeKey
kms:Decrypt
kms:Encrypt
kms:GenerateDataKey
kms:CreateGrant
以下策略授予主体所需的权限。kms:CreateGrant 操作允许 AWS Glue 在 AWS KMS 请求完成后在后台加密和重新加密 Data Catalog 元数据及搜索索引。AWS Glue 将授权范围限定为 glue_catalog_id 加密上下文。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "kms:DescribeKey",
"Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
},
{
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:GenerateDataKey"
],
"Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
},
{
"Effect": "Allow",
"Action": "kms:CreateGrant",
"Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab",
"Condition": {
"StringEquals": {
"kms:EncryptionContext:glue_catalog_id": "123456789012"
},
"StringLike": {
"kms:CallerAccount": "123456789012"
},
"Bool": {
"kms:GrantIsForAWSResource": "true"
}
}
}
]
}
- AWS CLI
-
使用开发工具包或 AWS CLI 启用加密
-
使用 PutDataCatalogEncryptionSettings API 操作。如果未指定密钥,AWS Glue 将使用客户账户的 AWS 托管加密密钥对数据目录进行加密。
aws glue put-data-catalog-encryption-settings \
--data-catalog-encryption-settings '{
"EncryptionAtRest": {
"CatalogEncryptionMode": "SSE-KMS-WITH-SERVICE-ROLE",
"SseAwsKmsKeyId": "arn:aws:kms:<region>:<account-id>:key/<key-id>",
"CatalogEncryptionServiceRole":"arn:aws:iam::<account-id>:role/<encryption-role-name>"
}
}'
启用加密后,您在数据目录对象中创建的所有对象都将被加密。如果您清除此设置,您在数据目录中创建的对象将不再加密。您可以继续使用所需的 KMS 权限访问数据目录中现有的加密对象。
对于在数据目录中使用 AWS KMS 密钥加密的任何对象,此密钥必须在 AWS KMS 密钥存储中保持可用。如果删除密钥,则无法再对对象进行解密。在某些情况下,您可能希望阻止访问数据目录元数据。
|
使用 AWS KMS 客户自主管理型密钥加密目录资产
受支持的目录资源会在您的 AWS Glue Data Catalog 中自动注册为资产。您可以向这些资产添加业务上下文,从而在 AWS Glue 中对此元数据进行语义搜索和筛选。当您使用客户自主管理型密钥启用元数据加密时,AWS Glue 还会使用您的 KMS 密钥对 Data Catalog 的搜索索引进行加密。无需其他步骤——作为元数据加密的一部分,AWS Glue 会自动启用搜索索引加密。
如果您之前使用客户自主管理型密钥启用了 Data Catalog 加密,且现有策略仅包含 kms:Decrypt、kms:Encrypt 和 kms:GenerateDataKey,则必须添加以下权限以支持目录资产和语义搜索:
有关包含这些权限的完整策略,请参阅 启用加密。如果您是首次设置加密,则该部分中的策略已包含所有必要权限。
对 Data Catalog 资产进行语义搜索不支持 AWS 托管密钥(aws/glue)。如果您的 Data Catalog 元数据是使用 aws/glue 加密的,则只有将配置更改为使用客户自主管理型密钥或移除该配置后,才能搜索该目录。
启用元数据加密是一项异步操作。AWS Glue 接受您的请求后,将完成加密设置,包括对现有搜索索引进行加密。首次启用加密可能需要一些时间才能完成,具体取决于 Data Catalog 的大小。在此期间,业务上下文和搜索 API 会返回错误,直到状态变为 Enabled。
下表介绍了 Data Catalog 资产元数据的不同加密状态:
| Status |
说明 |
启用 |
AWS Glue 正在设置加密。首次启用加密时,只有在设置完成后才能使用搜索功能。当您从一个客户自主管理型密钥更改为另一个时,搜索功能仍然可用。 |
已启用 |
加密已完成。您的 Data Catalog 元数据可供搜索。 |
已启用(有错误) |
加密已完成,搜索功能可用,但 AWS Glue 无法处理某些元数据。控制台将显示错误消息。要重试失败的项目,请修复错误后再次保存加密设置。 |
失败 |
加密未能完成,搜索功能不可用。请查看错误消息,更正配置,然后使用客户自主管理型密钥再次保存加密设置。 |
正在禁用 |
AWS Glue 正在使用您的 KMS 密钥禁用搜索索引中的加密。 |
已禁用 |
您的 Data Catalog 元数据和搜索索引不再使用您的 KMS 密钥进行加密。业务上下文和搜索 API 可继续正常使用。 |
当您将 Data Catalog 加密从一个客户自主管理型密钥更改为另一个时,AWS Glue 将使用新密钥重新加密搜索索引。在重新加密过程中,搜索功能仍然可用。禁用元数据加密后,AWS Glue 将从搜索索引中移除您的 KMS 密钥,状态将更改为 Disabled。
在加密状态恢复为 Enabled(或 Disabled,如果您已禁用加密)之前,请勿禁用、删除或撤销对先前的 KMS 密钥的访问权限。如果 AWS Glue 在操作完成之前失去了对先前密钥的访问权限,它将无法解密搜索索引,状态将更改为 Failed,并且对 Data Catalog 的搜索不可用。
启用或更改元数据加密的主体必须具有 启用加密 中描述的 kms:CreateGrant 权限。AWS Glue 在搜索索引的 AWS KMS 操作中使用 glue_catalog_id 加密上下文(值为您的 catalogId),与 AWS Glue 加密上下文 一致。AWS Glue 为搜索索引进行的 AWS KMS 调用记录在 AWS CloudTrail 中。
访问业务上下文和搜索的主体还必须具有对 KMS 密钥的访问权限。如果您已将 AWS KMS 操作委托给 IAM 服务角色,则该服务角色必须具有对 KMS 密钥的访问权限。
除了身份策略之外,您还必须在 KMS 密钥策略中添加以下语句,以允许 AWS Glue 为搜索索引加密创建授权。kms:GrantIsForAWSResource 条件将授权限制为 AWS Glue,glue_catalog_id 加密上下文将其范围限定为您的 Data Catalog。要使用该语句,请将用户输入占位符替换为您自己的信息。
{
"Sid": "AllowCreateGrantForSearchIndexEncryption",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::account-id:root"
},
"Action": "kms:CreateGrant",
"Resource": "arn:aws:kms:region:account-id:key/key-id",
"Condition": {
"StringLike": {
"kms:CallerAccount": "account-id"
},
"Bool": {
"kms:GrantIsForAWSResource": "true"
},
"StringEquals": {
"kms:EncryptionContext:glue_catalog_id": "account-id"
}
}
}
监控用于 AWS Glue 的 KMS 密钥
当您将 KMS 密钥用于数据目录资源时,您可以使用 AWS CloudTrail 或 Amazon CloudWatch 日志来跟踪 AWS Glue 发送到 AWS KMS的请求。AWS CloudTrail 会监控并记录 AWS Glue 为了访问使用您的 KMS 密钥加密的数据而调用的 KMS 操作。
以下是 Decrypt、GenerateDataKey、CreateGrant 和 RetireGrant 操作的 AWS CloudTrail 事件示例。使用客户自主管理型密钥启用加密时,AWS Glue 会创建一个范围限定为 glue_catalog_id 加密上下文的 AWS KMS 授权,以便在后台加密和重新加密 Data Catalog 元数据,并在 AWS Glue 不再需要时停用该授权。
- Decrypt
-
{
"eventVersion": "1.08",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AROAXPHTESTANDEXAMPLE:Sampleuser01",
"arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
"accountId": "111122223333",
"accessKeyId": "AKIAIOSFODNN7EXAMPLE",
"sessionContext": {
"sessionIssuer": {
"type": "Role",
"principalId": "AROAXPHTESTANDEXAMPLE",
"arn": "arn:aws:iam::111122223333:role/Admin",
"accountId": "111122223333",
"userName": "Admin"
},
"webIdFederationData": {},
"attributes": {
"creationDate": "2024-01-10T14:33:56Z",
"mfaAuthenticated": "false"
}
},
"invokedBy": "glue.amazonaws.com"
},
"eventTime": "2024-01-10T15:18:11Z",
"eventSource": "kms.amazonaws.com",
"eventName": "Decrypt",
"awsRegion": "eu-west-2",
"sourceIPAddress": "glue.amazonaws.com",
"userAgent": "glue.amazonaws.com",
"requestParameters": {
"encryptionContext": {
"glue_catalog_id": "111122223333"
},
"encryptionAlgorithm": "SYMMETRIC_DEFAULT"
},
"responseElements": null,
"requestID": "43b019aa-34b8-4798-9b98-ee968b2d63df",
"eventID": "d7614763-d3fe-4f84-a1e1-3ca4d2a5bbd5",
"readOnly": true,
"resources": [
{
"accountId": "111122223333",
"type": "AWS::KMS::Key",
"ARN": "arn:aws:kms:<region>:111122223333:key/<key-id>"
}
],
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "111122223333",
"eventCategory": "Management",
"sessionCredentialFromConsole": "true"
}
- GenerateDataKey
-
{
"eventVersion": "1.08",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AROAXPHTESTANDEXAMPLE:V_00_GLUE_KMS_GENERATE_DATA_KEY_111122223333",
"arn": "arn:aws:sts::111122223333:assumed-role/Admin/V_00_GLUE_KMS_GENERATE_DATA_KEY_111122223333",
"accountId": "111122223333",
"accessKeyId": "AKIAIOSFODNN7EXAMPLE",
"sessionContext": {
"sessionIssuer": {
"type": "Role",
"principalId": "AROAXPHTESTANDEXAMPLE",
"arn": "arn:aws:iam::111122223333:role/Admin",
"accountId": "AKIAIOSFODNN7EXAMPLE",
"userName": "Admin"
},
"webIdFederationData": {},
"attributes": {
"creationDate": "2024-01-05T21:15:47Z",
"mfaAuthenticated": "false"
}
},
"invokedBy": "glue.amazonaws.com"
},
"eventTime": "2024-01-05T21:15:47Z",
"eventSource": "kms.amazonaws.com",
"eventName": "GenerateDataKey",
"awsRegion": "eu-west-2",
"sourceIPAddress": "glue.amazonaws.com",
"userAgent": "glue.amazonaws.com",
"requestParameters": {
"keyId": "arn:aws:kms:eu-west-2:AKIAIOSFODNN7EXAMPLE:key/AKIAIOSFODNN7EXAMPLE",
"encryptionContext": {
"glue_catalog_id": "111122223333"
},
"keySpec": "AES_256"
},
"responseElements": null,
"requestID": "64d1783a-4b62-44ba-b0ab-388b50188070",
"eventID": "1c73689b-2ef2-443b-aed7-8c126585ca5e",
"readOnly": true,
"resources": [
{
"accountId": "111122223333",
"type": "AWS::KMS::Key",
"ARN": "arn:aws:kms:eu-west-2:111122223333:key/AKIAIOSFODNN7EXAMPLE"
}
],
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "111122223333",
"eventCategory": "Management"
}
- CreateGrant
-
使用客户自主管理型密钥启用加密时,AWS Glue 会对 KMS 密钥创建授权,以便在后台加密和重新加密 Data Catalog 元数据。该授权的范围限定为 glue_catalog_id 加密上下文。
{
"eventVersion": "1.08",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01",
"arn": "arn:aws:sts::111122223333:assumed-role/Example/Sampleuser01",
"accountId": "111122223333",
"accessKeyId": "AKIAIOSFODNN7EXAMPLE",
"sessionContext": {
"sessionIssuer": {
"type": "Role",
"principalId": "AROAIGDTESTANDEXAMPLE",
"arn": "arn:aws:iam::111122223333:role/Example",
"accountId": "111122223333",
"userName": "Example"
},
"attributes": {
"creationDate": "2024-04-22T17:02:00Z",
"mfaAuthenticated": "false"
}
},
"invokedBy": "glue.amazonaws.com"
},
"eventTime": "2024-04-22T17:02:00Z",
"eventSource": "kms.amazonaws.com",
"eventName": "CreateGrant",
"awsRegion": "eu-west-2",
"sourceIPAddress": "glue.amazonaws.com",
"userAgent": "glue.amazonaws.com",
"requestParameters": {
"retiringPrincipal": "glue.eu-west-2.amazonaws.com",
"operations": [
"GenerateDataKey",
"Decrypt",
"Encrypt",
"ReEncryptFrom",
"ReEncryptTo",
"DescribeKey",
"RetireGrant"
],
"granteePrincipal": "glue.eu-west-2.amazonaws.com",
"constraints": {
"encryptionContextSubset": {
"glue_catalog_id": "111122223333"
}
},
"keyId": "arn:aws:kms:eu-west-2:111122223333:key/<key-id>"
},
"responseElements": {
"grantId": "0ab0ac0d0b000f00ea00cc0a0e00fc00bce000c000f0000000c0bc0a0000aaafSAMPLE",
"keyId": "arn:aws:kms:eu-west-2:111122223333:key/<key-id>"
},
"requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
"eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
"readOnly": false,
"resources": [
{
"accountId": "111122223333",
"type": "AWS::KMS::Key",
"ARN": "arn:aws:kms:eu-west-2:111122223333:key/<key-id>"
}
],
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "111122223333",
"eventCategory": "Management",
"sessionCredentialFromConsole": "true"
}
- RetireGrant
-
当 AWS Glue 不再需要该授权时(例如,当您更改 KMS 密钥或禁用加密时),AWS Glue 会停用它。
{
"eventVersion": "1.08",
"userIdentity": {
"type": "AWSService",
"invokedBy": "glue.amazonaws.com"
},
"eventTime": "2025-04-29T22:18:50Z",
"eventSource": "kms.amazonaws.com",
"eventName": "RetireGrant",
"awsRegion": "eu-west-2",
"sourceIPAddress": "glue.amazonaws.com",
"userAgent": "glue.amazonaws.com",
"requestParameters": null,
"responseElements": {
"keyId": "arn:aws:kms:eu-west-2:111122223333:key/<key-id>"
},
"additionalEventData": {
"grantId": "0ab0ac0d0b000f00ea00cc0a0e00fc00bce000c000f0000000c0bc0a0000aaafSAMPLE"
},
"requestID": "294308c0-7617-4727-b5c9-34eaf75aa8e3",
"eventID": "273708f7-5fbb-3a90-b04d-2b3138bf0ec9",
"readOnly": false,
"resources": [
{
"accountId": "111122223333",
"type": "AWS::KMS::Key",
"ARN": "arn:aws:kms:eu-west-2:111122223333:key/<key-id>"
}
],
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "111122223333",
"sharedEventID": "b46377d7-b3c3-4bfd-a257-722bd3f3411d",
"eventCategory": "Management"
}