使用密钥管理器 API 和Amazon适 SDK for PHP 发工具包版本 3 - Amazon适用于 PHP 的开发工具包
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用密钥管理器 API 和Amazon适 SDK for PHP 发工具包版本 3

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

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

以下示例演示如何:

的所有示例代码Amazon适用 SDK for PHP 开发工具包版本 3GitHub 上的位置

Credentials

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

在密钥管理器中创建密钥

若要在 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"; }

从密钥管理器检索密钥

要检索存储在密钥管理器中的密钥的值,请使用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;

列出存储在密钥管理器中的密钥

获取由密钥管理器存储的所有密钥的列出,使用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) 的元数据。要获取存储在密钥管理器中的指定密钥的详细信息,请使用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

要轮换存储在密钥管理器中的现有密钥的值,请使用 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"; }

从密钥管理器中删除密钥

要从密钥管理器中删除指定密钥,请使用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 用户指南