Jenkins 권한 관리

Sangyeon·2023년 1월 27일
2

Jenkins

목록 보기
3/3
post-thumbnail

Jenkins에서 사용자별, 프로젝트별, 역할별 권한 설정하는 방법을 다룹니다.

Matrix Authorization Strategy

플러그인 설치

Jenkins 관리 > Plugin Manager에서 아래 플러그인을 설치합니다.

https://plugins.jenkins.io/matrix-auth/

(Jenkins 2.375.2 버전 기준으로 Jenkins 설치 시 'Install suggested plugins'를 선택하면 기본으로 설치되는 것 같습니다.)

사용자별 권한 설정

Jenkins 관리 > Configure Global Security > Authentication > Authorization 에서 Matrix-based security를 선택합니다.

그리고 Add user 버튼을 클릭하여 사용자 계정 생성 시의 계정명(User ID)을 입력하여 사용자를 추가한 후, 각 사용자에게 부여할 권한을 설정하면 됩니다.

예시에서 사용자별 권한 설정은 아래와 같습니다.

  • 비로그인 사용자 : 권한 없음
  • 로그인 사용자 : Jenkins 대시보드, Job, View 열람 권한을 가지고 있음(수정 불가)
  • '상연' 계정 : Credentials 설정 권한과 Job, View 생성/수정/삭제 권한을 가지고 있음(Agent 설정 관련 권한은 없음)
  • '어드민' 계정 : 어드민 권한을 가지고 있음(전체 메뉴 접근 가능)

프로젝트별 권한 관리

프로젝트별로 사용자 권한을 다르게 설정해야할 경우에 사용합니다.

Jenkins 관리 > Configure Global Security > Authentication > Authorization 에서 Project-based Matrix Authorization Strategy를 선택합니다.

Matrix-based security와 동일하게 사용자별 권한을 설정합니다.

권한을 다르게 설정할 프로젝트 > 구성 > General에서 Enable project-based security를 체크합니다.

그리고 Inheritance Strategy를 선택합니다.

  • Inherit globally defined permissions : Jenkins 관리에서 설정한 사용자별 권한(글로벌 권한) 상속
  • Inherit permissions from parent ACL : 부모 프로젝트의 권한 상속
  • Do not inherit permission grants from other ACLs : 상속받지 않고 별도로 권한 설정

예시의 경우, 프로젝트명이 SecretProject로, 권한 설정을 상속받지 않고 별도로 설정하도록 'Do not inherit permission grants from other ACLs' 를 선택하고, 비로그인 사용자, 로그인 사용자 모두 접근 권한이 없게 아무것도 설정하지 않았습니다.

위와 같이 설정하면 어드민이 아닌 계정 로그인 시, 다른 프로젝트는 모두 보이고, SecretProject 프로젝트는 보이지 않게 됩니다.

Role-Based Strategy

사용자가 많아 사용자 각각의 권한을 설정하기 어려운 경우, 역할별 권한을 설정하고, 사용자 - 역할을 맵핑하여 권한 설정할 시 사용합니다.

플러그인 설치

Jenkins 관리 > Plugin Manager에서 아래 플러그인을 설치합니다.

https://plugins.jenkins.io/role-strategy/

역할별 권한 관리

Jenkins 관리 > Security > Configure Global Security > Authentication > Authorization 에서 Role-Based Strategy를 선택합니다.

그러면 Jenkins 관리 > Security에서 Manage and Assign Roles 메뉴가 생성됩니다.

Manage Roles 메뉴 : 역할 설정

Manage and Assign Roles 메뉴 내 Manage Roles 메뉴에서 역할을 설정합니다.

Global roles

우선 글로벌 역할을 설정합니다.

예시의 경우, 역할 설정은 아래와 같습니다.

  • admin : 어드민 권한을 가지고 있음(전체 메뉴 접근 가능)
  • developer : Jenkins 대시보드 접근 권한과 Credentials 설정 권한을 가짐(Job, View 관련 권한은 프로젝트별로 권한을 구분하기 위해 아래 Item roles에서 세부 설정합니다.)
  • guest : Jenkins 대시보드, Job, View 열람 권한을 가지고 있음
  • manager : Jenkins 대시보드 접근 권한과 Job, View 생성/수정/삭제 권한을 가지고 있음

여기서 설정 시 주의해야할 점은, 로그인 사용자에게 부여할 역할에 Overall - Read 권한을 주지 않으면, Jenkins URL 접근 시 Access Denied 메시지가 노출되게 됩니다.

Item roles

프로젝트(item)별 역할을 설정합니다.

예시의 경우, 프로젝트별 역할 설정은 아래와 같습니다.

  • Test1_Developer : 프로젝트명이 Test1로 끝나는 경우 Job, View 생성/수정 권한을 가지고 있음(삭제 권한은 없음)
  • Test2_Developer : 프로젝트명이 Test2로 끝나는 경우 Job, View 생성/수정 권한을 가지고 있음(삭제 권한은 없음)

Assign Roles 메뉴 : 사용자별 역할 맵핑

Manage Roles 메뉴에서 역할 설정이 완료되면, Assign Roles 메뉴에서 사용자별 역할 맵핑을 진행합니다.

Global roles

우선 사용자 - 글로벌 역할을 맵핑합니다.

Item roles

그리고 사용자 - 프로젝트(item) 역할을 맵핑합니다.

Item roles에서의 사용자는 위 Global roles에서 사용자에게 부여한 역할의 권한을 상속받게 됩니다. 그래서 예시의 경우, 상연1, 상연2 사용자에게 부여한 developer 역할의 권한을 가지고 있으면서, 추가로 상연1의 경우 Test1_Developer 역할의 권한을, 상연2의 경우 Test2_Developer 역할의 권한을 부여받게 됩니다.

예시 결과

로그인 사용자 : 어드민 (역할 : admin)

어드민 권한을 가지고 있어 'Jenkins 관리' 메뉴에 접근할 수 있습니다.

로그인 사용자 : 매니저 (역할 : manager)

예시에서 manager 역할은 별도 제약 없이 모든 프로젝트에 접근할 수 있습니다.('Jenkins 관리' 메뉴, 'Credentials' 메뉴 접근 권한은 없습니다.)

추가로, 뷰나 프로젝트를 삭제할 수 있는 권한을 가지고 있어 'Project 삭제' 메뉴가 노출됩니다.

로그인 사용자 : 상연1 (역할 : Test1_Developer)

예시에서 developer 역할은 Credentials 설정 권한을 가지고 있어 'Credentials' 메뉴가 노출되며, Test1_Developer 역할은 프로젝트명이 Test1로 끝나는 경우에만 Job, View 생성/수정 권한을 가지고 있어 Test2 관련 프로젝트는 노출되지 않습니다.

추가로, manager 역할과 달리 프로젝트 삭제 권한이 없어 'Project 삭제' 메뉴가 노출되지 않습니다.

상연2 (역할: Test2_Developer)

예시에서 Test2_Developer 역할은 프로젝트명이 Test2로 끝나는 경우에만 Job, View 생성/수정 권한을 가지고 있어 상연1이 권한을 가지고 있는 Test1 관련 프로젝트는 노출되지 않습니다.

로그인 사용자: 게스트 (역할: guest)

예시에서 guest 역할은 모든 프로젝트 열람 권한만 가지고 있기 때문에 추가/수정 등은 불가하고 프로젝트 열람만 가능합니다.

그래서 프로젝트 접근 시 '작업공간', '지금 빌드', '구성' 등의 메뉴 노출 없이 '상태', '변경사항' 메뉴만 확인할 수 있습니다.

비로그인 사용자 (역할 : Anonymous)

예시에서 Anonymous 역할에게 아무런 권한을 부여하지 않았기 때문에 Jenkins 로그인 페이지만 노출됩니다.

Reference

profile
I'm a constant learner.

0개의 댓글