본문 바로가기

에이전틱 AI(Agentic AI)의 성공은 API 접근성에 달려 있다, 통합 실행력

728x90

에이전틱 AI는 단순히 정보를 제공하는 데 그치지 않고, 실제 행동을 수행할 수 있는 능동적 AI입니다.
예: 이메일 작성, 회의 예약, 결제 승인 등 작업 지향적인 수행 능력을 갖춘 AI입니다.

  • 기존 AI는 ‘지능적인 검색기’에 가까웠다면,
  • Agentic AI는 “실행이 가능한 사용자”처럼 작동하는 AI로, 디지털 업무를 능동적으로 처리합니다.

🔗 API의 역할: 에이전트의 ‘팔과 다리’

Agentic AI가 실제로 일을 하려면 다양한 시스템과의 연결이 필요합니다.
이 연결의 핵심이 바로 API(Application Programming Interface)입니다.

  • 🛠️ 행동 수행 수단: AI가 외부 시스템에 명령을 내리려면 API를 통해야 합니다.
  • 🔌 시스템 통합: 이메일, 캘린더, HR 시스템, ERP, 재고 관리 등 수많은 툴과 연결해야 함.
  • 🔁 워크플로우 실행: 예를 들어, AI가 여행 일정을 잡고, 결제를 승인하며, 캘린더에 등록하는 등의 일련의 작업을 자동화합니다.

조직이 준비해야 할 과제

① API 인프라 강화

  • 내부 시스템의 API 공개 수준과 접근 권한을 정비해야 함.
  • API 문서화와 거버넌스를 체계화해야 함.
  • 기업 내 API의 "활용성"을 높이는 것이 관건.

② 보안 및 통제

  • AI가 내부 시스템에 접근하는 만큼, 강력한 인증/권한 관리가 필요.
  • 민감한 데이터 접근은 Role-Based Access Control(RBAC), Zero Trust 기반의 API 보안 아키텍처 도입 필요.

③ 자동화/워크플로우 설계

  • AI가 실질적인 생산성을 발휘하려면, 각 부서/업무별 자동화 가능한 업무 정의가 필요.
  • 기존 시스템과의 연계 로직 및 조건 정의를 함께 고려해야 함.

API를 전략자산으로

  • “모든 시스템을 에이전트가 호출 가능한 API 자산으로 바꾸는 것”이 성공 열쇠.
  • 내부의 기술 조직과 협력해, API를 통한 서비스 추상화와 노출 전략을 추진해야 함.
  • 기술적 통제뿐 아니라, 비즈니스 부서와의 협업을 통해 실제 업무 시나리오 구현이 중요.

성공적인 에이전틱 AI 구현을 위한 핵심 조건

조건 설명
✅ API 접근성 AI가 외부 시스템과 상호작용할 수 있도록 API를 열어야 함
✅ 보안 거버넌스 인증, 권한 관리, 데이터 접근 제한 등 통제가 필요
✅ 시스템 통합 다양한 SaaS 및 온프레미스 시스템과 연결 구조 마련
✅ 자동화 시나리오 설계 반복적 업무를 자동화할 수 있는 워크플로우 구축
✅ 기술-비즈니스 협업 AI가 실제 업무에 작동되기 위한 환경 조성

에이전틱 AI는 단순히 “똑똑한 응답기”에서 “실행 가능한 조력자”로 진화하고 있습니다.
그러나 이를 가능하게 하려면, 기업은 자신들의 시스템을 AI가 사용할 수 있도록 개방된 API 환경으로 전환해야 합니다.
즉, “API는 에이전틱 AI의 생존 기반이자 미래 경쟁력의 중심”입니다.

300x250

Python에서 .env 파일을 활용한 API Key 관리 방식은 보안성과 유지보수성을 높일 수 있는 좋은 방법입니다. 다만, .env 파일만으로는 완전한 보안을 보장하지 않기 때문에 몇 가지 보안 점검 포인트와 모범 사례를 함께 적용해야 합니다.

.env 파일을 사용하는 기본 방법

.env 파일은 환경변수를 정의해 놓는 텍스트 파일입니다.

예시: .env 파일

API_KEY=sk-xxxxxx
SECRET_TOKEN=mysecrettoken123

Python 코드에서 불러오기 (python-dotenv 라이브러리 사용)

pip install python-dotenv
from dotenv import load_dotenv
import os

load_dotenv()  # .env 파일 로드

api_key = os.getenv("API_KEY")
token = os.getenv("SECRET_TOKEN")

보안 체크포인트 및 가이드

✅ .env 파일을 Git 등 버전 관리에 절대 포함하지 마세요

  • .gitignore에 반드시 포함: .env

.env.example 템플릿 제공

  • 개발자들에게 필요한 변수명만 제공하고 값은 제거:
  • API_KEY= SECRET_TOKEN=

✅ .env 파일은 운영 환경별로 구분

  • .env.development
    .env.production
  • 그리고 코드에서는 다음처럼 사용 가능
    load_dotenv(dotenv_path=".env.production")

✅ 운영 환경에서는 OS 환경변수만 사용

  • .env는 로컬 개발환경용으로 제한하고, 운영 서버에서는 .env 사용 없이 시스템 환경변수만 사용:
  • export API_KEY=sk-xxxxxx

환경 변수 노출 여부 점검

  • .env가 웹 서버를 통해 노출되는지 확인 (예: 잘못된 NGINX 설정 등)
  • DEBUG 설정이 꺼져 있는지 확인 (Flask, Django 등)

✅ API Key는 회전(Rotation) 및 만료 정책을 설정

  • API Key 자체에 만료 일자를 설정하거나, 일정 주기로 재발급

추가 보안 계층 적용

  • 민감한 정보를 .env 대신 Vault나 KMS에 저장하고, .env에는 참조 정보만 저장하는 방식도 고려
    • HashiCorp Vault
    • AWS Secrets Manager
    • GCP Secret Manager

실무 적용 예시: 다양한 환경에서 로드

import os
from dotenv import load_dotenv

# 환경 변수에 따라 다른 .env 파일 사용
env = os.getenv("APP_ENV", "development")  # 예: 'production', 'staging'

dotenv_path = f".env.{env}"
load_dotenv(dotenv_path=dotenv_path)

API_KEY = os.getenv("API_KEY")

보안 점검 체크리스트

항목 설명
.env Git 제외 .gitignore에 포함
✅ 운영환경은 OS 환경변수 .env는 로컬에서만 사용
✅ 권한 제한 .env 파일의 권한은 최소화 (chmod 600)
✅ 로그에 노출 금지 print() 또는 로그에 API_KEY 등이 출력되지 않도록 주의
✅ 자동화 배포 시 암호화 저장 고려 .env 파일은 저장소 대신 CI/CD 환경변수로 설정하는 것도 좋음

보안 강화 추가 제안

  • CI/CD에 API Key를 직접 포함하지 말고, GitHub Actions, GitLab CI, Jenkins 등에서 제공하는 보안 변수(Secret) 기능 사용
  • 컨테이너 환경에서는 .env 파일을 ConfigMap이나 Secret으로 관리 (Kubernetes 환경의 경우)

 

.env를 활용한 API Key 관리 방식은 편리하면서도 보안적인 접근이 가능한 방법입니다. 다만, 보안 관리를 철저히 하지 않으면 민감정보 유출의 경로가 될 수 있으므로, 위에서 제시한 체크리스트를 기반으로 개발/운영 환경에 맞는 보호 조치를 반드시 적용하시길 권장드립니다. .env 방식은 간편하지만 보안 및 확장성 측면에서는 한계가 있으므로, HashiCorp Vault 같은 비밀 관리 시스템(Secrets Manager) 으로 전환하는 것이 권장됩니다. 또한, 이 전환을 CI/CD 환경과 통합하면 보안과 운영 효율성을 모두 강화할 수 있습니다.

🔐 .env → Vault 전환 전략 & CI/CD 자동화 보안 전략

.env에서 Vault로 전환 개요

기존 구조

개발자 → .env 파일 (로컬/서버) → os.getenv()로 불러옴

전환 후 구조

개발자 / 앱 / CI → Vault (Secret 저장소) → API or CLI로 실시간 조회

HashiCorp Vault를 이용한 보안 비밀 관리 방식

설치 (로컬 또는 서버)

# 간단한 dev 서버 실행
vault server -dev

초기 설정

export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN='dev-root'  # 실제 운영 환경에서는 다른 인증방식 사용

# Secret 등록 예시
vault kv put secret/myapp API_KEY=sk-xxxxxx SECRET_TOKEN=abc123

Python에서 Vault 호출

pip install hvac
import hvac

client = hvac.Client(
    url='http://127.0.0.1:8200',
    token='dev-root'  # 운영에서는 JWT, TLS 인증 등 활용
)

secret = client.secrets.kv.v2.read_secret_version(path='myapp')
api_key = secret['data']['data']['API_KEY']

CI/CD에서 Vault 자동 연동 전략

GitHub Actions 예시

  1. Vault 인증용 GitHub JWT 사용 (Vault에 GitHub 인증 설정 필요)
  2. CI 환경에서 Secrets 불러오기
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Authenticate to Vault
        run: |
          export VAULT_ADDR=https://vault.example.com
          vault login -method=github token=${{ secrets.VAULT_GITHUB_TOKEN }}

      - name: Read Secrets from Vault
        run: |
          vault kv get -format=json secret/myapp > secret.json
          export API_KEY=$(jq -r .data.data.API_KEY secret.json)

👉 API_KEY는 이후 step에서 사용 가능하며 로그에는 출력되지 않도록 주의

GitLab CI 예시

stages:
  - deploy

deploy:
  script:
    - apt-get update && apt-get install -y jq
    - VAULT_TOKEN=$VAULT_TOKEN_FROM_ENV
    - export API_KEY=$(curl -s --header "X-Vault-Token: $VAULT_TOKEN" \
        https://vault.example.com/v1/secret/data/myapp | jq -r '.data.data.API_KEY')

보안 운영 체크포인트 (Vault 연동 시)

항목 내용
✅ 인증 방식 토큰, GitHub JWT, AppRole, TLS 인증 등 사용 (환경에 따라 선택)
✅ 접근 권한 제어 Vault의 정책(Policy) 기능으로 Key 단위 접근 통제 가능
✅ 감사로그 누가 어떤 Secret을 조회했는지 로그 기록 (Vault Audit 기능)
✅ 암호화 저장 Vault 내부에서 자동 암호화 후 저장, 자체 KMS 불필요
✅ Secret TTL 특정 시간 후 자동 만료 가능 (임시 키 활용 가능)

.env 대비 Vault의 보안 우위

항목 .env 파일 Vault
✅ 저장 방식 평문 (텍스트 파일) 암호화 저장
✅ 접근 제어 OS 파일 권한에 의존 Key-Level 접근 정책 지원
✅ 로테이션 수동 변경 API 통해 자동화 가능
✅ CI/CD 통합 노출 위험 존재 안전한 API 연동
✅ 감사 기능 없음 내장된 감사 로그
  • Vault + CI/CD 연동을 통한 중앙 집중형 비밀 관리가 가장 안전하고 확장성 있는 방식입니다.
  • .env는 개발 환경에서만 사용하고, 운영 및 배포 환경은 모두 Vault 또는 Secret Manager (AWS/GCP) 로 전환하세요.
  • CI/CD 파이프라인에서는 API 키를 직접 다루지 않고, Vault를 통해 불러와 환경 변수로만 사용하는 것이 이상적입니다.

 

HashiCorp Vault 구성 가이드 (기본 + GitHub 인증 연동 포함)

설치 및 실행 (개발 환경용)

# 바이너리 다운로드 후
vault server -dev
  • -dev 옵션은 테스트용. 운영 환경에서는 파일 스토리지, Consul, S3, etcd 등 사용.

운영 환경 구성 예시 (config.hcl)

storage "file" {
  path = "/var/lib/vault/data"
}

listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_disable = 1  # 운영 환경에서는 반드시 TLS 사용!
}

ui = true

실행

vault server -config=config.hcl

초기화 및 언실(seal) 해제

vault operator init
vault operator unseal
vault login <root_token>

비밀 저장 및 조회 예시

# 키 등록
vault kv put secret/myapp API_KEY=sk-xxxx SECRET_TOKEN=abc123

# 조회
vault kv get secret/myapp

GitHub Actions와 연동 (GitHub 인증 모듈 사용)

1️⃣ Vault에 GitHub 인증 방식 활성화

vault auth enable github

2️⃣ GitHub 조직 설정

vault write auth/github/config organization="your-org-name"

3️⃣ 정책 생성

vault policy write ci-policy - <<EOF
path "secret/data/myapp" {
  capabilities = ["read"]
}
EOF

4️⃣ GitHub 팀과 Vault 정책 연결

vault write auth/github/map/teams/ci-team value=ci-policy

5️⃣ GitHub Action에서 로그인

- name: Install Vault CLI
  run: sudo apt-get install vault -y

- name: Vault Login & Get Secrets
  run: |
    export VAULT_ADDR=https://vault.example.com
    vault login -method=github token=${{ secrets.VAULT_GITHUB_TOKEN }}
    vault kv get -format=json secret/myapp > secrets.json
    export API_KEY=$(jq -r .data.data.API_KEY secrets.json)

GCP Secret Manager 구성

보안 특징

  • IAM 기반 접근 제어
  • 자동 버전 관리 및 감사 로그
  • 서버리스 통합 (Cloud Run, GKE 등)

GCP Secret 등록

gcloud secrets create myapp-api-key --replication-policy="automatic"
gcloud secrets versions add myapp-api-key --data-file=api_key.txt

Python에서 사용

from google.cloud import secretmanager

client = secretmanager.SecretManagerServiceClient()
name = f"projects/PROJECT_ID/secrets/myapp-api-key/versions/latest"
response = client.access_secret_version(name=name)
secret = response.payload.data.decode("UTF-8")

GitHub Actions에서 사용

- name: 'Set up Cloud SDK'
  uses: google-github-actions/setup-gcloud@v1
  with:
    service_account_key: ${{ secrets.GCP_SA_KEY }}
    project_id: my-project

- name: 'Access Secret'
  run: |
    gcloud secrets versions access latest --secret=myapp-api-key > key.txt

AWS Secrets Manager 구성

보안 특징

  • IAM 기반 접근 제어
  • 자동 키 회전 지원
  • CloudTrail 감사 연동

비밀 저장

aws secretsmanager create-secret \
  --name MyApp/API_KEY \
  --secret-string '{"API_KEY":"sk-xxxx", "SECRET_TOKEN":"abc123"}'

Python 사용 예시 (boto3)

import boto3
import json

client = boto3.client('secretsmanager')
response = client.get_secret_value(SecretId='MyApp/API_KEY')
secrets = json.loads(response['SecretString'])
api_key = secrets['API_KEY']

GitHub Actions에서 사용

- name: Configure AWS credentials
  uses: aws-actions/configure-aws-credentials@v2
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
    aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
    region: ap-northeast-2

- name: Access Secrets
  run: |
    secret=$(aws secretsmanager get-secret-value --secret-id MyApp/API_KEY | jq -r '.SecretString')
    export API_KEY=$(echo $secret | jq -r '.API_KEY')

Vault vs GCP vs AWS 비교 요약

항목 HashiCorp Vault GCP Secret Manager AWS Secrets Manager
배포 형태 자체 서버/클러스터 운영 GCP 서비스 (서버리스) AWS 서비스
인증방식 AppRole, GitHub, TLS 등 IAM IAM
자동 회전 가능 (내부 구현 필요) 지원 지원
CI/CD 통합 GitHub, GitLab 등 자유도 높음 GitHub Action 공식 연동 GitHub Action 공식 연동
감사 로그 제공 (audit log 기능) Cloud Audit Logs CloudTrail 연동
운영 복잡도 다소 복잡 (유연함↑) 매우 단순 단순

추천

시나리오 추천 비밀 관리
온프레미스 인프라 HashiCorp Vault (가장 유연함)
GCP 중심 환경 GCP Secret Manager
AWS 기반 환경 AWS Secrets Manager
CI/CD에서만 사용 GCP/AWS 공식 연동 또는 GitHub Secret + dotenv 일부 사용 병행

Vault 고가용성 구성: Raft & Consul 백엔드 비교

Raft 스토리지 백엔드 (권장, 내장형)

  • Vault 자체적으로 분산 합의 알고리즘(Raft)을 구현
  • 외부 스토리지 필요 없음

 

예시 설정 (config.hcl)

storage "raft" {
  path    = "/opt/vault/data"
  node_id = "vault-node-1"
}

listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_cert_file = "/etc/vault/certs/vault.crt"
  tls_key_file  = "/etc/vault/certs/vault.key"
}

api_addr = "https://vault-node-1.example.com:8200"
cluster_addr = "https://vault-node-1.example.com:8201"
ui = true

클러스터 조인 명령

vault operator raft join https://vault-node-2.example.com:8200

Consul 스토리지 백엔드 (기존 Consul 사용 시)

storage "consul" {
  address = "127.0.0.1:8500"
  path    = "vault/"
}
  • Vault 상태 저장은 Consul에 위임
  • 클러스터 상태 관리 용이 (Consul 자체 HA도 필수)

비교 요약

항목 Raft Consul
복잡도 낮음 높음 (별도 서비스 필요)
장애 복구 자동 선출 자동 선출
운영 필요 리소스 Vault 노드만 필요 Consul 클러스터 추가 필요
권장 여부 ✅ Vault 1.4+ 이상에서는 기본으로 추천 ✅ Consul 이미 운영 중이면 사용 가능

TLS 기반 인증 구성 (Mutual TLS 포함)

기본 TLS 구성

listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_cert_file = "/etc/vault/certs/vault.crt"
  tls_key_file  = "/etc/vault/certs/vault.key"
}
  • 필수 권장: CA 서명된 인증서 사용
  • 인증서 자동화: Let's Encrypt, Vault 자체 pki 엔진

Mutual TLS (클라이언트 인증 포함)

listener "tcp" {
  address         = "0.0.0.0:8200"
  tls_cert_file   = "/etc/vault/certs/vault.crt"
  tls_key_file    = "/etc/vault/certs/vault.key"
  tls_client_ca_file = "/etc/vault/certs/ca.crt"
  tls_require_and_verify_client_cert = true
}
  • 사용자는 클라이언트 인증서 필요
  • 운영에서는 LDAP + TLS, mTLS + JWT, 또는 OIDC 방식 병행 권장

Kubernetes와 연동한 Vault Secrets 관리

구성 방식 개요

Pod → Vault Agent (sidecar or init) → Vault 서버 → secrets 주입

Kubernetes Auth Method 활성화

vault auth enable kubernetes

Kubernetes API 연동 정보 설정

vault write auth/kubernetes/config \
  token_reviewer_jwt="$TOKEN" \
  kubernetes_host="https://kubernetes.default.svc" \
  kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

서비스 어카운트 매핑

vault write auth/kubernetes/role/my-app \
  bound_service_account_names=vault-app \
  bound_service_account_namespaces=default \
  policies=my-app-policy \
  ttl=24h

Vault Agent Injector 예시 (sidecar 방식)

annotations:
  vault.hashicorp.com/agent-inject: "true"
  vault.hashicorp.com/role: "my-app"
  vault.hashicorp.com/agent-inject-secret-config.txt: "secret/data/myapp"

📦 관련 Helm Chart: hashicorp/vault, vault-helm

CI/CD 환경 보안 아키텍처 설계

Secrets는 Git이나 .env에 저장하지 않고 외부에서 안전하게 로드

구성 요소 추천 보안 방식
GitHub Actions Vault + JWT 또는 GCP/AWS Secret Manager 사용
GitLab CI Vault + AppRole 또는 CI_VAR + encrypted env
Jenkins Vault Plugin 또는 Credential Store + Vault 연동
Docker / BuildKit Build-time Secrets 주입 (RUN --mount=type=secret)
Terraform Vault provider 사용 (data "vault_generic_secret" 등)

예시: GitHub Actions + Vault (mTLS 또는 JWT 방식)

- name: Install Vault CLI
  run: sudo apt-get install vault -y

- name: Login to Vault
  run: |
    export VAULT_ADDR=https://vault.example.com
    vault login -method=github token=${{ secrets.VAULT_GITHUB_TOKEN }}

- name: Retrieve Secrets
  run: |
    vault kv get -format=json secret/myapp > secret.json
    export API_KEY=$(jq -r .data.data.API_KEY secret.json)

도입 제안

시나리오 권장 구성
Vault 자체 HA Raft 기반 + TLS 통신
보안 인증 방식 mTLS + LDAP/OIDC + AppRole 병행
K8s 환경 Vault Agent Injector + Kubernetes Auth
CI/CD 통합 Vault API 호출 + 보안 Secret 저장소만 활용
대규모 시스템 Policy 기반 RBAC + Audit Log 활성화 + TTL 및 접근 제한 설정

Vault를 Helm으로 설치하고, TLS를 Raft + PKI로 구성한 후, Kubernetes에 자동 인증서 주입, 그리고 Terraform을 통한 정책 관리 자동화합니다.

Helm 기반 Vault 설치 (Raft + TLS)

준비 사항

  • Kubernetes 클러스터
  • Vault Helm repo
helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update

TLS 인증서 생성 (임시용)

openssl req -x509 -nodes -newkey rsa:2048 \
  -keyout vault.key -out vault.crt -days 365 \
  -subj "/CN=vault.example.com"

kubectl create secret tls vault-tls --cert=vault.crt --key=vault.key -n vault

Helm 설치 명령

helm install vault hashicorp/vault -n vault --create-namespace \
  --set "server.ha.enabled=true" \
  --set "server.ha.raft.enabled=true" \
  --set "server.ha.raft.setNodeId=true" \
  --set "server.ha.replicas=3" \
  --set "server.extraVolumes[0].name=vault-tls" \
  --set "server.extraVolumes[0].secret.secretName=vault-tls" \
  --set "server.extraVolumeMounts[0].name=vault-tls" \
  --set "server.extraVolumeMounts[0].mountPath=/vault/userconfig/tls" \
  --set "server.extraArgs[0]=-tls-cert-file=/vault/userconfig/tls/tls.crt" \
  --set "server.extraArgs[1]=-tls-key-file=/vault/userconfig/tls/tls.key"

Vault의 PKI 엔진을 통한 TLS 인증서 자동 발급

PKI 엔진 활성화

vault secrets enable pki
vault secrets tune -max-lease-ttl=87600h pki

Root CA 생성

vault write pki/root/generate/internal \
  common_name="vault-ca.example.com" ttl=87600h

Role 생성 (K8s에 발급할 인증서 정의)

vault write pki/roles/k8s-cluster \
  allowed_domains="svc.cluster.local" \
  allow_subdomains=true \
  max_ttl="72h"

Kubernetes에 Vault 인증서 자동 주입 구성

Kubernetes Auth 활성화

vault auth enable kubernetes

Vault 내부에서 K8s API 연동

vault write auth/kubernetes/config \
  token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
  kubernetes_host="https://kubernetes.default.svc" \
  kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

정책 생성

# policy.hcl
path "pki/issue/k8s-cluster" {
  capabilities = ["update"]
}
vault policy write pki-policy policy.hcl

Vault Injector 사용 (sidecar)

annotations:
  vault.hashicorp.com/agent-inject: "true"
  vault.hashicorp.com/role: "k8s-pki"
  vault.hashicorp.com/agent-inject-secret-cert.pem: "pki/issue/k8s-cluster"

→ Pod 내 /vault/secrets/cert.pem 위치에 자동 인증서 주입

Terraform을 통한 Vault 정책 및 Secret 자동화

Terraform Provider 설정

provider "vault" {
  address = "https://vault.example.com"
  token   = var.vault_token
}

Secret, Policy, Role 관리 예시

resource "vault_policy" "app" {
  name = "my-app-policy"
  policy = <<EOT
path "secret/data/myapp/*" {
  capabilities = ["read"]
}
EOT
}

resource "vault_kv_secret_v2" "api_key" {
  mount = "secret"
  name  = "myapp/config"

  data_json = jsonencode({
    API_KEY = "sk-xxxxxx"
  })
}

AppRole 생성

resource "vault_auth_backend" "approle" {
  type = "approle"
  path = "approle"
}

resource "vault_approle_auth_backend_role" "ci" {
  backend        = vault_auth_backend.approle.path
  role_name      = "ci-role"
  token_policies = [vault_policy.app.name]
  token_ttl      = "1h"
  token_max_ttl  = "4h"
}

→ CI/CD에서 role_id + secret_id로 로그인 후 비밀 접근 가능

종합 아키텍처 예시

┌──────────────┐
│ CI/CD (GitHub│────┐
└──────┬───────┘    │ Vault API 인증 (AppRole or GitHub)
       │            ▼
       │      ┌────────────┐
       │      │ Vault (HA) │  ◀─────────────┐
       │      └─────┬──────┘                │
       ▼            ▼                       │
 Kubernetes Pods    PKI Engine → 자동 TLS 인증서 발급
  (with Agent)       ↑                      │
       │             │                      │
       └────→ secret/data/myapp ←───────────┘
구성 요소 기술 선택
설치 방식 Helm + Raft
TLS 관리 Vault PKI 엔진 자동 발급
인증 주입 Vault Agent Injector + Kubernetes Auth
IaC 자동화 Terraform + Vault provider 활용
인증 방식 CI: AppRole / K8s: Kubernetes Auth / 운영자: LDAP or GitHub

아래는 Vault 기반 보안 인프라 설계를 위한 구성 요소별 실전 리소스 모음입니다.
각 항목은 샘플 코드 저장소, CI 연동 템플릿, Audit 설정 가이드, GitOps 연동 구성 예시 등으로 구성되어 있습니다.

Helm + Vault + Raft + TLS 설치 샘플

GitHub 샘플 저장소

📝 실습 템플릿

helm install vault hashicorp/vault -n vault --create-namespace -f values-ha.yaml

📁 values-ha.yaml 주요 설정

server:
  ha:
    enabled: true
    raft:
      enabled: true
  extraVolumes:
    - name: vault-tls
      secret:
        secretName: vault-tls

Vault + PKI 인증서 발급 구성

샘플 코드

📄 실전 설정 예시

vault secrets enable pki
vault write pki/root/generate/internal \
  common_name="example.com" ttl=87600h

vault write pki/roles/web-cert \
  allowed_domains="web.svc.cluster.local" \
  allow_subdomains=true \
  max_ttl="72h"

📌 인증서 자동 발급은 Agent를 통해 주입되며 vault.hashicorp.com/agent-inject-secret-cert.pem로 설정

Kubernetes 인증 + Vault Agent Injector 예시

📄 예시 Pod 템플릿

apiVersion: v1
kind: Pod
metadata:
  annotations:
    vault.hashicorp.com/agent-inject: "true"
    vault.hashicorp.com/role: "k8s-role"
    vault.hashicorp.com/agent-inject-secret-cert.pem: "pki/issue/web-cert"

/vault/secrets/cert.pem 경로에 인증서 주입됨

Terraform + Vault IaC 통합 예시

📄 주요 리소스 구성

resource "vault_kv_secret_v2" "api_key" {
  mount = "secret"
  name  = "myapp/config"

  data_json = jsonencode({
    API_KEY = "sk-xxx"
  })
}

resource "vault_policy" "ci" {
  name   = "ci-policy"
  policy = file("${path.module}/ci-policy.hcl")
}

→ CI/CD에서 Terraform으로 정책 배포 및 비밀 구성 가능

CI 연동 (GitHub Actions + Vault)

📄 예시 Workflow

- name: Install Vault CLI
  run: sudo apt-get install vault -y

- name: Login to Vault
  run: vault login -method=github token=${{ secrets.VAULT_TOKEN }}

- name: Get Secret
  run: |
    vault kv get -format=json secret/myapp > secrets.json
    export API_KEY=$(jq -r .data.data.API_KEY secrets.json)

Vault Audit 설정 가이드

📄 기본 구성

audit "file" {
  path = "/vault/logs/audit.log"
}
  • 운영 시 파일, syslog, socket 모두 가능
  • 기록 항목: 사용자 ID, 요청 경로, method, 결과 등

🔗 참고 링크

GitOps 통합 구성 (ArgoCD + Vault)

샘플 저장소

구성 흐름

ArgoCD App ─┬─> Helm/Kustomize Template
            │
            └─> Vault Plugin ──> Secrets 주입

예시 템플릿 (secret.yaml)

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
stringData:
  password: <path:secret/data/myapp#password>

ArgoCD ConfigMap 설정

data:
  configManagementPlugins: |
    - name: avp
      generate:
        command: ["argocd-vault-plugin"]
        args: ["generate", "helm"]

GitOps 기반 Vault 통합 템플릿

✅ Helm 기반 Vault 설치 (Raft + TLS)
✅ Terraform으로 Vault 정책 및 Secret 생성
✅ ArgoCD를 통한 K8s 배포 및 Vault Secret 자동 주입
✅ ArgoCD CMP(Plugin) 설정으로 argocd-vault-plugin 사용

🗂️ 전체 구성은 Vault-gitops-template 문서에 저장되었으며, 다음과 같은 구조를 따릅니다.

infrastructure/
├── helm/vault/values.yaml         # Helm 기반 Vault 설치 설정
├── terraform/main.tf              # Vault 정책 및 Secret 정의
argocd/
├── apps/vault-app.yaml            # Vault 앱 선언
├── manifests/k8s-secret.yaml      # AVP 연동 K8s Secret
├── config/cm-argocd-cmp.yaml      # CMP 플러그인 설정

🎯 배포 흐름 예시

  1. Terraform으로 Vault에 비밀 및 정책 등록
  2. Helm으로 Vault 설치 (Raft 구성 + TLS 인증서)
  3. ArgoCD로 앱 배포 → Vault에서 Secret을 주입
  4. argocd-vault-plugin이 템플릿 안에서 자동 치환

추가로 Vault Token 자동화, CI/CD에서 Vault 접근용 AppRole 발급, TLS 인증서도 Vault PKI에서 주입 등으로 확장해볼 수 있습니다.

728x90
그리드형(광고전용)

댓글