보관소와 비밀 정보 저장소
Vault 같은 도구로 비밀 정보를 중앙화합니다.
보관소와 비밀 정보 저장소은(는) CoddyKit의 무료 Cyber Security Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cyber Security Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cyber Security Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
secret 저장소로 해결할 수 있는 문제
secret 저장소(또는 금고)는 secret에 대한 접근을 저장하고, 제어하며, 감사하는 일만 담당하는 중앙 집중식 보안 강화 서비스입니다. secret 확산을 일으키는 분산된 파일과 환경 변수를 대체합니다.
좋은 secret 관리자는 다음 네 가지 핵심 기능을 제공합니다:
- 중앙 집중식 저장소 모든 secret에 대한 단일 기준 출처입니다.
- 접근 제어 각 secret을 누가 무엇을 통해 읽을 수 있는지 세밀하게 정하는 정책입니다.
- 접근 감사 기록 사고 대응을 위해 모든 접근을 기록합니다.
- 암호화 secret을 저장 중에도 전송 중에도 암호화합니다.
예로 HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, GCP Secret Manager가 있습니다.
HashiCorp Vault의 구조
HashiCorp Vault는 널리 사용되는 오픈 소스 secret 관리자입니다. 기능을 경로에 마운트하는 플러그인 방식의 secret 엔진으로 구성합니다.
- KV 엔진 정적인 키-값 secret을 저장합니다.
- 데이터베이스 엔진 동적이고 수명이 짧은 데이터베이스 자격 증명을 생성합니다.
- PKI 엔진 필요할 때 TLS 인증서를 발급합니다.
- Transit 엔진 키를 노출하지 않고 서비스로 암호화를 제공합니다.
Vault와는 HTTP 인터페이스 또는 CLI를 통해 상호 작용합니다. 각 경로에는 누가 해당 경로를 읽거나 쓸 수 있는지를 결정하는 정책이 적용됩니다.
# Enable a KV v2 secrets engine at the 'secret/' path
vault secrets enable -path=secret kv-v2
# Write and read a static secret
vault kv put secret/app/db password='S3cr3t' user='app'
vault kv get secret/app/db봉인 및 봉인 해제 모델
Vault는 봉인/봉인 해제 메커니즘으로 데이터를 보호합니다. Vault가 시작될 때는 봉인된 상태이므로 암호화된 데이터가 어디 있는지는 알지만 복호화할 수 없습니다.
저장소를 복호화하는 기본 키 자체가 봉인 해제 키로 암호화됩니다. 샤미르의 secret 공유 방식을 사용하면 이 봉인 해제 키가 여러 조각으로 나뉘어 서로 다른 운영자에게 분배됩니다.
키를 재구성하고 Vault의 봉인을 해제하려면 구성 가능한 임계값(예: 조각 5개 중 3개)을 제공해야 합니다. 한 사람이 혼자 봉인을 해제할 수 없으므로 내부자에 의한 침해를 막을 수 있습니다.
# Initialize Vault: 5 key shares, threshold of 3 to unseal
vault operator init -key-shares=5 -key-threshold=3
# Each operator supplies one shard until threshold is met
vault operator unseal <shard-1>
vault operator unseal <shard-2>
vault operator unseal <shard-3>인증: 누구이십니까
어떤 secret을 읽기 전에 클라이언트는 인증하여 토큰을 받아야 합니다. Vault는 다양한 신원에 맞춘 여러 인증 방식을 지원합니다:
- AppRole 애플리케이션과 지속적 통합 시스템용(역할 ID + secret ID).
- 쿠버네티스 파드의 서비스 계정 토큰을 사용합니다.
- AWS/GCP/Azure IAM 클라우드 플랫폼의 신원을 신뢰합니다.
- OIDC/LDAP SSO를 통한 사람 사용자용입니다.
핵심 원칙은 신원이 플랫폼에서 제공된다는 것이지, 오래 유지되는 비밀번호에서 제공되는 것이 아니라는 점입니다. 쿠버네티스 파드는 자체 서비스 계정 토큰으로 자신의 신원을 증명하므로 유출될 초기 설정용 secret이 필요하지 않습니다.
# App authenticates via AppRole to receive a token
vault write auth/approle/login \
role_id="db-app-role" \
secret_id="$WRAPPED_SECRET_ID"
# Response includes client_token used for subsequent reads정책을 사용한 권한 부여
인증은 신원을 증명하고, 정책은 해당 신원이 무엇을 할 수 있는지 결정합니다. Vault 정책은 HCL로 작성되며 최소 권한 원칙을 따릅니다. 즉, 워크로드에 필요한 경로와 기능만 허용합니다.
이 정책을 사용하면 서비스가 자신의 데이터베이스 secret만 읽고 다른 것은 전혀 읽지 못합니다:
권한은 API 동작에 대응합니다: read, create, update, delete, list. 기본적으로 거부하고 명시적으로 허용하십시오.
# policy: billing-app.hcl
path "secret/data/billing/*" {
capabilities = ["read"]
}
path "database/creds/billing-readonly" {
capabilities = ["read"]
}
# everything else is implicitly denied클라우드 네이티브 secret 저장소
단일 클라우드에서 실행한다면 제공업체의 관리형 저장소가 운영 부담을 줄여 줍니다. 봉인/봉인 해제도, 패치할 서버도 필요하지 않습니다:
- AWS Secrets Manager는 IAM과 통합되고 기본 제공되는 순환 Lambda를 지원합니다.
- Azure Key Vault는 RBAC를 사용해 secret, 키, 인증서를 저장합니다.
- GCP Secret Manager는 IAM 바인딩으로 접근을 제한하는 버전 관리 secret을 제공합니다.
접근은 클라우드의 IAM으로 관리되므로 워크로드는 별도의 비밀번호 없이 기존 역할을 사용해 secret을 읽습니다. 단점은 Vault에 비해 공급업체 종속이 생기고 여러 클라우드 환경에 대한 지원이 약해진다는 것입니다.
# Read a secret from AWS Secrets Manager (workload uses its IAM role)
aws secretsmanager get-secret-value \
--secret-id prod/billing/db \
--query SecretString --output text
# GCP equivalent
gcloud secrets versions access latest --secret=billing-db서비스형 암호화
때로는 secret을 아예 저장하지 않고, 애플리케이션이 암호화 키를 전혀 보유하지 않은 상태로 애플리케이션 데이터를 암호화하고 싶을 수 있습니다. Vault의 Transit 엔진이 바로 이 기능을 제공합니다.
애플리케이션은 평문을 Vault에 보내고 암호문을 돌려받으며, 키는 전혀 보지 못합니다. 복호화도 같은 방식으로 작동합니다. 이를 서비스형 암호화라고 합니다.
장점은 키가 Vault 내부에만 존재하고 중앙에서 교체할 수 있다는 것입니다. 침해된 애플리케이션도 자신이 보유한 적 없는 키를 유출할 수 없습니다.
# Encrypt data without the app ever seeing the key
vault write transit/encrypt/orders-key \
plaintext=$(echo -n 'card=4111...' | base64)
# returns: ciphertext=vault:v1:abc123...
# Decrypt later
vault write transit/decrypt/orders-key ciphertext='vault:v1:abc123...'워크로드에 secret 주입
금고는 애플리케이션이 경로나 토큰을 하드코딩하지 않고 secret을 사용할 수 있을 때만 유용합니다. 일반적인 주입 방식은 다음과 같습니다:
- 보조 프로세스/에이전트 Vault Agent가 애플리케이션과 함께 실행되어 인증하고, 공유 메모리 내 볼륨에 secret을 기록합니다.
- CSI 드라이버 쿠버네티스가 Secrets Store CSI 드라이버를 통해 secret을 파일로 마운트합니다.
- SDK 가져오기 애플리케이션이 시작할 때 금고 API를 직접 호출합니다.
환경 변수보다 메모리 내 파일 시스템(tmpfs)에 마운트하는 방식을 우선 사용하고, secret이 남아 있을 수 있는 디스크에는 기록하지 마십시오.
# Vault Agent template renders a secret to an in-memory file
template {
contents = "DB_PASS={{ with secret \"secret/app/db\" }}{{ .Data.data.password }}{{ end }}"
destination = "/run/secrets/db.env"
}감사 기록 및 책임 추적
볼트의 모든 읽기, 쓰기 및 인증 이벤트는 감사 기록에 기록되어야 합니다. 이는 사고 발생 시 비밀 관리 체계를 방어할 수 있게 해 줍니다.
감사 기록은 중요한 질문에 답합니다. 누가 어떤 비밀에 언제, 어디에서 접근했는지 알 수 있습니다. 볼트는 기록에서 민감한 값을 해시하므로 기록 자체에서 비밀이 유출되지 않습니다.
공격자가 볼트 호스트를 침해하더라도 자신이 접근한 흔적을 지우지 못하도록 감사 기록을 변조 감지 기능이 있는 별도의 시스템(SIEM)으로 전송하십시오.
# Enable a file audit device (HMAC-hashes secret values)
vault audit enable file file_path=/var/log/vault/audit.log
# Forward to a SIEM/syslog endpoint for tamper resistance
vault audit enable syslog tag="vault" facility="AUTH"볼트 자체 보호
중앙 집중식 저장소는 위험을 한곳에 집중시킵니다. 볼트가 무너지면 모든 것이 무너집니다. 볼트를 가장 중요한 자산으로 보고 다음과 같이 강화하십시오:
- 모든 엔드포인트에서 TLS를 사용하여 실행하고, 응용 프로그램 인터페이스를 암호화되지 않은 상태로 노출하지 마십시오.
- 엄격한 방화벽 규칙으로 보호되는 사설 네트워크에 볼트를 두십시오.
- 수동 샤드 관리를 피하도록 클라우드 KMS를 통한 자동 봉인 해제를 활성화하되, 해당 KMS 키를 철저히 보호하십시오.
- 짧은 토큰 TTL과 갱신 가능한 임대 기간을 사용하여 탈취된 토큰이 빠르게 만료되도록 하십시오.
- 보안 업데이트를 신속히 적용하고 감사 기록에서 이상 징후를 모니터링하십시오.
볼트는 여러 장애 지점을 하나의 매우 강력하게 방어된 지점으로 통합합니다.
적합한 저장소 선택
모든 환경에 가장 적합한 단일 도구는 없으므로 저장소를 환경에 맞추어 선택해야 합니다:
- 단일 클라우드, 단순한 요구 사항인 경우 운영 부담이 가장 적은 기본 제공 관리자(AWS/애저/GCP)를 사용하십시오.
- 여러 클라우드 또는 온프레미스인 경우 HashiCorp 볼트가 일관되고 이식 가능한 추상화를 제공합니다.
- 동적 비밀 또는 서비스형 암호화가 필요하다면 볼트의 엔진이 가장 강력한 기능을 제공합니다.
- 쿠버네티스 중심 환경에서는 저장소를 CSI 드라이버 또는 외부 비밀과 같은 운영자와 함께 사용하십시오.
무엇을 선택하든 목표는 동일합니다. 흩어진 평문을 감사되고 접근이 통제되는 하나의 기준 정보원으로 대체하는 것입니다.
빠른 확인
볼트의 보호 모델에 대한 이해도를 확인해 보십시오.
복습: 볼트와 비밀 저장소
흩어진 비밀을 중앙 집중식 감사 저장소로 대체하는 방법을 배웠습니다.
- 비밀 저장소는 중앙 집중식 저장, 접근 제어, 감사 기록 및 암호화를 제공합니다.
- HashiCorp 볼트는 플러그인 방식의 비밀 엔진과 Shamir의 비밀 공유로 보호되는 봉인/봉인 해제 모델을 사용합니다.
- 인증 방법은 플랫폼(쿠버네티스, IAM, AppRole)에서 신원을 도출하고, 정책은 최소 권한을 적용합니다.
- 클라우드 네이티브 저장소(AWS, 애저, GCP)는 낮은 운영 부담을 위해 이식성을 절충합니다.
- 트랜짓 엔진은 서비스형 암호화를 제공하므로 애플리케이션이 키를 보관하지 않아도 됩니다.
- 에이전트 또는 CSI를 통해 비밀을 메모리 내 저장소에 주입하고, 모든 접근을 기록하며, 볼트를 가장 중요한 자산으로 보고 강화하십시오.
다음에는 비밀을 동적으로 생성하여 수명을 짧게 만드는 방법으로 비밀을 더욱 안전하게 보호하겠습니다.
자주 묻는 질문
“보관소와 비밀 정보 저장소” 강의는 무료인가요?
네 — “보관소와 비밀 정보 저장소” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cyber Security Academy 강의 전체를 잠금 해제할 수 있습니다. Cyber Security Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“보관소와 비밀 정보 저장소”에서 뭘 배우나요?
Vault 같은 도구로 비밀 정보를 중앙화합니다. 브라우저에서 직접 실행하는 실습 코드로 Cyber Security Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cyber Security Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cyber Security Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“보관소와 비밀 정보 저장소” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cyber Security Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cyber Security Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 비밀 정보 확산 문제
- 보관소와 비밀 정보 저장소
- 동적 비밀 정보와 임대
- 키 교체와 탐지