使用 IAM 策略限制对 Parameter Store 参数的访问
您可以使用 AWS Identity and Access Management (IAM) 限制对 AWS Systems Manager 参数的访问。更具体地说,您可以创建 IAM policy 来限制对以下 API 操作的访问:
当使用 IAM policy 限制对 Systems Manager 参数的访问时,建议您创建和使用限制性 IAM policy。例如,以下策略允许用户为有限的一组资源调用 DescribeParameters
和 GetParameters
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-*
开头的参数的 GetParameter
、GetParameters
、GetParameterHistory
和 GetParametersByPath
。
{ "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-*" } ] }
注意
参数历史记录包括当前版本在内的所有参数版本。因此,如果拒绝用户使用 GetParameter
、GetParameters
和 GetParameterByPath
的权限,但允许其使用 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" ], "Resource": [ "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-12345EXAMPLE" ] } ] }
1使用指定的客户托管密钥创建加密的高级参数需要 kms:GenerateDataKey
权限。
相比之下,客户账户中的所有用户都可以访问默认 AWS 托管密钥。如果您使用此默认密钥加密 SecureString
参数,并且不希望用户使用 SecureString
参数,则其 IAM policy 必须显式拒绝对默认密钥的访问权限,如以下策略示例所示。
注意
您可以在AWS 托管密钥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
参数活动。
有关更多信息,请参阅以下主题:
-
IAM 用户指南中的策略评估逻辑
-
AWS Key Management Service Developer Guide 中的在 AWS KMS 中使用密钥策略
-
AWS CloudTrail 用户指南中的使用 CloudTrail 事件历史记录查看事件