使用 IAM 策略限制对 Parameter Store 参数的访问 - AWS Systems Manager

使用 IAM 策略限制对 Parameter Store 参数的访问

您可以使用 AWS Identity and Access Management (IAM) 限制对 AWS Systems Manager 参数的访问。更具体地说,您可以创建 IAM policy 来限制对以下 API 操作的访问:

当使用 IAM policy 限制对 Systems Manager 参数的访问时,建议您创建和使用限制性 IAM policy。例如,以下策略允许用户为有限的一组资源调用 DescribeParametersGetParameters API 操作。这意味着,用户可以获取有关以 prod-* 开头的所有参数的信息并使用这些参数。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:DescribeParameters" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ssm:GetParameters" ], "Resource": "arn:aws:ssm:us-east-2:123456789012:parameter/prod-*" } ] }
重要

如果用户有权访问某个路径,则该用户可以访问该路径的所有级别。例如,如果某个用户有权访问路径 /a,则该用户也可以访问 /a/b。即使用户在 IAM 中已被显式拒绝访问参数 /a/b,他们仍能够以递归方式为 /a 调用 GetParametersByPath API 操作并查看 /a/b

对于受信任的管理员,您可以通过使用类似以下示例的策略提供对所有 Systems Manager 参数 API 操作的访问权限。此策略将授予用户对所有以 dbserver-prod-* 开头的生产参数的完全访问权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:PutParameter", "ssm:DeleteParameter", "ssm:GetParameterHistory", "ssm:GetParametersByPath", "ssm:GetParameters", "ssm:GetParameter", "ssm:DeleteParameters" ], "Resource": "arn:aws:ssm:us-east-2:123456789012:parameter/dbserver-prod-*" }, { "Effect": "Allow", "Action": "ssm:DescribeParameters", "Resource": "*" } ] }

拒绝权限

每个 API 都是唯一的,并且具有不同的操作和权限,您可以单独允许或拒绝这些操作和权限。任何策略中的显式拒绝将覆盖允许。

注意

默认的 AWS Key Management Service (AWS KMS) 密钥具有对 AWS 账户中的所有 IAM 委托人的Decrypt权限。如果您希望对账户中的 SecureString 参数拥有不同的访问级别,不建议您使用默认密钥。

如果您希望所有检索参数值的 API 操作都具有相同的行为,则可以在策略中使用类似 GetParameter* 的模式。以下示例显示了如何拒绝所有以 prod-* 开头的参数的 GetParameterGetParametersGetParameterHistoryGetParametersByPath

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ssm:GetParameter*" ], "Resource": "arn:aws:ssm:us-east-2:123456789012:parameter/prod-*" } ] }

以下示例显示了如何拒绝一些命令,同时允许用户对以 prod-* 开头的所有参数执行其他命令。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ssm:PutParameter", "ssm:DeleteParameter", "ssm:DeleteParameters", "ssm:DescribeParameters" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ssm:GetParametersByPath", "ssm:GetParameters", "ssm:GetParameter", "ssm:GetParameterHistory" ], "Resource": "arn:aws:ssm:us-east-2:123456789012:parameter/prod-*" } ] }
注意

参数历史记录包括当前版本在内的所有参数版本。因此,如果拒绝用户使用 GetParameterGetParametersGetParameterByPath 的权限,但允许其使用 GetParameterHistory 的权限,则用户可以使用 GetParameterHistory 查看当前参数(包括 SecureString 参数)。

仅允许特定参数在节点上运行

您可以控制访问权限,以使托管式节点只能运行指定参数。

如果您在创建参数时选择 SecureString 参数类型,Systems Manager 将使用 AWS KMS 加密参数值。AWS KMS 使用 AWS 托管式密钥 或客户托管密钥来加密值。有关 AWS KMS 和 AWS KMS key的更多信息,请参阅 AWS Key Management Service Developer Guide

您可以通过从 AWS CLI 运行以下命令来查看 AWS 托管式密钥:

aws kms describe-key --key-id alias/aws/ssm

在以下示例中,允许节点获取仅用于以 prod- 开头的参数的参数值。如果参数是 SecureString 参数,则节点会使用 AWS KMS 解密该字符串。

注意

如以下示例所示,实例策略分配到 IAM 中的实例角色。有关配置对 Systems Manager 功能的访问权限的详细信息,包括如何将策略分配给用户和实例,请参阅 使用 Systems Manager 管理 EC2 实例

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameters" ], "Resource": [ "arn:aws:ssm:us-east-2:123456789012:parameter/prod-*" ] }, { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-east-2:123456789012:key/4914ec06-e888-4ea5-a371-5b88eEXAMPLE" ] } ] }

有关使用 AWS 默认密钥和客户托管密钥的 IAM 权限

Parameter Store SecureString 参数使用 AWS KMS 密钥进行加密和解密。您可以选择使用 AWS KMS key 或 AWS 提供的默认 KMS 密钥对 SecureString 参数进行加密。

使用客户托管密钥时,授予用户访问参数或参数路径的权限的 IAM policy 必须提供对密钥的显式 kms:Encrypt 权限。例如,以下策略允许用户在指定的 AWS 区域和 AWS 账户中创建、更新和查看以 prod- 开头的 SecureString 参数。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:PutParameter", "ssm:GetParameter", "ssm:GetParameters" ], "Resource": [ "arn:aws:ssm:us-east-2:111122223333:parameter/prod-*" ] }, { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey" Footnote callout 1 to explain a line in a JSON policy ], "Resource": [ "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-12345EXAMPLE" ] } ] }

1使用指定的客户托管密钥创建加密的高级参数需要 kms:GenerateDataKey 权限。

相比之下,客户账户中的所有用户都可以访问默认 AWS 托管密钥。如果您使用此默认密钥加密 SecureString 参数,并且不希望用户使用 SecureString 参数,则其 IAM policy 必须显式拒绝对默认密钥的访问权限,如以下策略示例所示。

注意

您可以在AWS 托管密钥页面的 AWS KMS 控制台中找到默认密钥的 Amazon Resource Name (ARN)。默认密钥是在 Alias (别名) 列中使用 aws/ssm 标识的密钥。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "arn:aws:kms:us-east-2:111122223333:key/abcd1234-ab12-cd34-ef56-abcdeEXAMPLE" ] } ] }

如果您需要对账户中的 SecureString 参数进行精细访问控制,则应使用客户托管密钥来保护和限制对这些参数的访问。我们还建议使用 AWS CloudTrail 监视 SecureString 参数活动。

有关更多信息,请参阅以下主题: