1. Vault 셋업 상태 확인

1-1. vault 관련 리소스 확인 ( data-backend : consul )

kubectl get all -n vault

vault-set-0.png

kubectl -n vault get pods -l app.kubernetes.io/name=vault

vault-set-1.png

1-2. vault 상태확인 ( CLI & WEB )

kubectl -n vault exec -it vault-0 -- vault status
                                                                                                                                                                                                  ─╯
Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          false
Total Shares    1
Threshold       1
Version         1.12.1
Build Date      2022-10-27T12:32:05Z
Storage Type    consul
Cluster Name    vault-cluster-ea7219cc
Cluster ID      4afce6a6-85d6-c02d-2034-4d962ca11604
HA Enabled      true
HA Cluster      <https://vault-0.vault-internal:8201>
HA Mode         active
Active Since    2023-03-28T04:26:02.952116118Z

...
kubectl -n vault exec -it vault-1 -- vault status
...

Vault 설정 상태

vault-set-3.png

1-3 vault 접속 ( CLI & WEB )

CLI :

kubectl -n vault get secrets vault-credential -o jsonpath='{.data.vt-root-key\\.txt}' | base64 -D
> hvs.xxxxx

...
CLUSTER_ROOT_TOKEN=$(kubectl -n vault get secrets vault-credential -o jsonpath='{.data.vt-root-key\\.txt}' | base64 -D)
echo $(CLUSTER_ROOT_TOKEN)
kubectl -n vault exec vault-0 -- vault login $CLUSTER_ROOT_TOKEN
...
kubectl -n vault exec vault-1 -- vault login $CLUSTER_ROOT_TOKEN
...

vault-set-4.png

kubectl -n vault exec -it vault-0 -- /bin/sh
...

kubectl -n vault exec -it vault-1 -- /bin/sh
...

WEB : 아래 도메인과 포트 8200 으로 접속

http://vault.dev.cloudplex.me:8200/

root-token 확인 >

kubectl -n vault get secrets vault-credential -o jsonpath='{.data.vt-root-key\\.txt}' | base64 -D

vault-set-2.png

2. Vault key/value 설정

2-1. vault 서버 접속 후 key/vaule 셋업

# 클러스터로 구성된 vault 아무 서버나 접속하여 셋업 (ex: vault-0 OR vault-1 )
> kubectl -n vault exec -it vault-0 -- /bin/sh

# 예시: secret/test PATH 경로에 아래와 같은 key/vaule 셋업
vault kv put secret/test ID="test" password="passwd"

2-2. key/vaule 값 확인 ( CLI )

# 클러스터로 구성된 vault 아무 서버나 접속하여 셋업 (ex: vault-0 OR vault-1 )

❯ kubectl -n vault exec -it vault-1 -- /bin/sh                                                                                                                                                         ─╯
/ $ vault kv get secret/test
== Secret Path ==
secret/data/test

======= Metadata =======
Key                Value
---                -----
created_time       2023-03-28T04:33:49.87741966Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            1

====== Data ======
Key         Value
---         -----
ID          test
password    passwd

2-3. key/vaule 값 확인 ( WEB )

root 토큰으로 로그인 후, 아래와 같이 설정값 확인

vault-set-5.png

3. Pod 배포시 key/value 주입 ( agent-injector 를 통해 pod 에 k/v data 주입 )

3-1. vault 상에 policy 및 role 설정

# 예시

### step-0 ( vault policy 생성 : vault-side 작업 )
> kubectl -n vault exec -it vault-1 -- /bin/sh

vault policy write secret-read - <<EOF
path "secret/*" {
  capabilities = ["read"]
}
EOF

#### step-1 ( vault role 생성 : vault-side 작업 )
# scret-read policy와 kubernetes interanl-app role 연결
# vault-test 네임스페이스에 vault-secret-read 서비스어카운트에게 권한부여

vault write auth/kubernetes/role/internal-app \\
  bound_service_account_namespaces=vault \\
  bound_service_account_names=vault \\
  policies=secret-read \\
  ttl=24h

##### 추가로 복수의 SA 및 NS 설정/수정 가능

vault-set-6.png

3-2. 배포시 pod 주입

배포 yaml 설정

#pod 배포 예시

apiVersion: v1
kind: Pod
metadata:
  name: tested-app-vault-ky-payroll
  namespace: vault                                # vault-role 에서 설정한 NS
  labels:
    app: payroll
  annotations:
    vault.hashicorp.com/agent-inject: 'true'      # vault key/vaule data 삽입
    vault.hashicorp.com/role: 'internal-app'        # vault-role 에서 설정한 role 이름
    vault.hashicorp.com/agent-inject-status: update   # vault-agent 상태값
    vault.hashicorp.com/agent-inject-secret-test: 'secret/test'   # vault 에서 설정한 PATH

spec:
  serviceAccountName: vault    # vault-role 에서 설정한 SA
  containers:
    - name: payroll
      image: jweissig/app:0.0.1

배포 파드 내, vault key/vaule 주입확인

# 배포파드 내, vault key/vaule 주입경로
> /vault/< vault key/vaule PATH >

예시> 
kubectl exec \\                                                                                                                                                                                       
  $(kubectl get pod -l app=payroll -o jsonpath="{.items[0].metadata.name}" -n vault) \\
  -c payroll -- cat /vault/secrets/test
data: map[ID:test password:passwd]
metadata: map[created_time:2023-03-28T04:33:49.87741966Z custom_metadata:<nil> deletion_time: destroyed:false version:1]

DONE.