Jenkins 원격 서버 표준 계정 · 권한 · 로그인 설정 가이드
본 문서는 Jenkins 기반 원격 배포 환경을 보안·운영·자동화 관점에서 표준화하기 위한 가이드이다.
비밀번호 기반 로그인, su, sshpass 방식은 사용하지 않으며
SSH RSA Key + sudo NOPASSWD + 전용 스크립트 구조를 사용한다.
1. 설계 목표
- Jenkins 서버에서 원격 서버로 비밀번호 없이 접속
- 원격 서버의
jenkins계정으로 작업 수행 jenkins계정은 root ❌- 필요한 작업만 root 권한으로 제한 수행
- 보안 감사 대응 가능
- 서버 수가 늘어나도 동일하게 복제 가능
2. 전체 아키텍처
[Jenkins Server]
└─ /home/jenkins/.ssh/jenkins_rsa (private key)
↓ SSH (RSA)
[Target Server]
└─ jenkins 계정
├─ ~/.ssh/authorized_keys (public key)
└─ sudo NOPASSWD (지정 스크립트만 허용)
3. 대상 서버에 jenkins 계정 생성
useradd -m -s /bin/bash jenkins
passwd jenkins
4. SSH Key 기반 로그인 설정
4.1 Jenkins 서버에서 키 생성
ssh-keygen -t rsa -b 4096 -f /home/jenkins/.ssh/jenkins_rsa -N ""
4.2 Jenkins 서버에서 생선한 키 파일 소유자 변경
chown -R jenkins:jenkins /home/jenkins/.ssh/jenkins_rsa*
4.3 대상 서버에 Public Key 등록
su - jenkins
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys
4.4 Jenkins 서버에서 생성한 Public Key 파일 내용 가져오기와서 붙혀넣기
vi /home/jenkins/.ssh/jenkins_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCzLqMqjpPXy7rDw8hUMJJXpXnDewi
···
4.5 대상 서버에 등록한 Public Key 권한 및 소유자 설정
chmod 600 ~/.ssh/authorized_keys
chown -R jenkins:jenkins ~/.ssh
5. Jenkins 서버 → 대상 서버 비밀번호 없는 SSH 접근 확인 (필수 선행)
⚠️ 이 단계가 통과되지 않으면 이후 모든 Jenkins 배포는 실패한다.
5.1 Jenkins 서버에서 SSH 접속 테스트
ssh -i /home/jenkins/.ssh/jenkins_rsa -p ${TARGET_SERVER_PORT} -o StrictHostKeyChecking=no jenkins@${TARGET_SERVER_IP}
5.2 정상 기준
- 비밀번호 입력 요청 ❌
- 즉시 로그인 ⭕
- 접속 후 사용자 확인:
whoami
출력:
jenkins
5.3 실패 시 점검 항목
/home/jenkins/.ssh/jenkins_rsa권한:600- 대상 서버
~/.ssh/authorized_keys권한:600 - 대상 서버
~/.ssh권한:700 vi /etc/ssh/sshd_config설정:PubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys
6 Jenkins 배포 스크립트 생성 및 root 권한 부여
대상 스크립트
- /app/script/deploy_prepare.sh
- /app/script/backup.sh
- /app/script/deploy.sh
6.1 스크립트 디렉터리 생성 (root)
mkdir -p /app/script
chown root:root /app/script
chmod 755 /app/script
6.2 deploy_prepare.sh 생성
vi /app/script/deploy_prepare.sh
#!/bin/bash
set -e
# $1="/app/reinno-erp/prod/webapps_deploy"
# $2="20260107_183402"
BASE=$1
rm -rf "${BASE:?}/"*
mkdir -p "${BASE}/$2"
ls -al "${BASE}"
chown -R jenkins:jenkins ${BASE}/$2
6.3 backup.sh 생성
vi /app/script/backup.sh
#!/bin/bash
TIMESTAMP=$1
TARGET_PATH=$2
BACKUP_PATH=$3
#TIMESTAMP="20260107_183402"
#TARGET_PATH="/app/reinno-erp/prod/webapps/ROOT"
#BACKUP_PATH="/app/reinno-erp/prod/webapps_bak"
TARGET_BACKUP_DIR="${BACKUP_PATH}/${TIMESTAMP}"
# 1) BACKUP_PATH 전체 비우기
rm -rf "${BACKUP_PATH:?}"/*
mkdir -p "${TARGET_BACKUP_DIR}"
echo "Cleared old backups: ${BACKUP_PATH}"
# 2) 백업 대상 폴더 지정
folders=("")
for folder in "${folders[@]}"; do
src="${TARGET_PATH}/${folder}"
dest="${TARGET_BACKUP_DIR}/${folder}"
if [ -d "${src}" ]; then
mkdir -p "${dest}"
cp -r "${src}/." "${dest}/"
echo "Backed up: ${src} -> ${dest}"
else
echo "Skip (not exists): ${src}"
fi
done
echo "Backup completed -> ${TARGET_BACKUP_DIR}"
6.4 deploy.sh 생성
vi /app/script/deploy.sh
#!/bin/bash
TIMESTAMP=$1
DEPLOY_PATH=$2
TARGET_PATH=$3
#TIMESTAMP="20260107_183402"
#DEPLOY_PATH="/app/reinno-erp/prod/webapps_deploy"
#TARGET_PATH="/app/reinno-erp/prod/webapps/ROOT"
WAR_FILE="${DEPLOY_PATH}/${TIMESTAMP}/ROOT.war"
chown -R root:root ${DEPLOY_PATH}/${TIMESTAMP}
# 배포된 파일들의 절대 경로 기준으로 복사
find ${DEPLOY_PATH}/${TIMESTAMP} -type f | while read src_file; do
# 1) 기존 WEB-INF, META-INF, org 등 모든 파일 삭제
echo "[1] Removing old files..."
rm -rf ${TARGET_PATH}/*
echo "Old files removed."
echo ""
# deploy 경로를 제외한 상대 경로 추출
rel_path=${src_file#${DEPLOY_PATH}/${TIMESTAMP}/}
# 타겟 디렉토리 생성
dir_path=$(dirname "${TARGET_PATH}/${rel_path}")
mkdir -p "${dir_path}"
# 압축 해제
cd ${TARGET_PATH}
unzip -o ${WAR_FILE} -d ${TARGET_PATH}
# 파일 복사
# cp "${src_file}" "${TARGET_PATH}/${rel_path}"
echo "Deployed: ${rel_path}"
done
echo "Deployment completed from ${DEPLOY_PATH}/${TIMESTAMP} to ${TARGET_PATH}"
6.5 root 소유권 및 실행 권한 부여
chown root:root /app/script/deploy_prepare.sh
chown root:root /app/script/backup.sh
chown root:root /app/script/deploy.sh
chmod 700 /app/script/deploy_prepare.sh
chmod 700 /app/script/backup.sh
chmod 700 /app/script/deploy.sh
6.6 권한 확인
ls -l /app/script
정상 예:
-rwx------ 1 root root deploy_prepare.sh
-rwx------ 1 root root backup.sh
-rwx------ 1 root root deploy.sh
7. sudo 권한 설정
visudo
jenkins ALL=(root) NOPASSWD: /app/script/deploy_prepare.sh, \
/app/script/backup.sh, \
/app/script/deploy.sh
8. Jenkins 파이프라인 예시
sh """
ssh -i /home/jenkins/.ssh/jenkins_rsa \
-p ${WEB_PORT} \
-o StrictHostKeyChecking=no \
${WEB_USER}@${WEB_HOST} \
"sudo /app/script/deploy_prepare.sh ${WEB_DEPLOY_PATH} ${TIMESTAMP}"
"""
9. 절대 금지 사항
- jenkins 계정을 root로 변경 ❌
- sudo ALL 허용 ❌
- sshpass 사용 ❌
- 비밀번호 자동화 ❌
10. 결론
Jenkins 원격 배포의 정답은
SSH Key + sudo NOPASSWD + 전용 스크립트 구조다.
