Vault + CI/CD 통합

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 관리)

🔧 구성 흐름

  1. Vault에서 Helm values.yaml에 필요한 secret 저장
  2. ArgoCD가 Helm Chart를 통해 Kubernetes에 배포할 때 secrets 자동 주입
  3. 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 도구를 연동하면 **“민감 정보 관리의 자동화 + 보안 강화”**를 동시에 달성할 수 있습니다.


RSS Feed
마지막 수정일자