0부터 시작하는 Keycloak 공부 - OIDC를 이용한 Keycloak & Sonarqube SSO 연동

Jaehong Lee·2023년 8월 16일
3
post-thumbnail

1. 목표

  • Sonarqube는 기본적으로 SSO 연동에 SAML만 지원한다. 허나 SAML은 다음과 같은 단점을 가지고 있다

    1. 브라우저 종속성 : SAML은 응답과 요청 메시지가 XML형식이므로 브라우저에서만 작동한다
    2. 성능 : 인증 인가 과정에서 여러 단계의 메시지 교한과 Redirection이 발생하여 성능이 떨어질 수 있다
    3. 복잡성 : 복잡한 XML 메시지를 사용하기에 설정 및 구현에 어려움이 있다
  • 이를 보안하기 위해 Sonarqube에 OIDC Plugin을 설치하여 Keycloak과 SSO 연동을 하고자 한다


2. Sonarqube Image 설정

JKS에 Root CA 인증서 등록

  • Keycloak은 HTTPS와 HTTP 둘 다 지원한다. 하지만 Keycloak을 안전하게 운영하기 위해선 HTTPS를 사용해야 한다. 우리는 Keycloak에 사설 TLS 인증서를 등록하였다. 따라서 Sonarqube에 사설 TLS 인증서 발급에 사용한 Root CA 인증서를 등록해야 한다

  • SonarQube는 JVM 위에서 동작한다. 따라서 JKS에 Root CA 인증서를 등록해야 한다. SonarQube 10버전은 OpenJDK 17을 사용하는데, OpenJDK 17은 /opt/java/openjdk/lib/security 디렉토리에 있는 cacerts라는 JKS 형식의 인증서 저장소에 Root CA 인증서를 저장한다

sonarqube@sonarqube-sonarqube-0:/opt/java/openjdk/lib/security$ ls
blocked.certs  cacerts  default.policy  public_suffix_list.dat
  • 해당 파일에 Root CA 인증서를 등록하기 위해선 JKS로 변환해야 하기에 Keytool을 사용해야 한다
keytool -importcert -keystore "keystore 위치" -storepass "keystore 비밀번호"  -alias "인증서 구분을 위한 명칭" -file "인증서 파일 위치" -noprompt
  • 등록하기 위한 명령어는 위와 같다
  • noprompt 옵션을 사용하지 않으면, Root CA 등록 시 Trust this certificate? 질문에 수동으로 답해줘야 한다. 우리는 Dockerfile Script를 통해 과정을 자동화해야 하므로 noprompt 옵션을 사용해야 한다
FROM sonarqube:10.0.0-community
USER root
COPY localCA.pem /opt/java/openjdk/lib/security/localCA.pem
RUN /bin/bash -c 'keytool -importcert -alias bongca -keystore /opt/java/openjdk/lib/security/cacerts -file /opt/java/openjdk/lib/security/localCA.pem -storepass changeit -noprompt'
  • Dockerfile에 위 내용을 추가하자

Sonarqube OIDC Plugin 설치

출처 : https://github.com/vaulttec/sonar-auth-oidc

wget sonar-auth-oidc-plugin-2.1.1.jar
  • 플러그인 jar 파일 다운로드
FROM sonarqube:10.0.0-community
USER root
COPY localCA.pem /opt/java/openjdk/lib/security/localCA.pem
RUN /bin/bash -c 'keytool -importcert -alias bongca -keystore /opt/java/openjdk/lib/security/cacerts -file /opt/java/openjdk/lib/security/localCA.pem -storepass changeit -noprompt'
ADD sonar-auth-oidc-plugin-2.1.1.jar /opt/sonarqube/extensions/plugins/sonar-auth-oidc-plugin-2.1.1.jar
  • Dockerfile을 통해 Container에 넣어주자

이미지 생성 및 배포

docker build --no-cache -t gitea.hong.net:3000/devtool/ca-sonarqube:10.0.0-community .
  • Docker Image를 생성하고, Helm Chart에 적용하자
helm install sonarqube -n sonarqube .
  • Helm Chart를 이용해 SonarQube를 배포하자

3. Keycloak 설정

Realm 생성

  • Realm을 생성하자. Realm은 인증 인가가 적용되는 범위이다. 우리는 Devtool Realm을 사용한다

Client 설정

Client 생성 및 설정

  • Clients를 추가하자. Clinent는 인증 인가 행위를 수행할 어플리케이션이다

  • ID는 sonarqube, 사용할 Protocol은 OIDC를 선택한다

  • Settings에 들어가자. Protocol과 Access Type을 선택하자

  • URL 설정은 위와 같다. Valid Redirect URl은 로그인 성공 시 Redirect 할 URL이다. 해당 URL은 “Sonarqube URL”/oauth2/callback/oidc 로 설정해야 한다

  • 설정 후 Credentials에 들어가 Secret을 저장하자

Scope 설정

  • Scope에 들어가 Full Scope Allowed를 OFF하자. Scope는 클라이언트가 Service Provider의 리소스에 접근할 때, 요청할 수 있는 권한의 범위이다

    Client Scope랑 Scope는 다르다

    • Scope는 사용자의 리소스에 접근하기 위해 클라이어트 애플리케이션이 요청하는 권한 범위이다. Keycloak은 Scope를 기반으로 Access Token을 발급하여 사용자의 권한을 부여한다
    • Client Scope는 Keycloak에서 특정 접근 권한 및 기능을 정의한다. Client Scope를 통해 여러 Scope 정책을 관리할 수 있다
    • 즉, Scope는 리소스 접근 시 클라이어트 애플리케이션이 요청하는 권한 범위를 설정하고, Client Scope는 Keycloak 에서의 클라이어트 애플리케이션의 권한을 설정한다

Mapper 생성

  • Mapper를 추가하자
  • Mapper는 사용자 프로필 정보나 클라이언트 애플리케이션에 제공되는 Access Token과 같은 Token 정보를 변환하거나 조작하는데 사용되는 구성 요소이다. Mapper를 이용해 애플리케이션은 사용자 정보를 추출하거나 Token의 내용을 가공할 수 있다

  • Mapper 설정은 위와 같다

Role 생성

  • admin role을 생성하자

  • 생성한 role에 들어가서 Composite Roles를 설정하자
    • Composite Role은 기본 롤을 조합하여 새로운 롤을 만드는 설정이다
    • Realm Roles는 Realm 내의 모든 클라이언트에서 공유되는 Role이다
    • Client Roles는 특정 Client에서만 사용할 수 있는 Role이다

User 생성

  • User 를 생성하자. 우리가 사용할 사용자이다

  • ID에 해당하는 Username과 Email을 설정하자

  • 생성한 User의 Credential에 들어가서 Password 설정을 해주자. Temporary 옵션은 해제한다. Temporary 옵션을 사용한다면, 사용자는 첫번째 로그인 후, Password를 변경해야 한다

  • Role Mappings에 들어가서 Client에서 생성한 admin Role을 할당해주자

4. Sonarqube 설정

  • Sonarqube에 admin 계정으로 접속하자
  • 이후 Administration → Security에 들어가면 OIDC 설정이 나온다. Enabled 설정을 해주자

  • Issuer URL : Realm을 가리키는 url이다. Issuer을 이용해 해당 Realm을 통해 인증 인가 처리 가능하다. Realm Settings → Endpoints → OpenID Endpoint Configuration에서 issuer 항목을 확인하면 된다
  • Client ID : Client 생성 시 설정한 ID이다. sonarqube를 입력하자

  • Client secret은 Client Credentials → Secret을 참조하자

  • Groups claim name은 생성한 mapper 이름인 groups를 입력하자

  • General에 들어가서 Server base URL을 설정하자. 해당 URL을 설정하지 않으면 로그인 시, 올바른 Redirect URL을 찾지 못하므로 꼭 설정해야 한다

5. 연동 확인

  • OIDC를 이용한 로그인 버튼이 나온다. 클릭하자

  • Keycloak Login 창으로 Redirect된다. 생성한 User ID / PW를 입력해서 로그인하자

  • 잘 로그인된다

OIDC를 이용한 Sonarqube - Keycloak SSO연동이 완료되었다

profile
멋진 엔지니어가 될 때까지

0개의 댓글