S3 Access Grants와 기업 디렉터리 자격 증명

S3 Access Grants와 기업 디렉터리 자격 증명 (S3 Access Grants and corporate directory identities)

Amazon S3 Access Grants로 AWS Identity and Access Management(IAM) 보안 주체(사용자 또는 역할)에게 접근을 부여할 수 있어요. 같은 AWS 계정 안이든 다른 계정이든지요. 하지만 데이터에 접근하는 실제 주체가 기업 디렉터리(corporate directory)의 최종 사용자인 경우가 많아요. IAM 보안 주체에 접근을 부여하는 대신, S3 Access Grants로 기업의 사용자와 그룹에 직접 접근을 부여할 수 있어요. S3 Access Grants를 사용하면 기업 애플리케이션을 통해 S3 데이터에 접근하기 위해 기업 자격 증명을 중간 IAM 보안 주체에 매핑할 필요가 없어요.

출처: 문서

본문

최종 사용자 자격 증명으로 데이터에 접근하는 것 — 이 새로운 기능 — 은 S3 Access Grants 인스턴스를 AWS IAM Identity Center 인스턴스와 연결해 제공돼요. IAM Identity Center는 표준 기반 자격 증명 공급자를 지원하며, S3 Access Grants를 포함해 최종 사용자 자격 증명을 지원하는 모든 AWS 서비스나 기능의 AWS 허브예요. IAM Identity Center는 신뢰할 수 있는 자격 증명 전파(trusted identity propagation) 기능을 통해 기업 자격 증명에 대한 인증 지원을 제공해요. 자세한 내용은 애플리케이션 간 신뢰할 수 있는 자격 증명 전파를 참고하세요.

S3 Access Grants에서 워크포스 자격 증명 지원을 시작하려면, 전제 조건으로 IAM Identity Center에서 기업 자격 증명 공급자와 IAM Identity Center 사이의 자격 증명 프로비저닝을 구성하는 것부터 시작해요. IAM Identity Center는 Okta, Microsoft Entra ID(이전 Azure Active Directory), 또는 SCIM(System for Cross-domain Identity Management) 프로토콜을 지원하는 다른 외부 자격 증명 공급자(IdP) 같은 기업 자격 증명 공급자를 지원해요. IAM Identity Center를 IdP에 연결하고 자동 프로비저닝을 활성화하면 IdP의 사용자와 그룹이 IAM Identity Center의 자격 증명 저장소로 동기화돼요. 이 단계 후 IAM Identity Center는 사용자와 그룹에 대한 자체 보기를 가지므로, S3 Access Grants 같은 다른 AWS 서비스와 기능에서 그들을 참조할 수 있어요. IAM Identity Center 자동 프로비저닝 구성에 대한 자세한 내용은 AWS IAM Identity Center User Guide의 자동 프로비저닝을 참고하세요.

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

하지만 AWS Organizations 관리자가 아직 중앙 IAM Identity Center 인스턴스를 구성하지 않았다면, S3 Access Grants 인스턴스와 같은 계정과 같은 AWS 리전에 로컬 인스턴스를 만들 수 있어요. 다른 AWS 리전에 IAM Identity Center 인스턴스를 구성했다면, 이 인스턴스를 S3 Access Grants 인스턴스와 같은 AWS 리전으로 복제할 수도 있어요. 이러한 구성은 개념 증명이나 로컬 개발 사용 사례에서 더 흔해요. 모든 경우에 IAM Identity Center 인스턴스는 연결될 S3 Access Grants 인스턴스와 같은 AWS 리전에 있어야 해요.

외부 IdP를 사용한 IAM Identity Center 구성 다이어그램에서 IdP는 SCIM으로 구성되어 IdP의 자격 증명 저장소를 IAM Identity Center의 자격 증명 저장소로 동기화해요.

기업 디렉터리 자격 증명을 S3 Access Grants와 함께 사용하려면

  1. IAM Identity Center에서 자동 프로비저닝을 설정해 IdP의 사용자와 그룹 정보를 IAM Identity Center로 동기화해요.
  2. IAM Identity Center 내의 외부 자격 증명 소스를 신뢰할 수 있는 토큰 발급자(trusted token issuer)로 구성해요. 자세한 내용은 AWS IAM Identity Center User Guide의 애플리케이션 간 신뢰할 수 있는 자격 증명 전파를 참고하세요.
  3. S3 Access Grants 인스턴스를 IAM Identity Center 인스턴스와 연결해요. S3 Access Grants 인스턴스를 만들 때 이 작업을 할 수 있어요. S3 Access Grants 인스턴스를 이미 만들었다면 IAM Identity Center 인스턴스 연결 또는 연결 해제를 참고하세요.

디렉터리 자격 증명이 S3 데이터에 접근하는 방법

기업 디렉터리 사용자들이 외부 IdP(예: Okta)와 통합되어 사용자를 인증하는 기업 애플리케이션(예: 문서 뷰어 애플리케이션)을 통해 S3 데이터에 접근해야 하는 상황을 가정해 봐요. 이러한 애플리케이션에서 사용자 인증은 일반적으로 사용자의 웹 브라우저에서의 리다이렉트로 이루어져요. 디렉터리의 사용자는 IAM 보안 주체가 아니므로, 애플리케이션은 사용자를 대신해 S3 데이터에 대한 접근 자격 증명을 얻기 위해 S3 Access Grants GetDataAccess API 작업을 호출할 수 있는 IAM 자격 증명이 필요해요. 자격 증명을 스스로 얻는 IAM 사용자와 역할과 달리, 애플리케이션은 IAM 역할에 매핑되지 않은 디렉터리 사용자를 나타내는 방법이 필요해요. 그래야 그 사용자가 S3 Access Grants를 통해 데이터 접근을 얻을 수 있거든요.

인증된 디렉터리 사용자에서 디렉터리 사용자를 대신해 S3 Access Grants에 요청할 수 있는 IAM 호출자로의 이 전환은, 애플리케이션이 IAM Identity Center의 신뢰할 수 있는 토큰 발급자 기능을 통해 수행해요. 디렉터리 사용자를 인증한 후 애플리케이션은 Okta가 디렉터리 사용자를 나타내는 IdP(예: Okta)의 자격 증명 토큰(identity token)을 가져요. IAM Identity Center의 신뢰할 수 있는 토큰 발급자 구성은 애플리케이션이 이 Okta 토큰(Okta 테넌트가 "신뢰할 수 있는 발급자"로 구성됨)을 AWS 서비스 안에서 디렉터리 사용자를 안전하게 나타낼 IAM Identity Center의 다른 자격 증명 토큰으로 교환할 수 있게 해줘요. 그러면 데이터 애플리케이션은 추가 컨텍스트로 디렉터리 사용자의 IAM Identity Center 토큰을 제공하며 IAM 역할을 맡아요. 애플리케이션은 결과 IAM 세션으로 S3 Access Grants를 호출할 수 있어요. 그 토큰은 애플리케이션의 자격 증명(IAM 보안 주체 자체)과 디렉터리 사용자의 자격 증명을 둘 다 나타내요.

이 전환의 주요 단계는 토큰 교환(token exchange)이에요. 애플리케이션은 IAM Identity Center의 CreateTokenWithIAM API 작업을 호출해 이 토큰 교환을 수행해요. 물론 그것도 AWS API 호출이며 서명에 IAM 보안 주체가 필요해요. 이 요청을 하는 IAM 보안 주체는 일반적으로 애플리케이션과 연결된 IAM 역할이에요. 예를 들어 애플리케이션이 Amazon EC2에서 실행된다면 CreateTokenWithIAM 요청은 일반적으로 애플리케이션이 실행되는 EC2 인스턴스와 연결된 IAM 역할이 수행해요. 성공적인 CreateTokenWithIAM 호출의 결과는 AWS 서비스 안에서 인식될 새 자격 증명 토큰이에요.

애플리케이션이 디렉터리 사용자를 대신해 GetDataAccess를 호출하기 전의 다음 단계는, 애플리케이션이 디렉터리 사용자의 자격 증명을 포함한 IAM 세션을 얻는 것이에요. 애플리케이션은 추가 자격 증명 컨텍스트로 디렉터리 사용자의 IAM Identity Center 토큰을 포함하는 AWS Security Token Service(AWS STS) AssumeRole 요청으로 이렇게 해요. 이 추가 컨텍스트가 IAM Identity Center가 디렉터리 사용자의 자격 증명을 다음 단계로 전파할 수 있게 해줘요. 애플리케이션이 맡는 IAM 역할은 GetDataAccess 작업을 호출할 IAM 권한이 필요한 역할이에요.

디렉터리 사용자의 IAM Identity Center 토큰을 추가 컨텍스트로 해서 자격 증명 전달자(identity bearer) IAM 역할을 맡은 후, 애플리케이션은 이제 인증된 디렉터리 사용자를 대신해 GetDataAccess에 서명된 요청을 하기 위해 필요한 모든 것을 가지게 돼요.

토큰 전파는 다음 단계를 기반으로 해요.

IAM Identity Center 애플리케이션 만들기

먼저 IAM Identity Center에서 새 애플리케이션을 만들어요. 이 애플리케이션은 사용할 수 있는 애플리케이션 설정 유형을 IAM Identity Center가 식별할 수 있게 하는 템플릿을 사용해요. 애플리케이션 생성 명령은 IAM Identity Center 인스턴스 Amazon 리소스 이름(ARN), 애플리케이션 이름, 애플리케이션 공급자 ARN을 제공해야 해요. 애플리케이션 공급자는 애플리케이션이 IAM Identity Center에 호출하는 데 사용할 SAML 또는 OAuth 애플리케이션 공급자예요.

다음 예제 명령을 사용하려면 user input 자리 표시자를 자신의 정보로 바꾸세요.

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

응답(Response):

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

신뢰할 수 있는 토큰 발급자 만들기

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

  • 자격 증명 공급자 발급자 URL(identity provider issuer URL)
  • 신뢰할 수 있는 토큰 발급자 이름
  • 클레임 속성 경로(claim attribute path)
  • 자격 증명 저장소 속성 경로(identity store attribute path)
  • JSON Web Key Set(JWKS) 검색 옵션

클레임 속성 경로는 자격 증명 저장소 속성에 매핑하는 데 사용될 자격 증명 공급자 속성이에요. 일반적으로 클레임 속성 경로는 사용자의 이메일 주소이지만 매핑에 다른 속성을 사용할 수 있어요.

다음 정보로 oidc-configuration.json이라는 파일을 만들어요. 이 파일을 사용하려면 user input 자리 표시자를 자신의 정보로 바꾸세요.

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

신뢰할 수 있는 토큰 발급자를 만들려면 다음 명령을 실행해요. 이 예제 명령을 사용하려면 user input 자리 표시자를 자신의 정보로 바꾸세요.

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

응답(Response)

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

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

신뢰할 수 있는 토큰 발급자가 작동하려면 몇 가지 구성 설정이 더 필요해요. 신뢰할 수 있는 토큰 발급자가 신뢰할 대상(audience)을 설정해요. 대상은 키로 식별되고 자격 증명 공급자 설정에서 찾을 수 있는 IdToken 안의 값이에요. 예를 들어:

1234973b-abcd-1234-abcd-345c5a9c1234

다음 내용을 포함하는 grant.json이라는 파일을 만들어요. 이 파일을 사용하려면 대상을 자격 증명 공급자 설정과 일치하도록 변경하고 이전 명령이 반환한 신뢰할 수 있는 토큰 발급자 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 자리 표시자를 자신의 정보로 바꾸세요.

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) assertion 프로필에 등록된 네임스페이스예요. 이 네임스페이스에 대한 자세한 내용은 RFC 7523에서 찾을 수 있어요.

다음으로, 다음 명령을 사용해 신뢰할 수 있는 토큰 발급자가 자격 증명 공급자의 IdToken 값을 교환할 때 포함할 범위(scope)를 설정해요. 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 키는 애플리케이션이 디렉터리 사용자의 자격 증명 정보를 포함하기 위해 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 리소스에 접근할 권한이 있는 최종 자격 증명을 받을 수 있어요.

더 알아보기 (Learn more)