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>
7.1 KiB
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 |