hashicorp사의 Vault(볼트) - Tutorial-Dev(With-커맨드) - 2
목차
- 들어가며
- Vault Dev 서버 모드 튜토리얼
- 참고문헌
들어가며
본 게시물은 Vault 공식 문서의 내용과 필자의 생각을 정리하였다. Vault는 무엇인지, 어디에 사용하는지, 왜 사용하는지, 어떻게 사용하는지 서술한다. Vault를 처음 접하는 인원은 Vault의 흐름과 골격을 이해할 수 있는 시간을 갖는다. 또한 Vault를 실질적으로 사용해보는 시간을 갖는다. Vault는 Dev 서버 모드를 지원한다. Dev 서버 모드는 사전 설정이 되어있는 데모 서버라고 생각하면 좋다. 사용자는 해당 데모 서버에서 Vault를 학습할 수 있다. 시간이 괜찮으면 Vault HA를 구성한다(시간이 있으면...).
본 게시물의 시리즈는 다음과 같다.
- hashicorp사의 Vault(볼트) - 개요 - 1
- hashicorp사의 Vault(볼트) - Tutorial-Dev(With-커맨드) - 2
- hashicorp사의 Vault(볼트) - Tutorial-Real(With-REST-API) - 3
- hashicorp사의 Vault(볼트) - Tutorial-Docker - 4
- hashicorp사의 Vault(볼트) - Tutorial-HA - 5
- hashicorp사의 Vault(볼트) - Java-Spring With Vault - 6
Vault Dev 서버 모드 튜토리얼
CentOS 기준, yum 명령어를 사용하여 Vault를 설치한다. 설치방법은 Vault Tutorial 페이지에서 확인할 수 있다.
[Vault 서버 가동]
$vault server -dev &
[Vault 환경 변수 설정]
환경 변수 설정은 필수가 아니다. 그러나 CLI 환경에서 Vault 명령을 쉽게 사용하기 위해 환경변수를 설정한다. CentOS는 .bash_profile를 통해 환경변수를 영구 설정할 수 있지만, 그렇게 하지 않는다.
위의 로깅된 Root Token과 HOST에 맞게 환경변수를 설정한다.
$export VAULT_ADDR='http://127.0.0.1:8200'
$export VAULT_TOKEN="s.XmpNPoi9sRhYtdKHaQhkHP6x"
환경변수 조회 및 확인
$ set | grep VAULT
[Vault 사용 - Secret 등록]
$vault kv put secret/hello foo=world
설명
- Secret, foo=world 등록
- kv: key-value storage에 접근할 때 사용
- put secret/hello: secret/hello라는 secret 생성(위치? 엔드포인트?)
- foo=world: foo라는 파라메터와 함께 secret 생성
- +) vault kv put 명령은 생성할 때 사용하지만 갱신/대체 작업에도 사용
[Vault 사용 - Secret 조회]
$vault kv get secret/hello
$vault kv get -field=foo secret/hello
$vault kv get -format=json secret/hello
설명
- get secret/hello: secret/hello에 위치하는 Secret 조회
- -field=foo: foo 필드의 값만 조회
- -format=json: JSON 형식으로 조회(json, yaml, table 형식으로 조회 가능, 디폴트 값은 table)
[Vault 사용 - Secret 폐기]
$vault kv delete secret/hello
설명
- delete: secret/hello에 위치하는 것을 폐기
[Vault 사용 - Secret Engine 생성]
Key/Value형식의 Secret Engine 생성 및 조회
$vault secrets enable -path=kv kv
$vault secrets list
[Vault 사용 - 방금 생성한 Secret Engine에 Secret 등록]
$vault kv put kv/my-secret value="s3c(eT"
$vault kv get kv/my-secret
$vault kv delete kv/my-secret
$vault kv list kv/
$vault secrets disable kv
$vault secrets enable -path=kv kv
[Vault 사용 - 토큰 생성]
토큰을 생성/로그인/폐기한다.
$vault token create
$vault login s.w5cdTSBCLaFbHAu8lHDfHpCW
$vault token revoke s.w5cdTSBCLaFbHAu8lHDfHpCW
[Vault 사용 - 토큰의 정책 설정]
$vault policy list
$vault policy read default
$vault policy write my-policy - << EOF
# Dev servers have version 2 of KV secrets engine mounted by default, so will
# need these paths to grant permissions:
path "secret/data/*" {
capabilities = ["create", "update"]
}
path "secret/data/foo" {
capabilities = ["read"]
}
EOF
$vault token lookup
$vault token create -policy=my-policy
$export VAULT_TOKEN="$(vault token create -field token -policy=my-policy)"
$vault kv put secret/creds password="my-long-password"
$vault kv put secret/creds password="my-long-password-1"
$vault kv get secret/creds //(안됨)
$export VAULT_TOKEN="s.kZw14yyEbEIkDSRRSLEsVM8M" //(root 토큰)
$vault kv get secret/creds(됨)
설명
- 토큰 생성 시 정책을 적용할 수 있다.
- 정책은 Secret에 대해 접근제어를 실시한다.
- 정책 "my-policy의 설명은 다음과 같다.
- "secret/data 이하의 경로에 대해 create와 update 작업을 실시할 수 있다(udpate는 put을 통한 갱신 작업).
- "secret/data/foo에 해당하는 경로는 read 작업을 실시할 수 있다.
- 다음의 설명은 생략한다.
[Vault 사용 - AppRole]
위의 "토큰 생성" 부분에서 Vault는 사용자의 토큰을 인증 절차 없이 생성한다. 이유는 다음과 같다. 현재 적용된 토큰은 "루트 토큰"이다. 그래서 인증 절차 없이 사용자의 토큰을 생성할 수 있다. 그러나 일반적인 상황에서는 인증 절차가 필요하다. 대표적인 인증 절차는 ID/PW 방식을 사용할 수 있다. Vault의 AppRole은 식별값(ID)/인증값(PW)을 이용해서 토큰을 발급한다. 또한 정책을 적용할 수 있으며, 토큰에 적용 가능하다.
// approle 확인
$vault auth list | grep 'approle/'
// 리스트업이 되지 않을 경우, approle 활성화
$vault auth enable approle
// approle 확인
$vault auth list | grep 'aaprole/'
//approle에 my-role(사용자) 생성
$vault write auth/approle/role/my-role \
secret_id_ttl=10m \
token_num_uses=10 \
token_ttl=20m \
token_max_ttl=30m \
secret_id_num_uses=40 \
token_policies=my-policy
// approle 조회
$vault list auth/approle/role
$vault read auth/approle/role/my-role
$vault read auth/approle/role/my-role/role-id
$vault read -field=role_id auth/approle/role/my-role/role-id
// ROLE_ID(식별자) 환경 변수 적용 및 조회
$export ROLE_ID="$(vault read -field=role_id auth/approle/role/my-role/role-id)"
$set | grep -e VAULT -e ROLE_ID
// SECRET_ID 설정(AppRole 인증을 위한 비밀번호 개념과 비슷하다.)
// SECRET_ID(인증값) 환경 변수 적용 및 조회
// vault write를 별도로 진행해도 괜찮다.
$export SECRET_ID="$(vault write -f -field=secret_id auth/approle/role/my-role/secret-id)"
$set | grep -e SECRET_ID -e VAULT -e ROLE_ID
// 토큰 요청
// approle 인증 완료 후, 토큰을 반환받을 수 있다.
$vault write auth/approle/login role_id="$ROLE_ID" secret_id="$SECRET_ID"