개요
2022.05.16 - [Jenkins] LDAP 연동으로 Jenkins에 LDAP 적용을 했었는데, 이번에는 인증서를 이용한 LDAPS 적용이 필요해 방법을 정리한다.
쿠버네티스 클러스터에 Helm으로 설치한 Jenkins로, 사용한 Chart는 이미 deprecated 된 https://github.com/helm/charts/tree/master/stable/jenkins이다.
init container를 이용해 컨테이너 환경 변수로 전달한 인증서를 적용하는 방법으로, https://github.com/helm/charts/issues/23374를 참고하여 진행했다.
적용 방식
1. 공유 공간으로 cacerts-share이라는 이름의 emptyDir volume 생성
2. jenkins 컨테이너를 기반으로 하는 사용자 지정 초기화 컨테이너 생성
3. 원본 /etc/ssl/certs/ca-certificates.crt, $JAVA_HOME/lib/security/cacerts을 cacart-share로 복사
4. 초기화 컨테이너에 사용자 정의 CA 인증서를 환경변수로 전달하여 복사한 파일에 추가
5. 수정한 파일을 Jenkins 컨테이너에 마운트 하여 기본 파일 재정의
적용 순서
1. 인증서를 base64로 인코딩
사용한 CA 인증서는 Window10 사용자 인증서 관리 도구에서 base64 인코딩으로 X.509 옵션으로 내보내기 한 .cer 파일이다.
cat <RootCA.cer> | base64 | tr -d '\n'
위 명령어로 다시 인코딩한 값이 필요하다.
2. values.yaml에 인증서를 저장할 볼륨 추가
이때 추가한 cacert-share의 mountPaths는 JAVA_HOME 아래의 lib/security/cacerts이다. Jenkins 버전에 따라 JAVA_HOME이 다를 수 있으므로 확인이 필요하다. 이 글에서 사용한 Jenkins 2.355의 경우, /opt/java/openjdk/lib/security/cacerts으로 마운트 하면 된다.
persistence:
volumes:
- name: cacerts-share
emptyDir: {}
mounts:
- mountPath: /etc/ssl/certs/ca-certificates.crt
name: cacerts-share
subPath: ca-certificates.crt
- mountPath: <$JAVA_HOME>/lib/security/cacerts
name: cacerts-share
subPath: cacerts
3. 사용자 지정 초기화 컨테이너 추가
아래와 같이 add-ca-certs라는 이름의 customInitContainers를 설정한다.
CA_CERTS_BASE64 환경변수에 1번에서 인증서를 인코딩한 결과값을 기재한다.
master:
customInitContainers:
- name: add-ca-certs
image: "jenkins/jenkins:<VERSION_TAG>"
imagePullPolicy: Always
env:
- name: CA_CERTS_BASE64
value: "BASE64로 인코딩한 값"
command:
- "sh"
- "-c"
- >
echo $CA_CERTS_BASE64 | base64 -d > /tmp/custom-ca-certs.crt
&& cat /etc/ssl/certs/ca-certificates.crt /tmp/custom-ca-certs.crt > /cacerts-share/ca-certificates.crt
&& cp ${JAVA_HOME}/lib/security/cacerts /cacerts-share/cacerts
&& chmod 644 /cacerts-share/cacerts
&& ${JAVA_HOME}/bin/keytool -import -trustcacerts -alias custom-ca-certs -keystore /cacerts-share/cacerts -file /tmp/custom-ca-certs.crt -noprompt -storepass changeit
volumeMounts:
- name: cacerts-share
mountPath: /cacerts-share
4. LDAP 설정 변경
만약 LDAP Simple Binding을 사용하고 있다가 LDAPS (LDAP with SSL)을 적용하는 경우라면 server 주소만 변경하면 된다.
master:
securityRealm: >-
<securityRealm class="hudson.security.LDAPSecurityRealm" plugin="ldap@VERSION 지정">
<disableMailAddressResolver>false</disableMailAddressResolver>
<configurations>
<jenkins.security.plugins.ldap.LDAPConfiguration>
<server>ldaps://서버:주소</server>
<rootDN>rootDN 설정</rootDN>
<inhibitInferRootDN>false</inhibitInferRootDN>
<userSearchBase></userSearchBase>
<userSearch>cn={0}</userSearch>
<groupMembershipStrategy class="jenkins.security.plugins.ldap.FromGroupSearchLDAPGroupMembershipStrategy">
<filter></filter>
</groupMembershipStrategy>
<managerDN>인증 계정</managerDN>
<managerPasswordSecret>계정 비밀번호</managerPasswordSecret>
<displayNameAttributeName>displayname</displayNameAttributeName>
<mailAddressAttributeName>mail</mailAddressAttributeName>
<ignoreIfUnavailable>false</ignoreIfUnavailable>
</jenkins.security.plugins.ldap.LDAPConfiguration>
</configurations>
<userIdStrategy class="jenkins.model.IdStrategy$CaseInsensitive"/>
<groupIdStrategy class="jenkins.model.IdStrategy$CaseInsensitive"/>
<disableRolePrefixing>true</disableRolePrefixing>
</securityRealm>
5. values.yaml 적용
적용 후 Jenkin Pod가 정상적으로 동작하는지, 로그인하는데 이상이 없는지 확인한다.
참고 문서
https://github.com/helm/charts/issues/23374