本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用秘密管理器 API 和Amazon SDK for PHP版本 3
Amazon Secrets Manager 存储和管理共享密钥,如密码、API 密钥和数据库凭证。借助 Secrets Manager 服务,开发人员可以将已部署代码中的硬编码的凭证替换为对 Secrets Manager 的嵌入式调用。
Secrets Manager 原生支持 Amazon Relation Database Service (Amazon RDS) 数据库的自动计划凭证轮换,从而提高应用程序安全性。Secrets Manager 还可以为其他数据库和第三方服务无缝轮换密钥Amazon Lambda实施特定于服务的详细信息。
以下示例演示如何:
-
使用 CreateSecret 创建密钥。
-
使用 GetSecretValue 检索密钥。
-
使用 ListSecrets 列出 Secrets Manager 存储的所有密钥。
-
使用 DescribeSecret 获取有关指定密钥的详细信息。
-
使用 PutSecretValue 更新指定密钥。
-
使用 RotateSecret 设置密钥轮换。
-
使用 DeleteSecret 标记密钥以进行删除。
Amazon SDK for PHPGitHub 上提供了
凭证
运行示例代码之前,请配置您的Amazon凭证,如所述设置 凭证. 然后导入Amazon SDK for PHP,如所述基本用法.
在 Secrets Manager 中创建密钥
要在 Secrets Manager 中创建密钥,请使用CreateSecretoperation.
在此示例中,用户名和密码将存储为 JSON 字符串。
导入
require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;
示例代码
$client = new SecretsManagerClient([ 'profile' => 'default', 'version' => '2017-10-17', 'region' => 'us-west-2' ]); $secretName = '<<{{MySecretName}}>>'; $secret = '{"username":"<<USERNAME>>","password":"<<PASSWORD>>"}'; $description = '<<Description>>'; try { $result = $client->createSecret([ 'Description' => $description, 'Name' => $secretName, 'SecretString' => $secret, ]); var_dump($result); } catch (AwsException $e) { // output error message if fails echo $e->getMessage(); echo "\n"; }
从 Secrets Manager 中检索密钥
要检索存储在 Secrets Manager 中的密钥的值,请使用GetSecretValueoperation.
在此示例中,密钥是一个包含存储的值的字符串。如果针对之前创建的密钥进行调用,此示例将输出 [{\"username\":\"<<USERNAME>>\",\"password\":\"<<PASSWORD>>\"}]
。使用 json.loads
访问索引值。
导入
require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;
示例代码
$client = new SecretsManagerClient([ 'profile' => 'default', 'version' => '2017-10-17', 'region' => '<<{{MyRegionName}}>>', ]); $secretName = '<<{{MySecretName}}>>'; try { $result = $client->getSecretValue([ 'SecretId' => $secretName, ]); } catch (AwsException $e) { $error = $e->getAwsErrorCode(); if ($error == 'DecryptionFailureException') { // Secrets Manager can't decrypt the protected secret text using the provided AWS KMS key. // Handle the exception here, and/or rethrow as needed. throw $e; } if ($error == 'InternalServiceErrorException') { // An error occurred on the server side. // Handle the exception here, and/or rethrow as needed. throw $e; } if ($error == 'InvalidParameterException') { // You provided an invalid value for a parameter. // Handle the exception here, and/or rethrow as needed. throw $e; } if ($error == 'InvalidRequestException') { // You provided a parameter value that is not valid for the current state of the resource. // Handle the exception here, and/or rethrow as needed. throw $e; } if ($error == 'ResourceNotFoundException') { // We can't find the resource that you asked for. // Handle the exception here, and/or rethrow as needed. throw $e; } } // Decrypts secret using the associated KMS CMK. // Depending on whether the secret is a string or binary, one of these fields will be populated. if (isset($result['SecretString'])) { $secret = $result['SecretString']; } else { $secret = base64_decode($result['SecretBinary']); } // Your code goes here;
列出存储在 Secrets Manager 中的密钥
通过使用密钥管理器获取由 Secrets Manager 存储的所有密钥的列表。ListSecretsoperation.
导入
require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;
示例代码
$client = new SecretsManagerClient([ 'profile' => 'default', 'version' => '2017-10-17', 'region' => 'us-west-2' ]); try { $result = $client->listSecrets([ ]); var_dump($result); } catch (AwsException $e) { // output error message if fails echo $e->getMessage(); echo "\n"; }
检索有关密钥的详细信息
存储的密钥包含有关轮换规则、上次访问或更改密钥、用户创建的标签和 Amazon 资源名称 (ARN) 的元数据。要获取存储在 Secrets Manager 中的指定密钥的详细信息,请使用DescribeSecretoperation.
导入
require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;
示例代码
$client = new SecretsManagerClient([ 'profile' => 'default', 'version' => '2017-10-17', 'region' => 'us-west-2' ]); $secretName = '<<{{MySecretName}}>>'; try { $result = $client->describeSecret([ 'SecretId' => $secretName, ]); var_dump($result); } catch (AwsException $e) { // output error message if fails echo $e->getMessage(); echo "\n"; }
更新密钥值
要在 Secrets Manager 中存储新的加密密值,请使用PutSecretValueoperation.
这将创建密钥的一个新版本。如果密钥的某个版本已存在,则在 AWSCURRENT
中添加带该值的 VersionStages
参数,以确保在检索该值时使用新值。
导入
require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;
示例代码
$client = new SecretsManagerClient([ 'profile' => 'default', 'version' => '2017-10-17', 'region' => 'us-west-2' ]); $secretName = '<<{{MySecretName}}>>'; $secret = '{"username":"<<USERNAME>>","password":"<<PASSWORD>>"}'; try { $result = $client->putSecretValue([ 'SecretId' => $secretName, 'SecretString' => $secret, ]); var_dump($result); } catch (AwsException $e) { // output error message if fails echo $e->getMessage(); echo "\n"; }
将值轮换为 Secrets Manager 中的现有密钥
要轮换存储在 Secrets Manager 中的现有密钥的值,请使用 Lambda 轮换函数和RotateSecretoperation.
开始之前,请创建一个 Lambda 函数来轮换您的密钥。这些区域有:Amazon代码示例目录目前包含用于轮换 Amazon RDS 数据库凭证的多个 Lambda 代码示例。
有关轮换密钥的更多信息,请参阅轮换您的Amazon Secrets ManagerSecrets中的Amazon Secrets Manager用户指南。
设置您的 Lambda 函数后,请配置一个新的密钥轮换。
导入
require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;
示例代码
$client = new SecretsManagerClient([ 'profile' => 'default', 'version' => '2017-10-17', 'region' => 'us-west-2' ]); $secretName = '<<{{MySecretName}}>>'; $lambda_ARN = 'arn:aws:lambda:us-west-2:123456789012:function:MyTestDatabaseRotationLambda'; $rules = ['AutomaticallyAfterDays' => 30]; try { $result = $client->rotateSecret([ 'RotationLambdaARN' => $lambda_ARN, 'RotationRules' => $rules, 'SecretId' => $secretName, ]); var_dump($result); } catch (AwsException $e) { // output error message if fails echo $e->getMessage(); echo "\n"; }
配置轮换时,您可以使用 RotateSecret 操作实施轮换。
导入
require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;
示例代码
$client = new SecretsManagerClient([ 'profile' => 'default', 'version' => '2017-10-17', 'region' => 'us-west-2' ]); $secretName = '<<{{MySecretName}}>>'; try { $result = $client->rotateSecret([ 'SecretId' => $secretName, ]); var_dump($result); } catch (AwsException $e) { // output error message if fails echo $e->getMessage(); echo "\n"; }
从 Secrets Manager 中删除密钥
要从 Secrets Manager 中删除指定密钥,请使用DeleteSecretoperation. 为了防止意外删除秘密, DeletionDate 将自动为密钥添加戳,用于指定您可恢复删除的恢复时间范围。如果未指定恢复时间窗口的范围,则默认时间范围为 30 天。
导入
require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;
示例代码
$client = new SecretsManagerClient([ 'profile' => 'default', 'version' => '2017-10-17', 'region' => 'us-west-2' ]); $secretName = '<<{{MySecretName}}>>'; try { $result = $client->deleteSecret([ 'SecretId' => $secretName, ]); var_dump($result); } catch (AwsException $e) { // output error message if fails echo $e->getMessage(); echo "\n"; }
相关信息
这些区域有:Amazon SDK for PHP示例通过使用以下 REST 操作:Amazon Secrets ManagerAPI 参考:
有关使用 Amazon Secrets Manager 的更多信息,请参阅 Amazon Secrets Manager 用户指南。