guardia-itsm/cicd/docs/03_security_config.md
DESKTOP-TKLFCPRython 64c27c3509 feat(itsm): G-1~G-12 확장 기능 + 하네스/봇/설치스크립트 구현
G-1: 메신저 Webhook Relay + _send_to_room 실제 httpx 호출 구현
G-2: POST /api/tasks/bulk SR 대량작업 엔드포인트 (최대 100건)
G-3: 라이선스 만료 알림 스케줄러 (매일 09:00 KST)
G-4: 체험판 upgrade_banner 필드 + license.py 배너 로직
G-5: core/auto_rca.py + incidents/problem auto-rca 엔드포인트
G-6: core/deploy_impact.py + vibe impact-analysis 엔드포인트
G-7: core/ticket_classifier.py + SR 생성 시 AI 분류 + ai-suggestion API
G-8: VulnPatchRecord 모델 + vuln_scan 패치추적 4개 엔드포인트
G-9: core/jira_sync.py + gateway Jira/Confluence 연동 엔드포인트
G-10: core/push_notify.py + routers/push.py + PushSubscription 모델
G-11: approvals 다중승인 (위임/서명/기한초과/마감연장)
G-12: alembic.ini + migrations/ + cicd/migrate_to_postgres.sh

하네스: guardia-orchestrator 확장기능 Phase 반영
봇명령어: /sr /status /license /bulk 슬래시 명령어 추가
설치스크립트: setup/ (Ubuntu, CentOS, RHEL, Windows) --test 옵션 포함

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:18:52 +09:00

7.1 KiB

보안 설정 가이드

버전: 1.0.0
최종 수정: 2026-05-25
참고 기준: NIST SP 800-53, 행안부 정보보안 관리체계


1. 개요

CI/CD 파이프라인에서 취급하는 민감 정보:

종류 예시 보관 방법
SSH 키 배포 서버 SSH 개인키 Jenkins Credentials (SSH Key)
서비스 계정 토큰 ITSM API Token Jenkins Credentials (Secret Text)
DB 접속 정보 SonarQube DB Password Jenkins Credentials (Username+Password)
배포 서버 정보 서버 IP/포트 Jenkins Credentials / Config File

절대 금지 사항:

  • Jenkinsfile 또는 스크립트에 민감 정보 하드코딩
  • Git 저장소에 자격증명 커밋
  • 빌드 로그에 비밀번호/토큰 출력

2. Jenkins Credentials 관리

2-1. Credentials 종류 및 용도

Credential ID 종류 용도
git-credentials Username+Password (또는 SSH Key) Git 소스 체크아웃
ssh-{서버명} SSH Username+Private Key 배포 서버 SSH 접속
itsm-api-token Secret Text GUARDiA ITSM API 호출
sonar-token Secret Text SonarQube 분석
deploy-key-prd SSH Username+Private Key 운영 서버 배포 전용

2-2. SSH Credentials 등록

Jenkins 관리 → Credentials → System → Global credentials → Add Credentials:

Kind:         SSH Username with private key
Scope:        Global
ID:           ssh-app-server-01
Description:  APP-SERVER-01 배포 SSH Key
Username:     deploy
Private Key:  [Enter directly] → 개인키 내용 붙여넣기
Passphrase:   (있는 경우 입력)

2-3. Secret Text 등록 (API Token)

Kind:         Secret text
Scope:        Global
ID:           itsm-api-token
Description:  GUARDiA ITSM API Token
Secret:       <토큰값>

2-4. Jenkinsfile에서 Credentials 사용

// SSH Key 사용
withCredentials([sshUserPrivateKey(
    credentialsId: 'ssh-app-server-01',
    keyFileVariable: 'SSH_KEY',
    usernameVariable: 'SSH_USER'
)]) {
    sh "ssh -i ${SSH_KEY} ${SSH_USER}@${TARGET_HOST} 'systemctl status tomcat'"
}

// Secret Text 사용
withCredentials([string(
    credentialsId: 'itsm-api-token',
    variable: 'ITSM_TOKEN'
)]) {
    sh "curl -H 'Authorization: Bearer ${ITSM_TOKEN}' ${ITSM_URL}/api/health"
}

// Username+Password 사용
withCredentials([usernamePassword(
    credentialsId: 'sonar-credentials',
    usernameVariable: 'SONAR_USER',
    passwordVariable: 'SONAR_PASS'
)]) {
    sh "mvn sonar:sonar -Dsonar.login=${SONAR_USER} -Dsonar.password=${SONAR_PASS}"
}

3. RBAC (역할 기반 접근 제어)

3-1. Role Strategy Plugin 설정

Jenkins 관리 → Security → Authorization → Role-Based Strategy

Global Roles

Role 권한 대상
admin 전체 Jenkins 관리자
pm Job Read/Build, View PM/프로젝트 관리자
developer Job Read/Build (dev 한정), View 개발자
viewer Job Read, View 감사/보안 담당

Project Roles (정규식 매핑)

Role 대상 Job 패턴 권한
dev-deployer .*-dev$ Build, Cancel, Read
prd-deployer .*-prd$ Build, Cancel, Read
rollback-only .*-rollback$ Build, Read

3-2. 운영 배포 2인 승인 규칙

main, hotfix/* 브랜치 배포는 반드시 2명이 승인:

stage('Production Approval') {
    steps {
        script {
            def approvers = []
            def required = 2

            timeout(time: 60, unit: 'MINUTES') {
                for (int i = 0; i < required; i++) {
                    def approval = input(
                        message: "운영 배포 ${i+1}/${required}차 승인",
                        ok: "승인",
                        submitterParameter: "APPROVER_${i+1}"
                    )
                    approvers << approval
                    echo "승인자 ${i+1}: ${approval}"
                }
            }
            env.APPROVERS = approvers.join(', ')
        }
    }
}

4. 네트워크 보안

4-1. Jenkins 접근 IP 제한

# Nginx에서 허용 IP 제한
location / {
    allow 10.0.0.0/8;       # 내부망
    allow 192.168.0.0/16;   # 내부망
    deny all;
    proxy_pass http://jenkins;
}
# firewalld에서 특정 IP만 허용
sudo firewall-cmd --permanent --add-rich-rule='
    rule family="ipv4"
    source address="10.0.0.0/8"
    port protocol="tcp" port="8080"
    accept'
sudo firewall-cmd --reload

4-2. 배포 서버 SSH 보안

# 배포 서버 /etc/ssh/sshd_config 설정
# Jenkins 전용 deploy 계정만 허용
AllowUsers deploy jenkins-agent
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# deploy 계정 SSH sudo 제한 (특정 명령만)
# /etc/sudoers.d/jenkins-deploy
deploy ALL=(root) NOPASSWD: /bin/systemctl restart tomcat9, \
                             /bin/systemctl restart nginx, \
                             /opt/jeus/bin/stopServer, \
                             /opt/jeus/bin/startServer

5. 빌드 로그 보안

5-1. 민감 정보 마스킹

Mask Passwords 플러그인 사용:

options {
    maskPasswords()
}

Jenkins 관리 → System → Mask Passwords:

  • Global Passwords에 패턴 등록: PASSWORD, TOKEN, SECRET, KEY

5-2. 로그 보존 정책

options {
    buildDiscarder(logRotator(
        numToKeepStr: '30',      // 30개 빌드 보관
        artifactNumToKeepStr: '10',  // 아티팩트 10개 보관
        daysToKeepStr: '90'      // 90일 이전 자동 삭제
    ))
}

6. 아티팩트 보안

6-1. 아티팩트 체크섬 검증

# 빌드 후 SHA256 체크섬 생성
sha256sum target/*.jar > target/checksums.sha256

# 배포 전 검증
sha256sum -c checksums.sha256

6-2. 아티팩트 접근 제한

# 아티팩트 디렉터리 권한 설정
sudo mkdir -p /opt/artifacts
sudo chown jenkins:jenkins /opt/artifacts
sudo chmod 750 /opt/artifacts

7. 감사 로그 (Audit Trail)

Audit Trail Plugin 설치 후:

Jenkins 관리 → System → Audit Trail:

  • Log Location: /var/log/jenkins/audit.log
  • Log File Size: 100 MB
  • Log File Count: 30

기록 항목:

  • 로그인/로그아웃
  • 자격증명 접근
  • 잡 빌드 시작/중단
  • 설정 변경

8. Jenkins 보안 설정 체크리스트

항목 상태 비고
CSRF Protection 활성화 기본 활성화
익명 사용자 접근 차단 Authorization: Role-Based
빌드 에이전트 인증 SSH or JNLP with secret
Credentials 암호화 Jenkins master key 사용
보안 업데이트 정기 적용 주 1회 매주 일요일 자동 업데이트 확인
사용하지 않는 플러그인 제거 분기별 점검
HTTPS 적용 내부망 선택 외부 연동 시 필수
빌드 로그 민감정보 마스킹 Mask Passwords Plugin
운영 배포 2인 승인 input() step
감사 로그 활성화 Audit Trail Plugin