You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过RDS API将PHP创建的AWS KMS密钥授权给其他AWS账号?

如何通过PHP的AWS KMS Client将KMS密钥授权给指定AWS账号ID的用户?

问题背景

我已经用PHP的KmsClient创建了AWS KMS密钥,代码如下:

new KmsClient([
    'credentials' => [
        'key' => $awsKey,
        'secret' => $awsSecret,
    ],
    'version' => 'latest',
    'region' => 'us-east-1',
]);

现在需要把该密钥授权给指定AWS账号ID的用户,但尝试用RDS API操作均未成功,也没找到相关GitHub示例,该怎么实现?

解决方案

KMS密钥的权限管理是通过KMS自身的API完成的,和RDS API无关。你需要使用KMS的putKeyPolicy方法(或创建密钥时直接指定策略)来为目标AWS账号添加授权。

方法1:创建密钥时直接指定授权策略

在调用createKey创建KMS密钥时,直接传入包含目标账号权限的策略:

$kmsClient = new KmsClient([
    'credentials' => [
        'key' => $awsKey,
        'secret' => $awsSecret,
    ],
    'version' => 'latest',
    'region' => 'us-east-1',
]);

// 目标AWS账号ID
$targetAccountId = '123456789012';

// 构建授权策略
$policy = json_encode([
    'Version' => '2012-10-17',
    'Statement' => [
        [
            'Effect' => 'Allow',
            'Principal' => [
                'AWS' => "arn:aws:iam::$targetAccountId:root"
            ],
            'Action' => [
                'kms:Encrypt',
                'kms:Decrypt',
                'kms:ReEncrypt*',
                'kms:GenerateDataKey*',
                'kms:DescribeKey'
            ],
            'Resource' => '*'
        ]
    ]
]);

// 创建带授权策略的KMS密钥
$result = $kmsClient->createKey([
    'Policy' => $policy,
    // 可添加其他参数,比如Description、KeyUsage等
]);

$keyId = $result['KeyMetadata']['KeyId'];

方法2:为已存在的密钥添加授权

如果密钥已经创建好,调用putKeyPolicy方法更新密钥的权限策略:

$kmsClient = new KmsClient([
    'credentials' => [
        'key' => $awsKey,
        'secret' => $awsSecret,
    ],
    'version' => 'latest',
    'region' => 'us-east-1',
]);

$targetAccountId = '123456789012';
$existingKeyId = '你的KMS密钥ID或ARN';

// 构建包含目标账号权限的完整策略(注意:会覆盖原有策略,若需保留原有权限需合并)
$policy = json_encode([
    'Version' => '2012-10-17',
    'Statement' => [
        // 保留原有管理员权限(比如创建密钥的账号)
        [
            'Effect' => 'Allow',
            'Principal' => [
                'AWS' => "arn:aws:iam::你的账号ID:root"
            ],
            'Action' => 'kms:*',
            'Resource' => '*'
        ],
        // 新增目标账号的授权
        [
            'Effect' => 'Allow',
            'Principal' => [
                'AWS' => "arn:aws:iam::$targetAccountId:root"
            ],
            'Action' => [
                'kms:Encrypt',
                'kms:Decrypt',
                'kms:ReEncrypt*',
                'kms:GenerateDataKey*',
                'kms:DescribeKey'
            ],
            'Resource' => '*'
        ]
    ]
]);

// 更新密钥策略
$kmsClient->putKeyPolicy([
    'KeyId' => $existingKeyId,
    'PolicyName' => 'default', // KMS密钥的默认策略名称为default
    'Policy' => $policy
]);

关键说明

  • Principal格式:指定目标账号时,使用arn:aws:iam::账号ID:root表示该账号下的所有IAM用户/角色都能获得对应权限(若需限制到具体用户,可替换为该用户的ARN)。
  • 权限范围:根据实际需求调整Action数组中的权限,比如只给加密权限就只保留kms:Encrypt。
  • 策略覆盖:调用putKeyPolicy会完全替换原有密钥策略,若需保留原有权限,必须将原有策略内容合并到新的JSON中。
  • IAM权限要求:执行该操作的IAM用户必须拥有kms:PutKeyPolicy(或kms:CreateKey)的权限。

内容的提问来源于stack exchange,提问作者Suresh Hemal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:30:41