해당 게시글은 다음 강의를 보고 정리한 자료입니다:
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 의 흐름은 다음과 같습니다:
- AWS와 Identity Provider 간 trust relationship 을 형성합니다.
- 사용자가 Identity Provider 를 통해 로그인 합니다.
- 사용자는 Identity Provider 로부터 AWS 리소스에 접근 가능한 자격 증명을 받습니다.
- 사용자가 임시 자격 증명을 사용하여 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 를 통한 접근에 대해 알아봅니다.
- 사용자가 Corporate data center 에서 Identity Provider 로 인증을 요청합니다.
- Identity Provider 는 Identity Store 를 기반하여 유저를 인증합니다.
- SAML assertion 을 반환합니다. 이는 로그인의 성공 여부를 포함합니다.
- 이후 유저는 SAML assertion 을 기반으로 AssumeRoleWithSAML API 를 호출합니다.
- STS 는 API 호출을 받고 assertion 이 올바른지 확인합니다. 검증이 되었다면 유저에게 임시 자격 증명을 제공합니다.
- 최종적으로 유저는 임시 자격 증명을 통해 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 를 사용할 것을 권장합니다.
- 먼저 클라이언트는 서드파티 IdP 를 통해 로그인합니다.
- 인증 후 서드파티 IdP 는 web identity token 을 발급합니다.
- 클라이언트는 이를 통해 AssumeRoleWithWebIdentity API 를 호출합니다.
- STS 에서 web identity token 을 기반하여 검증을 수행하고, 검증이 완료되면 임시 자격 증명을 발급합니다.
- 최종적으로 클라이언트는 이 임시 자격 증명으로 AWS 리소스에 접근할 수 있습니다.
Web Identity Federation with Cognito
Web Identity Federation 을 구현하는 데 있어 Cognito 를 사용하는 것이 권장됩니다. 이는 다음의 과정들을 포합합니다:
- Cognito 를 사용하는 IAM role 을 생성합니다.
- OIDC IdP 와 AWS 간의 trust relationship 을 형성합니다.
다음의 과정이 완료되었다면 아래 사진의 흐름대로 Web Identity Federation 이 가능합니다.
- 먼저 클라이언트는 서드파티 IdP 를 통해 로그인합니다.
- 인증 후 서드파티 IdP 는 web identity token 을 발급합니다.
- 클라이언트는 web identity token 을 Amazon Cognito 에 전달합니다.
- Amazon Cognito 는 이를 기반하여 Cognito token 을 반환합니다.
- 발급받은 Cognito token 을 STS 에 제공합니다.
- STS 는 Cognito token 을 임시 자격 증명으로 변환해줍니다.
- 최종적으로 클라이언트는 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 에 대한 정리를 마칩니다.
'AWS' 카테고리의 다른 글
Terraform의 aws_iam_openid_connect_provider에 관하여 (0) | 2024.07.18 |
---|---|
[AWS IAM] Hands-on: Github Actions에 임시 자격 증명 사용하기 (0) | 2024.07.17 |
[AWS IAM] STS Basics (0) | 2024.07.15 |
[AWS CloudWatch] CloudWatch Agent와 stress를 통해 스왑 메모리 사용량 지표 추출하기 (0) | 2024.07.09 |
[AWS Network] Hands-on: Site-to-Site VPN Connection (1) | 2024.07.02 |