비밀 관리, 암호화, 민감한 데이터에 대한 안전한 접근을 위한 포괄적인 HashiCorp Vault 명령어와 워크플로우.
설치 및 설정
| 명령어 | 설명 |
|---|
vault version | Vault 버전 표시 |
vault server -dev | 개발 서버 시작 |
vault server -config=config.hcl | 구성 파일로 시작하기 |
vault status | 서버 상태 확인 |
인증 및 로그인
기본 인증
| 명령어 | 설명 |
|---|
vault auth -method=userpass username=myuser | 사용자 이름/비밀번호로 로그인 |
vault auth -method=ldap username=myuser | LDAP로 로그인 |
vault auth -method=github token=mytoken | GitHub으로 로그인 |
vault auth -method=aws | AWS IAM으로 로그인 |
vault auth -method=kubernetes | Kubernetes로 로그인 |
토큰 관리
| 명령어 | 설명 |
|---|
vault token create | 새 토큰 생성 |
vault token create -ttl=1h | TTL로 토큰 생성 |
vault token lookup | 현재 토큰 조회 |
vault token renew | 현재 토큰 갱신 |
vault token revoke TOKEN | 특정 토큰 취소 |
비밀 관리
키-값 비밀 (v2)
| 명령어 | 설명 |
|---|
vault kv put secret/myapp username=admin password=secret | 비밀 저장소 |
vault kv get secret/myapp | 비밀 검색 |
vault kv get -field=password secret/myapp | 특정 필드 가져오기 |
vault kv delete secret/myapp | 비밀 삭제 |
vault kv list secret/ | 비밀 목록 |
vault kv metadata get secret/myapp | 메타데이터 가져오기 |
비밀 버전
| 명령어 | 설명 |
|---|
vault kv put secret/myapp @data.json | JSON 파일에서 저장 |
vault kv get -version=2 secret/myapp | 특정 버전 가져오기 |
vault kv rollback -version=1 secret/myapp | 버전으로 롤백 |
vault kv destroy -versions=2,3 secret/myapp | 버전 제거 |
vault kv undelete -versions=2 secret/myapp | 삭제 취소 버전 |
데이터베이스 비밀 엔진
데이터베이스 구성
| 명령어 | 설명 |
|---|
vault secrets enable database | 데이터베이스 엔진 활성화 |
vault write database/config/my-mysql-database plugin_name=mysql-database-plugin connection_url="\\{\\{username\\}\\}:\\{\\{password\\}\\}@tcp(localhost:3306)/" allowed_roles="my-role" username="vaultuser" password="vaultpass" | MySQL 구성하기 |
vault write database/roles/my-role db_name=my-mysql-database creation_statements="CREATE USER '\\{\\{name\\}\\}'@'%' IDENTIFIED BY '\\{\\{password\\}\\}';GRANT SELECT ON *.* TO '\\{\\{name\\}\\}'@'%';" default_ttl="1h" max_ttl="24h" | 역할 생성 |
동적 자격 증명
| 명령어 | 설명 |
|---|
vault read database/creds/my-role | 데이터베이스 자격 증명 생성 |
vault write database/rotate-root/my-mysql-database | 루트 자격 증명 회전 |
PKI (공개 키 인프라)
PKI 설정
| 명령어 | 설명 |
|---|
vault secrets enable pki | PKI 엔진 활성화 |
vault secrets tune -max-lease-ttl=87600h pki | 최대 TTL 설정 |
vault write pki/root/generate/internal common_name=example.com ttl=87600h | 루트 CA 생성 |
vault write pki/config/urls issuing_certificates="http://vault.example.com:8200/v1/pki/ca" crl_distribution_points="http://vault.example.com:8200/v1/pki/crl" | URL 구성하기 |
인증서 관리
| 명령어 | 설명 |
|---|
vault write pki/roles/example-dot-com allowed_domains=example.com allow_subdomains=true max_ttl=72h | 역할 생성 |
vault write pki/issue/example-dot-com common_name=test.example.com | 인증서 발급 |
vault write pki/revoke serial_number=39:dd:2e:90:b7:23:1f:8d:d3:7d:31:c5:1b:da:84:d0:5b:65:31:58 | 인증서 취소 |
AWS 비밀 엔진
AWS 구성
| 명령어 | 설명 |
|---|
vault secrets enable aws | AWS 엔진 활성화 |
vault write aws/config/root access_key=AKIAI... secret_key=R4nm... | root 자격 증명 구성 |
vault write aws/roles/my-role credential_type=iam_user policy_document=-<<EOF \\{...\\} EOF | IAM 역할 생성 |
AWS 자격 증명
| 명령어 | 설명 |
|---|
vault read aws/creds/my-role | AWS 자격 증명 생성 |
vault write aws/sts/my-role ttl=15m | STS 자격 증명 생성 |
전송 비밀 엔진
암호화 설정
| 명령어 | 설명 |
|---|
vault secrets enable transit | 트랜짓 엔진 활성화 |
vault write transit/keys/my-key type=aes256-gcm96 | 암호화 키 생성 |
vault write transit/encrypt/my-key plaintext=$(base64 <<< "my secret data") | 데이터 암호화 |
vault write transit/decrypt/my-key ciphertext=vault:v1:8SDd3WHDOjf7mq69CyCqYjBXAiQQAVZRkFM13ok481zoCmHnSeDX9vyf7w== | 데이터 복호화 |
키 관리
| 명령어 | 설명 |
|---|
vault write transit/keys/my-key/rotate | 암호화 키 회전 |
vault read transit/keys/my-key | 주요 정보 읽기 |
vault write transit/rewrap/my-key ciphertext=vault:v1:... | 최신 키로 다시 래핑 |
정책
정책 관리
| 명령어 | 설명 |
|---|
vault policy write my-policy policy.hcl | 정책 생성/업데이트 |
vault policy read my-policy | 정책 읽기 |
vault policy list | 모든 정책 나열하기 |
vault policy delete my-policy | 삭제 정책 |
정책 예시
# Read operation on the k/v secrets
path "secret/data/*" \\\\{
capabilities = ["read"]
\\\\}
# Write operation on the k/v secrets
path "secret/data/myapp/*" \\\\{
capabilities = ["create", "update"]
\\\\}
# Deny all access to secret/admin
path "secret/data/admin" \\\\{
capabilities = ["deny"]
\\\\}
인증 방법
인증 방법 활성화
| 명령어 | 설명 |
|---|
vault auth enable userpass | 사용자 이름/비밀번호 활성화 |
vault auth enable ldap | LDAP 활성화 |
vault auth enable github | GitHub 활성화 |
vault auth enable aws | AWS IAM 활성화 |
vault auth enable kubernetes | Kubernetes 활성화 |
인증 방법 구성
| 명령어 | 설명 |
|---|
vault write auth/userpass/users/myuser password=mypass policies=my-policy | 사용자 생성 |
vault write auth/ldap/config url="ldap://ldap.example.com" userdn="ou=Users,dc=example,dc=com" | LDAP 구성 |
vault write auth/github/config organization=myorg | GitHub 구성하기 |
감사 로깅
감사 장치 활성화
| 명령어 | 설명 |
|---|
vault audit enable file file_path=/vault/logs/audit.log | 파일 감사 활성화 |
vault audit enable syslog | syslog 감사 활성화 |
vault audit list | 감사 장치 목록 |
vault audit disable file/ | 감사 장치 비활성화 |
고가용성 및 클러스터링
클러스터 작업
| 명령어 | 설명 |
|---|
vault operator init | Vault 클러스터 초기화 |
vault operator unseal | 볼트 열기 |
vault operator seal | 실 볼트 |
vault operator step-down | 지도자 직에서 물러나다 |
vault operator raft list-peers | Raft 피어 목록 |
| 명령어 | 설명 |
|---|
vault operator raft snapshot save backup.snap | 스냅샷 생성 |
vault operator raft snapshot restore backup.snap | 스냅샷 복원 |
서버 구성
storage "consul" \\\\{
address = "127.0.0.1:8500"
path = "vault/"
\\\\}
listener "tcp" \\\\{
address = "0.0.0.0:8200"
tls_disable = 1
\\\\}
api_addr = "http://127.0.0.1:8200"
cluster_addr = "https://127.0.0.1:8201"
ui = true
seal "awskms" \\\\{
region = "us-east-1"
kms_key_id = "12345678-1234-1234-1234-123456789012"
\\\\}
```## 환경 변수
| 변수 | 설명 |
|----------|-------------|
| `VAULT_ADDR` | Vault 서버 주소 |
| `VAULT_TOKEN` | 인증 토큰 |
| `VAULT_NAMESPACE` | Vault 네임스페이스 (Enterprise) |
| `VAULT_CACERT` | CA 인증서 파일 |
| `VAULT_CLIENT_CERT` | 클라이언트 인증서 파일 |
| `VAULT_CLIENT_KEY` | 클라이언트 개인 키 파일 |## 모범 사례
### 보안