S3 Access Grants 및 기업 디렉터리 ID - Amazon Simple Storage Service

S3 Access Grants 및 기업 디렉터리 ID

Amazon S3 Access Grants를 사용하여 동일한 AWS 계정 및 서로 다른 계정에서 AWS Identity and Access Management(IAM) 보안 주체(사용자 또는 역할)에 대한 액세스 권한을 부여할 수 있습니다. 하지만 대부분의 경우 데이터에 액세스하는 엔터티는 기업 디렉터리의 최종 사용자입니다. IAM 보안 주체에 액세스 권한을 부여하는 대신 S3 Access Grants를 사용하여 기업 사용자 및 그룹에 직접 액세스 권한을 부여할 수 있습니다. S3 Access Grants를 사용하면 기업 애플리케이션을 통해 S3 데이터에 액세스하기 위해 더 이상 기업 ID를 중간의 IAM 보안 주체에 매핑할 필요가 없습니다.

데이터에 대한 최종 사용자 ID 액세스를 지원하는 이 새로운 기능은 S3 Access Grants 인스턴스를 AWS IAM Identity Center 인스턴스와 연결하여 제공됩니다. IAM Identity Center는 표준 기반 ID 제공업체를 지원하며 AWS 내에서 최종 사용자 ID를 지원하는 S3 Access Grants를 비롯한 모든 서비스 또는 기능의 허브 역할을 합니다. IAM Identity Center는 신뢰할 수 있는 ID 전파 기능을 통해 기업 ID에 대한 인증 지원을 제공합니다. 자세한 내용은 Trusted identity propagation across applications를 참조하세요.

S3 Access Grants의 인력 ID 지원을 시작하려면 먼저 IAM Identity Center에서 기업 ID 제공업체와 IAM Identity Center 간에 ID 프로비저닝을 구성해야 합니다. IAM Identity Center는 Okta, Microsoft Entra ID(구 Azure Active Directory)와 같은 기업 ID 제공업체 또는 System for Cross-domain Identity Management(SCIM) 프로토콜을 지원하는 기타 외부 ID 제공업체(IdP)를 지원합니다. IAM Identity Center를 IdP에 연결하고 자동 프로비저닝을 활성화하면 IdP의 사용자 및 그룹이 IAM Identity Center의 ID 저장소에 동기화됩니다. 이 단계가 끝나면 IAM Identity Center는 사용자 및 그룹을 자체적으로 파악하므로 S3 Access Grants와 같은 다른 AWS 서비스 및 기능을 사용하여 해당 사용자와 그룹을 참조할 수 있습니다. IAM Identity Center 자동 프로비저닝을 구성하는 방법에 대한 자세한 내용은 AWS IAM Identity Center 사용 설명서의 자동 프로비저닝을 참조하세요.

IAM Identity Center는 AWS Organizations와 통합되어 있으므로 각 계정을 수동으로 구성하지 않고도 여러 AWS 계정의 권한을 중앙에서 관리할 수 있습니다. 일반적인 조직에서는 ID 관리자가 전체 조직에 대해 하나의 IAM Identity Center 인스턴스를 단일 ID 동기화 지점으로 구성합니다. 이 IAM Identity Center 인스턴스는 일반적으로 조직의 전용 AWS 계정에서 실행됩니다. 이 일반적인 구성에서는 조직 내 모든 AWS 계정에서 S3 Access Grants의 사용자 및 그룹 ID를 참조할 수 있습니다.

하지만 AWS Organizations 관리자가 아직 중앙 IAM Identity Center 인스턴스를 구성하지 않은 경우 S3 Access Grants 인스턴스와 동일한 계정에 로컬 인스턴스를 생성할 수 있습니다. 개념 증명 또는 로컬 개발 사용 사례에서는 이러한 구성이 더 일반적입니다. 모든 경우에 IAM Identity Center 인스턴스는 해당 인스턴스가 연결될 S3 Access Grants 인스턴스와 동일한 AWS 리전에 있어야 합니다.

외부 IdP를 사용한 IAM Identity Center 구성을 보여주는 다음 다이어그램에서 IdP는 IdP의 ID 저장소를 IAM Identity Center의 ID 저장소와 동기화하도록 SCIM으로 구성되어 있습니다.

자동 프로비저닝을 통한 외부 ID 저장소와 IAM Identity Center 통합.

S3 Access Grants와 함께 기업 디렉터리 ID를 사용하려면 다음을 수행하세요.

디렉터리 ID가 S3 데이터에 액세스하는 방법

외부 IdP(예: Okta)와 통합되어 사용자를 인증하는 기업 애플리케이션(예: 문서 뷰어 애플리케이션)을 통해 S3 데이터에 액세스해야 하는 회사 디렉터리 사용자가 있다고 가정해 보겠습니다. 이러한 애플리케이션의 사용자 인증은 일반적으로 사용자 웹 브라우저의 리디렉션을 통해 이루어집니다. 디렉터리의 사용자는 IAM 보안 주체가 아니므로 애플리케이션에는 사용자를 대신하여 S3 데이터에 대한 액세스 보안 인증 정보를 가져오기 위해 S3 Access Grants GetDataAccess API 작업을 호출하는 데 사용할 수 있는 IAM 보안 인증 정보가 필요합니다. 보안 인증 정보를 직접 얻는 IAM 사용자 및 역할과 달리, 애플리케이션에는 IAM 역할에 매핑되지 않은 디렉터리 사용자를 표현할 방법이 필요합니다. 그래야 사용자가 S3 Access Grants를 통해 데이터 액세스 권한을 받을 수 있습니다.

인증된 디렉터리 사용자에서 디렉터리 사용자를 대신하여 S3 Access Grants에 요청할 수 있는 IAM 호출자로의 전환은 애플리케이션에서 IAM Identity Center의 신뢰할 수 있는 토큰 발급자 기능을 통해 이루어집니다. 디렉터리 사용자를 인증한 애플리케이션은 IdP(예: Okta)의 ID 토큰을 받게 되며, 이 토큰은 Okta에 따라 디렉터리 사용자를 나타냅니다. IAM Identity Center의 신뢰할 수 있는 토큰 발급자 구성을 통해 애플리케이션은 이 Okta 토큰(Okta 테넌트는 '신뢰할 수 있는 발급자'로 구성됨)을 IAM Identity Center의 다른 ID 토큰으로 교환할 수 있습니다. 이 ID 토큰은 AWS 서비스 내에서 디렉터리 사용자를 안전하게 나타냅니다. 그러면 데이터 애플리케이션이 IAM 역할을 맡아 IAM Identity Center의 디렉터리 사용자 토큰을 추가 컨텍스트로 제공합니다. 애플리케이션은 생성된 IAM 세션을 사용하여 S3 Access Grants를 호출할 수 있습니다. 토큰은 애플리케이션의 ID(IAM 보안 주체 자체)와 디렉터리 사용자의 ID를 모두 나타냅니다.

이 전환의 주요 단계는 토큰 교환입니다. 애플리케이션은 IAM Identity Center에서 CreateTokenWithIAM API 작업을 호출하여 이 토큰 교환을 수행합니다. 물론 이 역시 AWS API 직접 호출이며 서명하려면 IAM 보안 주체가 필요합니다. 이 요청을 하는 IAM 보안 주체는 일반적으로 애플리케이션과 연결된 IAM 역할입니다. 예를 들어, 애플리케이션이 Amazon EC2에서 실행되는 경우 CreateTokenWithIAM 요청은 일반적으로 애플리케이션이 실행되는 EC2 인스턴스에 연결된 IAM 역할에 의해 수행됩니다. 성공적인 CreateTokenWithIAM 호출의 결과로 새 ID 토큰이 생성되며, 이 토큰은 AWS 서비스 내에서 인식됩니다.

애플리케이션이 디렉터리 사용자를 대신하여 GetDataAccess 호출할 수 있으려면 먼저 애플리케이션이 디렉터리 사용자의 ID가 포함된 IAM 세션을 확보해야 합니다. 애플리케이션은 디렉터리 사용자를 위한 IAM Identity Center 토큰을 추가 ID 컨텍스트로 포함하는 AWS Security Token Service(AWS STS) AssumeRole 요청을 통해 이 작업을 수행합니다. 이 추가 컨텍스트를 통해 IAM Identity Center는 디렉터리 사용자의 ID를 다음 단계로 전파할 수 있습니다. 애플리케이션이 맡는 IAM 역할은 GetDataAccess 작업을 호출하기 위해 IAM 권한이 필요한 역할입니다.

디렉터리 사용자를 위한 IAM Identity Center 토큰을 추가 컨텍스트로 사용하여 ID 보유자 IAM 역할을 맡은 애플리케이션은 이제 인증된 디렉터리 사용자를 대신하여 GetDataAccess에 서명된 요청을 보내는 데 필요한 모든 것을 갖추게 되었습니다.

토큰 전파는 다음 단계를 기반으로 합니다.

IAM Identity Center 애플리케이션 생성

먼저 IAM Identity Center에서 새 애플리케이션을 생성합니다. 이 애플리케이션은 사용할 수 있는 애플리케이션 설정 유형을 IAM Identity Center에서 식별할 수 있는 템플릿을 사용합니다. 애플리케이션을 생성하기 위한 명령을 실행하려면 IAM Identity Center 인스턴스 Amazon 리소스 이름(ARN), 애플리케이션 이름, 애플리케이션 공급자 ARN을 제공해야 합니다. 애플리케이션 공급자는 애플리케이션이 IAM Identity Center에 호출하는 데 사용할 SAML 또는 OAuth 애플리케이션 공급자입니다.

다음 예시 명령을 사용하려면 user input placeholders를 실제 정보로 대체하세요.

aws sso-admin create-application \ --instance-arn "arn:aws:sso:::instance/ssoins-ssoins-1234567890abcdef" \ --application-provider-arn "arn:aws:sso::aws:applicationProvider/custom" \ --name MyDataApplication

응답:

{ "ApplicationArn": "arn:aws:sso::123456789012:application/ssoins-ssoins-1234567890abcdef/apl-abcd1234a1b2c3d" }

신뢰할 수 있는 토큰 발급자 생성

IAM Identity Center 애플리케이션이 준비되었으므로 다음 단계는 IdP의 IdToken 값을 IAM Identity Center 토큰으로 교환하는 데 사용할 신뢰할 수 있는 토큰 발급자를 구성하는 것입니다. 이 단계에서는 다음 항목을 제공해야 합니다.

  • ID 제공업체 발급자 URL

  • 신뢰할 수 있는 토큰 발급자 이름

  • 클레임 속성 경로

  • ID 저장소 속성 경로

  • JSON Web Key Set(JWKS) 검색 옵션

클레임 속성 경로는 ID 저장소 속성에 매핑하는 데 사용되는 ID 제공업체 속성입니다. 일반적으로 클레임 속성 경로는 사용자의 이메일 주소이지만 다른 속성을 사용하여 매핑을 수행할 수 있습니다.

다음 정보를 사용하여 oidc-configuration.json이라는 파일을 생성합니다. 이 파일을 사용하려면 user input placeholders를 실제 정보로 대체합니다.

{ "OidcJwtConfiguration": { "IssuerUrl": "https://login.microsoftonline.com/a1b2c3d4-abcd-1234-b7d5-b154440ac123/v2.0", "ClaimAttributePath": "preferred_username", "IdentityStoreAttributePath": "userName", "JwksRetrievalOption": "OPEN_ID_DISCOVERY" } }

신뢰할 수 있는 토큰 발급자를 생성하려면 다음 명령을 실행합니다. 이 예 명령을 사용하려면 user input placeholders를 실제 정보로 대체하세요.

aws sso-admin create-trusted-token-issuer \ --instance-arn "arn:aws:sso:::instance/ssoins-1234567890abcdef" \ --name MyEntraIDTrustedIssuer \ --trusted-token-issuer-type OIDC_JWT \ --trusted-token-issuer-configuration file://./oidc-configuration.json

응답

{ "TrustedTokenIssuerArn": "arn:aws:sso::123456789012:trustedTokenIssuer/ssoins-1234567890abcdef/tti-43b4a822-1234-1234-1234-a1b2c3d41234" }

IAM Identity Center 애플리케이션을 신뢰할 수 있는 토큰 발급자와 연결

신뢰할 수 있는 토큰 발급자가 작동하려면 몇 가지 구성 설정이 더 필요합니다. 신뢰할 수 있는 토큰 발급자가 신뢰할 대상을 설정합니다. 대상은 키로 식별되는 IdToken 내부의 값이며 ID 제공업체 설정에서 찾을 수 있습니다. 예:

1234973b-abcd-1234-abcd-345c5a9c1234

다음 콘텐츠가 포함된 grant.json이라는 파일을 생성합니다. 이 파일을 사용하려면 대상을 ID 제공업체 설정과 일치하도록 변경하고 이전 명령에서 반환된 신뢰할 수 있는 토큰 발급자 ARN을 제공합니다.

{ "JwtBearer": { "AuthorizedTokenIssuers": [ { "TrustedTokenIssuerArn": "arn:aws:sso::123456789012:trustedTokenIssuer/ssoins-1234567890abcdef/tti-43b4a822-1234-1234-1234-a1b2c3d41234", "AuthorizedAudiences": [ "1234973b-abcd-1234-abcd-345c5a9c1234" ] } ] } }

다음 예시 명령을 실행합니다. 이 명령을 사용하려면 user input placeholders를 실제 정보로 대체합니다.

aws sso-admin put-application-grant \ --application-arn "arn:aws:sso::123456789012:application/ssoins-ssoins-1234567890abcdef/apl-abcd1234a1b2c3d" \ --grant-type "urn:ietf:params:oauth:grant-type:jwt-bearer" \ --grant file://./grant.json \

이 명령은 신뢰할 수 있는 토큰 발급자가 grant.json 파일의 대상을 신뢰하고 jwt-bearer 유형의 토큰을 교환하기 위해 첫 단계에서 만든 애플리케이션과 이 대상을 연결하도록 구성을 설정합니다. urn:ietf:params:oauth:grant-type:jwt-bearer 문자열은 임의의 문자열이 아닙니다. 이 문자열은 OAuth JSON Web Token(JWT) 어설션 프로필에 등록된 네임스페이스입니다. 이 네임스페이스에 대한 자세한 내용은 RFC 7523에서 확인할 수 있습니다.

그런 다음, 다음 명령을 사용하여 ID 제공업체로부터 IdToken 값을 교환할 때 신뢰할 수 있는 토큰 발급자가 포함할 범위를 설정합니다. S3 Access Grants의 경우 --scope 파라미터의 값은 s3:access_grants:read_write입니다.

aws sso-admin put-application-access-scope \ --application-arn "arn:aws:sso::111122223333:application/ssoins-ssoins-111122223333abcdef/apl-abcd1234a1b2c3d" \ --scope "s3:access_grants:read_write"

마지막 단계는 IAM Identity Center 애플리케이션에 리소스 정책을 연결하는 것입니다. 이 정책을 통해 애플리케이션 IAM 역할은 sso-oauth:CreateTokenWithIAM API 작업에 요청을 보내고 IAM Identity Center로부터 IdToken 값을 수신할 수 있습니다.

다음 콘텐츠가 포함된 authentication-method.json이라는 파일을 생성합니다. 123456789012을 계정 ID로 바꿉니다.

{ "Iam": { "ActorPolicy": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/webapp" }, "Action": "sso-oauth:CreateTokenWithIAM", "Resource": "*" } ] } } }

IAM Identity Center 애플리케이션에 정책을 연결하려면 다음 명령을 실행합니다.

aws sso-admin put-application-authentication-method \ --application-arn "arn:aws:sso::123456789012:application/ssoins-ssoins-1234567890abcdef/apl-abcd1234a1b2c3d" \ --authentication-method-type IAM \ --authentication-method file://./authentication-method.json

웹 애플리케이션을 통해 디렉터리 사용자와 함께 S3 Access Grants를 사용하기 위한 구성 설정이 완료되었습니다. 애플리케이션에서 직접 이 설정을 테스트하거나 IAM Identity Center 애플리케이션 정책에서 허용된 IAM 역할에서 다음 명령을 사용하여 CreateTokenWithIAM API 작업을 호출할 수 있습니다.

aws sso-oidc create-token-with-iam \ --client-id "arn:aws:sso::123456789012:application/ssoins-ssoins-1234567890abcdef/apl-abcd1234a1b2c3d" \ --grant-type urn:ietf:params:oauth:grant-type:jwt-bearer \ --assertion IdToken

응답은 다음과 유사합니다.

{ "accessToken": "<suppressed long string to reduce space>", "tokenType": "Bearer", "expiresIn": 3600, "refreshToken": "<suppressed long string to reduce space>", "idToken": "<suppressed long string to reduce space>", "issuedTokenType": "urn:ietf:params:oauth:token-type:refresh_token", "scope": [ "sts:identity_context", "s3:access_grants:read_write", "openid", "aws" ] }

base64로 인코딩된 IdToken 값을 디코딩하면 키-값 쌍이 JSON 형식으로 표시됩니다. sts:identity_context 키에는 디렉터리 사용자의 ID 정보를 포함하기 위해 애플리케이션이 sts:AssumeRole 요청에 전송해야 하는 값이 들어 있습니다. 다음은 디코딩된 IdToken의 예입니다.

{ "aws:identity_store_id": "d-996773e796", "sts:identity_context": "AQoJb3JpZ2luX2VjEOTtl;<SUPRESSED>", "sub": "83d43802-00b1-7054-db02-f1d683aacba5", "aws:instance_account": "123456789012", "iss": "https://identitycenter.amazonaws.com/ssoins-1234567890abcdef", "sts:audit_context": "AQoJb3JpZ2luX2VjEOT<SUPRESSED>==", "aws:identity_store_arn": "arn:aws:identitystore::232642235904:identitystore/d-996773e796", "aud": "abcd12344U0gi7n4Yyp0-WV1LWNlbnRyYWwtMQ", "aws:instance_arn": "arn:aws:sso:::instance/ssoins-6987d7fb04cf7a51", "aws:credential_id": "EXAMPLEHI5glPh40y9TpApJn8...", "act": { "sub": "arn:aws:sso::232642235904:trustedTokenIssuer/ssoins-6987d7fb04cf7a51/43b4a822-1020-7053-3631-cb2d3e28d10e" }, "auth_time": "2023-11-01T20:24:28Z", "exp": 1698873868, "iat": 1698870268 }

sts:identity_context에서 값을 가져오고 이 정보를 sts:AssumeRole 호출에 전달할 수 있습니다. 다음은 이 구문의 CLI 예시입니다. 수임되는 역할은 s3:GetDataAccess 호출 권한이 있는 임시 역할입니다.

aws sts assume-role \ --role-arn "arn:aws:iam::123456789012:role/temp-role" \ --role-session-name "TempDirectoryUserRole" \ --provided-contexts ProviderArn="arn:aws:iam::aws:contextProvider/IdentityCenter",ContextAssertion="value from sts:identity_context"

이제 이 호출에서 받은 보안 인증 정보를 사용하여 s3:GetDataAccess API 작업을 호출하고 S3 리소스 액세스 권한이 있는 최종 보안 인증 정보를 받을 수 있습니다.