Gerenciando segredos usando a API Secrets Manager e o AWS SDK for PHP versão 3 - AWS SDK for PHP

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Gerenciando segredos usando a API Secrets Manager e o AWS SDK for PHP versão 3

O AWS Secrets Manager armazena e gerencia segredos compartilhados, como senhas, chaves de API e credenciais de banco de dados. Com o serviço Secrets Manager, os desenvolvedores podem substituir as credenciais incorporadas no código implantado por uma chamada para o Secrets Manager.

O Secrets Manager oferece suporte nativo à rotação automática de credenciais para bancos de dados do Amazon Relational Database Service (Amazon RDS), aumentando a segurança do aplicativo. O Secrets Manager também pode alternar perfeitamente segredos para outros bancos de dados e serviços de terceiros usando AWS Lambda para implementação de detalhes específicos do serviço.

Os exemplos a seguir mostram como:

O código de exemplo completo do AWS SDK for PHP está disponível aqui no GitHub.

Credenciais

Antes de executar o código de exemplo, configure suas credenciais da AWS, conforme descrito em Credenciais. Em seguida, importe o AWS SDK for PHP, conforme descrito em Uso básico.

Crie um segredo no Secrets Manager

Para criar um segredo no Secrets Manager, use a operação CreateSecret.

Neste exemplo, um nome de usuário e uma senha são armazenados como uma string JSON.

Importações

require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;

Código de exemplo

$client = new SecretsManagerClient([ 'profile' => 'default', 'version' => '2017-10-17', 'region' => 'us-west-2' ]); $secretName = 'MySecretName'; $secret = json_encode([ "username" => getenv("SMDEMO_USERNAME"), "password" => getenv("SMDEMO_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"; }

Recuperar um segredo do Secrets Manager

Para recuperar o valor de um segredo armazenado no Secrets Manager, use a operação GetSecretValue.

Neste exemplo, secret é uma string que contém o valor armazenado. Se o valor para username é <<USERNAME>>, e o valor para password é <<PASSWORD>>, a saída de secret é:

{"username":"<<USERNAME>>","password":"<<PASSWORD>>"}

Use json_decode($secret, true) para acessar os valores da matriz.

Importações

require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;

Código de exemplo

$client = new SecretsManagerClient([ 'profile' => 'default', 'version' => '2017-10-17', 'region' => 'us-east-1', ]); $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']); } print $secret; $secretArray = json_decode($secret, true); $username = $secretArray['username']; $password = $secretArray['password']; // Your code goes here;

Listar segredos armazenados no Secrets Manager

Obtenha uma lista de todos os segredos que estão armazenados no Secrets Manager usando a operação ListSecrets.

Importações

require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;

Código de exemplo

$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"; }

Recuperar os detalhes sobre um segredo

Os segredos armazenados contêm metadados sobre as regras de rotação, quando foi o último acesso ou alteração, as tags criadas pelo usuário, e o nome de recurso da Amazon (ARN). Para obter os detalhes de um segredo especificado armazenado no Secrets Manager, use a operação DescribeSecret.

Importações

require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;

Código de exemplo

$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"; }

Atualizar o valor do segredo

Para armazenar um novo valor do segredo criptografado no Secrets Manager, use a operação PutSecretValue.

Isso cria uma nova versão do segredo. Se uma versão do segredo já existir, adicione o parâmetro VersionStages com o valor em AWSCURRENT para garantir que o novo valor seja usado ao recuperar o valor.

Importações

require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;

Código de exemplo

$client = new SecretsManagerClient([ 'profile' => 'default', 'version' => '2017-10-17', 'region' => 'us-west-2' ]); $secretName = 'MySecretName'; $secret = json_encode([ "username" => getenv("SMDEMO_USERNAME"), "password" => getenv("SMDEMO_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"; }

Alternar o valor de um segredo existente no Secrets Manager

Para alternar o valor de um segredo existente armazenado no Secrets Manager, use uma função de rotação do Lambda e a operação RotateSecret.

Antes de começar, crie uma função do Lambda para alternar o segredo. O Catálogo de exemplos de código da AWS atualmente contém vários exemplos de código do Lambda para alternar as credenciais de banco de dados do Amazon RDS.

nota

Para obter mais informações sobre a alternância de segredos, consulte Alternar seus segredos do AWS Secrets Manager no Guia do usuário do AWS Secrets Manager.

Depois de configurar a função do Lambda, configure uma nova rotação de segredos.

Importações

require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;

Código de exemplo

$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"; }

Quando uma rotação for configurada, você poderá implementar uma rotação usando a operação RotateSecret.

Importações

require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;

Código de exemplo

$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"; }

Excluir um segredo do Secrets Manager

Para remover um segredo especificado do Secrets Manager, use a operação DeleteSecret. Para evitar a exclusão de um segredo acidentalmente, um stamp DeletionDate é adicionado automaticamente ao segredo que especifica uma janela de tempo de recuperação na qual você poderá reverter a exclusão. Se não for especificado o tempo para a janela de recuperação, o tempo padrão é de 30 dias.

Importações

require 'vendor/autoload.php'; use Aws\SecretsManager\SecretsManagerClient; use Aws\Exception\AwsException;

Código de exemplo

$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"; }

Os exemplos de AWS SDK for PHP usam as seguintes operações REST da Referência da API do AWS Secrets Manager:

Para obter mais informações sobre o uso do AWS Secrets Manager, consulte o Guia do usuário do AWS Secrets Manager.