Vault + CI/CD 통합
1️⃣3️⃣ Vault + CI/CD 통합
Vault는 단순한 비밀 저장소를 넘어 CI/CD 파이프라인과의 통합을 통해 민감 정보(토큰, API 키, DB 크리덴셜 등)를 안전하게 주입하고 관리할 수 있습니다.
CI/CD 환경에서는 환경변수 또는 파일 형태로 민감 정보가 노출되기 쉬우므로, Vault를 통한 비밀 자동 주입은 보안의 핵심 요소입니다.
1. Jenkins, GitHub Actions에서 시크릿 주입
📌 Jenkins + Vault Plugin 사용 예시
Jenkins에서는 HashiCorp에서 공식 제공하는 Vault 플러그인을 통해 파이프라인 내에서 Vault와 통신할 수 있습니다.
pipeline {
agent any
environment {
VAULT_ADDR = 'http://vault.mycorp.local:8200'
VAULT_SECRET = credentials('jenkins-vault-token')
}
stages {
stage('Get Secret') {
steps {
withVault([vaultUrl: "${VAULT_ADDR}", vaultCredentialId: 'jenkins-vault-token']) {
script {
def dbPass = vaultSecrets([path: 'secret/data/db', secretValues: [[envVar: 'DB_PASSWORD', vaultKey: 'password']]])
echo "DB Password: ${env.DB_PASSWORD}"
}
}
}
}
}
}
☝️
credentials()
는 Jenkins Credentials에 등록된 Vault Token 사용
🧪 GitHub Actions에서 Vault 사용
GitHub Actions에서는 hashicorp/vault-action
를 활용합니다.
name: Use Vault Secrets
on: [push]
jobs:
vault-example:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Read secrets from Vault
uses: hashicorp/vault-action@v2
with:
url: 'https://vault.example.com'
token: ${{ secrets.VAULT_TOKEN }}
secrets: |
secret/data/app/config password | APP_PASSWORD
secret/data/db config | DB_CONFIG
- name: Use secret
run: echo "The secret is $APP_PASSWORD"
✅ 주요 포인트
- Vault 접근 권한은 GitHub Secrets로 보관 (
VAULT_TOKEN
) APP_PASSWORD
,DB_CONFIG
등 환경변수로 주입됨
2. 환경변수, Vault Plugin 사용 예시
Vault에서 읽어온 비밀은 주로 아래 방식으로 파이프라인에 주입됩니다.
방식 | 설명 | 도구 |
---|---|---|
환경변수 | $MY_SECRET 형태로 사용 |
Jenkins, GitHub Actions |
파일 생성 | temp 파일에 주입 후 Mount | Ansible, Kubernetes |
템플릿 렌더링 | Vault Agent + Consul Template | Nomad, Custom |
📦 환경변수 주입 예시 (Linux Shell)
export DB_PASS=$(vault kv get -field=password secret/data/db)
./run.sh
🧩 Jenkins Plugin: Vault Secrets Binding
withCredentials([vaultUsernamePassword(credentialsId: 'vault-db')]) {
sh 'psql -U $USERNAME -p $PASSWORD'
}
3. ArgoCD + Vault 연동 (Helm Secrets 관리)
🔧 구성 흐름
- Vault에서 Helm values.yaml에 필요한 secret 저장
- ArgoCD가 Helm Chart를 통해 Kubernetes에 배포할 때 secrets 자동 주입
argocd-vault-plugin
을 통해 Helm values에 시크릿 삽입
📦 Vault 저장 구조 예시
vault kv put secret/helm/myapp \
db_user="admin" \
db_pass="s3cr3t!"
📄 values.yaml
템플릿
db:
username: <path:secret/helm/myapp#db_user>
password: <path:secret/helm/myapp#db_pass>
🧰 ArgoCD Application 예시
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp
spec:
source:
repoURL: https://github.com/myorg/helm-apps
path: myapp
helm:
valueFiles:
- values.yaml
plugin:
name: argocd-vault-plugin
🖼️ 연동 아키텍처
┌───────────────┐
│ Vault │
│ (secret store)│
└────┬──────────┘
│
▼
┌──────────────┐
│ ArgoCD App │
│ (argocd-vault│
│ -plugin) │
└────┬─────────┘
▼
┌──────────────┐
│ Helm Template│
└────┬─────────┘
▼
┌──────────────┐
│ Kubernetes │
│ Deployment │
└──────────────┘
✅ 정리
항목 | 설명 |
---|---|
Jenkins | Vault 플러그인 사용, 환경변수 주입 가능 |
GitHub Actions | 공식 vault-action 활용 가능 |
ArgoCD | argocd-vault-plugin 통해 Helm 연동 |
보안 이점 | 민감 정보는 Vault에서만 관리, 로컬 파일 노출 없음 |
Vault와 CI/CD 도구를 연동하면 **“민감 정보 관리의 자동화 + 보안 강화”**를 동시에 달성할 수 있습니다.
마지막 수정일자