Secrets Manager API 및 AWS SDK for PHP 버전 3을 사용한 암호 관리 - AWS SDK for PHP

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

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를 사용하여 다른 데이터베이스 및 타사 서비스에 대한 보안 정보를 원활하게 교체할 수 있습니다.

다음 예제에서는 다음과 같은 작업을 하는 방법을 보여줍니다.

  • CreateSecret을 사용해 암호를 생성합니다.

  • GetSecretValue를 사용해 암호를 가져옵니다.

  • ListSecrets를 사용해 Secrets Manager에서 저장된 암호를 모두 나열합니다.

  • DescribeSecret을 사용해 특정 암호에 대한 세부 정보를 가져옵니다.

  • PutSecretValue를 사용해 특정 암호를 업데이트합니다.

  • RotateSecret을 사용해 암호 교체를 설정합니다.

  • DeleteSecret을 사용해 삭제할 암호를 표시합니다.

AWS SDK for PHP에 대한 모든 예제 코드는 GitHub에서 사용할 수 있습니다.

보안 인증

예제 코드를 실행하기 전에 보안 인증에 설명된 대로 AWS 보안 인증을 구성합니다. 그 다음 기본 사용법에 설명된 대로 AWS SDK for PHP를 가져옵니다.

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

Secrets Manager에서 문자열 보안 암호 검색

Secrets Manager에 저장된 암호 값을 가져올 때는 GetSecretValue 작업을 사용합니다.

이번 예제에서 secret는 저장된 값이 포함된 문자열입니다. username의 값이 <<USERNAME>>이고 <<PASSWORD>>의 값이 password인 경우 secret 출력은 다음과 같습니다.

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

배열 값에 액세스하는 데 json_decode($secret, true)를 사용합니다.

가져오기

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

샘플 코드

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

Secrets Manager에 저장된 보안 암호 생성

Secrets Manager에서 저장된 암호 목록을 모두 나열할 때는 ListSecrets 작업을 사용합니다.

가져오기

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 작업을 사용합니다.

그러면 새로운 버전의 암호가 생성됩니다. 암호 버전이 이미 존재한다면 값과 함께 VersionStages 파라미터를 AWSCURRENT에 추가하여 값을 가져올 때 새로운 값이 사용되도록 합니다.

가져오기

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

Secrets Manager에 저장된 기존 암호 값 교체

Secrets Manager에 저장된 기존 암호 값을 교체할 때는 Ladmbda 교체 함수와 RotateSecret 작업을 사용합니다.

시작하기 전에 먼저 암호을 교체할 때 사용할 Lambda 함수를 생성합니다. 현재 AWS 코드 샘플 카탈로그에는 Amazon RDS 데이터베이스 보안 인증을 교체할 때 사용되는 Lambda 코드 예제가 몇 가지 포함되어 있습니다.

참고

자세한 내용은 AWS Secrets Manager 사용 설명서에서 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 참조에서 다음 REST 작업을 사용합니다.

AWS Secrets Manager 사용에 대한 자세한 내용은 AWS Secrets Manager 사용 설명서를 참조하세요.