devops
Vault Secrets Engine 정의와 KV Secrets Engine v2 테스트 본문
Vault의 시크릿 엔진은 data를 암호화하고 저장하고 생성하는, 어떤 기능을 하는 유연한 특징을 가진 컴포넌트로 보면된다.
어떤 시크릿 엔진은 단순히 데이터 저장과 읽기만 제공하지만, 어떤 것은 서비스와 연결되어 동적인 Credential을 생성하기도 하고 인증 역할을 하기도 한다.
모든 시크릿 엔진은 볼트의 path를 통해서 활성화된다. 그래서 볼트에 요청이 올때 자동으로 해당 경로로 라우팅되어 처리된다. 시크릿 엔진은 개별 경로(path)와 속성이 정해져있기 때문에 사용하는 유저입장에서는 Virtual Filesystem이라고도 볼 수 있음
Lifecycle
- Enable : 시크릿 엔진의 경로와 함께 Enable된다. (몇몇 시크릿 엔진은 여러 경로로 Enable이 될 수 있음) 각 시크릿 엔진은 각기 다른 경로에 isolated 된다.
- Disable : 생성된 시크릿 엔진을 Disable한다. 해당 하는 시크릿들은 모두 revoke되어 물리적 Storage에 저장된 모든 데이터들은 삭제된다.
- Move : 존재하는 시크릿엔진의 경로를 옮긴다. 이건 모든 시크릿을 revoke하고 새로 생성된 경로로 만들어진다.
- Tune : TTL과 같은 전역(Global) 구성을 조정하는 것으로 수정이라고 해석해도 될 듯하다.
시크릿 엔진이 Enable 되면 임의의 UUID가 생성되어 해당 시크릿 엔진의 data root가 된다. 그래서 Vault Storage Layer는 상대적인 접근 (../ 과 같은)을 지원하지 않기 때문에 하나의 시크릿 엔진이 다른 데이터로 접근이 불가능하다.
Secret Engine 종류
Key Value
가장 많이 사용하는 대표적인 시크릿 엔진이다. Key-Value 방식으로 물리적인 Storage에 저장되며 백앤드에서는 두가지 모드로 실행된다.
KV version 1 : 버전이 지정되지 않은 kv 시크릿 엔진이 실행될 때 version 1으로 구성된다. 오직 최근에 쓰기된 key-value가 보존된다. 이 버전의 장점은 각 키의 추가적인 메타데이터와 히스토리가 없기 때문에 Storage size를 줄일 수 있다. 또한, Storage call와 locking이 없기 때문에 퍼포먼스도 비교적 좋다.
KV version 2 : 이전 버전의 메타데이터와 데이터를 검색할 수 있으며, Check-and-Set 작업으로 데이터를 실수로 덮어쓰는 것을 방지할 수 있다. 버전이 삭제되면 기본 데이터는 삭제되지 않는다(삭제된 것으로 표시는 됨) 물론 버전 별 메타데이터를 삭제할 수 있으나 ACL을 통해서 삭제 권한을 유저에 따라 지정할 수 있다.
* 아래에 KV version 2를 테스트해보려고함
Transit
전송 중인 데이터에 대한 암호화 기능을 지원한다. Vault는 전송된 데이터를 저장하지 않는다. Transit는 데이터에 서명하고 확인이 가능하다. 어플리케이션의 데이터를 암호화할 수 있어, 어플리케이션 개발자의 보안(민감 데이터의 암호화/복호화) 부담을 덜어주는 역할을 한다.
AWS
IAM 정책에 따라서 동적인 AWS 액세스 자격 증명을 생성한다. 웹 UI를 클릭할 필요없이 AWS IAM 작업을 손쉽게 진행할 수 있다. 이 프로세스는 코드화되어서 내부 인증 방법에 매핑되며, AWS IAM 자격증명은 시간 기반이기 때문에 Vault lease 가 만료되면 자동으로 revoke된다.
지원하는 자격증명은 3가지다.
- iam_user
- assumed_role
- federation_token
Database
생성된 역할을 기반으로 동적으로 데이터베이스 자격 증명을 생성할 수 있다. Plugin 인터페이스로 다양한 데이터베이스와 함께 작동한다.
모든 서비스가 유니크한 자격 증명을 통해서 데이터베이스에 접근하기 때문 관리가 쉬우며, 유저가 정해진 기간에만 접근하도록 통제할 수 있다.
KV Secrets Engine v2 테스트
v2는 롤백 기능을 제공해서, 덮어쓰기와 손실로 인한 데이터 복구가 가능하다. v2에서는 secret의 버전을 유지해서 이전 데이터를 검색할 수 있다. 아래 그림처럼 이미 삭제(Delete)된 시크릿을 복구(Undo Delete) 할 수 있다.
직접 v2를 올려보고 복구하는 과정을 테스트해보려고 한다.
KV v2 enable, write
$ vault secrets enable -path=secret kv-v2
$ vault kv put secret/customer/acme customer_name="ACME Inc." \
contact_email="john.smith@acme.com"
kv put을 통해서 위와 같은 Secret이 생성 것을 알 수 있다. 처음 생성된 Secret은 version이 1로 시작된다.
$ vault kv put secret/customer/acme customer_name="ACME Inc." \
contact_email="john.smith@acme.com"
또 같은 경로에 Secret을 생성하면 아래와 같이 Version이 2로 변경된다.
$ vault kv get secret/customer/acme
해당 경로에서 Secret을 확인해보자.
Version 2의 Data가 입력되어 있는 것을 알 수 있다. 같은 경로에 Secret을 put하면 이전 버전의 Secret을 대체한다. 그럼 이제 put이 아닌, patch를 통해서 secret의 버전을 업데이트해본다.
$ vault kv patch secret/customer/acme contact_email="admin@acme.com"
patch를 통해 Secret의 Version은 3으로 변경되었다.
$ vault kv get -version=2 secret/customer/acme
Version 2의 Secret을 확인하려면 -version=2 를 추가한다.
만약 해당 경로의 Secret의 메타데이터를 확인하고 싶다면 아래와 같이 입력한다.
$ vault kv metadata get secret/customer/acme
KV v2에서는 시크릿 엔진이 10개 Version을 유지한다.(config에서는 max_versions가 0으로 되어있으나 실제 default는 10이라고 보면됨) 이 값을 수정해서 불필요하게 보관하는 시크릿을 줄일 수 있다.
$ vault read secret/config // secret 설정 확인
$ vault write secret/config max_versions=4 // secret max_version 변경
Web UI를 이용하면 아래와 같이 쉽게 확인할 수 있다.
'DevOps > Vault' 카테고리의 다른 글
Github action + Vault + ECR + ArgoCD CICD 파이프라인 구축하기 (0) | 2023.05.22 |
---|---|
Hashicorp Vault 서버 배포하기 (0) | 2023.03.01 |