보안 인증 공급자 사용 - AWS SDK for PHP

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

보안 인증 공급자 사용

보안 인증 공급자는 GuzzleHttp\Promise\PromiseInterface 인스턴스를 통해 이행되거나 Aws\Credentials\CredentialsInterface을 통해 거부되는 Aws\Exception\CredentialsException를 반환하는 함수입니다. 보안 인증 공급자를 사용하여 보안 인증 생성을 위한 고유의 사용자 지정 로직을 구현하거나 보안 인증 로딩을 최적화할 수 있습니다.

보안 인증 공급자는 credentials 클라이언트 생성자 옵션에 전달됩니다. 보안 인증 공급자는 비동기적이므로, API 작업을 호출할 때마다 강제로 늦게 평가됩니다. 따라서 보안 인증 공급자 함수를 SDK 클라이언트 생성자에 전달하면 보안 인증이 즉시 확인되지 않습니다. 보안 인증 공급자가 보안 인증 객체를 반환하지 않는 경우 API 작업은 Aws\Exception\CredentialsException을 통해 거부됩니다.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; // Use the default credential provider $provider = CredentialProvider::defaultProvider(); // Pass the provider to the client $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

SDK의 기본 제공 공급자

SDK는 사용자 지정 공급자와 함께 결합할 수 있는 여러 기본 제공 공급자를 제공합니다. SDK에서 표준화된 공급자 및 자격 증명 공급자 체인을 구성하는 방법에 대한 자세한 내용은 AWS SDK 및 도구 참조 안내서의 표준화된 자격 증명 공급자를 참조하십시오.AWS

중요

API 작업을 수행할 때마다 보안 인증 공급자가 호출됩니다. 보안 인증 로딩이 비용이 많이 드는 작업(예: 디스크 또는 네트워크 리소스에서 로딩)이거나 공급자가 보안 인증일 캐시하지 않는 경우 보안 인증 공급자를 Aws\Credentials\CredentialProvider::memoize 함수 안에 래핑하는 것을 고려합니다. SDK에서 사용되는 기본 보안 인증 공급자는 자동으로 메모이제이션(memoization)됩니다.

assumeRole 공급자

역할 수임을 통해 Aws\Credentials\AssumeRoleCredentialProvider를 사용하여 보안 인증을 생성하는 경우 표시된 것처럼 'client' 정보를 StsClient 객체와 함께 제공하고 'assume_role_params' 세부 정보를 제공해야 합니다.

참고

모든 API 작업에서 불필요하게 AWS STS 자격 증명을 가져오지 않으려면 memoize 함수를 사용하여 자격 증명이 만료될 때 자격 증명을 자동으로 새로 고치는 작업을 처리할 수 있습니다. 예제는 다음 코드를 참조하세요.

use Aws\Credentials\CredentialProvider; use Aws\Credentials\InstanceProfileProvider; use Aws\Credentials\AssumeRoleCredentialProvider; use Aws\S3\S3Client; use Aws\Sts\StsClient; // Passing Aws\Credentials\AssumeRoleCredentialProvider options directly $profile = new InstanceProfileProvider(); $ARN = "arn:aws:iam::123456789012:role/xaccounts3access"; $sessionName = "s3-access-example"; $assumeRoleCredentials = new AssumeRoleCredentialProvider([ 'client' => new StsClient([ 'region' => 'us-east-2', 'version' => '2011-06-15', 'credentials' => $profile ]), 'assume_role_params' => [ 'RoleArn' => $ARN, 'RoleSessionName' => $sessionName, ], ]); // To avoid unnecessarily fetching STS credentials on every API operation, // the memoize function handles automatically refreshing the credentials when they expire $provider = CredentialProvider::memoize($assumeRoleCredentials); $client = new S3Client([ 'region' => 'us-east-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

에 대한 자세한 내용은 을 참조하십시오. 'assume_role_params' AssumeRole

SSO 제공업체

Aws\Credentials\CredentialProvider::sso싱글 사인온 자격 증명 공급자입니다. 이 공급자를 자격 증명 공급자라고도 합니다. AWS IAM Identity Center

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $credentials = new Aws\CredentialProvider::sso('profile default'); $s3 = new Aws\S3\S3Client([ 'version' => 'latest', 'region' => 'us-west-2', 'credentials' => $credentials ]);

이름이 지정된 프로필을 사용하는 경우 이전 예제에서 프로필 이름을 default로 대체하세요. 이름이 지정된 프로필을 설정하는 방법에 대한 자세한 내용은 AWS SDK 및 도구 참조 안내서의 공유 configcredentials 파일을 참조하세요. 또는 AWS_PROFILE 환경 변수를 사용하여 사용할 프로필 설정을 지정할 수 있습니다.

IAM ID 센터 공급자의 작동 방식을 자세히 알아보려면 AWS SDK 및 도구 참조 안내서의 IAM ID 센터 인증 이해를 참조하세요.

공급자 연결

Aws\Credentials\CredentialProvider::chain() 함수를 사용하여 보안 인증 공급자를 연결할 수 있습니다. 이 함수는 variadic 수의 인수를 받으며, 각 인수는 보안 인증 공급자 함수입니다. 따라서 이 함수는 공급자 중 하나가 성공적으로 이행된 promise를 반환할 때까지 함수가 하나씩 차례로 호출되도록 제공된 함수의 합성인 새 함수를 반환합니다.

defaultProvider는 이 합성을 사용하여 실패하기 전에 여러 공급자를 확인합니다. defaultProvider의 소스는 chain 함수의 사용을 보여 줍니다.

// This function returns a provider public static function defaultProvider(array $config = []) { // This function is the provider, which is actually the composition // of multiple providers. Notice that we are also memoizing the result by // default. return self::memoize( self::chain( self::env(), self::ini(), self::instanceProfile($config) ) ); }

사용자 지정 공급자 생성

보안 인증 공급자는 호출될 때 GuzzleHttp\Promise\PromiseInterface 객체를 통해 이행되거나 Aws\Credentials\CredentialsInterface을 통해 거부되는 promise(Aws\Exception\CredentialsException)를 반환하는 함수일 뿐입니다.

공급자를 생성하기 위한 모범 사례는 실제 보안 인증 공급자를 생성하기 위해 호출되는 함수를 생성하는 것입니다. 예를 들어 다음은 env 공급자의 소스입니다(예시용으로 약간 수정됨). 이 소스는 실제 공급자 함수를 반환하는 함수라는 점에 주의하세요. 이 함수를 사용하여 보안 인증 공급자를 쉽게 생성하고 값으로 전달할 수 있습니다.

use GuzzleHttp\Promise; use GuzzleHttp\Promise\RejectedPromise; // This function CREATES a credential provider public static function env() { // This function IS the credential provider return function () { // Use credentials from environment variables, if available $key = getenv(self::ENV_KEY); $secret = getenv(self::ENV_SECRET); if ($key && $secret) { return Promise\promise_for( new Credentials($key, $secret, getenv(self::ENV_SESSION)) ); } $msg = 'Could not find environment variable ' . 'credentials in ' . self::ENV_KEY . '/' . self::ENV_SECRET; return new RejectedPromise(new CredentialsException($msg)); }; }

defaultProvider 공급자

Aws\Credentials\CredentialProvider::defaultProvider는 기본 보안 인증 공급자입니다. 이 공급자는 클라이언트를 생성할 때 credentials 옵션을 생략한 경우에 사용됩니다. 이 공급자는 먼저 환경 변수, 그 다음에 .ini 파일(.aws/credentials 파일을 먼저 시도하고, 다음에 .aws/config 파일), 그 다음에 인스턴스 프로파일(EcsCredentials를 먼저 시도하고, 다음에 Ec2 메타데이터)에서 보안 인증을 로드하려고 시도합니다.

참고

기본 공급자의 결과는 자동으로 메모이제이션(memoization)됩니다.

ecsCredentials 공급자

Aws\Credentials\CredentialProvider::ecsCredentialsGET 요청을 통해 보안 인증을 로드하려고 시도합니다. 이 요청의 URI는 컨테이너에 있는 환경 변수 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI에서 지정됩니다.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $provider = CredentialProvider::ecsCredentials(); // Be sure to memoize the credentials $memoizedProvider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $memoizedProvider ]);

env 공급자

Aws\Credentials\CredentialProvider::env는 환경 변수에서 보안 인증을 로드하려고 시도합니다.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => CredentialProvider::env() ]);

assumeRoleWithWebIdentityCredentialProvider 제공자

Aws\Credentials\CredentialProvider::assumeRoleWithWebIdentityCredentialProvider는 역할을 위임하여 보안 인증 로드를 시도합니다. 환경 변수 AWS_ROLE_ARNAWS_WEB_IDENTITY_TOKEN_FILE이 존재할 경우, 공급자는 AWS_WEB_IDENTITY_TOKEN_FILE에 지정된 전체 경로에서 디스크의 토큰을 사용하여 AWS_ROLE_ARN에서 지정된 역할 위임을 시도합니다. 환경 변수를 사용할 경우, 공급자는 AWS_ROLE_SESSION_NAME 환경 변수로부터 세션 설정을 시도합니다.

환경 변수가 설정되어 있지 않다면, 공급자는 기본 프로필 또는 AWS_PROFILE으로 설정된 값을 사용합니다. 공급자는 기본적으로 ~/.aws/credentials~/.aws/config에서 프로필을 읽으며, filename 컨피그 옵션에서 지정된 프로필을 읽어 들일 수 있습니다. 공급자는 프로필의 role_arn에서 역할을 위임하며, web_identity_token_file에서 설정된 전체 경로로부터 토큰을 읽습니다. role_session_name은 프로필에 설정되어 있는 경우 사용할 수 있습니다.

공급자는 기본 공급망의 한 부분으로서 호출되지만 직접 호출될 수도 있습니다.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $provider = CredentialProvider::assumeRoleWithWebIdentityCredentialProvider(); // Cache the results in a memoize function to avoid loading and parsing // the ini file on every API operation $provider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

기본적으로 이 자격 증명 공급자는 에서 역할을 수임하는 데 사용할 구성된 지역을 상속합니다 StsClient . 선택적으로 전체 내용을 제공할 StsClient 수 있습니다. 자격 증명은 제공된 것과 같이 false 설정해야 StsClient 합니다.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; use Aws\Sts\StsClient; $stsClient = new StsClient([ 'region' => 'us-west-2', 'version' => 'latest', 'credentials' => false ]) $provider = CredentialProvider::assumeRoleWithWebIdentityCredentialProvider([ 'stsClient' => $stsClient ]); // Cache the results in a memoize function to avoid loading and parsing // the ini file on every API operation $provider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

ini 공급자

Aws\Credentials\CredentialProvider::iniini 보안 인증 파일에서 보안 인증을 로드하려고 시도합니다. 기본적으로 SDK는 에 있는 공유 AWS credentials 파일에서 “기본” 프로필을 로드하려고 시도합니다. ~/.aws/credentials

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $provider = CredentialProvider::ini(); // Cache the results in a memoize function to avoid loading and parsing // the ini file on every API operation $provider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

공급자를 생성하는 함수에 인수를 제공하여 사용자 지정 프로파일 또는 .ini 파일 위치를 사용할 수 있습니다.

$profile = 'production'; $path = '/full/path/to/credentials.ini'; $provider = CredentialProvider::ini($profile, $path); $provider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

process 공급자

Aws\Credentials\CredentialProvider::processini 보안 인증 파일에서 지정하는 보안 인증 프로세스에서 보안 인증을 로드하려고 시도합니다. 기본적으로 SDK는 에 있는 공유 AWS credentials 파일에서 “기본” 프로필을 로드하려고 시도합니다. ~/.aws/credentials SDK가 credential_process 명령을 그대로 정확하게 호출한 후 stdout에서 JSON 데이터를 읽어옵니다. credential_process는 다음 형식으로 보안 인증을 stdout에 작성해야 합니다.

{ "Version": 1, "AccessKeyId": "", "SecretAccessKey": "", "SessionToken": "", "Expiration": "" }

SessionTokenExpiration은 선택 사항 두 선택 사항을 지정한다면 보안 인증이 임시로 처리됩니다.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $provider = CredentialProvider::process(); // Cache the results in a memoize function to avoid loading and parsing // the ini file on every API operation $provider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

공급자를 생성하는 함수에 인수를 제공하여 사용자 지정 프로파일 또는 .ini 파일 위치를 사용할 수 있습니다.

$profile = 'production'; $path = '/full/path/to/credentials.ini'; $provider = CredentialProvider::process($profile, $path); $provider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $provider ]);

instanceProfile 공급자

Aws\Credentials\CredentialProvider::instanceProfile 파일은 Amazon EC2 인스턴스 프로파일에서 보안 인증을 로드하려고 시도합니다.

use Aws\Credentials\CredentialProvider; use Aws\S3\S3Client; $provider = CredentialProvider::instanceProfile(); // Be sure to memoize the credentials $memoizedProvider = CredentialProvider::memoize($provider); $client = new S3Client([ 'region' => 'us-west-2', 'version' => '2006-03-01', 'credentials' => $memoizedProvider ]);

기본적으로 공급자는 보안 인증을 가져오기 위해 최대 3번까지 재시도할 수 있습니다. 재시도 횟수는 retries 옵션으로 설정되고, 옵션을 0에 설정하면 완전히 비활성화될 수 있습니다.

use Aws\Credentials\CredentialProvider; $provider = CredentialProvider::instanceProfile([ 'retries' => 0 ]); $memoizedProvider = CredentialProvider::memoize($provider);
참고

AWS_EC2_METADATA_DISABLED 환경 변수를 true로 설정하면 Amazon EC2 인스턴스 프로파일에서 로드하려는 이 시도를 비활성화할 수 있습니다.

보안 인증 메모이제이션

때로는 이전 반환 값을 기억하는 보안 인증 공급자를 생성해야 할 수도 있습니다. 이 공급자는 보안 인증 로딩이 비용이 많이 드는 작업인 경우 또는 Aws\Sdk 클래스를 사용하여 여러 클라이언트 간에 보안 인증 공급자를 공유하는 경우 성능에 유용합니다. 보안 인증 공급자 함수를 memoize 함수 안에 래핑하여 메모이제이션(memoization)을 보안 인증 공급자에 추가할 수 있습니다.

use Aws\Credentials\CredentialProvider; $provider = CredentialProvider::instanceProfile(); // Wrap the actual provider in a memoize function $provider = CredentialProvider::memoize($provider); // Pass the provider into the Sdk class and share the provider // across multiple clients. Each time a new client is constructed, // it will use the previously returned credentials as long as // they haven't yet expired. $sdk = new Aws\Sdk(['credentials' => $provider]); $s3 = $sdk->getS3(['region' => 'us-west-2', 'version' => 'latest']); $ec2 = $sdk->getEc2(['region' => 'us-west-2', 'version' => 'latest']); assert($s3->getCredentials() === $ec2->getCredentials());

메모이제이션(memoization)된 보안 인증이 만료되면 메모이제이션 래퍼가 보안 인증을 새로 고치려고 시도할 때 래핑된 공급자를 호출합니다.