Gestione dei segreti utilizzando l'API Secrets Manager e la AWS SDK for PHP versione 3 - AWS SDK for PHP

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Gestione dei segreti utilizzando l'API Secrets Manager e la AWS SDK for PHP versione 3

AWS Secrets Manager archivia e gestisce segreti condivisi, ad esempio password, chiavi API e credenziali del database. Con il servizio Secrets Manager, gli sviluppatori possono sostituire le credenziali codificate nel codice distribuito con una chiamata incorporata a Secrets Manager.

Secrets Manager supporta nativamente la rotazione automatica pianificata delle credenziali per i database Amazon Relational Database Service (Amazon RDS), aumentando la sicurezza delle applicazioni. Secrets Manager può anche ruotare senza problemi i segreti di altri database e servizi di terze parti utilizzando per AWS Lambda implementare dettagli specifici del servizio.

Gli esempi seguenti mostrano come:

Tutto il codice di esempio per il AWS SDK for PHP è disponibile qui GitHub.

Credenziali

Prima di eseguire il codice di esempio, configura AWS le tue credenziali, come descritto inCredenziali. Quindi importareAWS SDK for PHP, come descritto inUtilizzo di base.

Crea un segreto in Secrets Manager

Per creare un segreto in Secrets Manager, usa l'CreateSecretoperazione.

In questo esempio, un nome utente e una password vengono memorizzati come una stringa JSON.

Importazioni

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

Codice di esempio

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

Recupera un segreto da Secrets Manager

Per recuperare il valore di un segreto archiviato in Secrets Manager, usa l'GetSecretValueoperazione.

Nell'esempio seguente, secret è una stringa che contiene il valore memorizzato. Se il valore per username è <<USERNAME>> e il valore per password è<<PASSWORD>>, l'output di secret è:

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

Da utilizzare json_decode($secret, true) per accedere ai valori dell'array.

Importazioni

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

Codice di esempio

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

Elenca i segreti archiviati in Secrets Manager

Ottieni un elenco di tutti i segreti archiviati da Secrets Manager utilizzando l'ListSecretsoperazione.

Importazioni

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

Codice di esempio

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

Recupera dettagli su un segreto

I segreti archiviati contengono metadati sulle regole di rotazione, la data dell'ultimo accesso o modifica, i tag creati dall'utente e l'Amazon Resource Name (ARN). Per ottenere i dettagli di un segreto specificato archiviato in Secrets Manager, usa l'DescribeSecretoperazione.

Importazioni

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

Codice di esempio

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

Come aggiornare il valore del segreto

Per memorizzare un nuovo valore segreto crittografato in Secrets Manager, utilizzare l'PutSecretValueoperazione.

Viene creata una nuova versione del segreto. Se una versione del segreto esiste già, aggiungi il parametro VersionStages con il valore in AWSCURRENT per garantire che il nuovo valore viene utilizzato quando viene recuperato.

Importazioni

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

Codice di esempio

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

Ruota il valore su un segreto esistente in Secrets Manager

Per ruotare il valore di un segreto esistente memorizzato in Secrets Manager, utilizzate una funzione di rotazione Lambda e l'RotateSecretoperazione.

Prima di iniziare, crea una funzione Lambda per ruotare il tuo segreto. Il AWSCode Sample Catalog contiene attualmente diversi esempi di codice Lambda per la rotazione delle credenziali del database Amazon RDS.

Nota

Per ulteriori informazioni sulla rotazione dei segreti, consulta Rotating Your AWS Secrets Manager Secrets nella Guida per l'AWS Secrets Managerutente.

Dopo aver configurato la funzione Lambda, configura una nuova rotazione segreta.

Importazioni

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

Codice di esempio

$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 è configurata una rotazione, è possibile implementare una rotazione utilizzando l'RotateSecretoperazione.

Importazioni

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

Codice di esempio

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

Eliminare un segreto da Secrets Manager

Per rimuovere un segreto specificato da Secrets Manager, utilizzare l'DeleteSecretoperazione. Per evitare l'eliminazione accidentale di un segreto, al segreto viene aggiunto automaticamente un DeletionDate timbro che specifica una finestra di tempo di ripristino in cui è possibile annullare l'eliminazione. Se non si specifica l'ora per la finestra di ripristino, il periodo di tempo predefinito è di 30 giorni.

Importazioni

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

Codice di esempio

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

Gli AWS SDK for PHP esempi utilizzano le seguenti operazioni REST dall'AWS Secrets ManagerAPI Reference:

Per ulteriori informazioni su come utilizzare AWS Secrets Manager, consulta la Guida per l'utente di AWS Secrets Manager.