AWS

[AWS IAM] Identity Federation & Cognito Basics

Sean 션 2024. 7. 16. 16:45

해당 게시글은 다음 강의를 보고 정리한 자료입니다:

http://www.udemy.com/course/aws-solutions-architect-professional

[References]

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WIF.html


Identity Federation in AWS

AWS 바깥에 있는 사용자에게 AWS 리소스에 대한 권한을 줄 때 사용되는 개념으로, IAM User 를 만들지 않고 권한을 줄 수 있습니다.

  • 사용자 측에 이미 Active Directory 를 기반한 identity 시스템이 구축되어 있는 경우 사용합니다.
  • AWS 리소스에 접근이 필요한 웹/모바일 애플리케이션이 사용합니다.

Identity Federation 의 흐름은 다음과 같습니다:

  1. AWS와 Identity Provider 간 trust relationship 을 형성합니다.
  2. 사용자가 Identity Provider 를 통해 로그인 합니다.
  3. 사용자는 Identity Provider 로부터 AWS 리소스에 접근 가능한 자격 증명을 받습니다.
  4. 사용자가 임시 자격 증명을 사용하여 AWS 리소스에 접근합니다.

Identity Federation 은 다양한 서비스와의 통합이 가능합니다:

  • SAML 2.0
  • Custom Identity Broker
  • Web Identity Federation with/without Amazon Cognito
  • Single Sign-On (SSO)

이 게시글에선 Single Sign-On (SSO)를 제외한 SAML 2.0, Custom Identity Broker, Web Identity Federation with/without Amazon Cognito 에 대해 알아보도록 하겠습니다.


SAML 2.0 Federation

SAML 은 Security Assertion Markup Language 을 의미합니다. 이는 ADFS(Active Directory Federation Services)를 포함한 많은 Identity Provider 들의 기준(standard) 입니다.

 

SAML 2.0 IdPs(Identity Providers)에게 IAM User 를 만들지 않고도 AWS 콘솔, AWS CLI, AWS API 에 접근하는 임시 자격 증명을 제공할 수 있습니다.

 

SAML 2.0 Federation 을 위해서는 AWS IAM 과 SAML 2.0 IdP 사이에 trust relationship 을 양방향으로 형성해야 합니다.

 

추가적 정보:

  • 내부적으로는 STS API 중 AssumeRoleWithSAML 을 사용합니다.
  • SAML 2.0 Federation 은 레거시 방식으로, 최근에는 Amazon Single Sign-On (AWS SSO) Federation 을 이용하는 것이 권장됩니다(더욱 간편하다고 합니다).

SAML 2.0 Federation Flow Diagram: AWS API

다이어그램을 통해 SAML 2.0 Federation 이 어떻게 이루어지는지 이해합니다. 해당 시나리오에서 유저는 Corporate data center 의 IdP(Identity Provider) 를 이용하여 최종적으로 AWS Cloud 의 S3 버킷으로 접근하고자 합니다. IdP 와 AWS 간 trust relationship 이 이미 형성되었다고 가정합시다. AWS Cloud 에 접근하는 방법은 다음과 같습니다:

  • AWS API
  • AWS Management Console
  • AWS CLI

해당 시나리오에선 AWS API 를 통한 접근에 대해 알아봅니다.

  1. 사용자가 Corporate data center 에서 Identity Provider 로 인증을 요청합니다.
  2. Identity Provider 는 Identity Store 를 기반하여 유저를 인증합니다.
  3. SAML assertion 을 반환합니다. 이는 로그인의 성공 여부를 포함합니다.
  1. 이후 유저는 SAML assertion 을 기반으로 AssumeRoleWithSAML API 를 호출합니다.
  2. STS 는 API 호출을 받고 assertion 이 올바른지 확인합니다. 검증이 되었다면 유저에게 임시 자격 증명을 제공합니다.
  3. 최종적으로 유저는 임시 자격 증명을 통해 AWS 리소스에 접근할 수 있습니다.

Custom Identity Broker Application

레거시 기능으로, IdP 가 SAML 2.0 과 호환되지 않을 때만 사용하는 걸 권장합니다. 이 방법의 특징은 IdP 가 Broker 가 되어 직접 STS 를 통한 임시 자격 증명을 요청한다는 점입니다.

그렇기 때문에 IdP, 즉 Custom Identity Broker 가 권한 관리에 대한 책임을 지게 됩니다. 이 방식은 내부적으로 AssumeRole 또는 GetFederationToken API 를 사용합니다. 임시 자격 증명을 받은 후엔 유저에게 이를 전달하고, 유저는 최종적으로 AWS 리소스를 사용할 수 있게 됩니다.


Web Identity Federation without Cognito

Cognito 없이 Web Identity Federation 를 구성할 수 있지만, 이는 권장하지 않습니다. AWS 는 이 경우 Cognito 를 사용할 것을 권장합니다.

  1. 먼저 클라이언트는 서드파티 IdP 를 통해 로그인합니다.
  2. 인증 후 서드파티 IdP 는 web identity token 을 발급합니다.
  3. 클라이언트는 이를 통해 AssumeRoleWithWebIdentity API 를 호출합니다.
  4. STS 에서 web identity token 을 기반하여 검증을 수행하고, 검증이 완료되면 임시 자격 증명을 발급합니다.
  5. 최종적으로 클라이언트는 이 임시 자격 증명으로 AWS 리소스에 접근할 수 있습니다.

Web Identity Federation with Cognito

Web Identity Federation 을 구현하는 데 있어 Cognito 를 사용하는 것이 권장됩니다. 이는 다음의 과정들을 포합합니다:

  • Cognito 를 사용하는 IAM role 을 생성합니다.
  • OIDC IdP 와 AWS 간의 trust relationship 을 형성합니다.

다음의 과정이 완료되었다면 아래 사진의 흐름대로 Web Identity Federation 이 가능합니다.

  1. 먼저 클라이언트는 서드파티 IdP 를 통해 로그인합니다.
  2. 인증 후 서드파티 IdP 는 web identity token 을 발급합니다.
  3. 클라이언트는 web identity token 을 Amazon Cognito 에 전달합니다.
  4. Amazon Cognito 는 이를 기반하여 Cognito token 을 반환합니다.
  1. 발급받은 Cognito token 을 STS 에 제공합니다.
  2. STS 는 Cognito token 을 임시 자격 증명으로 변환해줍니다.
  3. 최종적으로 클라이언트는 AWS 리소스에 접근할 수 있습니다.

 

Cognito 를 사용함으로써 얻는 장점은 다음과 같습니다:

  • anonymous user 를 지원합니다.
  • MFA 를 지원합니다.
  • Data synchronization 이 가능합니다.

 

Web Identity Federation 을 사용하면 IAM Policy 를 기반한 권한 관리가 가능합니다:

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}

 

해당 예제의 Condition 절에서 "${www.amazon.com:user_id}" 와 같이 user_id 를 기반하여 접근을 제어하는 것을 확인할 수 있습니다.

 

이상 Identity Federation & Cognito 에 대한 정리를 마칩니다.