AWS 기술 블로그
Amazon Redshift와 Keycloak을 활용한 사설망 내 중앙 집중화된 사용자 인증 및 권한 관리 – Amazon Redshift JDBC 드라이버 구성 및 ID 페더레이션 실행
안내
이 글은 총 5개의 이어지는 글로 구성된 Amazon Redshift와 Keycloak을 활용한 사설망 내 중앙 집중화된 사용자 인증 및 권한 관리 시리즈의 첫번째 글에 해당됩니다. 사설망에서 ID Federation을 통하여 Amazon Redshift를 연결, 사용하고 상세 수준 권한관리를 하시려는 독자분들께서는 시리즈의 첫번째 글 부터 순서대로 읽으시며 실습을 겸하시면 필요한 구성을 성공적으로 진행하실 수 있습니다.
- 글 1 : 솔루션 개요 및 환경 준비
- 글 2 : 사설망 내 Amazon Redshift 클러스터 생성 및 PrivateLink 구성
- 글 3 : ID 페더레이션 구성
- 글 4 : Amazon Redshift JDBC 드라이버 구성 및 ID 페더레이션 실행
- 글 5 : Amazon Redshift와 Keycloak를 활용한 스키마와 사용자 권한 관리
** 앞 글에서 이어집니다.
단계 6: Amazon Redshift JDBC 드라이버 구성 및 ID 페더레이션 실행
이 단계에서는 윈도우 인스턴스에서 SQL 클라이언트 툴을 통해 Amazon Redshift 프로비저닝 클러스터와 서버리스 작업 그룹에 ID 페더레이션으로 각각 접속해보겠습니다.
먼저, 단계 1에서 사용자 단말에 설치한 도구 목록은 다음과 같습니다.
- SQL 클라이언트: SQL WorkBench/J
- Amazon JDBC 드라이버(AWS Java용 SDK 드라이버 종속 라이브러리 파일이 포함된 ZIP 파일)
- 파이어폭스 브라우저
- 파이어폭스 SAML-tracer 플러그인
6.1. SQL 클라이언트(SQL Workbench/J)에 Amazon Redshift JDBC 드라이버를 추가합니다.
- Class name: com.amazon.redshift.jdbc42.Driver
6.2. Amazon Redshift 프로비저닝 클러스터에 접속합니다.
6.2.1. Amazon Redshift 프로비저닝 클러스터의 엔드포인트를 확인합니다.
- AWS 관리 콘솔에서 JDBC URL을 확인하는 방법
- AWS CLI를 통해 JDBC URL을 확인하는 방법은 단계 2를 참조하세요.
- IAM 자격 증명을 사용하도록 JDBC 연결 구성을 참조해서, 아래와 같이 Connection Profile의 URL에 jdbc:redshift: 다음에 iam:을 붙여서 입력합니다.
6.2.2. Extended Properties를 설정합니다.
- login_url: 단계5.1.2에 설정한 urn:amazon:webservices SAML 클라이언트의 Home URL을 참조하세요.
- plugin_name: com.amazon.redshift.plugin.BrowserSamlCredentialsProvider
- ssl_insecure: true
- idp_response_timeout: 60
- groupfederation: true(이 옵션은 프로비저닝 클러스터에만 적용합니다). 이 옵션이 True인 경우 Amazon Redshift는 IAM 자격 증명을 사용하여 처음 데이터베이스에 연결할 때 접두사 IAMR:가 붙은 Amazon Redshift 자격 증명을 자동으로 생성하지만 False인 경우 접두사 IAM:가 붙은 자격 증명을 생성합니다. 이 옵션을 False로 사용할 경우 GetClusterCredentials API와 AutoCreate 파라미터에 대한 이해가 필요합니다. 자세한 내용은 다음을 참고하세요.
Groupfederation 값 | 임시 데이터베이스 자격 증명 생성을 위한 Amazon Redshift API | Amazon Redshift 자격 증명 자동 생성 여부 |
True | GetClusterCredentialsWithIAM | AutoCreate속성 값과 무관하게 자동으로 생성 됨 |
False | GetClusterCredentials | AutoCreate 값에 의존적이며 True 인 경우 자동 생성 됨 |
6.2.3. SQL 클라이언트에서 Amazon Redshift프로비저닝 클러스터에 접속합니다.
사용자가 SQL 클라이언트를 통해 Amazon Redshift 프로비저닝 클러스터에 연결을 시도하면, Keycloak 로그인 화면이 나타납니다. 사용자가 Keycloak 자격 증명으로 로그인에 성공하면, Keycloak SAML 클라이언트는 SAML 플러그인이 실행 중인 사용자 윈도우 인스턴스의 로컬 서버(기본 포트 7890)로 SAML 인증 응답을 전송합니다. SAML 플러그인은 Keycloak SAML 응답을 사용하여 AWS STS로부터 임시 보안 자격 증명을 획득하고, 이를 통해 Amazon Redshift API가 제공하는 임시 데이터베이스 자격 증명으로 로그인합니다.
그림 7: SQL Workbench/J에서 Amazon Redshift 프로비저닝 클러스터에 싱글 사인온 액세스
로그인 완료 후 SQL 스크립트로 DB 사용자 정보를 확인해보면 Keycloak 사용자 계정의 email 앞에 IAMR: 접두사가 붙어 있습니다. 이것은 IAM 역할을 사용하여 처음 데이터베이스에 연결하면, Amazon Redshift는 자동으로 동일한 이름의 Amazon Redshift 자격 증명을 생성하기 때문입니다.
만일 IAM 자격 증명(IAM Identity, IAM ID)이 역할이 아니라 사용자일 경우IAM: 접두사가 붙고, CURRENT_SESSION_ARN도 다음과 같은 형태로 출력됩니다. 기존 커넥션 구성을 변경해서 검증하려면 아래를 참고하세요.
- groupfederation: false로 변경
- autocreate: true 추가
6.2.4. 사용자 인증이 완료되면 SAML 클라이언트는 윈도우 인스턴스의 로컬 서버로 SAML 응답을 전달합니다. 이 응답은 아래와 같이 SAML-tracer 플러그인으로 확인할 수 있습니다.
6.2.5. 사용자 계정 접속 기록을 AWS CloudTrail에서 확인합니다.
6.2.5.1. Keycloak의 SAML 인증 응답을 수신한 SAML 플러그인(그림 2의 4)은 임시 보안 크리덴셜을 얻기 위해 AWS STS의 AssumeRoleWithSAML API를 호출합니다.(그림 2의 5) 이 작업은 AWS CloudTrail에 기록되고 내용은 아래와 같습니다. API를 호출한 소스 IP 주소는 SQL 클라이언트가 설치된 윈도우 인스턴스의 사설 IP 주소이고, Keycloak의 SAML 인증 응답이 SAML 플러그인에 의해 AWS STS 엔드포인트로 전달된 것을 확인할 수 있습니다. 그리고 AWS STS에 전달된 Keycloak의 SAML 인증 응답에는 다음 SAML 속성이 포함되어 있는 것을 확인할 수 있습니다.
- RoleSessionName: email 형식의 사용자 세션 이름
- PrincipalTags:RedshiftDbUser: email 형식의 사용자 세션 이름
- Role ARN: 사용자가 부여 받을 AWS IAM 역할 ARN
- Principal ARN: AWS IAM에 자격 증명 공급자로 등록한 keycloak ARN 또한 AssumeRoleWithSAML API의 응답에는 임시 보안 자격 증명 만료 시간이 1시간 후인 것을 확인할 수 있습니다.
6.2.5.2. ID 페더레이션으로 임시 데이터베이스 자격 증명을 얻기 위해 GetClusterCredentialsWithIAM API를 호출한 로그를 확인합니다. 소스 IP주소는 AWS STS API를 호출한 동일한 윈도우 인스턴스의 사설 IP 주소이고 AWS STS로부터 반환된 임시 보안 자격 증명으로 임시 데이터베이스 자격 증명을 얻기 위해Amazon Redshift 클러스터 API를 호출한 것을 확인할 수 있습니다. 또한 GetClusterCredentialsWithIAM API는 Amazon Redshift 엔드포인트(redshift.region-code.amazonaws.com)를 통해 제공되는 것을 확인할 수 있습니다.
JDBC 커낵션 설정 시 groupfederation 옵션 값을 false로 설정한 경우 GetClusterCredentials API를 확인해야 합니다.
6.2.6. Keycloak에서 사용자 세션 정보를 확인합니다.
페더레이션 사용자가 SQL 클라이언트를 통해 Redshift 프로비저닝 클러스터에 싱글 사인온으로 로그인하면, urn:amazon:webservices SAML 클라이언트로 생성된 사용자 세션을 아래와 같이 확인할 수 있습니다.
6.3. Amazon Redshift 서버리스 작업 그룹에 접속합니다.
6.3.1. Amazon Redshift 서버리스 작업 그룹의 JDBC URL을 확인합니다.
- AWS 관리 콘솔에서 JDBC URL을 확인하는 방법
- AWS CLI를 통해 JDBC URL을 확인하는 방법은 단계2를 참조하세요.
- IAM 자격 증명을 사용하도록 JDBC 연결 구성을 참조해서, 아래와 같이 Connection Profile의 URL에 jdbc:redshift: 다음에 iam:을 붙여서 입력합니다.
6.3.2. Extended Properties를 설정합니다.
Amazon Redshift 프로비저닝 클러스터 연결 구성과 groupFederation 파라미터를 제외하고 동일합니다.
- login_url: 단계1.2에 설정한 urn:amazon:webservices SAML 클라이언트의 Home URL을 참조하세요.
- plugin_name: com.amazon.redshift.plugin.BrowserSamlCredentialsProvider
- ssl_insecure: true
- idp_response_timeout: 60
6.3.3. SQL 클라이언트에서 Amazon Redshift 서버리스 작업 그룹에 접속합니다.
사용자가 SQL 클라이언트를 통해 Amazon Redshift 서버리스 작업 그룹에 대한 연결을 요청할 때, 다음과 같은 프로세스가 진행됩니다. 먼저 AWS STS로부터 임시 보안 자격 증명을 획득합니다. 이 과정은 프로비저닝 클러스터에 접속할 때와 동일합니다. 하지만 임시 보안 자격 증명으로부터 임시 데이터베이스 자격 증명을 생성하는 엔드포인트와 API는 프로비저닝 클러스터와 다릅니다. 그리고 임시 데이터베이스 자격 증명 획득 후 데이터베이스에 로그인하는 것은 프로비저닝 클러스터에 연결하는 방식과 동일합니다.
Redshift 클러스터 배포 유형 | Redshift엔드포인트의 프라이빗 DNS 이름 | 임시 데이터베이스 자격 증명 생성 API |
Redshift 서버리스 작업 그룹 | redshift-serverless.region-code.amazonaws.com | GetClusterCredentialsWithIAM GetClusterCredentials |
Redshift 프로비저닝 클러스터 | redshift.region-code.amazonaws.com | GetCredentials |
SQL Workbench/J에서 Amazon Redshift 서버리스 작업그룹에 싱글 사인온 액세스
로그인 완료 후 아래와 같이SQL 스크립트로 프로비저닝 클러스터에 접속할 때와 동일한 DB 사용자 정보를 확인할 수 있습니다.
페더레이션 사용자는 Amazon Redshift 배포 유형에 관계없이 동일한 Keycloak 사용자 계정과 AWS IAM 역할로 Redshift 클러스터에 연결할 수 있습니다.
6.3.4. 사용자 인증이 완료되면 SAML 클라이언트는 사용자 윈도우 인스턴스의 로컬서버로 SAML 응답을 전달합니다. 이 응답은 아래와 같이 SAML-tracer 플러그인으로 확인할 수 있습니다.
6.3.5. 사용자 접속 기록을 AWS CloudTrail에서 확인합니다.
6.3.5.1. SAML 플러그인이 Amazon Redshift에 접속하기 위해 Keycloak의 SAML 응답으로부터 AWS STS의 AssumeRoleWithSAML API를 호출해서 임시 보안 자격 증명을 획득하는 로그입니다. 이 과정은 Amazon Redshift 클러스터 배포 유형과 관계없이 동일합니다.
6.3.5.2. ID 페더레이션으로 임시 데이터베이스 자격 증명을 획득하기 위해 호출하는 Amazon Redshift 서비스 엔드포인트와 API는 Redshift 클러스터 배포 유형에 따라 다릅니다. 따라서, 서버리스 작업 그룹에 접속하기 위해 임시 데이터베이스 자격 증명을 획득하는 로그를 확인하려면 GetCredentials 이벤트를 확인해야 합니다. 또한 GetCredentials API는 Amazon Redshift 서버리스 엔드포인트를 통해 제공되는 것을 확인할 수 있습니다.
6.3.6. Keycloak에서 사용자 세션 정보를 확인합니다.
페더레이션 사용자가 SQL 클라이언트를 통해 서버리스 작업 그룹에 싱글 사인온으로 로그인하면,
urn:amazon:webservices SAML 클라이언트로 생성된 사용자 세션을 아래와 같이 확인할 수 있습니다.
지금까지 AWS 외부에 구축한 IAM 솔루션을 통해 Amazon Redshift에 액세스하는 과정과, 오픈 소스 IAM 솔루션인 Keycloak을 자격 증명 공급자로 구성해서 ID 페더레이션 사용자가 Amazon Redshift에 IAM Role로 로그인하는 환경을 구성해봤습니다. 이어서 ID 페더레이션 환경에서 Amazon Redshift 스키마와 사용자 권한 관리 방법을 알아보겠습니다.
** 다음 글로 이어집니다.