Ubuntu18.04에 Jenkins 설치(Nginx, SSL인증서, Azure AD연동)

공식문서의 가이드를 참고하여 작성하였음.

Jenkins 설치

				
					apt install openjdk-11-jdk
				
			
				
					curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee \
  /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins
				
			
				
					cat /var/lib/jenkins/secrets/initialAdminPassword
8770a4658f4241978a2e6b530008bfe3
				
			

http://젠킨스IP주소:8080 에 접속해서 위에 복사해둔  key를 넣어준다.

jenkins1

Nginx 연동

				
					apt-get install nginx

#아래 폴더에 SSL인증서를 넣어준다
mkdir /etc/nginx/ssl

#202107_nginx_jenkins.infraadmin.teck_cert.pem
#202107_nginx_jenkins.infraadmin.teck_private.key

vi /etc/nginx/conf.d/nginx-ssl-jenkins.conf
				
			

nginx에서 불러와서 사용 될 nginx-ssl-jenkins.conf를 아래와 같이 추가해준다.

				
					upstream jenkins {
  keepalive 32; # keepalive connections
  server 127.0.0.1:8080; # jenkins ip and port
}

# Required for Jenkins websocket agents
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

server {
    listen  80;
    server_name jenkins.infraadmin.teck;
 
    return  301 https://$server_name$request_uri;
  }

server {
    listen 443;
    server_name jenkins.infraadmin.teck;
 
    access_log      /var/log/nginx/jenkins/access.log;
    error_log       /var/log/nginx/jenkins/error.log;
 
    ignore_invalid_headers off;
 
    location ~ "^/static/[0-9a-fA-F]{8}\/(.*)$" {
    #rewrite all static files into requests to the root
    #E.g /static/12345678/css/something.css will become /css/something.css
    rewrite "^/static/[0-9a-fA-F]{8}\/(.*)" /$1 last;
    }
 
    ssl on;
    ssl_certificate     /etc/nginx/ssl/202107_nginx_jenkins.infraadmin.teck_cert.pem;
    ssl_certificate_key /etc/nginx/ssl/202107_nginx_jenkins.infraadmin.teck_private.key;
 
    ssl_session_timeout  10m;
 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;
 
    location /userContent {
    # have nginx handle all the static requests to userContent folder
    #note : This is the $JENKINS_HOME dir
    root /var/lib/jenkins/;
    if (!-f $request_filename){
      #this file does not exist, might be a directory or a /**view** url
      rewrite (.*) /$1 last;
      break;
    }
    sendfile on;
  }

  location / {
      sendfile off;
      proxy_pass         http://jenkins;
      proxy_redirect     default;
      proxy_http_version 1.1;

      # Required for Jenkins websocket agents
      proxy_set_header   Connection        $connection_upgrade;
      proxy_set_header   Upgrade           $http_upgrade;

      proxy_set_header   Host              $host;
      proxy_set_header   X-Real-IP         $remote_addr;
      proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Proto $scheme;
      proxy_max_temp_file_size 0;

      #this is the maximum upload size
      client_max_body_size       10m;
      client_body_buffer_size    128k;

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;
      proxy_buffering            off;
      proxy_request_buffering    off; # Required for HTTP CLI commands
      proxy_set_header Connection ""; # Clear for keepalive
  }

}
				
			

log 파일이 생성되는 폴더를 생성해주고 nginx를 재시작한다.

				
					mkdir /var/log/nginx/jenkins
systemctl restart nginx
				
			

http://jenkins.infraadmin.teck 으로 접근하면 https로 redirection되고 SSL 인증서가 확인 된다.

jenkins2
jenkins3
jenkins4
jenkins5

Azure AD(Azure Active Directory) 인증정보 연동

Azure Active Directory에서 앱등록 메뉴를 통해 Jenkins와 연동될 App을 생성한다.
공식 가이드처럼 리디렉션 URI를 추가해준다.
https://{your_jenkins_host}/securityRealm/finishLogin

jenkins6

인증 메뉴에서 토큰 유형을 선택한다.(ID 토큰)

jenkins13

생성된 App의 인증서 및 암호 메뉴에서 클라이언트 암호를 생성해 주고 값을 기록해 둔다.

jenkins7

연동될 Jenkins에 입력해야 하는 App 정보를 확인하고 기록해 둔다.

디렉터리(테넌트) ID
애플리케이션(클라이언트)ID
클라이언트 Secret(값)ID

jenkins8

Login 테스트를 위해
Azure Active Directory -> 엔터프라이즈 애플리케이션 -> {생성된 App} -> 사용자 및 그룹
로그인할 유저를 추가해 준다.(Auzre Active Directory Premium 1 라이선스를 사용하면 그룹할당이 가능하다)

jenkins9

Jenkins로 돌아와서
Azure AD 플러그인을 설치해 준다.

jenkins10

Jenkins 관리 -> Configure Global Security -> Security Realm → Azure Active Directory 선택
Client ID / Client Secret / Tenant 값 입력 : 앱 등록 과정에서 생성된 값
Disable graph integration 선택

jenkins12

로그인 테스트를 위해 바로 아래 Authorization에서 Authenticated Users에만 권한을 할당 한 뒤
다른 브라우저 또는 시크릿모드 브라우저를 이용하여 앱에 추가된 사용자 계정으로 로그인을 시도한다.

jenkins14
jenkins16
jenkins15

사용자 개별 권한설정을 위해 Authorization 설정에서 인증된 모든 유저의 권한은 제거 하고 계정별 권한을 설정한다.

jenkins17
				
					vi /var/lib/jenkins/config.xml
sed -ri 's/<useSecurity>true<\/useSecurity>/<useSecurity>false<\/useSecurity>/g' /var/lib/jenkins/config.xml
systemctl restart jenkins