에이전틱 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의 생존 기반이자 미래 경쟁력의 중심”입니다.
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 예시
- Vault 인증용 GitHub JWT 사용 (Vault에 GitHub 인증 설정 필요)
- 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 샘플 저장소
- hashicorp/vault-helm
→ 공식 Helm Chart 및 values.yaml 예시 제공
📝 실습 템플릿
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 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 플러그인 설정
🎯 배포 흐름 예시
- Terraform으로 Vault에 비밀 및 정책 등록
- Helm으로 Vault 설치 (Raft 구성 + TLS 인증서)
- ArgoCD로 앱 배포 → Vault에서 Secret을 주입
argocd-vault-plugin
이 템플릿 안에서 자동 치환
추가로 Vault Token 자동화, CI/CD에서 Vault 접근용 AppRole 발급, TLS 인증서도 Vault PKI에서 주입 등으로 확장해볼 수 있습니다.
댓글