리서치이노션 지식위키리서치이노션 지식위키
  • Introduction
  • 코딩 스타일 가이드

    • 공통 스타일
    • 언어별 가이드
    • 코드 품질 및 규칙
    • 코드 리뷰 & 테스트
  • Front-End

    • HTML Layout
    • Javascript
    • Library
  • Back-End

    • Spring Boot
    • eGovFrame
  • 환경 구축

    • Window
    • Linux
    • Spring Framework
  • Figma 템플릿

    • 컴포넌트 시스템
    • 웹 서비스 스타일 가이드
    • 모바일 디자인 템플릿
  • HTML/CSS 템플릿

    • 기본 부트스트랩 템플릿
    • 관리자 테마 UI
  • 기타 자료

    • 디자인 시스템 문서
    • 공통 아이콘 폴더
  • 운영 사이트

    • GitLab (버전 관리)
    • Jenkins (배포 자동화)
    • SonarQube (정적 코드 분석)
    • Send API 문서 (Postman)
  • 접속 환경

    • VPN 연결
  • Introduction
  • 코딩 스타일 가이드

    • 공통 스타일
    • 언어별 가이드
    • 코드 품질 및 규칙
    • 코드 리뷰 & 테스트
  • Front-End

    • HTML Layout
    • Javascript
    • Library
  • Back-End

    • Spring Boot
    • eGovFrame
  • 환경 구축

    • Window
    • Linux
    • Spring Framework
  • Figma 템플릿

    • 컴포넌트 시스템
    • 웹 서비스 스타일 가이드
    • 모바일 디자인 템플릿
  • HTML/CSS 템플릿

    • 기본 부트스트랩 템플릿
    • 관리자 테마 UI
  • 기타 자료

    • 디자인 시스템 문서
    • 공통 아이콘 폴더
  • 운영 사이트

    • GitLab (버전 관리)
    • Jenkins (배포 자동화)
    • SonarQube (정적 코드 분석)
    • Send API 문서 (Postman)
  • 접속 환경

    • VPN 연결
  • 운영 사이트

    • GitLab (버전 관리)

      • 1. 개요
    • Jenkins (배포 자동화)

      • 1. 개요
      • 2. 원격 서버 설정 가이드
    • SonarQube (정적 코드 분석)

      • 1. 개요
      • 2-1. 프로젝트 생성 (로컬)
      • 3-0. 분석 결과 해석 및 필수 조치 가이드
      • 3-1. 로컬 점검

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 yes
    • AuthorizedKeysFile .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 + 전용 스크립트 구조다.

GitLab에서 이 페이지 편집하기
최종 수정일: 26. 1. 8. 오전 10:51
기여자: jhhyun@reinno.com
Prev
1. 개요