适用于 PHP 的 AWS 开发工具包
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 Secrets Manager API 和AWS SDK for PHP版本 3 管理密钥

AWS Secrets Manager 存储和管理共享密钥,如密码、API 密钥和数据库凭证。借助 Secrets Manager 服务,开发人员可以将已部署代码中的硬编码的凭证替换为对 Secrets Manager 的嵌入式调用。

Secrets Manager 原生支持对 Amazon Relational Database Service (Amazon RDS) 数据库的自动计划凭证轮换,从而增强应用程序安全性。Secrets Manager 还可以使用 AWS Lambda 无缝地轮换其他数据库和第三方服务的密钥,以实现特定于服务的详细信息。

以下示例演示如何:

GitHub 上的此处提供了AWS SDK for PHP版本 3 的所有示例代码。

凭证

在运行示例代码之前,您需要配置 AWS 凭证,如适用于 PHP 的 AWS 开发工具包版本 3 的凭证中所述。然后导入AWS SDK for PHP,如适用于 PHP 的 AWS 开发工具包版本 3 的基本使用模式中所述。

在 Secrets Manager 中创建密钥

要在 Secrets Manager 中创建密钥,请使用 CreateSecret 操作。

在此示例中,用户名和密码将存储为 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 中的密钥的值,请使用 GetSecretValue 操作。

在此示例中,密钥是一个包含存储的值的字符串。如果针对之前创建的密钥进行调用,此示例将输出 [{\"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 中的密钥

使用 ListSecrets 操作获取 Secrets Manager 存储的所有密钥的列表。

导入

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 中的指定密钥的详细信息,请使用 DescribeSecret 操作。

导入

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 中,请使用 PutSecretValue 操作。

这将创建密钥的一个新版本。如果密钥的某个版本已存在,则在 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 轮换函数和 RotateSecret 操作。

在开始之前,请创建一个 Lambda 函数来轮换您的密钥。AWS 代码示例目录目前包含用于轮换 Amazon RDS 数据库凭证的多个 Lambda 代码示例。

注意

有关轮换密钥的更多信息,请参阅 AWS Secrets Manager User Guide 中的轮换您的 AWS 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 中删除指定密钥,请使用 DeleteSecret 操作。要防止意外删除密钥,将自动为密钥添加 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"; }

AWS SDK for PHP示例通过 AWS Secrets Manager API Reference 使用以下 REST 操作:

有关使用 AWS Secrets Manager 的更多信息,请参阅 AWS Secrets Manager 用户指南