혼자서만 젠킨스를 사용하고 외부에서 연결 가능하지 않다면 상관없지만 젠킨스를 도입하려는 곳이라면 보통 다수의 개발자가 존재하는 곳일 것이다.

여럿이 동시에 사용하는 환경이라면 적절한 보안 조치와 역할 분리를 통해서 보안 사고와 잘못된 권한 설정으로 인한 사고를 미리 방지해야 할 필요가 있다.

젠킨스는 기본적으로 접근 통제가 꺼져 있으므로 누구나 연결할 수 있고 이로 인해 권한이 없는 이가 젠킨스에 연결하여 설정을 변경하거나 빌드를 수행하거나 작업을 삭제할 수 있다.

이번 절에서는 전역 보안 설정 메뉴를 통해 사용자 별로 계정을 설정하여 인증을 수행하고 권한별 접근 통제 정책을 수립하여 이를 젠킨스에 반영해 보자.

이 기능은 젠킨스 관리에서 Configure Global Security 를 클릭하여 진입할 수 있으며 다음과 같은 메뉴가 표시된다.


Markup Formatter

젠킨스 관리에서 있는 시스템 메시지 기능을 기억할 것이다. 기본 마크업 포맷터인 Escaped HTML 은 HTML 태그도 문자열로 취급해서 화면에 출력한다.

포맷터를 Raw HTML 로 변경하면 HTML 태그를 HTML 로 다루어 출력한다.

Enable security

보안을 설정할 지 여부이며 기본 설정은 꺼져 있다. 체크하면 아래와 같이 다양한 보안 옵션을 설정할 수 있는 화면이 표시된다.

TCP port for JNLP slave agents

젠킨스는 분산 빌드 기능이 있어서 물리적으로 다른 머신을 여러 대 사용하여 각각 빌드할 수 있다. 이때 슬레이브 머신과 통신시 JNLP 라는 프로토콜을 사용하는데 포트 중복을 방지하기 위해 기본적으로 랜덤한 포트를 사용한다.

이는 방화벽에서 임의의 포트를 열어야 하므로 보안상 취약점이 될 수도 있다. 분산 빌드를 사용하지 않는 다면 Disable 를 선택하자.


Security Realm

사용자 관리를 어디서 할지 설정하는 메뉴이다.  총 4개의 옵션이 있으며 하나씩 살펴 보자.

보안 영역

  • Delegate to servlet container
    사용하는 WAS 에게 사용자 정보를 위임한다. 불편하므로 잘 사용되지 않는다.
  • Jenkins’ own user database
    젠킨스의 사용자 관리 기능을 이용하여 사용자 정보를 관리한다. 사용자의 가입 허용 을 클릭하면 개별 사용자가 직접 계정을 등록할 수 있다.
    이 경우 주의할 점은 젠킨스는 기본 캡차(Captcha) 기능이 없으므로 대량의 계정이 등록될 수 있으므로 별도의 캡차 플러그인을 사용하여 걸러낼 필요가 있다. 
    사용자의 가입 허용 을 체크하지 않으면 관리자가 직접 사용자를 등록 해야 한다.

  • LDAP
    LDAP 을 사용하여 계정을 관리한다. LDAP 으로 계정을 통합 관리하는 경우 유용하다.

  • Unix user/group database
    시스템의 사용자 정보와 연동하여 젠킨스 계정을 관리한다.


권한 부여(Authorization)

 이제 사용자 관리에 대한 설정이 끝났으므로 권한을 설정해 보자. 권한 부여는 총 5개의 선택이 가능하다.

  •  Anyone can do anything
    누구나 모든 기능을 수행할 수 있다. 기본 설정이며 로그인하지 않은 사용자들도 모든 기능을 수행할 수 있으므로 보안에 취약하다.
  • Legacy mode 
    젠킨스의 예전 동작 모드와 일치하며 관리자 권한이 있을 경우 모든 기능을 수행할 수 있으며 일반 사용자와 비로그인 사용자는 읽기만 가능하다.
  • Logged-in users can do anything
    로그인한 사용자는 별도의 접근 통제없이 모든 기능을 사용할 수 있다.
  • Matrix-based security
    매트릭스 기반으로 사용자/그룹별 권한을 세밀하게 조정할 수 있다.
  • Project-based Matrix Authorization Strategy
    매크릭스 기반 보안의 확장판으로 개별 프로젝트 별로 권한을 조정할 수 있다. 보안 관점에서는 맞는 기능이지만 다수의 팀이 사용하고 프로젝트가 많아지는 환경에서는 프로젝트별 관리가 힘들어 지는 문제가 있으므로 그리 권장하지 않는다.
    이런 세밀한 접근 관리가 필요한 복잡한 조직이라면 뱀부등의 다른 지속적인 통합 솔루션 도입을 검토해 볼 필요가 있다.
Disable remember me

로그인시에 "Remember me on this computer"  체크 박스를 표시하지 않는다. 사용자는 매번 아이디와 암호를 입력해서 로그인 해야 한다.

Prevent Cross Site Request Forgery exploits

사이트 간 요청 위조 공격(CSRF - Cross Site Request Forgery) 을 사용하여 허가 받지 않은 이가 젠킨스의 설정을 변경하거나 작업을 삭제할 수 있다.

이 옵션을 켜면 페이지마다 nonce 또는 crumb 이라 불리우는 임시 값을 삽입하여 사이트 간 요청 위조 공격을 막을 수 있게 해준다.

보안에 아주 민감한 사람이라면 켜주어도 좋지만 보통 젠킨스는 사내에서만 사용하므로 이 정도까지 설정하지는 않는다.

 

사용자 등록 및 권한 부여

이제 각 메뉴의 용도를 알았으니 직접 보안을 설정해 보자. 먼저 해야 할 것은 Security Realm 옵션을 설정하여 계정 관리의 주체가 누구인지 명확히 하는 것이다.

제일 무난한 방법은 젠킨스의 자체 사용자 관리 기능을 이용하는 것이다. Security Realm 의 옵션을 Jenkins’ own user database 로 설정해 보자.

여기서 주의할 점은 아직 최초의 계정을 생성하지 않았으므로 사용자의 가입 허용 을 선택해서 계정을 만들어야 한다.


적용하고 젠킨스에 새로 연결하면 우측 상단에 "로그인"과 "가입" 메뉴가 표시된다.

"가입" 을 클릭하여 사용자를 등록하고 로그인해 보자. 다음은 사용자 가입 화면이다.

가입 화면

이제 로그인이 끝났으면 다시 Configure Global Security 메뉴에 들어가 보자.

현재까지는 로그인 여부와 상관없이 모든 사용자가 모든 권한을 갖고 있는 "Anyone can do anything" 로 설정되어 있으므로 보안이 적용되지 않은 상태와 차이가 없다.
이제 권한 부여를 적용하여 사용자별로 권한을 나누고 보안을 강화해 보자.

여러 가지 권한 부여 방식중에 세밀하게 설정할 수 있는 방식은 Matrix-based security 방식이다. 다양한 개발자와 팀이 사용하는 환경이라면 가장 적합하므로 이 방식으로 권한을 관리해 보자.

항목을 체크하면 다음과 같이 세밀한 권한 조정 화면이 표시된다.

다음은 권한 매트릭스의 항목과 권한별 의미이다.

항목권한의미

Overall





Administer시스템의 전역 설정을 변경할 수 있다. OS 에서 허용된 범위안에서 전체 시스템 엑세스드의 매우 민감한 설정을 수행할 수 있다.
Read젠킨스의 모든 페이지를 볼 수 있다.
RunScripts그루비 콘솔이나 그루비 CLI 명령을 통해 그루비 스크립트를 실행할 수 있다.
UploadPlugins특정 플러그인을 업로드 할 수 있다.
ConfigureUpdateCenter업데이트 사이트와 프록시 설정을 할 수 있다.
SlaveConfigure기존 슬레이브 설정 가능
 Delete기존 슬레이브 삭제
 Create신규 슬레이브 생성
 Disconnect슬레이브 연결을 끊거나 슬레이브를 임시로 오프라인으로 표시.
 Connect슬레이브와 연결하거나 슬레이브를 온라인으로 표시;
JobCreate새로운 작업 생성
 Delete기존 작업 삭제.
 Configure기존 작업의 설정 갱신
 Read프로젝트 설정에 읽기 전용 권한 부여
 Discover익명 사용자가 작업을 볼 권한이 없으면 에러 메시지 표시를 하지 않고 로그인 폼으로 전환 시킴/
 Build새로운 빌드 시작.
 Workspace
젠킨스 빌드를 실행 하기 위해 체크아웃 한 작업 영역의 내용을 가져옴.
 Cancel실행중인 빌드 취소
RunDelete빌드 내역에서 특정 빌드 삭제
 Update빌드의 설명과 기타 프로퍼티 수정(빌드 실패 사유등)
ViewCreate새로운 뷰 생성
 Delete기존 뷰 삭제
 Configure기존 뷰 설정 갱신
 Read기존 뷰 보기
SCMTag특정 빌드와 관련된 소스 관리 시스템에 태깅을 생성.

이제 사용자별 접근 권한을 부여해 보자. 먼저 "Matrix-based security" 를 클릭하면 아래와 같은 복잡한 권한 설정 화면이 표시된다.



 

사용자 생성

"사용자의 가입 허용" 을 비활성화 했다면 사용자 등록은 관리자만 할 수 있게 된다. 사용자 가입 메뉴는 사라지고 젠킨스의 관리 메뉴의 하위 메뉴로 "Manage Users" 메뉴가 생성된다.

"Manage Users" 메뉴에 들어가면 등록된 전체 사용자의 목록을 보고 사용자 정보를 수정할 수 있으며 좌측의 "사용자 생성" 메뉴을 통해 새로운 사용자도 생성할 수 있다. 

사용자 관리

관리자가 직접 계정을 관리하기로 결정했다면 이 메뉴를 통해서 사용자를 관리하도록 하자.

먼저 권한을 부여할 계정을 "User/group to add" 창에 입력하고 "Add" 를 클릭하면 추가 된다.

권한 부여 화면

위에서 정리한 권한 정책에 맞게 사용자의 권한을 설정해 보자. 시스템 관리자라면 전체 권한을 부여하고 개발자는 Job 과 Run, 그리고 View 카테고리 하의 권한을 설정해 주면 된다.

보안 비활성화

계정을 만들기 전에 실수로 로그인 해야만 사용할 수 있게 설정하거나 또는 사용자 가입 허용을 설정하지 않은 경우 로그인을 할 수 없는 문제가 발생한다.

또 권한 설정을 잘못 해서 관리자 역할을 수행할 수 있는 계정이 없어서 설정을 변경하지 못하는 경우도 발생한다.

이런 경우 젠킨스의 설정 파일을 직접 수정하여 보안 기능을 비활성화한후에 새로 보안을 설정해야 한다.


이 작업은 $JENKINS_HOME 밑에서 config.xml 파일을 찾아서 useSecurity  부분을 false 로 수정하면 된다.

<useSecurity>false</useSecurity>

설정을 변경했으면 젠킨스를 재시작해야 한다. 이제 인증없이 관리자 기능을 수행할 수 있으므로 보안 설정을 새로 하면 된다.

젠킨스의 보안은 설정 파일 하나로 간단하게 무력화 되므로 허가 받지 않은 사용자가 아니면 설정 파일에 접근할 수 없게 차단해야 한다.