zioinfo-mail/itsm/cicd/docs/03_security_config.md
DESKTOP-TKLFCPR\ython e228faabf5 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

276 lines
7.1 KiB
Markdown

# 보안 설정 가이드
> **버전**: 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 사용
```groovy
// 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명이 승인:
```groovy
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
# Nginx에서 허용 IP 제한
location / {
allow 10.0.0.0/8; # 내부망
allow 192.168.0.0/16; # 내부망
deny all;
proxy_pass http://jenkins;
}
```
```bash
# 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 보안
```bash
# 배포 서버 /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` 플러그인 사용:
```groovy
options {
maskPasswords()
}
```
Jenkins 관리 → System → Mask Passwords:
- Global Passwords에 패턴 등록: `PASSWORD`, `TOKEN`, `SECRET`, `KEY`
### 5-2. 로그 보존 정책
```groovy
options {
buildDiscarder(logRotator(
numToKeepStr: '30', // 30개 빌드 보관
artifactNumToKeepStr: '10', // 아티팩트 10개 보관
daysToKeepStr: '90' // 90일 이전 자동 삭제
))
}
```
---
## 6. 아티팩트 보안
### 6-1. 아티팩트 체크섬 검증
```bash
# 빌드 후 SHA256 체크섬 생성
sha256sum target/*.jar > target/checksums.sha256
# 배포 전 검증
sha256sum -c checksums.sha256
```
### 6-2. 아티팩트 접근 제한
```bash
# 아티팩트 디렉터리 권한 설정
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 |