์ฟ ๋ฒ๋คํฐ์ค์์ ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ์ ํตํด ํ๊ฒฝ๋ณ์๋ ํ์ผ์ ์ ๋ฌํด์ค ์ ์์ต๋๋ค.
ํนํ ๋ฏผ๊ฐํ ์ ๋ณด์ธ ๊ฒฝ์ฐ ์ํฌ๋ฆฟ์ ํตํด ๋ฐฐํฌํ๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง ์ํฌ๋ฆฟ์ ๋ฌธ์ ๊ฐ ํ๋ ์์ต๋๋ค. ์ด๋ฆ์ ์ํฌ๋ฆฟ์ธ๋ฐ.. ์ธ์ฝ๋ฉ๋ง ํด์ค๋ฟ ์ ํ ์ํฌ๋ฆฟ์ค๋ฝ์ง ๋ชปํฉ๋๋ค.
๋ฐ๋ผ์ ์ํฌ๋ฆฟ์ ์ฌ์ฉํ๋ Helm Chart ์ ์์ฑํ ํ, ๊นํ๋ธ์ ์ฌ๋ฆฌ๊ฒ ๋๋ค๋ฉด ๊ฒฐ๊ตญ ๊ทธ ์ํฌ๋ฆฟ ๊ฐ์ ๊ทธ๋๋ก ๋ ธ์ถ๋ฉ๋๋ค.
ํ๋ผ์ด๋น ๋ ํฌ์งํ ๋ฆฌ๋ผ ํด๋, ๋ฏผ๊ฐํ ์ ๋ณด๋ ๊น ํ๋ธ์ ์ฌ๋ฆฌ๋ฉด ์๋๋ค๊ณ , ๊นํ ์์ฒด์์๋ ๊ฐ์ด๋ํฉ๋๋ค
๊ทธ๋ผ ์ด๋ฐ ์ํฌ๋ฆฟ์ ์ด๋ป๊ฒ ์ํฌ๋ฆฟ์ค๋ฝ๊ฒ ์ฌ์ฉํ ์ ์์๊น์? ๋คํํ ์ด๋ฏธ ์ข์ ์๋ฃจ์ ์ด ์กด์ฌํฉ๋๋ค.
๋ฐ๋ก HashiCorp ์ Vault ์ ๋๋ค.
Vault ๋ Secret Manager ์์คํ ์ผ๋ก ์ด๋ฆ ๊ทธ๋๋ก ์ํฌ๋ฆฟ์ ๊ด๋ฆฌํด์ฃผ๋ ์์คํ ์ ๋๋ค.
Vault ๋ฅผ ์ด์ฉํ๋ค๋ฉด ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ํฌ๋ฆฟ ๋ฆฌ์์ค์ ๋ช ์ํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ๋ ธ์ถ๋ ์ผ์ด ์์ด์ง๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ผ Vault ๋ ์ด๋ป๊ฒ ์ด๊ฑธ ๊ฐ๋ฅํ๊ฒ ํ ๊น์?
์ด๋ฒ ๊ธ์์๋ ๊ฐ๋จํ ์์ ๋ฅผ ํตํด Vault ๋ฅผ ์์๋ณด๊ณ ์ ํฉ๋๋ค.
๊ทธ๋ผ ๋ ์ธ ๋๋์ฝ๋~
Vault ์ค์น
Vault Install Mode ๋ ํฌ๊ฒ Dev Mode, Single Node Mode(Stand Alone), HA Mode ๊ฐ ์๋๋ฐ, ์ด๋ฒ ๊ธ์์๋ Dev Mode ๋ก ์ค์นํฉ๋๋ค.
Vault ์๋ Seal, Unseal ์ด๋ผ๋ ์์ฃผ ์ค์ํ ๊ฐ๋ ์ด ์๋๋ฐ Dev Mode ๋ก ์งํํ๋ฉด ํญ์ Unseal ์ํ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ ๊ฒฝ์ธ ํ์๊ฐ ์์ฃ . ๊ทธ๋์ Dev Mode ๋ก ์งํํฉ๋๋ค.
์ค์น๋ Helm Chart ๋ก ์งํํ๊ณ , Dev Mode ๋ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
์ค์น ๊ด๋ จ ๊ณต์ ๋ฌธ์์ ์ฌ๊ธฐ!
value ๋ช ๊ฐ๋ฅผ ์์ ํ๊ธฐ ์ํด์ values.yaml ์ด๋ผ๋ ํ์ผ์ ๋ฐ๋ก ๋ง๋ ํ ์ ๊ณต๋๋ ์ฐจํธ์ values.yaml ์ ๊ทธ๋๋ก ๋ณต์ฌํด์ค๋๋ค.
์ดํ .dev.enabled ๋ true ๋ก, .standalone.enabled ๋ false ๋ก ํด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ui ๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ .ui.enabled ๋ํ true ๋ก ํด์ค๋๋ค.
์ด์ helm install ๋ช ๋ น์ด๋ฅผ ํตํด Dev Mode ์ Vault ๋ฅผ ์ค์นํด์ค์๋ค.
์ฑ๊ณต์ ์ผ๋ก ์ค์น๊ฐ ๋์๋ค์!
๊ทธ๋ผ ui ๋ ํ์ธํด๋ณผ๊น์?
8200 ํฌํธ๋ก port-forwarding ์ ํตํด์ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
Token ๊ฐ์ values.yaml ์ ๋ช ์๋์ด ์์ผ๋ฉฐ, ๊ธฐ๋ณธ ๊ฐ์ root ์ ๋๋ค.
์ข์ต๋๋ค!
Agent Injector vs Vault CSI Provider
์ค์ต์ ์์ ์์ฃผ ์ค์ํ Vault Component ๋ฅผ ์ ๊น ์์๋ณด๊ณ ์ ํฉ๋๋ค.
๋ฐ๋ก Agent Injector ๊ณผ Vault CSI Provider ์ด์ฃ .
๋จผ์ Agent Injector ์ ๋๋ค.
ํต์ฌ ๊ฐ๋ ์ ๋ฐ๋ก Admission Controller ์ Mutate ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด์ฃ !
์ด์คํฐ์ค๊ฐ Admission Controller ๋ฅผ ํตํด์ ํ๋ ์์ฑ ์ ํ๋ก์๋ฅผ ์์ฑํด์ฃผ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Agent Injector ๋ ํ๋๊ฐ Vault ์ ์ํฌ๋ฆฟ์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ์คํ์ ๋ณ๊ฒฝ(Mutate) ํด์ค๋๋ค.
Admission Controller ๊ฐ ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
๊ทธ๋ฆฌ๊ณ PV ๊ฐ ์๋ EmptyDir ์ ์ด์ฉํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํฉ๋๋ค. ์ด๊ฑด ๋ค์์ ์์ ๋ณด์๋ฉด ์ฝ๊ฒ ์ดํด๊ฐ ๋์ค ๊ฒ๋๋ค.
๋ค๋ฅธ ํ๋๋ Vault CSI Provider ์ ๋๋ค.
์ฐ์ ๋์ ๋๋ ๊ฑด Agent Injector ์ ๋ค๋ฅด๊ฒ CSI Provider ๋ ๋ฐ๋ชฌ์ ์ผ๋ก ๋์ด์ง๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ๋ ธ๋์ ๋์ด์ง๊ฒ ๋ฉ๋๋ค.
CSI(Container Storage Interface) ๋ผ๋ ์ด๋ฆ์ ๊ฑธ๋ง๊ฒ ๊ฐ ๋ ธ๋์ ์๋ ๋ณผ๋ฅจ์ Vault ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฒ ๋๊ณ ํ๋๊ฐ ์ด๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๋ ๋ฐฉ์์ด์ฃ .
์ด๊ฑด ์ ๊ฐ ๋ฐ๋ก ๋ ธ์ ์ ์ ๋ฆฌํ ๊ธ์ธ๋ฐ ๋ณด์๋ฉด ์๋ง ๋๋ต์ ์ธ ์ฐจ์ด์ ์ ๋๋ผ์ค ์ ์์ ๊ฒ๋๋ค.
์ด๋ฒ ์ค์ต์์๋ Vault Agent Injector ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
์ค์ต
๊ทธ๋ผ ์ด์ ๋ฐ๋ก ์ค์ต์ ํด๋ณด์ฃ .
์ค์ต์ ์ฌ์ฉํ ์ํฌ๋ฆฟ ๋ฐ์ดํฐ๋ถํฐ ๋ง๋ค์ด๋ณด์ฃ . Vault ๋ CLI, API, UI ๋ชจ๋ ๊ฐ๋ฅํ์ง๋ง ์ฌ๊ธฐ์ ํธํ๊ฒ UI ๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ์ค๋ฅธ์ชฝ ์๋จ์ Enable new engine+ ๋ฅผ ํด๋ฆญํฉ๋๋ค.
KV ๋ฅผ ์ ํํฉ๋๋ค (KV ๋ Key / Value ์ ์ค์๋ง)
path ๋ database-secret(์๋ฌด๊ฑฐ๋ ์๊ดX) ๋ก ํด์ค๋๋ค. Vault ์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ ์ ๋ถ Path ๋ฅผ ํตํด์ ์ ๊ทผํ๊ฒ ๋ฉ๋๋ค.
์ดํ ์ค๋ฅธ์ชฝ ์๋จ์ Create secret + ๋ฅผ ๋๋ฌ์ค๋๋ค.
์ํฌ๋ฆฟ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ ํ Save ๋ฅผ ๋๋ฌ์ค๋๋ค.
์ด๋ก์จ ์ฐ๋ฆฌ๋ Vault ์ ์ํฌ๋ฆฟ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ทธ๋ผ ์ด์ ์ด ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค์์ ์ฌ์ฉํด์ผ๊ฒ ์ฃ ?
๋ค์ด๊ฐ๊ธฐ ์์ ๋ ํ๊ฐ์ง ์ง๊ณ ๋์ด๊ฐ์ผ ํ๋ ๋ถ๋ถ์ด ์์ต๋๋ค.
๋ฐ๋ก Connectivity ์ ๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค์์ Vault ์ํฌ๋ฆฟ ๋ฐ์ดํฐ์ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ผํ๊ณ , ๋ฐ๋๋ก Vault ๋ํ ์ฟ ๋ฒ๋คํฐ์ค์ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ํ ์์ ์ ๋ฐ๋ก ํด๋ณด์ฃ .
์ค๋ฅธ์ชฝ ์๋จ์ Enable new method + ๋ฅผ ๋๋ฌ์ค๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ ํํด์ค๋๋ค.
์ด๋๋ก Enable Method ๋ฅผ ๋๋ฌ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ k8s host ์ k8s cert ๋ฅผ ๋ฃ์ด์ค๋๋ค.
k8s host ์ k8s cert ๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
# get k8s host
kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " "
# get k8s cert
kubectl config view --raw --minify --flatten -o jsonpath='{.clusters[].cluster.certificate-authority-data}' | base64 --decode
kubernetes auth method ๊ฐ ์์ฑ๋์์ต๋๋ค. ํด๋ฆญํด์ค์๋ค.
์ฟ ๋ฒ๋คํฐ์ค์์ ์ฌ์ฉํ๊ฒ ๋ Vault Role ์ ์ค๋ฅธ์ชฝ Create Role+ ๋ฅผ ๋๋ฌ ์์ฑํฉ๋๋ค.
์๋์ฒ๋ผ Role ์ ์์ฑํฉ๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์ฌ์ฉํ๊ฒ ๋ Vault Role ์ด ์์ฑ๋์์ต๋๋ค.
AWS IRSA ๋์๋ฐฉ์๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
์์์ default ๋ผ๋ Policy ๋ฅผ Role ์ ๋งตํ์์ผ์คฌ๋๋ฐ ํด๋น Policy ๋ ์๊น ๋ง๋ ์ํฌ๋ฆฟ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ด ํ์ฌ ์์ด์. ๊ทธ๋์ ๊ถํ์ ์์ฑํด์ค๋๋ค.
default ๋ฅผ ๋๋ฆ ๋๋ค.
์ค๋ฅธ์ชฝ ์๋จ์ Edit Policy ๋ฅผ ๋๋ฆ ๋๋ค.
์๋์ ๊ฐ์ด ๊ถํ์ ์ถ๊ฐํฉ๋๋ค.
์, Vault ์์์ ์์ ์ ๋๋ฌ๊ณ , ์ด์ ์ฟ ๋ฒ๋คํฐ์ค๋ก ๋์ด๊ฐ ๋ด ์๋ค.
์๋น์ค ์ด์นด์ดํธ์ ์ด๋ฆ๊ณผ ๋ค์์คํ์ด์ค๋ ๋ฐ๋์ ์์์ ๋ง๋ auth method ์ ์ผ์นํด์ผ ํฉ๋๋ค.
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: db-auth
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: role-tokenreview-binding
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: db-auth
namespace: default
์ดํ deployment ๋ฅผ ์์ฑํ๊ณ , ๋ฐฐํฌํฉ๋๋ค. ๋ ์์ธํ ์์ ์ค๋ช ์ด ๋ณด๊ณ ์ถ๋ค๋ฉด ์ฌ๊ธฐ!
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-example-deployment
spec:
replicas: 1
selector:
matchLabels:
app: app-example
template:
metadata:
labels:
app: app-example
annotations:
vault.hashicorp.com/agent-inject: 'true'
vault.hashicorp.com/agent-inject-secret-db-cred: 'database-secret/cred'
vault.hashicorp.com/agent-inject-template-db-cred: |
{{- with secret "database-secret/cred" -}}
postgres://{{ .Data.data.username }}:{{ .Data.data.password }}@postgres:5432/appdb?sslmode=disable
{{- end }}
vault.hashicorp.com/auth-type: 'kubernetes'
vault.hashicorp.com/auth-path: 'auth/kubernetes'
vault.hashicorp.com/role: 'db-cred'
spec:
containers:
- name: app
image: 'nginx'
serviceAccountName: db-auth
์ํฌ๋ฆฟ์ Injection ํ๋ ๋ฐฉ๋ฒ์ ์์ฒ๋ผ Annotation ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ Configmap ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์์ ๊ฐ์ด Annotation ์ ์ฌ์ฉํ๋ค๋ฉด Vault ๊ด๋ จ Annotation ์ Deployment ๋ ๋ฒจ์ด ์๋ Pod ๋ ๋ฒจ์ ๋ช ์ํด์ผ ํฉ๋๋ค.
๋ฌธ์ ์์ด ์์ฑ์ด ์๋์์ต๋๋ค.
๋ง์ฝ ์์ฑ์ด ์๋๋ค๋ฉด ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ฒ๊น ์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ผ ์ด์ ์์ฑํ ํ๋์ ๋ค์ด๊ฐ์ Vault ์ ์ํฌ๋ฆฟ ๋ฐ์ดํฐ๋ฅผ ์ ๋๋ก ๊ฐ์ ธ์๋์ง ํ์ธํด๋ณด์ฃ !
/vault/secrets ์ Vault ์์ ์ฌ์ฉํ๋ ์์ฝ ๊ฒฝ๋ก์ด๋ฉฐ, tmpfs ๋ก ํ๋ฐ์ฑ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
์ฌ์ด๋์นด ํจํด์ผ๋ก ์์ฑ๋๋ Agent Injector ์ปจํ
์ด๋์ EmptyDir ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํฉ๋๋ค.
Vault ์์ ์ํฌ๋ฆฟ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๊ฐ์ ธ์ฌ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ฌ์ด๋์นด๋ก ์คํ๋๋ vault-agent ๋ ํ์ธํด๋ณด์ฃ !
๊ฐ์ ๊ฒฝ๋ก๋ฅผ ๊ณต์ ํ๋ค๋ ์ฌ์ค์ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๊ฒฝ๋ก์ ๊ฐ๋ฉด db-cred ์ ๋ณด๊ฐ ์์ฃ . ์์์ ๋ณธ ํ์ผ๊ณผ ๊ฐ์ ํ์ผ์ ๋๋ค.
K8S ์์ Secret ๋ฅผ ์์ฑํ์ง ์์๋๋ฐ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ฃ !!
์ ๊ธฐํ์ง ์๋์? :)
API Explorer
์ถ๊ฐ์ ์ธ ํ์
๋๋ค.
Vault UI ์์ ํฐ๋ฏธ๋์ ํด๋ฆญํ ํ api ๋ฅผ ์คํํ๋ฉด ์ค์จ๊ฑฐ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง API ๋ฌธ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๊ฒ ํ์ธํด๋ณผ ์ ์์ด์ ํธ๋ฆฌํฉ๋๋ค.
๋ง๋ฌด๋ฆฌ
ํ์ฌ Vault ๋ฅผ ๊ณต๋ถํ๊ณ ์๋๋ฐ, ์ ๋ง ์ ์ฉํ ํ๋ก์ ํธ์ธ๊ฑฐ ๊ฐ์์. ์์ ๋ถํฐ ์ฟ ๋ฒ๋คํฐ์ค ์ํฌ๋ฆฟ ๊ด๋ฆฌ๊ฐ ๋ฌธ์ ์๊ณ , ์ด๋ฅผ Vault ๋ก ๊ด๋ฆฌํด์ผ์ง~ ํ๋๋ฐ ์ด์ ์์ผ ์งํํ๊ฒ ๋๋ค์.
AWS EKS Best Practice ๋ฅผ ๋ณด๋ฉด ์ํฌ๋ฆฟ์ ๊ด๋ฆฌํ ๋ Vault ๋ฅผ ์ฐ๋ผ๊ณ ๋ช ์๋์ด ์์ ๋งํผ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์์ด์ ํต์ฌ์ ์ธ ์ปดํฌ๋ํธ์ ๋๋ค.
Vault ์ฌ์ฉ์ Karpenter ๋์ ๋น์ทํ๊ฒ ๋๊ฒ ์ ์ ํ ๊ฒฝํ์ด์๊ณ , ์ถฉ๋ถํ ๊น๊ฒ ๊ณต๋ถํ ๋งํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์์ ๋ณด์ฌ๋๋ฆฐ Vault ๋ 1% ๋ ์๋๋ ๊ธฐ๋ฅ์ผ๋ก์จ, ์์ผ๋ก ๋ ์ด์ฌํ Vault ๋ฅผ ๊ณต๋ถํด๋ด์ผ ๊ฒ ์ต๋๋ค.
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง!
'๊ฒํฅ๊ธฐ ์๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ฒํฅ๊ธฐ ์๋ฆฌ์ฆ] ๋ช ๋จ์ ์๋ค์, ๋ค์ด์ค์์ฃ ! - Iptables ํธ (0) | 2023.01.09 |
---|---|
[๊ฒํฅ๊ธฐ ์๋ฆฌ์ฆ] k8s์ ๋ฆฌ์์ค๋ฅผ ์ํด ์น์ผ์ค - Helm ํธ (0) | 2022.12.21 |