如何通过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
相关产品推荐
相关产品推荐

