AWS 기술 블로그

Amazon Redshift와 Keycloak을 활용한 사설망 내 중앙 집중화된 사용자 인증 및 권한 관리 – ID 페더레이션 구성

안내

글은 총 5개의 이어지는 글로 구성된 Amazon Redshift Keycloak 활용한 사설망 중앙 집중화된 사용자 인증 권한 관리 시리즈의 첫번째 글에 해당됩니다. 사설망에서 ID Federation 통하여 Amazon Redshift 연결, 사용하고 상세 수준 권한관리를 하시려는 독자분들께서는 시리즈의 첫번째 부터 순서대로 읽으시며 실습을 겸하시면 필요한 구성을 성공적으로 진행하실 있습니다. 

** 글에서 이어집니다.

단계 5: ID 페더레이션 구성

이제 클라이언트가 Amazon JDBC 드라이버를 사용해서 ID 페더레이션으로 Amazon Redshift 데이터베이스에 액세스할 수 있도록 Keycloak과 AWS IAM을 구성하겠습니다.

본격적인 구성에 들어가기 앞서, 자격 증명 공급자가 사용자를 인증하고 SAML 플러그인에 응답을 생성할 때 사용하는 SAML 속성(Attributes)에 대해 이해해야 합니다. 이 SAML 속성들은 Keycloak에서 설정되며, SAML 플러그인이 AWS STS로부터 임시 자격 증명을 획득하는 데 활용됩니다. 또한, 이 속성들은 Amazon Redshift 사용자 인증, 권한 부여, 세션 관리 등에 중요한 역할을 합니다.

속성 설명 비고
https://aws.amazon.com/SAML/Attributes/Role 사용자가 맡을 수 있는 IAM 역할을 정의 합니다. IAM 역할과 SAML 공급자 ARN을 쉼표로 구분하여 지정합니다.
https://aws.amazon.com/SAML/Attributes/RoleSessionName 임시 자격 증명 식별자입니다. 사용자 세션 식별자입니다. 이메일 주소나 사용자 이름을 지정합니다.
https://aws.amazon.com/SAML/Attributes/SessionDuration 세션 지속 시간을 지정합니다. 초 단위로 지정합니다.(예: 3600초)
https://redshift.amazon.com/SAML/Attributes/DbUser Redshift 데이터베이스 사용자 이름입니다. 사용자 세션 식별자입니다. 이메일 주소나 사용자 이름을 지정합니다.
https://redshift.amazon.com/SAML/Attributes/DbGroups 사용자가 속할 Redshift 데이터베이스 그룹을 지정합니다. 일반적으로 IdP의 사용자 그룹과 동일합니다.
https://aws.amazon.com/SAML/Attributes/PrincipalTag:RedshiftDbUser RedshiftDbUser 세션 태그를 지정합니다. 사용자 세션 식별자입니다. 이메일 주소나 사용자 이름을 지정합니다.
https://aws.amazon.com/SAML/Attributes/PrincipalTag:RedshiftDbGroups RedshiftDbGroups 세션 태그를 지정합니다. 일반적으로 IdP의 사용자 그룹과 동일합니다.
https://redshift.amazon.com/SAML/Attributes/AutoCreate 데이터베이스 사용자가 존재하지 않을 경우 자동 생성 여부를 지정합니다. IdP에서 인증된 사용자가 Redshift에 자동으로 생성됩니다.

5.1. Keycloak에 AWS를 SAML 서비스 제공자로 구성합니다.

Amazon Redshift JDBC 드라이버의 SAML 플러그인과 통신할 수 있는 새로운 SAML 클라이언트를 앞서 생성한 AWS-IAM-IDP realm에 생성합니다.

5.1.1.  AWS signin saml-metadata 파일을 다운로드 받은 후 Realm에 새로운 SAML 클라이언트를 등록합니다.

https://region-code.signin.aws.amazon.com/static/saml-metadata.xml 또는 https://signin.aws.amazon.com/static/saml-metadata.xml 파일을 Realm에 신규 클라이언트로 등록해서 AWS가 서비스 제공자임을 Keycloak에 알립니다.

AWS가 제공한 saml-metadata.xml 파일로 등록한 신규 클라이언트의 클라이언트 ID는 urn:amazon:webservcies 입니다.

5.1.2.   SAML 클라이언트(urn:amazon:webservices) 액세스 구성(Access settings)

SQL 클라이언트가 Amazon Redshift 클러스터로 연결을 요청할 때 사용자 인증을 위한 로그인 화면을 표시하고, 사용자 인증 후 Keycloak의 SAML 인증 응답을 SAML 플러그인에 제공할 수 있도록 구성합니다.

  • Home URL: 인증 서버가 클라이언트로 리디렉션되거나 클라이언트로 연결되어야 할 때 사용 하는 기본 URL입니다. 이 글에서는 사용자가 윈도우 인스턴스의 SQL 클라이언트에 적용할 로그인 URL입니다.
# Home URL 필드 입력 예
/realms/AWS-IAM-IDP/protocol/saml/clients/signin

# SQL 클라이언트에 적용할 로그인 URL 예
https://ip-10-0-31-38.ap-northeast-2.compute.internal:8081/realms/AWS-IAM-IDP/protocol/saml/clients/signin
Bash

사용자가 SQL 클라이언트를 통해 Keycloak 인증 완료 후 브라우저에 보여지는 화면
  • IDP-Initiated SSO URL name: 사용자가 먼저 서비스 제공자에 접근하고 인증을 위해 자격 증명 공급자로 리디렉션되는 SP-Initiated SSO 방식과는 반대로 자격 증명 공급자에서 먼저 인증 프로세스가 시작되는 방식입니다. 이 글에서는 Keycloak에서 사용자를 인증한 후에AWS 서비스(서비스 제공자)로 리디렉션할 것이기 때문에 URL name 값을 입력합니다. 값을 입력하지 않으면 IDP-Initiated SSO가 비활성화 됩니다.

5.1.3. SAML 클라이언트의 엔드포인트 구성(Fine Grain SAML Endpoint Configuration)

Keycloak에서 사용자 인증이 완료된 후, SAML Assertion을 포함한 SAML 인증 응답을 SAML 플러그인에 전달할 수 있도록 다음과 같이 설정합니다.

  • Assertion Consumer Service POST Binding URL: Keyclocak 클라이언트의 SAML 인증 응답을 위한 POST 바인딩 URL입니다. 이 글에서는 윈도우 인스턴스의 SAML 플러그인이 실행한 로컬 서버의 URL입니다.

SQL 클라이언트에서 페더레이션 사용자 인증 완료 후 Keycloak 클라이언트의 SAML 인증 응답을 SAML-tracer 플러그인으로 캡처한 화면

5.2. AWS IAM에서 Keycloak을 자격 증명 공급자로 구성합니다.

5.2.1. Keycloak의Realm(AWS-IAM-IDP) 메타데이터 문서파일을 다운로드합니다.

AWS-IAM-IDP realm의 메타데이터 문서파일을 AWS IAM에 등록해서 Keycloak이 자격 증명 공급자임을 알립니다. Keycloak의 메타데이터 문서파일을 아래와 같이 Realm settings 메뉴에서 다운로드합니다.

5.2.2. 다운로드 받은 Realm 메타데이터 문서파일로 AWS IAM에 새로운 자격 증명 공급자를 등록합니다.

  • Provider name: keycloak

Keycloak의 Realm 이름과 AWS IAM의 자격 증명 공급자 이름을 반드시 동일하게 설정할 필요는 없습니다.

5.3. 단계3.에서 생성한 페더레이션 사용자(redshift.admin@mycompany.local)에게 부여할 IAM 역할을 생성합니다.

5.3.1. 자격 증명 공급자와 연동할 AWS IAM 역할을 생성합니다.

  • 역할 이름: AWS IAM 역할 이름으로 Redshift-Admin-Role을 사용합니다.
  • 신뢰할 수 있는 엔터티 유형: SAML 2.0 연동을 선택합니다.
  • SAML 2.0 연동: 단계 2에서 등록한 keycloak을 AWS 외부 자격 증명 공급자로 선택합니다.
  • 액세스 허용: 프로그래밍 방식 액세스만 허용합니다.
  • 속성: SAML:aud를 선택합니다.
  • 값: SQL 클라이언트 단말에서 SAML 플러그인이 실행하는 로컬서버의 URL인 http://localhost:7890/redshift/을 입력합니다. 이 값은 Keycloak SAML 클라이언트(urn:amazon:webservices)의 Valid redirect URIs, POST Binding URL과 동일합니다.(단계 1 참조)
  • 권한 정책: AWS 관리형 정책인 AmazonRedshiftFullAccess, AmazonGlueServiceRole, AmazonS3FullAccess를 선택합니다. 이 중 AmazonRedshiftFullAccess 정책에는 모든 Amazon Redshift 클러스터 배포 유형으로부터 임시 데이터베이스 자격 증명을 획득할 수 있는 작업이 기본적으로 포함되어 있습니다. AmazonGlueServiceRole, AmazonS3FullAccess 정책은 ‘Amazon Redshift와 Keycloak를 활용한 스키마와 사용자 권한 관리’ 단원에서 사용합니다.

5.3.2. Redshift-Admin-Role 역할의 신뢰 정책을 수정합니다. 신뢰 정책은 역할 생성 시 편집도 가능합니다.

sts:AssumeRoleWithSAML은 자격 증명 공급자가 사용자 인증 완료 후 SAML 플러그인으로 전달한 SAML 인증 응답(그림 2의 4)으로 AWS STS에 임시 보안 자격 증명을 요청하는 작업(그림 2의 5)입니다. 이 작업은 Redshift-Admin-Role 역할 생성 시 자동으로 허용 됩니다. 하지만 SAML Assertion에 PrincipalTag SAML 속성(예: https://aws.amazon.com/SAML/Attributes/PrincipalTag:RedshiftDbUser)을 포함하려면 sts:TagSession 작업을 추가적으로 허용해야 합니다. 이 글에서는 PrincipalTag:RedshiftDbUser 속성을 사용하기 때문에 아래와 같이 신뢰 정책에 sts:TagSession 작업을 추가로 허용합니다.

5.4. Keycloak SAML 클라이언트에서 SAML Assertion을 위한SAML 속성 구성

이 단계에서는 Keycloak 사용자 계정(redshift.admin@mycompany.local)에 AWS IAM 역할(Redshift-Admin-Role)을 부여하기 위한 설정을 진행합니다. 우선 urn:amazon:webservices SAML 클라이언트에서 사용자 계정 그룹에 할당할 역할(redshift_admin_role)을 만들고, 이를 AWS IAM 역할과 관계를 정의합니다.

그림 4: Keycloak SAML 클라이언트의 역할과 AWS IAM 역할 관계 정의

이어서 Keycloak이 사용자 인증 후 SAML Assertion을 생성하고, 이를 Amazon Redshift JDBC 드라이버에서 전달할 수 있도록 SAML 속성을 구성합니다. 이 글에서는 기본 속성인 RoleSession과 Role, 그리고 PrincipalTag:RedshiftDbUser 속성만을 다루도록 하겠습니다.

5.4.1. SAML 클라이언트(urn:amazon:webservcies) 기본 환경 구성

5.4.1.1. Client scopes에서 role_list를 삭제합니다.

5.4.1.2. Client scopes에서 Full scope allowed를 Off로 변경합니다.

5.4.1.3. 단계1에서 SAML 클라이언트를 신규로 등록했을 때 Client scopes에 자동으로 등록된 Mappers를 제거합니다. 삭제한 SAML 속성들은 뒤에서 다시 설정합니다.

  • 삭제 대상 Mapper Name
    • https://aws.amazon.com/SAML/Attributes/Role
    • https://aws.amazon.com/SAML/Attributes/RoleSessionName

5.4.2. SAML 클라이언트의 Roles 탭에서 역할을 생성합니다. 이 역할은 AWS IAM 역할 Redshift-Admin-Role과 Keycloak 사용자 그룹의 관계를 정의하는데 사용됩니다. 이 글에서는 역할 이름으로 redshift.admin.role을 사용합니다.

5.4.3. SAML 플러그인으로 SAML 인증 응답을 제공할 때 Keycloak SAML 클라이언트의 역할(redshift.admin.role)을 AWS IAM 역할(Redshift-Admin-Role)로 변경하기 위해서 SAML 클라이언트의 Client scopes 탭에서SAML 클라이언트 역할과 AWS IAM 역할의 관계를 정의하는 Mapper를 추가합니다.

  • Mapper type: Role Name Mapper
  • Name: 두 역할의 관계를 설명하는 이름을 정의합니다.(예:Mapping Redshift Admin Role)
  • Role: 단계4.2에서 생성한 Keycloak 클라이언트의 역할 redshift.admin.role을 선택합니다.
  • New Role Name: 다음 두개의 ARN(Amazon Resource Number)을 콤마로 구분해서 입력합니다.
#입력 형식: <AWS IAM 역할의 ARN>,<AWS IAM 자격 증명 공급자의 ARN>
# AWS IAM 자격 증명 공급자의 ARN: 단계2에서 AWS IAM에 등록한 SAML 2.0 기반 자격 증명 공급자 keycloak의 ARN
# AWS IAM 역할의 ARN: 단계3에서 자격 증명 공급자 keycloak을 신뢰하는 정책을 포함하는 IAM 역할 Redshift-Admin-Role의 ARN
arn:aws:iam::account-id:role/Redshift-Admin-Role,arn:aws:iam::account-id:saml-provider/keycloak
Bash

5.4.4. SAML Assertion을 생성하기 위한 SAML 속성을 정의합니다.

5.4.4.1. RoleSessionName 속성을 Mapper로 추가합니다.

  • Mapper type: User Property
  • Name: RoleSessionName
  • Property: username, email 등 사용자 속성 정보 중 세션 정보로 사용할 정보를 선택합니다. 이 글에서는 사용자 속성 정보로 email을 사용합니다.
  • Fridendly Name: RoleSessionName
  • SAML Attribute Name: https://aws.amazon.com/SAML/Attributes/RoleSessionName

5.4.4.2. Role 속성을 Mapper로 추가합니다.

단계 5.4.3에서 생성한 Role Name Mapper 정보를 기반으로 Keycloak 사용자 계정 역할을 AWS IAM 역할로 변경해 SAML 응답을 생성하기 위한 SAML 속성을 구성합니다.

  • Mapper type: Role list
  • Name: Role
  • Role attribute name: https://aws.amazon.com/SAML/Attributes/Role
  • Friendly Name: Role

5.4.4.3. PrincipalTag:RedshiftDbUser 속성을 추가합니다.

Amazon Redshift 서버리스 작업 그룹에 액세스할 때 이 속성을 추가 하지 않으면 IAMR:<iam-role-name> 형태로 DB 사용자가 생성되고, 이 속성을 추가할 경우 IAMR:<keycloak-user-email> 형태로 DB 사용자가 생성됩니다. 그리고 이 속성을 사용하려면 사용자에게 부여할 IAM 역할에 sts:TagSession 작업을 허용해야 합니다.

  • Mapper type: User Property
  • Name: RedshiftDbUser
  • Propertiy: username, email 등 사용자 속성 정보 중 세션 정보로 사용할 정보를 선택합니다. 이 글에서는 email을 선택했습니다.
  • Role attribute name: https://aws.amazon.com/SAML/Attributes/PrincipalTag:RedshiftDbUser
  • Fridendly Name: RedshiftDbUser

5.4.5. Realm 사용자 계정 그룹과 SAML 클라이언트 역할을 연결합니다.

AWS-IAM-IDP realm 사용자 그룹 redshift.admin.group에 SAML 클라이언트 역할 redshift.admin.role을 아래와 같이 부여합니다.

이제 AWS-IAM-IDP realm의 사용자 계정(redshift.admin@mycompany.local)은 SQL 클라이언트에서 urn:amazon:webservices SAML 클라이언트를 통해 사용자 인증을 하고 AWS IAM 역할 Redshift-Admin-Role로 AWS 서비스를 이용할 준비가 되었습니다. 이 구성을 반복해서 사용자 계정 redshift.user@mycompany.local을 아래와 같이 추가합니다.

이후 ‘Amazon Redshift를 활용한 스키마와 사용자 권한 관리’ 단원에서 redshift.admin@mycompany.local 사용자 계정은 스키마 사용자 역할을 부여 받고 redshift.user@mycompany.local 사용자는 스키마 관리자 역할을 부여 받습니다.

그림 5: AWS-IAM-IDP realm에 사용자 계정(redshift.user@mycompany.local) 추가 생성

** 다음 글로 이어집니다.

Joonghoon Shin

Joonghoon Shin

신중훈 솔루션즈 아키텍트는 금융 고객을 대상으로 클라우드 전략을 제안하고 클라우드 전환을 지원하는 역할을 수행하고 있습니다.

JeongKwon Lee

JeongKwon Lee

이정권 솔루션 아키텍트는 Redshift 서비스를 중심으로 AWS 기반의 서비스를 구성하고자 하는 고객분들께 클라우드 환경에 최적화된 아키텍처 가이드와 POC 등을 지원하는 역할을 수행하고 있습니다.

JongHyok Lee

JongHyok Lee

이종혁 Sr Analytics Specialist SA는 데이터와 애플리케이션 영역의 분석, 설계 및 구현과 관련된 다양한 경험을 바탕으로 고객분들께서 AWS의 분석 서비스들을 잘 활용하실 수 있도록 기술적인 도움을 드리고 있습니다.