Keycloak 기반 사용자 격리형 CI/CD 플랫폼 구축

NOHHYEONGJUN·2025년 5월 10일

CI/CD

목록 보기
10/15
post-thumbnail

필요성

Cloud / DevOps 직무를 목표로 공부하다보니,
대학교 내에서 프로젝트를 진행하거나 친구들과 대화하다 보면 생각보다 학생들이 CI/CD에 대한 경험이 없고, 낯설어 한다는 것을 깨달았다.

취업을 준비하며 채용 공고들을 보면, 직무와 상관 없이 대부분 기본적인 CI/CD 경험을 필요 혹은 우대한다는 사실도 확인했다.

그래서,
교내의 클라우드 리소스를 사용해서 쿠버네티스 클러스터에 대표적인 CI/CD 오픈소스들을 구축하고, 사용자 간 격리된 환경을 제공하면, 학생들이 SaaS로 편하게 CI/CD를 연습하고 사용하며 배울 수 있지 않을까? 라고 생각했고, 이에 따라 구축해보게 되었다.


 

 


Tools

위의 그림에서 보이듯이 GitLab, Jenkins, Harbor, Sonarqube, Grafana 로 선택했고, 구축했다.

가장 많이 쓰이고 대표적인 오픈 소스들로 선정했다.

간단하게 도구들의 특징을 정리해보았다.

 

GitLab

  • 소스 코드 관리, 이슈 추적프로젝트 라이프사이클을 관리하는 오픈소스 통합 개발 플랫폼

  • 코드 협업프로젝트 관리를 원활하게 수행 가능

 

Jenkins

  • 지속적 통합 및 배포(CI/CD)를 자동화하는 오픈소스 빌드 도구

  • 코드 변경사항을 자동으로 빌드, 테스트하고 배포 파이프라인을 구축하여 개발 프로세스를 효율화

 

Harbor

  • 컨테이너 이미지를 안전하게 저장, 관리할 수 있는 오픈소스 레지스트리

  • 취약점 스캐닝과 접근 제어 기능을 통해 컨테이너 이미지의 보안을 강화

 

Sonarqube

  • 코드 품질과 보안 취약점을 자동으로 검사하는 정적 코드 분석 오픈소스 도구

  • 지속적인 코드 품질 모니터링을 통해 더 안정적이고 유지보수가 용이한 코드를 작성

 

Grafana

  • 다양한 데이터 소스로부터 수집된 정보를 시각화하는 오픈소스 분석 및 모니터링 플랫폼
  • 직관적인 대시보드를 통해 시스템 성능과 애플리케이션 상태를 실시간으로 모니터링

 

 


Service Flow

큰 구조에서 보면, 위의 그림과 같다.

각 서비스별로 사용자 격리를 구현하는 것이 가장 중요했기 때문에,
각 오픈소스에서 제공하는 다른 방법들을 통해 격리 자동화를 구현했다.

각 서비스별 배포 및 설정은 추후 포스트에서 하나씩 다룰 예정이다.

이 글에서는 어떻게 사용자별 격리를 자동화하여 달성했는지 간략히 설명해보겠다.


Keycloak

먼저 각 서비스 전체에 SSO를 제공하기 위해 Keycloak을 사용했다.

교내에서 사용하는 만큼, Keycloak 회원가입 시, 학교 이메일 인증을 통해 학교 이메일 계정으로만 회원가입 가능하도록 설정했다.

회원가입 후 로그인하여 각 서비스에 접속하게 되면 다른 사용자의 리소스, 정보를 확인할 수 있는 상태이다.

여기서 필요했던 부분이 회원 가입 시, 각 서비스에 사용자별 격리된 환경이 자동으로 생성되도록 하는 것이었다.

이를 위해 Keycloak Event Listener를 사용했다.


 

 


Event Listener

키클락에서 제공하는 이벤트 리스너는 문장 그대로 키클락에서 발생하는 이벤트를 감지한다.

이를 이용해 회원가입 이벤트 발생 시, 우리가 필요한 작업을 수행하도록 설정할 수 있다.

작업을 수행하도록 자동화하기 위해 EventLisnterProvider에 .jar로 넣어주어야 한다.

keycloak-auto-group/
├── pom.xml                                                  # Maven 프로젝트 설정 파일
├── src/
│   └── main/
│       ├── java/
│       │   └── com/
│       │       └── example/
│       │           └── keycloak/                           # 메인 패키지
│       │               ├── AutoGroupEventListenerProvider.java      # 이벤트 처리 로직
│       │               ├── AutoGroupEventListenerProviderFactory.java  # 이벤트 리스너 팩토리
│       │               ├── config/                         # 설정 관련 클래스
│       │               │   └── ServiceConfig.java          # 서비스 설정 관리
│       │               ├── util/                           # 유틸리티 클래스
│       │               │   ├── AuthUtil.java               # 인증 관련 유틸리티
│       │               │   └── HttpUtil.java               # HTTP 통신 유틸리티
│       │               └── service/                        # 서비스 구현 클래스
│       │                   ├── HarborService.java          # Harbor 서비스 통합
│       │                   ├── JenkinsService.java         # Jenkins 서비스 통합
│       │                   ├── GrafanaService.java         # Grafana 서비스 통합
│       │                   └── SonarqubeService.java       # SonarQube 서비스 통합
│       └── resources/
│           ├── config.properties     
│           └── META-INF/
│               └── services/
│                   └── org.keycloak.events.EventListenerProviderFactory  # SPI 등록 파일

위의 구조처럼 Event Listener SPI Plugin 구조에 맞추어 프로젝트를 구성해주고,
mvn clean package 를 통해 .jar로 압축해준다.

압축 후 providers/ 아래에 넣어주면 된다.

이후에는 Keycloak에서 Event Listener에 추가가 될 것이다.


 

 


서비스 접속 시

서비스 접속 시, 서비스별 격리가 달성된 것을 확인할 수 있다.

GitLab

GitLab의 경우, 사용자가 Private 프로젝트를 생성해 사용하면 되므로, 따로 제한이 없다.

 

Jenkins

Jenkins의 경우, 사용자마다 Folder를 제공하고, 각 사용자에게는 자신의 Folder에만 권한을 주어 격리한다.

 

Harbor

Harbor의 경우, 사용자마다 Private 프로젝트를 생성하고, 사용자의 그룹에게만 프로젝트에 권한을 주어 격리한다.

 

Sonarqube

Sonarqube의 경우, 사용자가 Private 프로젝트를 생성하거나, 사용자별 템플릿을 생성해두어 다른 사용자는 접근할 수 없도록하여 격리한다.

 

Grafana

Grafana의 경우, 사용자마다 Organization을 할당해주어 격리한다.


 

 


서비스별 세부 설정

각 서비스별 배포 및 설정은 추후 포스트에서 하나씩 자세히 설명해 보겠다.

profile
Cloud/DevOps & Network Virtualization에 관심 있는 대학생입니다. 🐳

0개의 댓글