Sonarqube는 기본적으로 SSO 연동에 SAML만 지원한다. 허나 SAML은 다음과 같은 단점을 가지고 있다
- 브라우저 종속성 : SAML은 응답과 요청 메시지가 XML형식이므로 브라우저에서만 작동한다
- 성능 : 인증 인가 과정에서 여러 단계의 메시지 교한과 Redirection이 발생하여 성능이 떨어질 수 있다
- 복잡성 : 복잡한 XML 메시지를 사용하기에 설정 및 구현에 어려움이 있다
이를 보안하기 위해 Sonarqube에 OIDC Plugin을 설치하여 Keycloak과 SSO 연동을 하고자 한다
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
keytool -importcert -keystore "keystore 위치" -storepass "keystore 비밀번호" -alias "인증서 구분을 위한 명칭" -file "인증서 파일 위치" -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'
wget sonar-auth-oidc-plugin-2.1.1.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
docker build --no-cache -t gitea.hong.net:3000/devtool/ca-sonarqube:10.0.0-community .
helm install sonarqube -n sonarqube .
Client Scope랑 Scope는 다르다
- Scope는 사용자의 리소스에 접근하기 위해 클라이어트 애플리케이션이 요청하는 권한 범위이다. Keycloak은 Scope를 기반으로 Access Token을 발급하여 사용자의 권한을 부여한다
- Client Scope는 Keycloak에서 특정 접근 권한 및 기능을 정의한다. Client Scope를 통해 여러 Scope 정책을 관리할 수 있다
- 즉, Scope는 리소스 접근 시 클라이어트 애플리케이션이 요청하는 권한 범위를 설정하고, Client Scope는 Keycloak 에서의 클라이어트 애플리케이션의 권한을 설정한다
- Composite Role은 기본 롤을 조합하여 새로운 롤을 만드는 설정이다
- Realm Roles는 Realm 내의 모든 클라이언트에서 공유되는 Role이다
- Client Roles는 특정 Client에서만 사용할 수 있는 Role이다