为 Performance Insights 配置访问策略
要访问 Performance Insights,主体必须拥有 Amazon Identity and Access Management (IAM) 的相应权限。您可以通过以下方式授予访问权限:
-
将
AmazonRDSPerformanceInsightsReadOnly
托管式策略附加到权限集或角色,以访问 Performance Insights API 的所有只读操作。 -
将
AmazonRDSPerformanceInsightsFullAccess
托管式策略附加到权限集或角色,以访问 Performance Insights API 的所有操作。 -
创建自定义 IAM 策略并将其附加到权限集或角色。
如果您在打开 Performance Insights 时指定了客户托管密钥,请确保账户中的用户对 Amazon KMS key 具有 kms:Decrypt
和 kms:GenerateDataKey
权限。
将 AmazonRDSPerformanceInsightsReadOnly 策略附加到 IAM 主体
AmazonRDSPerformanceInsightsReadOnly
是 Amazon 托管策略,可以授予对 Amazon RDS Performance Insights API 的所有只读操作的访问权限。
如果将 AmazonRDSPerformanceInsightsReadOnly
附加到权限集或角色,接收人可以使用 Performance Insights 以及其他控制台功能。
有关更多信息,请参阅 Amazon 托管式策略:AmazonRDSPerformanceInsightsReadOnly。
将 AmazonRDSPerformanceInsightsFullAccess 策略附加到 IAM 主体
AmazonRDSPerformanceInsightsFullAccess
是 Amazon 托管策略,可以授予对 Amazon RDS Performance Insights API 的所有操作的访问权限。
如果将 AmazonRDSPerformanceInsightsFullAccess
附加到权限集或角色,接收人可以使用 Performance Insights 以及其他控制台功能。
有关更多信息,请参阅 Amazon 托管式策略:AmazonRDSPerformanceInsightsFullAccess。
为 Performance Insights 创建自定义 IAM 策略
对于没有 AmazonRDSPerformanceInsightsReadOnly
或 AmazonRDSPerformanceInsightsFullAccess
策略的用户,可以通过创建或修改用户托管式 IAM 策略,来授予对 Performance Insights 的访问权限。在将策略附加到 IAM 权限集或角色时,接收人可以使用 Performance Insights。
创建自定义策略
打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
在导航窗格中,选择策略。
-
选择创建策略。
-
在创建策略页面上,选择 JSON 选项。
-
复制并粘贴《Amazon 托管策略参考指南》中的 JSON 策略文档部分提供的有关 AmazonRDSPerformanceInsightsReadOnly 或 AmazonRDSPerformanceInsightsFullAccess 策略的文本。
-
选择查看策略。
-
为策略提供名称并可以选择提供描述,然后选择创建策略。
现在,可以将策略附加到权限集或角色。以下过程假设您已经有一个可用于此目的的用户。
将策略附加到用户
打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
在导航窗格中,选择 Users。
-
从列表中选择现有用户。
重要
要使用 Performance Insights,请确保除了自定义策略之外,您还有权访问 Amazon RDS。例如,
AmazonRDSPerformanceInsightsReadOnly
预定义策略提供了对 Amazon RDS 的只读访问权限。有关更多信息,请参阅“使用策略管理访问”。 -
在 Summary (摘要) 页上,选择 Add permissions (添加权限)。
-
选择直接附加现有策略。对于搜索,键入策略名称的前几个字符,如下图所示。
-
选择策略,然后选择 Next: Review。
-
选择 Add permissions (添加权限)。
为 Performance Insights 配置 Amazon KMS 策略
Performance Insights 使用 Amazon KMS key 加密敏感数据。通过 API 或控制台启用 Performance Insights 时,您可以执行以下任一操作:
-
选择默认 Amazon 托管式密钥。
Amazon RDS 为新的数据库实例使用 Amazon 托管式密钥。Amazon RDS 将为您的 Amazon Web Services 账户创建 Amazon 托管式密钥。您的 Amazon Web Services 账户在每个 Amazon Web Services 区域都有用于 Amazon RDS 的不同 Amazon 托管式密钥。
-
选择客户托管密钥。
如果您指定一个客户托管密钥,则您账户中调用 Performance Insights API 的用户需要在 KMS 密钥具有
kms:Decrypt
和kms:GenerateDataKey
权限。您可以通过 IAM policy 配置这些权限。但是,我们建议您通过 KMS 密钥策略来管理这些权限。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的在 Amazon KMS 中使用密钥策略。
以下示例显示了如何将语句添加到 KMS 密钥策略。这些语句可以访问 Performance Insights。您可能需要更改一些限制,这取决于您使用 KMS 密钥的方式。在将语句添加到您的策略之前,请删除所有注释。
{ "Version" : "2012-10-17", "Id" : "your-policy", "Statement" : [ { //This represents a statement that currently exists in your policy. } ...., //Starting here, add new statement to your policy for Performance Insights. //We recommend that you add one new statement for every RDS instance { "Sid" : "Allow viewing RDS Performance Insights", "Effect": "Allow", "Principal": { "AWS": [ //One or more principals allowed to access Performance Insights "arn:aws:iam::
444455556666
:role/Role1
" ] }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*", "Condition" : { "StringEquals" : { //Restrict access to only RDS APIs (including Performance Insights). //Replaceregion
with your Amazon Region. //For example, specify us-west-2. "kms:ViaService" : "rds.region
.amazonaws.com" }, "ForAnyValue:StringEquals": { //Restrict access to only data encrypted by Performance Insights. "kms:EncryptionContext:aws:pi:service": "rds", "kms:EncryptionContext:service": "pi", //Restrict access to a specific RDS instance. //The value is a DbiResourceId. "kms:EncryptionContext:aws:rds:db-id": "db-AAAAABBBBBCCCCDDDDDEEEEE
" } } }
Performance Insights 如何使用 Amazon KMS 客户托管密钥
Performance Insights 使用客户托管密钥加密敏感数据。当您开启 Performance Insights 时,可以通过 API 提供 Amazon KMS 密钥。Performance Insights 对此密钥创建 KMS 权限。它使用密钥并执行必要的操作来处理敏感数据。敏感数据包括用户、数据库、应用程序和 SQL 查询文本等字段。Performance Insights 可确保数据在静态和动态时都保持加密状态。
Performance Insights IAM 如何使用 Amazon KMS
IAM 提供针对特定 API 的权限。Performance Insights 具有以下公有 API,您可以使用 IAM 策略对其进行限制:
DescribeDimensionKeys
GetDimensionKeyDetails
GetResourceMetadata
GetResourceMetrics
ListAvailableResourceDimensions
ListAvailableResourceMetrics
您可以使用以下 API 请求来获取敏感数据。
DescribeDimensionKeys
GetDimensionKeyDetails
GetResourceMetrics
当您使用 API 获取敏感数据时,Performance Insights 会利用调用方的凭证。此检查可确保敏感数据的访问权限仅限于有权访问 KMS 密钥的用户。
调用这些 API 时,您需要通过 IAM 策略调用 API 的权限,以及通过 Amazon KMS 密钥策略调用 kms:decrypt
操作的权限。
GetResourceMetrics
API 可以返回敏感和非敏感数据。请求参数决定响应是否应包含敏感数据。当请求的筛选条件或分组依据参数中包含敏感维度时,API 会返回敏感数据。
有关可以与 GetResourceMetrics
API 一起使用的维度的更多信息,请参阅 DimensionGroup。
例 示例
以下示例请求 db.user
组的敏感数据:
POST / HTTP/1.1 Host: <Hostname> Accept-Encoding: identity X-Amz-Target: PerformanceInsightsv20180227.GetResourceMetrics Content-Type: application/x-amz-json-1.1 User-Agent: <UserAgentString> X-Amz-Date: <Date> Authorization: AWS4-HMAC-SHA256 Credential=<Credential>, SignedHeaders=<Headers>, Signature=<Signature> Content-Length: <PayloadSizeBytes> { "ServiceType": "RDS", "Identifier": "db-ABC1DEFGHIJKL2MNOPQRSTUV3W", "MetricQueries": [ { "Metric": "db.load.avg", "GroupBy": { "Group": "db.user", "Limit": 2 } } ], "StartTime": 1693872000, "EndTime": 1694044800, "PeriodInSeconds": 86400 }
以下示例请求 db.load.avg
指标的非敏感数据:
POST / HTTP/1.1 Host: <Hostname> Accept-Encoding: identity X-Amz-Target: PerformanceInsightsv20180227.GetResourceMetrics Content-Type: application/x-amz-json-1.1 User-Agent: <UserAgentString> X-Amz-Date: <Date> Authorization: AWS4-HMAC-SHA256 Credential=<Credential>, SignedHeaders=<Headers>, Signature=<Signature> Content-Length: <PayloadSizeBytes> { "ServiceType": "RDS", "Identifier": "db-ABC1DEFGHIJKL2MNOPQRSTUV3W", "MetricQueries": [ { "Metric": "db.load.avg" } ], "StartTime": 1693872000, "EndTime": 1694044800, "PeriodInSeconds": 86400 }
授予 Performance Insights 精细访问权限
精细访问控制功能提供用于控制对 Performance Insights 的访问的其他方法。此访问控制功能可以允许或拒绝对 GetResourceMetrics
、DescribeDimensionKeys
和 GetDimensionKeyDetails
Performance Insights 操作的各个维度的访问。要使用精细访问功能,请使用条件键在 IAM 策略中指定维度。访问权限的评估遵循 IAM 策略评估逻辑。有关更多信息,请参阅《 IAM 用户指南》中的策略评估逻辑。如果 IAM 策略声明未指定任何维度,该声明将控制对指定操作的所有维度的访问。有关可用维度的列表,请参阅 DimensionGroup。
要找出您的凭证有权访问的维度,请使用 ListAvailableResourceDimensions
中的 AuthorizedActions
参数并指定操作。允许的 AuthorizedActions
值如下所示:
-
GetResourceMetrics
-
DescribeDimensionKeys
-
GetDimensionKeyDetails
例如,如果您为 AuthorizedActions
参数指定 GetResourceMetrics
,ListAvailableResourceDimensions
将返回 GetResourceMetrics
操作有权访问的维度列表。如果您在 AuthorizedActions
参数中指定了多个操作,ListAvailableResourceDimensions
将返回这些操作有权访问的维度的交集。
以下示例提供了对 GetResourceMetrics
和 DescribeDimensionKeys
操作的指定维度的访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowToDiscoverDimensions", "Effect": "Allow", "Action": [ "pi:ListAvailableResourceDimensions" ], "Resource": [ "arn:aws:pi:us-east-1:123456789012:metrics/rds/db-ABC1DEFGHIJKL2MNOPQRSTUV3W" ] }, { "Sid": "SingleAllow", "Effect": "Allow", "Action": [ "pi:GetResourceMetrics", "pi:DescribeDimensionKeys" ], "Resource": [ "arn:aws:pi:us-east-1:123456789012:metrics/rds/db-ABC1DEFGHIJKL2MNOPQRSTUV3W" ], "Condition": { "ForAllValues:StringEquals": { // only these dimensions are allowed. Dimensions not included in // a policy with "Allow" effect will be denied "pi:Dimensions": [ "db.sql_tokenized.id", "db.sql_tokenized.statement" ] } } } ] }
以下是对所请求维度的响应:
// ListAvailableResourceDimensions API // Request { "ServiceType": "RDS", "Identifier": "db-ABC1DEFGHIJKL2MNOPQRSTUV3W", "Metrics": [ "db.load" ], "AuthorizedActions": ["DescribeDimensionKeys"] } // Response { "MetricDimensions": [ { "Metric": "db.load", "Groups": [ { "Group": "db.sql_tokenized", "Dimensions": [ { "Identifier": "db.sql_tokenized.id" }, // { "Identifier": "db.sql_tokenized.db_id" }, // not included because not allows in the IAM Policy { "Identifier": "db.sql_tokenized.statement" } ] } ] } ] }
以下示例为维度指定一个允许访问和两个拒绝访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowToDiscoverDimensions", "Effect": "Allow", "Action": [ "pi:ListAvailableResourceDimensions" ], "Resource": [ "arn:aws:pi:us-east-1:123456789012:metrics/rds/db-ABC1DEFGHIJKL2MNOPQRSTUV3W" ] }, { "Sid": "O01AllowAllWithoutSpecifyingDimensions", "Effect": "Allow", "Action": [ "pi:GetResourceMetrics", "pi:DescribeDimensionKeys" ], "Resource": [ "arn:aws:pi:us-east-1:123456789012:metrics/rds/db-ABC1DEFGHIJKL2MNOPQRSTUV3W" ] }, { "Sid": "O01DenyAppDimensionForAll", "Effect": "Deny", "Action": [ "pi:GetResourceMetrics", "pi:DescribeDimensionKeys" ], "Resource": [ "arn:aws:pi:us-east-1:123456789012:metrics/rds/db-ABC1DEFGHIJKL2MNOPQRSTUV3W" ], "Condition": { "ForAnyValue:StringEquals": { "pi:Dimensions": [ "db.application.name" ] } } }, { "Sid": "O01DenySQLForGetResourceMetrics", "Effect": "Deny", "Action": [ "pi:GetResourceMetrics" ], "Resource": [ "arn:aws:pi:us-east-1:123456789012:metrics/rds/db-ABC1DEFGHIJKL2MNOPQRSTUV3W" ], "Condition": { "ForAnyValue:StringEquals": { "pi:Dimensions": [ "db.sql_tokenized.statement" ] } } } ] }
以下是对请求维度的响应:
// ListAvailableResourceDimensions API // Request { "ServiceType": "RDS", "Identifier": "db-ABC1DEFGHIJKL2MNOPQRSTUV3W", "Metrics": [ "db.load" ], "AuthorizedActions": ["GetResourceMetrics"] } // Response { "MetricDimensions": [ { "Metric": "db.load", "Groups": [ { "Group": "db.application", "Dimensions": [ // removed from response because denied by the IAM Policy // { "Identifier": "db.application.name" } ] }, { "Group": "db.sql_tokenized", "Dimensions": [ { "Identifier": "db.sql_tokenized.id" }, { "Identifier": "db.sql_tokenized.db_id" }, // removed from response because denied by the IAM Policy // { "Identifier": "db.sql_tokenized.statement" } ] }, ... ] } ] }
// ListAvailableResourceDimensions API // Request { "ServiceType": "RDS", "Identifier": "db-ABC1DEFGHIJKL2MNOPQRSTUV3W", "Metrics": [ "db.load" ], "AuthorizedActions": ["DescribeDimensionKeys"] } // Response { "MetricDimensions": [ { "Metric": "db.load", "Groups": [ { "Group": "db.application", "Dimensions": [ // removed from response because denied by the IAM Policy // { "Identifier": "db.application.name" } ] }, { "Group": "db.sql_tokenized", "Dimensions": [ { "Identifier": "db.sql_tokenized.id" }, { "Identifier": "db.sql_tokenized.db_id" }, // allowed for DescribeDimensionKeys because our IAM Policy // denies it only for GetResourceMetrics { "Identifier": "db.sql_tokenized.statement" } ] }, ... ] } ] }