Keyclock을 구축하고, AWS Opensearch와 같은 서비스를 연동해본다.
사실 회사에서 사용중이지만 직접 구축하고, 연동해본 사례가 없기에 개인적인 학습 차원에서 시도 해보는것도 나쁘지 않다 생각하였다.
https://www.keycloak.org/
Keycloak은 사용자 인증 및 인가를 관리하기 위한 오픈 소스 Identity and Access Management (IAM) 시스템이다. Keycloak은 웹 애플리케이션 및 마이크로서비스 환경에서 사용자 인증, 권한 부여 및 보안 관리를 단순화하는 데 도움을 줄것으로 보인다.
다음은 ChatGPT가 소개하는 Keyclock의 주요 특징과 역할이다.
싱글 사인-온 (SSO): Keycloak은 사용자가 여러 애플리케이션 및 서비스에 대해 단일 로그인으로 인증될 수 있는 싱글 사인-온 (SSO)을 지원합니다. 사용자는 한 번 로그인한 후에 다른 애플리케이션으로 자동으로 인증됩니다.
다양한 인증 방법: Keycloak은 다양한 인증 방법을 지원하며, 사용자 이름/비밀번호, 소셜 로그인 (예: Google, Facebook), 다중요인 인증 (MFA), LDAP, SAML, OpenID Connect 등을 포함합니다.
권한 관리: Keycloak은 사용자 및 그룹 기반 권한 관리를 제공하여 애플리케이션 내에서 사용자에 대한 세밀한 권한 부여를 가능하게 합니다.
애플리케이션 통합: Keycloak은 다양한 애플리케이션 및 서비스와 통합할 수 있으며, 표준 기반의 프로토콜인 OAuth 2.0 및 OpenID Connect를 사용하여 인증 및 인가를 처리합니다.
사용자 관리: 사용자 등록, 프로필 관리, 암호 변경 및 비밀번호 복구와 같은 사용자 관리 기능을 제공합니다.
보안 강화: Keycloak은 보안을 강화하기 위한 다양한 기능을 제공하며, 보안 정책, 세션 관리, 로깅, 감사 기록, SSL/TLS 지원 등을 포함합니다.
다중 테넌시 지원: Keycloak은 다중 테넌시를 지원하여 여러 조직 또는 고객을 위한 독립된 보안 영역을 관리할 수 있습니다.
오픈 소스: Keycloak은 Red Hat에서 지원하는 오픈 소스 프로젝트로, 무료로 사용 가능하며 커뮤니티와 지원을 통해 개발과 관리를 지원합니다.
Keycloak은 복잡한 보안 요구 사항을 간단하게 처리하고, 사용자 관리 및 인증/인가 프로세스를 중앙 집중화하여 개발자 및 조직이 안전하게 애플리케이션을 개발 및 운영할 수 있도록 돕는 강력한 IAM 솔루션입니다.
위와같은 동작 방식을 이해하는데 도움이 될것 같다.
1. 사용자가 응용 프로그램에서 로그인 버튼을 클릭.
2. 응용 프로그램은 인증 요청을 생성.
3. 인증 요청은 302 리디렉션과 함께 사용자에게 전송.
4. 사용자는 리디렉션된 인증 엔드포인트로 이동하고 Keycloak은 로그인 페이지를 사용자에게 표시. 사용자는 사용자 이름과 비밀번호를 입력하고 폼을 제출.
5. Keycloak이 사용자 자격 증명을 확인한 후 인가 코드를 생성하고 이를 응용 프로그램으로 반환.
6. 응용 프로그램은 인가 코드를 ID Token 및 리프레시 토큰으로 교환. ID 토큰은 기본적으로 서명된 JSON Web Token (JWT) 따라서 그 형식은 Header.Payload.Signature 이며, 헤더와 페이로드는 Base64URL로 인코딩된 JSON 문서이다.
지난시간 스터디에서 배운 내역으로 다음과 같은 배경을 준비한다.
- EC2 : 테스트 목적으로 편리성을 위해 퍼블릭 접근이 가능한 EC2에 Keyclock 서비스를 동작
- AWS Opensearch : AWS 관리형 서비스 중 Opensearch를 생성하고, 인증 부문에서 Keyclock 서비스와 연동
- 그 외 다음과 같은 flow를 준비
- AWS Opensearch 대쉬보드에 접근 시 Keyclock을 통해서 인증 받은 후 접근 시도
EC2에 설치될 Keyclock은 다음과 같이 docker-compose
를 활용하여 구축한다.
version: '3'
services:
keycloak:
image: jboss/keycloak
environment:
- KEYCLOAK_USER=admin
- KEYCLOAK_PASSWORD=admin
ports:
- "8080:8080"
networks:
- keycloak-network
networks:
keycloak-network:
.
.
.
이리저리 구글링 및 ChatGPT에 문의하여 정리된 내역은 다음과 같다.
- Keyclock 17+ 버전에서는 기존 docker 환경변수와 약간 다르다.
- tcp/8080은 HTTP인데, 실제 웹콘솔에 접근해보면 다음과 같이 접근할 수 없게된다.
- container 동작에는 이상 없으나, 최초
bash ./opt/jboss/keycloak/bin/add-user-keycloak.sh -r master -u admin -p admin
와 같은 명령어를 컨테이너에서 동작되어야 한다. 그 후 docker-compose restart 명령어로 동일한 container ID를 사용하면서 재시작할 수 있도록 진행하였다.
결국 다음과 같은 docker-compose.yml 파일을 사용하였다.
version: '3'
services:
keycloak:
image: jboss/keycloak
environment:
- KEYCLOAK_ADMIN=admin
- KEYCLOAK_ADMIN_PASSWORD=admin
- KEYCLOCK_USER=test
- KEYCLOCK_PASSWORD=test
#- KC_HTTPS_CERTIFICATE_FILE=/home/ec2-user/server.crt.pem
#- KC_HTTPS_CERTIFICATE_KEY_FILE=/home/ec2-user/server.key.pem
#volumes:
#- /home/ec2-user/server.crt.pem:/home/ec2-user/server.crt.pem
#- /home/ec2-user/server.key.pem:/home/ec2-user/server.key.pem
ports:
- "8443:8443"
networks:
- keycloak-network
#entrypoint: /opt/keycloak/start-keycloak.sh
networks:
keycloak-network:
어찌어찌하여 결국 admin console 페이지까지 접근이 되었다.
동일하게 docker-compose로 생성할 수 있으나, 과거 경험상 security-module 활성화 및 idp 연동은 손이 많이타고 쉽지 않기에 약간의 비용이 발생하더라도 AWS 관리형 서비스로 쉽게 구축하고, Keyclock으로 연동을 수행해본다.
Openserach 생성 시 손쉬운 생성
이 있지만 현재 테스트 목적에는 과도한 인스턴스 및 구성이기에 사용자 지정 생성
으로 최소 사양으로 구축을 시도한다.
위는 손쉬운 생성
시의 인스턴스 유형 및 노드 수이며, 아래와 같은 세팅으로 구축 진행
특히 Public Access는 일반적으로 사용하지 않겠지만, 테스트의 편리성을 고려하여 활성화
또한 임시로 마스터 사용자를 설정해두고, SAML 인증은 Keyclock 세팅 후 연동할 수 있도록 한다.
마지막으로 위와 같은 설정시 max.bool_query 관련된 오류가 발생할 수 있다.
이때에는 최하단 옵션의 고급 클러스터 설정
에서 최대 절 수를 적당한 값(예를들어 1,024)로 입력하면 생성이 가능하다.
Keyclock 세팅은 할게 많았다. 천천히 다음과 같이 진행시 문제될 사항은 없어보였다.
AD 등 다양한 유저를 연동하고 싶었으나 생략하고, 추후 진행해볼 수 있도록 한다.
Opensearch 보안설정 편집에서 SAML 인증을 활성화 시키고 다음과 같은 추가 세팅을 진행한다.
1. IdP의 메타데이터 값으로 Keyclock의 Realm Setting > Endpoint > SAML 2.0 Identity Provider Metadata 클릭 후 출력되는 XML 값을 입력
역할 키
값으로 Role
입력
역시나 한방에 되지 않았다. 😅 무엇이 문제인가
메인페이지에 내가 등록한
ahss-keyclock
까지는 잘 출력되었으나, 접근하면 다음과 같은 오류가 발생되었다.
{"statusCode":500,"error":"Internal Server Error","message":"Internal Error"}
실제 Opensearch 서비스는 정상 상태이다.
{"error":{"root_cause":[{"type":"security_exception","reason":"no permissions for [cluster:monitor/health] and User [name=arn:aws:iam::422872899572:user/tester, backend_roles=[], requestedTenant=null]"}],"type":"security_exception","reason":"no permissions for [cluster:monitor/health] and User [name=arn:aws:iam::422872899572:user/tester, backend_roles=[], requestedTenant=null]"},"status":403}
위와같은 메시지까지는 확인된다. 결국 인증 관련된걸 연습하고 학습하려다가 인증 관련된 문제가 있어 보인다.
문제는 크게 2가지였고, 모두 개선하였을때 정상적으로 Keyclock을 이용한 IdP가 구현된것으로 보인다.
다음은 CloudWatch에 출력된 2가지 사항이다
- roles_key is not configured, will only extract subject from SAML
- Error while validating SAML response com.onelogin.saml2.exception.ValidationError: Found an Attribute element with duplicated Name...
- SAML Mapper가 동일한 이름으로 2개가 Keyclock에 설정되어 있었기에 Opensearch 에서는 둘 중 선택하지 못하고 중복된 속성으로 판단하여 VailidationError를 발생한것으로 보인다. 이는 기존에 직접 만든것을 제거하고, Keyclock에서 Identity Provider에서 SAML을 추가하는 방식으로 해결
이후 정상적으로 Keyclock의 User를 이용하여 Opensearch에 로그인이 가능
추후 AD 연동 등으로 확대 테스트를 목표로 여기서 일시 중지한다.
https://www.keycloak.org/
https://mr-zero.tistory.com/568
https://docs.aws.amazon.com/ko_kr/opensearch-service/latest/developerguide/saml.html