마루옵스서버 · 네트워크 · AI 기술 노트

소개문의

[Jenkins 시작하기 02] Rocky Linux 9에 Jenkins 설치하기: DNF·SELinux·방화벽

Java 21과 Jenkins LTS를 설치하고 firewalld와 SELinux를 유지하며 SSH 터널로 접속하는 구성
Rocky Linux 9 설치·접속 구성을 설명하는 개념도 · MaruOps

Rocky Linux에 Jenkins를 설치하는 명령은 길지 않습니다. 막히는 지점은 대개 Java 선택, 저장소 서명, 서비스 포트, 방화벽 가운데 하나예요. 이 네 가지를 따로 확인하면 보안 기능을 통째로 끄지 않고도 원인을 좁힐 수 있습니다.

설치 대상은 지원 중인 Rocky Linux 9의 별도 VM입니다. 9.6 ISO로 시작했다면 정상적인 9.x 저장소의 보안 업데이트를 적용한 상태를 기준으로 합니다. 특정 마이너 릴리스의 오래된 패키지를 고정하는 절차는 다루지 않습니다. Ubuntu 사용자는 01 Ubuntu 설치을 참고하세요.

Jenkins 시작하기 · 01 Ubuntu 설치 · 02 Rocky Linux 9 설치 · 03 첫 작업과 Pipeline · 04 자동화 활용

이 글의 목차

Rocky Linux에서 달라지는 부분

구분이 글에서 사용할 방법
패키지DNF와 Jenkins 공식 rpm-stable 저장소
Javajava-21-openjdk와 fontconfig
서비스systemd drop-in. /etc/sysconfig/jenkins를 설정의 출발점으로 삼지 않음
보안SELinux Enforcing 유지, firewalld 활성 구역 확인
브라우저서버 내부 127.0.0.1:8080에 SSH 터널로 접속
학습 자원시작값 2 vCPU·RAM 4GB·디스크 50GB. 빌드는 별도 에이전트에서 실행

1. 버전·시간·리소스를 점검한다

cat /etc/rocky-release
uname -m
timedatectl status
df -h /
free -h
getenforce
sudo dnf check-update

dnf check-update는 업데이트가 있으면 종료 코드 100을 반환할 수 있습니다. 셸에서 오류처럼 보인다고 저장소 고장으로 바로 판단하지 마세요. OS 업데이트와 재부팅은 VM 스냅샷·기존 서비스·작업 시간을 확인해 먼저 마칩니다. 여기서는 새 학습 VM의 업데이트가 정리된 상태에서 Jenkins 설치를 이어갑니다.

2. Java 21과 공식 RPM 저장소를 준비한다

sudo dnf install -y ca-certificates curl fontconfig java-21-openjdk git
java -version
sudo curl -fsSLo /etc/yum.repos.d/jenkins.repo \
  https://pkg.jenkins.io/rpm-stable/jenkins.repo
sudo dnf --refresh info jenkins

현재 공식 jenkins.repo는 패키지와 저장소 메타데이터의 서명 검사를 켜 둡니다. 키를 가져오겠다는 메시지가 나오면 출처와 지문을 확인한 뒤 진행합니다. 실제 파일은 공식 RPM 저장소 설정에서 확인할 수 있어요. 설치할 때 --nogpgcheck로 넘어가는 방법은 이 글에서 사용하지 않습니다.

현재 지원되는 런타임은 Java 지원 정책을 기준으로 고릅니다. 이 연재는 OpenJDK 21을 사용하며, 2026년 10월 18일 확인한 Jenkins LTS는 2.580.1입니다. 나중에 따라 한다면 LTS 변경 내역에서 그 시점의 버전을 다시 확인하세요.

3. 리슨 주소를 제한하고 서비스를 시작한다

컨트롤러의 8080번을 VM 외부에 바로 노출하는 대신 loopback에만 바인딩합니다. 처음 패키지를 설치하기 전에 drop-in을 작성합니다.

sudo install -d -m 0755 /etc/systemd/system/jenkins.service.d
sudo tee /etc/systemd/system/jenkins.service.d/override.conf >/dev/null <<'EOF'
[Service]
Environment="JENKINS_LISTEN_ADDRESS=127.0.0.1"
EOF
sudo dnf install jenkins
rpm -q jenkins
sudo systemctl daemon-reload
sudo systemctl enable --now jenkins
sudo systemctl restart jenkins
sudo systemctl status jenkins --no-pager -l
sudo ss -ltnp '( sport = :8080 )'

서버에서 127.0.0.1:8080을 리슨하는지 확인하세요. java -version이 올바르더라도 서비스가 별도의 Java 경로를 사용하고 있으면 시작에 실패할 수 있으므로, 로그와 systemctl cat jenkins를 같이 봅니다. DNF 설치 흐름은 Jenkins의 RHEL 계열 설치 안내를 바탕으로 구성했습니다.

4. firewalld와 SELinux를 유지한 채 접속한다

sudo systemctl is-active firewalld
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --list-all
getenforce

SSH 터널 방식에서는 VM의 SSH 접속 경로가 있으면 되고 Jenkins의 8080번을 열 필요는 없습니다. 활성 구역과 기본 구역은 다를 수 있으므로 --get-active-zones에 나온 실제 인터페이스 구역도 확인합니다. 방화벽이 설치되지 않았거나 비활성 상태인 서버라면 현재 네트워크 경계와 SSH 접근 정책부터 확인하세요.

PC에서 다음 터널을 열고 http://127.0.0.1:18080으로 접속합니다. 예시 계정·주소는 실제 값으로 바꿔야 합니다.

ssh -N -L 18080:127.0.0.1:8080 labadmin@192.168.56.20

브라우저 화면이 안 뜬다는 이유로 setenforce 0부터 실행하지 않습니다. 로컬 HTTP 응답, SSH 전달, 방화벽, SELinux 거부 기록을 차례대로 확인합니다. 거부 기록이 있다면 어떤 프로세스가 어떤 파일·포트에 접근했는지를 보고 필요한 정책을 판단해야 합니다.

curl -I http://127.0.0.1:8080/login
sudo journalctl -u jenkins -b -n 100 --no-pager
sudo ausearch -m AVC,USER_AVC -ts recent

ausearch는 audit 도구가 있는 환경에서 사용합니다. 명령이 없다면 audit 패키지와 서비스 상태부터 확인합니다. 거부 기록이 없다는 것만으로 전체 보안 설정이 올바르다고 단정할 수도 없습니다. SELinux를 다루는 방법은 RHEL 9 SELinux 문제 해결 문서를 함께 참고하세요.

LAN에서 직접 접속해야 하는 경우

아래는 SSH 터널 대신 관리망에서 직접 접속할 때의 선택 구성입니다. JENKINS_LISTEN_ADDRESS=127.0.0.1이면 방화벽만 열어도 원격 접속은 되지 않습니다. 리슨 주소를 관리망 IP로 바꾸는 작업과 접근 규칙을 함께 계획해야 해요.

sudo firewall-cmd --zone=public --permanent \
  --add-rich-rule='rule family="ipv4" source address="192.168.56.0/24" port port="8080" protocol="tcp" accept'
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-rich-rules

여기서 public은 실제 인터페이스의 구역으로, 192.168.56.0/24는 허용할 관리망으로 바꿉니다. 이 규칙은 IPv4 예시이고 IPv6 정책까지 대신하지 않습니다. HTTP 직접 접속은 격리된 실습망에서만 다루고, 공동 사용 환경은 HTTPS 리버스 프록시와 로그인·권한 정책을 갖춘 주소로 운영하세요. 규칙 문법은 firewalld rich language 문서에서 확인할 수 있습니다.

5. 초기 설정을 마치고 실행 계정을 확인한다

sudo cat /var/lib/jenkins/secrets/initialAdminPassword
sudo systemctl show jenkins -p User -p Group
sudo ls -ld /var/lib/jenkins
  1. Unlock Jenkins 화면에 초기 비밀번호를 입력합니다.
  2. 추천 플러그인 설치 후 별도의 관리자 계정을 생성합니다.
  3. Git·Pipeline·SSH Build Agents·Credentials Binding 플러그인이 있는지 확인합니다.
  4. 처음 작업은 03 첫 작업과 Pipeline의 에이전트 구성 후 실행합니다.

서비스가 jenkins 계정으로 실행된다는 점을 기억해 두세요. 터미널의 관리자 계정에서는 읽히는 파일이 작업에서만 읽히지 않는다면 경로와 소유권이 다를 수 있습니다. 이를 해결하려고 chmod -R 777을 적용하면 원인보다 넓은 권한을 열게 됩니다.

오류 메시지에서 먼저 찾을 단서

메시지·상태확인할 내용
유효한 Java를 못 찾음지원되는 Java 버전, 서비스의 JAVA_HOME·JENKINS_JAVA_CMD
Address already in use8080 리슨 프로세스. 필요하면 Jenkins 포트와 터널 목적지를 함께 변경
저장소 서명 검증 실패공식 repo 파일, 서명 키, 시간, 프록시 캐시. 검증을 끄지 않음
브라우저 접속만 실패loopback 바인딩인지, PC에서 SSH 터널을 열었는지
파일 Permission deniedjenkins 사용자 권한과 AVC 기록. 일반 파일 권한과 SELinux를 분리해 확인

설치가 끝난 뒤에도 빌드 명령은 root가 아니라 작업을 실행하는 에이전트 계정의 권한을 따릅니다. 다음 글에서 이 경계를 실제 작업으로 확인합니다.

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

닉네임·이메일·댓글 내용·IP 주소·브라우저 정보는 댓글 게시 및 관리에 사용됩니다. 이메일과 접속 정보는 공개 댓글에 표시하지 않습니다. 개인정보 요청은 운영자 이메일로 보내 주세요. 개인정보처리방침