Administración de secretos mediante la API Secrets Manager y la versión 3 de AWS SDK for PHP - AWS SDK for PHP

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Administración de secretos mediante la API Secrets Manager y la versión 3 de AWS SDK for PHP

AWS Secrets Manager almacena y administra secretos compartidos como, por ejemplo, contraseñas, claves de API y credenciales de bases de datos. Con el servicio Secrets Manager, los desarrolladores pueden sustituir credenciales con codificación rígida en el código implementado por una llamada integrada a Secrets Manager.

Secrets Manager admite de forma nativa la rotación automática y programada de credenciales para bases de datos de Amazon Relational Database Service (Amazon RDS), lo que aumenta la seguridad de las aplicaciones. Secrets Manager también puede rotar sin problemas los secretos de otras bases de datos y servicios de terceros mediante AWS Lambda para implementar detalles específicos del servicio.

Los siguientes ejemplos muestran cómo:

Todo el código de ejemplo de AWS SDK for PHP está disponible aquí en GitHub.

Credentials

Antes de ejecutar el código de ejemplo, configure sus credenciales de AWS, como se indica en Credentials. A continuación, importe AWS SDK for PHP, como se indica en Uso básico.

Crear un secreto en Secrets Manager

Para crear un secreto en Secrets Manager, utilice la operación CreateSecret.

En este ejemplo, un nombre de usuario y una contraseña se almacenan en una cadena JSON.

Importaciones

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

Código de muestra

$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 un secreto de Secrets Manager

Para recuperar el valor de un secreto almacenado en Secrets Manager, utilice la operación GetSecretValue.

En este ejemplo, secret es una cadena que contiene el valor almacenado. Si el valor de username es <<USERNAME>> y el valor de password es <<PASSWORD>>, la salida de secret es:

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

Utilice json_decode($secret, true) para acceder a los valores de la matriz.

Importaciones

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

Código de muestra

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

Mostrar los secretos almacenados en Secrets Manager

Puede obtener una lista de todos los secretos almacenados en Secrets Manager mediante la operación ListSecrets.

Importaciones

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

Código de muestra

$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 los detalles de un secreto

Los secretos almacenados contienen metadatos sobre las reglas de rotación, la fecha en que se modificaron o se tuvo acceso a ellos por última vez, las etiquetas creadas por el usuario y el nombre de recurso de Amazon (ARN). Para obtener los detalles de un secreto determinado almacenado en Secrets Manager, utilice la operación DescribeSecret.

Importaciones

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

Código de muestra

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

Actualización del valor del secreto

Para almacenar el valor de un secreto nuevo cifrado en Secrets Manager, utilice la operación PutSecretValue.

De esta forma, se crea una versión nueva del secreto. Si ya existe una versión del secreto, añada el parámetro VersionStages con el valor existente en AWSCURRENT para asegurarse de que se utiliza el valor nuevo al recuperar el valor.

Importaciones

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

Código de muestra

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

Rotar el valor de un secreto existente en Secrets Manager

Para rotar el valor de un secreto existente almacenado en Secrets Manager, utilice una función de rotación de Lambda y la operación RotateSecret.

Antes de comenzar, cree una función de Lambda para rotar el secreto. El catálogo de ejemplos de código de AWS contiene varios ejemplos de código de Lambda para la rotación de credenciales de base de datos de Amazon RDS.

nota

Para obtener más información acerca de la rotación de secretos, consulte Rotación de sus secretos de AWS Secrets Manager en la Guía del usuario de AWS Secrets Manager.

Después de configurar la función de Lambda, configure una rotación de secretos nueva.

Importaciones

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

Código de muestra

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

Cuando configure una rotación, puede implementar una rotación utilizando la operación RotateSecret.

Importaciones

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

Código de muestra

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

Eliminar un secreto de Secrets Manager

Para eliminar un secreto determinado de Secrets Manager, utilice la operación DeleteSecret. Para evitar la eliminación accidental de un secreto, se añade automáticamente una marca DeletionDate al secreto que especifica un intervalo de tiempo de recuperación en el que puede deshacer la eliminación. Si no se especifica la fecha para el intervalo de recuperación, el periodo de tiempo predeterminado es de 30 días.

Importaciones

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

Código de muestra

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

Los ejemplos de AWS SDK for PHP utilizan las siguientes operaciones REST de la Referecia de la API de AWS Secrets Manager:

Para obtener más información acerca de cómo usar AWS Secrets Manager, consulte la Guía del usuario de AWS Secrets Manager.