为 Secrets Manager 使用基于身份的策略(IAM 策略) - AWS Secrets Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

为 Secrets Manager 使用基于身份的策略(IAM 策略)

作为账户的管理员,您可以将权限策略附加到 IAM 身份(如用户、组和角色),以控制对您的账户中的 AWS 资源的访问。在授予权限时,您确定权限、资源以及允许对这些资源执行的特定操作。如果您为一个角色授予权限,则您指定的其他账户中的用户可以担任该角色。

默认情况下,用户或角色没有任何种类的权限。您必须使用策略明确授予任何权限。如果您未显式授予权限,将隐式拒绝该权限。如果您显式拒绝一个权限,这会拒绝允许该权限的任何其他策略。换句话说,用户仅具有显式授予的权限,而没有显式拒绝的权限。

有关策略的基本要素的概述,请参阅使用策略管理对资源的访问

Secrets Manager 的 AWS 托管策略

AWS Secrets Manager 提供以下 AWS 托管策略,以使授予权限变得更容易。选择链接以在 IAM 控制台中查看策略。

为用户授予完全 Secrets Manager 管理员权限

要成为 Secrets Manager 管理员,您必须在几个服务中具有权限。我们建议您不要将 Secrets Manager 作为最终用户服务启用,以使用户能够创建和管理其密钥。启用轮换所需的权限授予标准用户不应具有的重要权限。应由受信任的管理员管理 Secrets Manager 服务。最终用户不再直接处理凭证或将其嵌入在代码中。

警告

在启用轮换时,Secrets Manager 创建一个 Lambda 函数并将 IAM 角色附加到该函数。这需要使用一些仅为受信任的个人授予的 IAM 权限。因此,Secrets Manager 的托管策略 包含这些 IAM 权限。除了 SecretsManagerReadWrite 托管策略以外,您还必须明确选择分配 IAMFullAccess 托管策略以创建一个具有完全访问权限的 Secrets Manager 管理员。

如果仅使用 SecretsManagerReadWrite 策略授予访问权限,则允许 IAM 用户创建和管理密钥,但该用户无法创建和配置启用轮换所需的 Lambda 轮换函数。

完成以下步骤,将完全 Secrets Manager 管理员权限授予您账户下的某个 IAM 用户、组或角色。在本示例中,您不会创建新策略,而是附加预配置了权限的 AWS 托管策略。

将完全管理员权限授予 IAM 用户、组或角色

  1. 以有权将 IAM 策略附加到其他 IAM 用户的用户身份登录到 Identity and Access Management (IAM) 控制台 (https://console.amazonaws.cn/iam/)。

    在 IAM 控制台中,导航到策略

  2. 对于筛选策略:策略类型,选择 AWS 管理的策略,然后在搜索框中开始键入 SecretsManagerReadWrite,直到您可以在列表中看到该策略。

  3. 选择 SecretsManagerReadWrite 策略名称。

  4. 选择策略操作,然后选择附加

  5. 选中要添加为 Secrets Manager 管理员的用户、组或角色旁边的框。

  6. 选择 Attach policy

  7. 如果还要附加 IAMFullAccess 策略,请重复步骤 1 至步骤 6。

选定的用户、组和角色可以在 Secrets Manager 中立即开始执行任务。

为一个密钥授予读取访问权限

在编写应用程序以使用 Secrets Manager 检索和使用密钥时,您只需为应用程序授予一组非常有限的权限。Secrets Manager 仅需要具有允许检索包含凭证的加密密钥值的操作的权限。您指定密钥的 Amazon 资源名称 (ARN) 以将访问限制为仅一个密钥。

通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

选择创建策略并添加以下代码:

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "<arn-of-the-secret-the-app-needs-to-access>" } }

有关可以在 IAM 策略中分配的所有权限的列表,请参阅可以在 IAM 策略或 AWS Secrets Manager 密钥策略中使用的操作、资源和上下文键

限制对特定操作的访问

如果要授予有限的权限而不是全部权限,您可以创建一个策略,以便在 IAM 权限策略的 Action 元素中列出要允许的各个权限。正如以下示例中所示,您可以使用通配符 (*) 仅授予 Describe*Get*List* 权限,这实际上提供密钥的只读访问权限。

通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

选择创建策略并添加以下代码:

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "secretsmanager:Describe*", "secretsmanager:Get*", "secretsmanager:List*" ], "Resource": "*" } }

有关可以在 IAM 策略中分配的所有权限的列表,请参阅可以在 IAM 策略或 AWS Secrets Manager 密钥策略中使用的操作、资源和上下文键

限制对特定密钥的访问

除了限制对特定资源的访问,还可以限制对您的账户下特定密钥的访问。前面示例中的 Resource 元素均指定通配符(“*”),这表示“该操作可以与互的任何资源”。不过,您可以将“*”替换为您要允许访问的特定密钥的 ARN。

例 示例:按名称授予对于单个密钥的权限

以下策略的第一个语句授予用户对账户中所有密钥的元数据的读取访问权限。不过,第二个语句允许用户仅对按名称指定的单个密钥(或者以字符串“another_secret_name-”开头并且后跟恰好 6 个字符的任何密钥)执行任何 Secrets Manager 操作:

通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

选择创建策略并添加以下代码:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:DescribeSecret", "secretsmanager:List*" ], "Resource": "*" }, { "Effect": "Allow", "Action": "secretsmanager:*", "Resource": [ "arn:aws:secretsmanager:<region>:<account-id-number>:secret:a_specific_secret_name-a1b2c3", "arn:aws:secretsmanager:<region>:<account-id-number>:secret:another_secret_name-??????" ] } ] }

通过将“??????”作为通配符以匹配 Secrets Manager 分配的 6 个随机字符,可以避免在使用“*”通配符时出现的问题。如果使用“another_secret_name-*”语法,Secrets Manager 不仅匹配具有 6 个随机字符的预期密钥,而且还匹配“another_secret_name-<anything-here>a1b2c3”。使用“??????”语法使您能够安全地向尚不存在的密钥授予权限。发生这种情况是因为,您无法预测这 6 个随机字符,而只能预测 ARN 的所有其他部分。但要注意,如果删除密钥并以相同名称重新创建,即使 6 个字符发生变化,用户也会自动获得新密钥的权限。

您从 Secrets Manager 控制台(在密钥的详细信息页面上)或者通过调用 List* API 来获得密钥的 ARN。将该策略应用到的用户或组只能对示例中的 ARN 标识的两个密钥执行任何操作 ("secretsmanager:*")。

如果您不关心拥有密钥的区域或账户,您必须为 ARN 的区域和账户 ID 号字段指定通配符 *,而不是空白字段。

有关各种资源的 ARN 的更多信息,请参阅您可以在 IAM 策略或密钥策略中引用的资源

使用特定的暂存标签限制对密钥的访问

在所有上述示例中,您只通过名称或 ARN 显式标注操作、资源和委托人。您还可以优化访问以仅包含元数据包含特定标签键和值的密钥,或者包含具有特定标签的密钥。

示例:为包含具有特定标签键和值的元数据的密钥授予权限

在附加到用户、组或角色时,以下策略允许用户对当前账户中的任何密钥使用 DescribeSecret,该密钥具有包含带有键“ServerName”和值“ServerABC”的标签的元数据。

通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

选择创建策略并添加以下代码:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:DescribeSecret", "Resource": "*", "Condition": { "StringEquals": { "secretsmanager:ResourceTag/ServerName": "ServerABC" } } } ] }

示例:为具有特定暂存标签的密钥版本授予权限

在附加到用户、组或角色时,以下策略允许用户对名称以 Prod 开头的任何密钥(仅附加了 AWSCURRENT 暂存标签的版本)使用 GetSecretValue

通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

选择创建策略并添加以下代码:

{ "Policy": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecret", "Resource": "arn:aws:secretsmanager:*:*:secret:Prod*", "Condition": { "ForAnyValue:StringEquals": { "secretsmanager:VersionStage": "AWSCURRENT" } } } ] } }

由于一个密钥版本可以附加多个暂存标签,因此,您需要使用 IAM 策略语言的集合运算符比较这些标签。在前面的示例中,ForAnyValue:StringLike 声明如果附加到正在评估的版本的任一暂存标签与字符串 AWSCURRENT 匹配,则该语句匹配并应用 Effect

为轮换函数授予权限以访问单独的主密钥

在使用控制台或 AWS CLI 命令通过提供的 AWS Serverless Application Repository 模板创建 Lambda 轮换函数时,附带到函数角色的默认策略控制函数操作。默认情况下,该策略 为将该 Lambda 函数配置为密钥轮换函数的密钥授予访问权限。

如果密钥中的凭证不允许用户在受保护数据库或服务上更改其密码的权限,则您需要在轮换期间使用一组具有提升权限的单独凭证(超级用户)以更改该密钥。Secrets Manager 将超级用户凭证存储在单独的“主”密钥中。然后,在您轮换密钥时,Lambda 轮换函数使用主凭证登录到数据库或服务以更改或更新密钥凭证。如果您选择实施该策略,则必须在附加到该函数的角色策略中添加一个额外的语句,以便授予该主密钥以及主密钥的访问权限。

如果使用控制台通过具有主密钥的策略配置轮换,您可以在为密钥配置轮换时选择主密钥。

重要

您必须具有主密钥的 GetSecretValue 权限才能在控制台中选择该密钥。

在控制台中配置轮换后,您必须手动执行以下步骤,以便为 Lambda 函数授予主密钥的访问权限。

为 Lambda 轮换函数授予对主密钥的访问权限

请按照以下选项卡之一中的步骤进行操作:

Using the console
  1. 在启用轮换的情况下完成密钥创建或编辑密钥以启用轮换时,控制台将显示类似于以下内容的消息:

    Your secret MyNewSecret has been successfully stored [and secret rotation is enabled]. To finish configuring rotation, you need to grant the role MyLambdaFunctionRole permission to retrieve the secret <ARN of master secret>.
  2. 将消息中的主密钥 ARN 复制到剪贴板中。您将在后面的步骤中用到它。

  3. 上述消息中的角色名称提供了指向 IAM 控制台的链接,并为您直接导航到该角色。请选择该链接。

  4. 权限选项卡上,可能具有一个或两个内联策略。Secrets Manager 将一个内联策略命名为 SecretsManager<Name of Template>0。模板包含在轮换函数和受保护服务均在 VPC 中运行并且无法从 Internet 直接访问时所需的 EC2 相关权限。另一个名为 SecretsManager<Name of Template>1 的模板包含允许轮换函数调用 Secrets Manager 操作的权限。选择策略左侧的展开箭头并检查权限以打开策略(以“1”结尾的策略)。

  5. 选择编辑策略,然后执行以下某个选项卡中的步骤:

    Using the IAM Visual EditorUsing the JSON editor
    Using the IAM Visual Editor

    可视化编辑器选项卡上,选择添加额外的权限,然后设置以下值:

    • 对于服务,请选择 Secrets Manager

    • 对于操作,请选择 GetSecretValue

    • 对于资源,请选择密钥 资源类型条目旁边的添加 ARN

    • 添加 ARN 对话框中,粘贴您以前复制的主密钥的 ARN。

    Using the JSON editor

    JSON 选项卡上,检查脚本顶部。在第 3 行 ("Statement": [) 和第 4 行 ({) 之间,输入以下行:

    { "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws-cn:secretsmanager:region:123456789012:secret:MyDatabaseMasterSecret", "Effect": "Allow" },
  6. 在编辑完策略后,选择查看策略,然后选择保存更改

  7. 您现在可以关闭 IAM 控制台并返回到 Secrets Manager 控制台。

注意

有关可与 Secrets Manager 配合使用的操作、资源和上下文键的完整列表,请参阅适用于 AWS Secrets Manager 的操作、资源和条件键