Get to start Hashicorp vault for beginner

Thanakrit Phuraesri
Sirisoft
Published in
6 min readAug 18, 2023

สวัสดีครับ กลับมาอีกครั้งเเล้วนะครับ วันนี้ผมมี software สำหรับเก็บค่า Key ค่า value หรือเก็บ Secrets ต่าง ๆ มานำเสนอครับ นั้นก็คือ Software Hashicorp vault ครับ ซึ่งเป็น product ของทาง Hashicorp ก่อนที่จะไปเข้าเนื้อเรื่องผมก็ขอแนะนำตัวเองก่อนเลย สวัสดีอีกครั้งครับ ผมชื่อฟิวครับ ตอนนี้กำลังทำงานในตำแหน่ง Software Engineer อยู่ที่บริษัท Sirisoft ครับ ซึ่งเนื้อหาวันนี้ผมจะมาแนะนำว่า Hashicorp vault คืออะไร มีการทำงานเป็นยังไง รวมถึงสอนวิธีการติดตั้งและวิธีการใช้งานเบื้องต้น ตามไปดูกันเลยครับ

Hashicrop vault คืออะไร ?

Software Hashicrop vault เป็น software ของที่ถูกพัฒนาขึ้นจากทาง Hashicorp โดย software เป็นระบบการจัดการ Secrets และการเข้ารหัสของ Secrets เช่น คีย์การเข้ารหัสของ API รหัสผ่าน และ Certificate ซึ่งตัว Hashcorp vault สามารถใช้งานผ่านหน้า Console UI , Command line หรือสามารถเรียกผ่าน HTTP API ได้

Hashcorp vault การทำเป็นอย่างไร ?

Hashicorp vault จะทำงานกับ Token เป็นหลัก ซึ่ง Token จะเชื่อมโยงกับการกำหนดของแต่ละ policy ในการเก็บ secrets ซึ่ง policy แต่ละอันจะอิงตามเส้นทางที่ถูกกำหนดขึ้นตาม policy Hashicorp vault จะจำกัดการเข้าถึงของข้อมูลของ client แต่ละราย เราสามารถสร้าง Token ด้วยตนเองและกำหนด policy การเข้าถึงให้กับ client ได้ ภาพประกอบด้านล่างแสดงเวิร์กโฟลว์การทำงานหลักของ Software Hashicorp vault

https://developer.hashicorp.com

หลักการทำงานของ vault จะประกอบด้วยขั้นตอนดังนี้:

  • ตรวจสอบสิทธิ์: การตรวจสอบสิทธิ์ใน vault คือกระบวนการที่เมื่อ client ต้องการเข้าถึง vault จำเป็นต้องมีข้อมูลที่ vault ใช้เพื่อระบุว่าพวกเขาเป็นใคร เมื่อ client ได้รับการพิสูจน์ตัวตนกับวิธีการตรวจสอบสิทธิ์แล้ว Token จะถูกสร้างขึ้นและจะถูกเชื่อมเข้ากับ policy สิทธิ์การเข้าใช้งาน
  • การตรวจสอบ: vault จะตรวจสอบ client กับแหล่งที่มาที่เชื่อถือได้ เช่น Github, LDAP, AppRole และอื่นๆ
  • ให้สิทธิ์: Client ต้องตรงกับ policy การรักษาความปลอดภัยของพื้นที่เก็บข้อมูล โดย policy นี้จะเป็นการกำหนดสิทธิ์เข้าถึงที่กําหนดปลายทาง API ที่ client จะสามารถเข้าถึงได้โดยใช้ Token , Policy เป็นวิธีที่จะกำหนดสิทธิ์ในการเข้าถึงและการใช้งานในเซิร์ฟเวอร์ vault
  • การเข้าถึง: Vault จะให้สิทธิ์ในการเข้าถึงข้อมูล secrets และความสามารถในการเข้าถึงโดยสร้าง Token ตาม policy ที่กำหนดสิทธิ์การเข้าถึงของแต่ละ client

ตอนนี้ก็พอรู้หลักการทำงานเบื้องต้นของ Hashicorp vault กันเเล้วนะครับต่อไปเรามาเริ่มลองติดตั้งและลองใช้งานเบื้องต้นกัน ซึ่งผมจะให้มีเครื่อง server เพียง 1 เครื่อง เพื่อสำหรับในการติดตั้ง Hashicorp vault server โดยที่เครื่อง server เครื่อง hashicorp vault นั้นผมจะใช้จะเป็นใช้ OS เป็น Oracle linux 8.7 ครับ และจำเป็นต้องมี cluster kubernetes เพื่อสำหรับการทดสอบเรียกใช้งาน Hashicorp vault server สำหรับเพื่อนๆคนไหนยังไม่มี cluster kubernetes สามารถดูวิธีการติดตั้งได้ที่ ลิงค์ต่อไปนี้เลยครับ https://medium.com/sirisoft/getting-start-with-kubernetes เรามาเริ่มการติดตั้งและการใช้งาน hashicorp vault เบื้องต้นการเลย ไปดูกันครับ

Install ans setup Hashicorp vault

Name server : vault , IP server : 192.168.0.210

ในขั้นตอนการติดตั้งนั้นเราจะทำการติดตั้งและ config hashicorp vault

Install on node vault :

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install vault

Config vault on node vault :

sudo vi /etc/vault.d/vault.hcl
ui = true
storage "file" {
path = "/data/vault/data"
}
# HTTP listener
listener "tcp" {
address = "192.168.0.210:8200"
tls_disable = 1
}
api_addr = "http://192.168.0.210:8200"
cluster_addr = " http://192.168.0.210:8201"
cluster_name = "vault"
log_level = "INFO"

Start service vault and init vault on node vault :

systemctl start vault && systemctl enable vault
export VAULT_ADDR=http://192.168.0.210:8200
echo "export VAULT_ADDR=http://192.168.0.210:8200" >> ~/.bashrc
vault operator init > /etc/vault.d/init.file

ในตอนนี้เราได้ทำการติดตั้งและ config vault ที่ node vault เสร็จเเล้วซึ่งเราได้ config ให้ vault เก็บข้อมูลไว้บน path บนเครื่อง node เราเอง เเต่ vault สามารถเปลี่ยนที่เก็บข้อมูลให้ไปใช้การเก็บที่ Database ได้สามารถดูได้ว่าสามารถเชื่อมต่อกับ Database อะไรได้บ้าง ที่ https://support.hashicorp.com/hc/en-us/articles/4406218013587

หลังจากที่เราก็ได้ทำการ Init vault ขึ้นมาเเล้วเราจะได้ file ที่ path /etc/vault.d/init.file ซึ่งใน file ที่ชื่อ init.file จะเป็น token สำหรับ unseal key เพื่อเริ่มต้นใช้งาน vault อันนี้เป็นตัวอย่าง file init.file

Unseal Key 1: cUjFUEhEoT811ukTRFxGnMf1m59jzmS6P79o2XV8NzbA
Unseal Key 2: YJZWD3gn22nHkohDCOuMWYzFWmwZ4/CQaJEY0c4D7abd
Unseal Key 3: aYNyge97Mcf/B3NhrTQpin11ebMG2PyYG3zb8uSEln7L
Unseal Key 4: 1EunMYy/fkho/PTtBhciY/FjMmMZYLDrfIzxC9UYS6GW
Unseal Key 5: otnPjIkoKtYg1+5grgBC88mf4GqUUu/xDWP3dxmgamGN

Initial Root Token: hvs.l0YZEcRvN4idQmbpnOdExRuL

Vault initialized with 5 key shares and a key threshold of 3. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
before it can start servicing requests.

Vault does not store the generated root key. Without at least 3 keys to
reconstruct the root key, Vault will remain permanently sealed!

It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault operator rekey" for more information.

เราต้องทำการ unseal keys เพื่อเริ่มต้นใช้งาน Hashicorp vault

vault operator unseal Key1
vault operator unseal Key2
vault operator unseal Key3

เมื่อทำการ unseal keys ครบทั้ง 3 ครั้งเเล้วให้ทำการเช็คสถานะของ hashicorp vault

vault status
Key             Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 5
Threshold 3
Version 1.13.3
Build Date 2023-06-06T18:12:37Z
Storage Type file
Cluster Name vault01
Cluster ID 200f06b7-031f-baca-a55e-9a72d67d2e33
HA Enabled false

ตอนนี้เราสามารถเริ่มต้นใช้งาน hashicorp vault ของเราได้เเล้วซึ่งต่อไปเราจะทำการลองสร้าง secret ขึ้นมา

vault secrets enable -path=secret/devwebapp/ kv-v2
vault secrets list
Path            Type         Accessor              Description
---- ---- -------- -----------
cubbyhole/ cubbyhole cubbyhole_d3698592 per-token private secret storage
identity/ identity identity_4a9363da identity store
secret/test/ kv kv_579c9967 n/a
sys/ system system_0060f121 system endpoints used for control, policy and debugging
test/ kv kv_e57ea593 n/a

ทำการใส่ค่า key กับ value ที่ต้องการเก็บ

vault kv put secret/devwebapp/config username="giraffe" password="salsa"
vault kv get secret/devwebapp/config
======== Secret Path ========
secret/devwebapp/data/config

======= Metadata =======
Key Value
--- -----
created_time 2023-07-26T11:19:36.912210631Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1

====== Data ======
Key Value
--- -----
password salsa
username giraffe

เมื่อเราสร้าง secrets และใส่ค่า key กับ value เรียบร้อยเเล้วจากนั้นเราจะทำการ Integrate hashicorp vault server เข้ากับ cluster kubernetes เพื่อให้ cluster Kubernetes ของเรานั้นสามารถเรียกใช้งาน secrets จาก hashicorp vault server ได้ ซึ่งจะใช้วิธีการ Deploy vault agent ใน cluster kubernetes โดยใช้command helm

helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update

helm install vault hashicorp/vault \
--set "global.externalVaultAddr=http://192.168.210:8200"

เมื่อเราทำการ Deploy vault agent เรียบร้อยเเล้วให้ทำการตรวจสอบโดย pod และ Service account ของ vault

kubectl get pod 

NAME READY STATUS RESTARTS AGE
vault-agent-injector-66d74b8984-gkrkj 1/1 Running 0 7m53s
kubectl describe serviceaccount vault

Name: vault
Namespace: default
Labels: app.kubernetes.io/instance=vault
app.kubernetes.io/managed-by=Helm
app.kubernetes.io/name=vault
helm.sh/chart=vault-0.25.0
Annotations: meta.helm.sh/release-name: vault
meta.helm.sh/release-namespace: default
Image pull secrets: <none>
Mountable secrets: vault-token-k68bz
Tokens: vault-token-k68bz
Events: <none>

สำหรับใครที่ใช้ cluster kubernetes ที่มี version 1.24 ขึ้นไปให้ทำการสร้าง secrets สำหรับ vault เพิ่มขึ้นมาเอง โดยสามารถสร้าง secrets ได้ตามต่อไปนี้

cat > vault-secret.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
name: vault-token-k68bz
annotations:
kubernetes.io/service-account.name: vault
type: kubernetes.io/service-account-token
EOF
kubectl apply -f vault-secret.yaml
secret/vault-token-k68bz created

เมื่อเราทำการตรวจสอบ secrets เสร็จเรียบร้อยให้ทำการสร้างตัวแปรโดยตั้งชื่อว่า VAULT_HELM_SECRET_NAME เพื่อสำหรับเก็บค่าตัวแปรของ secrets เเละเมื่อสร้างเสร็จเเล้วให้ลอง describe secrets อีกรอบ

VAULT_HELM_SECRET_NAME=$(kubectl get secrets --output=json | jq -r '.items[].metadata | select(.name|startswith("vault-token-")).name')

kubectl describe secret $VAULT_HELM_SECRET_NAME
Name:         vault-token-k68bz
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: vault
kubernetes.io/service-account.uid: 3656d0e0-2ed6-4753-8ec4-5f1247dd2c1f

Type: kubernetes.io/service-account-token

Data
====
ca.crt: 1099 bytes
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IllLNmd2ZDZzWXlocVFMMGhpY3hPcWpUdW5YTlBJdG5QRzVvYU4zbmFCT0kifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InZhdWx0LXRva2VuLWs2OGJ6Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6InZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMzY1NmQwZTAtMmVkNi00NzUzLThlYzQtNWYxMjQ3ZGQyYzFmIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6dmF1bHQifQ.Vg0K8n6u0csmbdhtj2mI9RFs3etIe-d0f-aRgg6wO_OXVi0imYq-597jZtP48xejNWfpLA8FajNpeDWFunS3WU8rLiAF_UQT2tNPjbY8imncT30FSZDPl0VMpW4gDlGq9dFLkn-vBKEF7msvaSVvjr0p52O-n1fMeuxDXamBXcWs0CWM0y2ks4hCBjebkZUV2C_pEf3Y7nIGNEMRE9mO2oByoX0GLD3Tr0ELvs_RB5Abcv4wZnL22urzrciz1lEe8ceSDYP991UWsP-decbMTv_cs8lcZL4vCQ7nX_yL9eWgVpWJi_0l1zlcG7rJ4Xv7LdE9i8hpeUWu8RD6aBR4dA

ตอนนี้เราได้ทำการเตรียมการ Setup Cluster Kubernetes ให้สามารถใช้งาน vault server เสร็จเรียบร้อยเเล้ว ต่อไปจะมา set policy authentication บน Hashicorp vault server เพื่อสำหรับให้ Cluster Kubernetes ของเรานั้นสามารถ access เข้ามาใช้งานได้ตาม policy ที่กำหนด

โดยขั้นตอนเเรกต้องทำการ enable policy authentication สำหรับ Kubernetes บน server vault

vault auth enable kubernetes

เมื่อเรา enable policy authentication สำหรับ Kubernetes เสร็จเรียบร้อยตอนไปต้องทำการเก็บค่าที่จำเป็นในการสร้าง policy authentication โดยจะมี ค่า JSON web token , Kubernetes CA certificate และ Kubernetes host URL จะมีการเก็บตามนี้

JSON web token

TOKEN_REVIEW_JWT=$(kubectl get secret $VAULT_HELM_SECRET_NAME --output='go-template={{ .data.token }}' | base64 --decode)
Kubernetes CA certificate

KUBE_CA_CERT=$(kubectl config view --raw --minify --flatten --output='jsonpath={.clusters[].cluster.certificate-authority-data}' | base64 --decode)
Kubernetes host URL

KUBE_HOST=$(kubectl config view --raw --minify --flatten --output='jsonpath={.clusters[].cluster.server}')

เมื่อทำการเก็บค่าตัวแปรครบทั้งหมดเเล้วจะทำการสร้าง policy authentication สำหรับ Kubernetes และกำหนดสิทธิ์ในการเข้างาน vault ให้กับ cluster kubernetes

การสร้าง authentication สำหรับ Kubernetes :

vault write auth/kubernetes/config \
token_reviewer_jwt="$TOKEN_REVIEW_JWT" \
kubernetes_host="$KUBE_HOST" \
kubernetes_ca_cert="$KUBE_CA_CERT" \
issuer="https://kubernetes.default.svc.cluster.local"

การสร้าง policy เข้าใช้งาน secrets ใน Hashicorp server โดยจะสร้าง policy ชื่อ devwebapp จะสร้าง policy ให้ secrets path secret/devwebapp/data/config

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

เมื่อสร้าง authentication สำหรับ Kubernetes และสร้าง policy สำหรับการเข้าใช้งาน secrets เสร็จเรียบร้อยเเล้วจากนั้นจะทำการสร้าง Kubernetes authentication role

vault write auth/kubernetes/role/devweb-app \
bound_service_account_names=internal-app \
bound_service_account_namespaces=default \
policies=devwebapp \
ttl=24h

ตอนนี้เราก็เตรียมพร้อมที่จะลองทดสอบการใช้งานเรียกค่า key กับ value ที่เก็บอยู่ใน secrets ที่ server hashicorp vault เราจะทดสอบโดยการสร้าง pod ใน cluster kubernetes โดยในไฟล์ yaml สำหรับการสร้าง pod นั้นจะต้องเพิ่มการ config ในส่วนของ annotations ใน yaml ไฟล์ เพื่อสำหรับการเรียกใช้งาน secrets

cat > pod-devwebapp-with-annotations.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: devwebapp-with-annotations
labels:
app: devwebapp-with-annotations
annotations:
vault.hashicorp.com/agent-inject: 'true'
vault.hashicorp.com/role: 'devweb-app'
vault.hashicorp.com/agent-inject-secret-credentials.txt: 'secret/devwebapp/data/config'
spec:
serviceAccountName: internal-app
containers:
- name: app
image: burtlo/devwebapp-ruby:k8
EOF
kubectl create-f pod-devwebapp-with-annotations.yaml
kubectl get pods

NAME READY STATUS RESTARTS AGE
devwebapp-with-annotations 2/2 Running 0 39s
vault-agent-injector-7b6cd469d8-8svg5 1/1 Running 0 17m

เมื่อทำการสร้าง pod ที่มีการ config เรียกการใช้งานผ่าน vault-agent-injector ตัว vault-agent-injector จะทำการสร้าง sidecar ขึ้นใน pod ที่ชื่อ devwebapp-with-annotations ขึ้นมาเพื่อสำหรับไปเรียกดึงค่า secrets จาก hashicorp vault server มาใช้งานใน pod ชื่อ devwebapp-with-annotations สามารถเช็คการเรียกใช้งาน secrets ดังนี้

kubectl exec -it devwebapp-with-annotations -c app -- cat /vault/secrets/credentials.txt

data: map[password:salsa username:giraffe]
metadata: map[created_time:2022-06-06T18:26:14.070155Z custom_metadata:<nil> deletion_time: destroyed:false version:1]

และตอนนี้ก็สามารถเรียกใช้งาน secrets ได้เป็นที่เรียบร้อย เป็นไงก้นบ้างครับสำหรับการใช้งานตัว software hashicorp vault เบื้องต้น อาจจะมีการใช้งานที่ยุ่งยากนิดหน่อยแต่สำหรับการเก็บค่า key และ value นั้นถือเป็น software ที่เหมาะสมสำหรับการใช้งานในการเก็บค่า key และ value ที่เป็น secrets อย่างมากตัว hashicorp vault ยังสามารถเก็บค่า secrets ในรูปแบบอื่นๆไดอีกด้วย ยังไงเพื่อนๆ ก็สามารถลองไปทำตามกันได้นะครับ สามารถศึกหาข้อมูลเพิ่มเติมในการใช้งานของตัว Software hashicorp vault ได้ที่ https://developer.hashicorp.com/vault/docs

ท้ายที่สุดนี้หวังว่า Blog ของผมจะเป็นประโยชน์สำหรับผู้ที่กำลังอ่านอยู่หรือผู้ที่สนใจครับถ้ามีเนื้อหาอะไรที่ตกหล่นหรือผิดพลาดประการใดต้องขออภัยด้วยครับ

ยังไม่หมด ตอนนี้ทางบริษัท Sirisoft ยังเปิดรับสมาชิกเพิ่มอยู่นะครับเพื่อนๆคนในสนใจสามารถติดต่อมาได้ที่
Line : https://lin.ee/1eqbK9V
Email : Jobs@sirisoft.co.th

👉🏻ติดตามข่าวสารอื่นๆของบริษัทได้ที่ช่องทางด้านล่างนี้เลยครับผม

Medium : https://medium.com/sirisoft
Facebook : https://www.facebook.com/sirisoft
Instagram : https://www.instagram.com/sirisoft_official
Tiktok : www.tiktok.com/@sirisoft_official
Youtube : https://www.youtube.com/@sirisoftofficial1698

--

--