Nguồn
https://thachanpy.com/tim-hieu-ve-vault-va-cach-luu-tru-cac-khoa-bi-mat-tren-vault/
Lời mở đầu
Nếu các bạn đã và đang quản lý một hệ thống nào đó, thì chắc chắn sẽ có những dữ liệu nhạy cảm bạn không muốn ai biết đến như mật khẩu truy cập vào server, tokens, ssh keys, ca certs, secrets,…
Bạn thường lưu trữ chúng ở đâu?
Chắc chắn sẽ có rất nhiều người lưu chúng ở file Word, Excel, hoặc ghi ra giấy, hoặc trong một phần mềm tạo khóa như KeyPass, hoặc có nhiều thánh còn lưu trữ trong đầu luôn
Các cách lưu trữ trên không hề chuyên nghiệp chút nào. Hơn nữa khi bạn muốn cung cấp các khóa bí mật này đến một hệ thống, công cụ khác một cách tự động mà vẫn đảm bảo được độ bảo mật thì làm sao nhỉ?
Vault sinh ra để làm việc đó
Vault là gì?
Vault là một phần mềm của HashiCorp, dùng để lưu trữ các khóa bị mật, các phương thức xác thực có thể tích hợp với một số hệ thống bên ngoài. Mục đích chính của Vault là lưu trữ và bảo vệ các khóa bí mật này.
Cách sử dụng
Cài đặt
Manual
Bạn có thể cài đặt Vault thông qua việc download Vault package ở trang này. Sau đó giải nén ra và có thể sử dụng luôn rồi.
Tuy nhiên, với từng platform khác nhau, vault cũng hỗ trợ việc cài đặt thông qua nhiều package manage khác nhau.
MacOS
brew install hashicorp/tap/vault
Windows
Bạn có thể dùng chocolatey để cài đặt:
choco install vault
Linux
Tùy vào distro mà có các câu lệnh khác nhau.
Ubuntu/Debian
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install vault
CentOS/RHEL
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
Fedora
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/fedora/hashicorp.repo
sudo dnf -y install vault
Amazon Linux
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
sudo yum -y install vault
Kiểm tra cài đặt
Bạn có thể kiểm tra lại Vault đã được cài đặt hay chưa thông qua lệnh sau:
vault
Nếu có ouput hiện ra như trên thì việc cài đặt coi như đã thành công rồi
Usage: vault <command> [args]
Common commands:
read Read data and retrieves secrets
write Write data, configuration, and secrets
delete Delete secrets and configuration
list List data or secrets
login Authenticate locally
server Start a Vault server
status Print seal and HA status
unwrap Unwrap a wrapped secret
Other commands:
audit Interact with audit devices
auth Interact with auth methods
lease Interact with leases
operator Perform operator-specific tasks
path-help Retrieve API help for paths
policy Interact with policies
secrets Interact with secrets engines
ssh Initiate an SSH session
token Interact with tokens
Khởi tạo Vault Server
Bản chất Vault cũng là một web service, nên bạn start Vault thì cũng đồng nghĩa sẽ start web service này.
Dev mode
Bạn có thể start Vault ở DEV Mode. Khi sử dụng mode này, Vault sẽ tạo cho bạn một service dùng để phát triển, kiểm tra một thứ gì đó với một số cấu hình mặc định sau:
- Không bảo mật
- Lưu trữ mọi thứ ở Memory
- Các khóa bị mật sẽ không bị niêm phong
- Có thể tùy chỉnh root token
Khởi tạo Dev server
Việc tạo một Vault Dev server rất đơn giản, bạn chỉ cần chạy câu lệnh sau là có thể tạo được rồi:
vault server -dev
Khi bạn chạy xong, sẽ có một tá log in ra, tuy nhiên, bạn chỉ nên chú ý vào một số dòng log sau:
==> Vault server configuration:
Api Address: http://127.0.0.1:8200
Cgo: disabled
Cluster Address: https://127.0.0.1:8201
Go Version: go1.14.7
Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
Log Level: info
Mlock: supported: false, enabled: false
Recovery Mode: false
Storage: inmem
Version: Vault v1.5.2
Version Sha: 685fdfa60d607bca069c09d2d52b6958a7a2febd
...
...
Unseal Key: a7Dvo2sQvCuwfgkWHExpNGFZ8I4+4OVVpZp7Xm9s5eQ=
Root Token: s.jnXnIBNFukKrPz9gaBmMmtWY
...
Trong đó:
- Api Address: đây chính là Vault web service address của bạn. Bạn có thể giao tiếp với vault thông qua address này.
- Unseal Key: mặc định ở Dev mode sẽ không niêm phong các khóa, nên Vault cũng sẽ cho bạn key để unseal.
- Root Token: token này dùng để access vào Vault Address.
Kết nối tới Vault Server
Có nhiều cách để kết nối tới Vault server, bạn có thể kết nối thông qua Web UI, CLI hoặc HTTP API.
Web UI
Cách này đơn giản nhất, bạn có thể truy cập vào Vault Address đã hiển thị trên console output, và truy cập tới thôi.
Khi đó, giao diện của Vault sẽ hiện ra, bạn chọn phương thức xác thực và đăng nhập vào. Ở đây mình sẽ thử đăng nhập bằng Root Token hiển thị ở log console.
Trang dashboard của Vault sẽ hiện ra cho bạn với một vài Secrets engines mặc định.
Vault CLI
Vault cung cấp cho bạn bộ CLI khá mạnh mẽ, có thể dùng để thao tác mọi thứ trên Vault.
Mình sẽ thử sử dụng CLI này để đăng nhập tới Vault xem sao.
Đầu tiên bạn phải khai báo biến môi trường VAULT_ADDR để vault CLI có thể hiểu được bạn đang muốn truy cập tới vault server nào.
Tùy vào platform bạn sử dụng mà có các cách tạo biến môi trường khác nhau nhé. Ở đây mình sẽ sử dụng command của Linux
export VAULT_ADDR='http://127.0.0.1:8200'
Sau đó có thể đăng nhập vào rồi, mình vẫn dùng method là Token với Root Token nhé
vault login -method=token token=s.jnXnIBNFukKrPz9gaBmMmtWY
Khi đó, console sẽ hiện ra thông tin bạn đã đăng nhập thành công hay không, nếu có thì một số thông tin cơ bản sẽ hiện ra.
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.
Key Value
--- -----
token s.jnXnIBNFukKrPz9gaBmMmtWY
token_accessor TCREE9BTmdwHokiGavQAlo8a
token_duration ∞
token_renewable false
token_policies ["root"]
identity_policies []
policies ["root"]
Với Vault CLI, nếu bạn đã có sẵn một token nào đó (như Root Token chẳng hạn), thì bạn có thể lưu token này ở biến môi trường, Vault CLI sẽ tự động lấy token này để xác thực cho các câu lệnh khác.
export VAULT_TOKEN='s.jnXnIBNFukKrPz9gaBmMmtWY'
HTTP API
Vault cũng cung cấp cho bạn một bộ HTTP API mạnh mẽ, có thể tích hợp vào code của bạn luôn.
HTTP API sẽ không có khái niệm đăng nhập, mà bạn có thể đưa Token vào request header. Ở đây mình sẽ thử get thông tin các Accessors của Vault.
curl \
--header "X-Vault-Token: s.jnXnIBNFukKrPz9gaBmMmtWY" \
--request LIST \
http://127.0.0.1:8200/v1/auth/token/accessors
Một response sẽ trả về để biết bạn có quyền access đến Vault thông qua token này hay không
{
"request_id":"9bdbdeb3-f0f8-ef9b-dc56-1dd8b8ff0e6c",
"lease_id":"",
"renewable":false,
"lease_duration":0,
"data":{
"keys":[
"TCREE9BTmdwHokiGavQAlo8a"
]
},
"wrap_info":null,
"warnings":null,
"auth":null
}
Có response trả về, vậy là mình có thể dùng token này để xác thực rồi.
Secrets Engines
Các loại secrets engines
Dù sao đi nữa thì mục đích chính của Vault chính là lưu trữ các khóa bí mật để không bị lộ ra bên ngoài cũng như có thể tích hợp đến các hệ thống khác một cách dễ dàng.

Vault hỗ trợ rất nhiều secrets engines, từ các cặp key/value bình thường, đến SSH, PKI Certificates, có cả Cloud bao gồm AWS, Azure, GCP,.. hoặc một vài Infra khác như Consul, Nomad, RabbitMQ,…
Ở bài này, mình sẽ thử tạo ra một cặp key/value đơn giản và upload nó lên Vault thông qua Vault CLI và dùng KV Engine nhé.
Enable một Secrets engine
Kích họat KV engine trên Vault với path là thachanpy_kv
vault secrets enable -path=thachanpy_kv kv
Một console log sẽ xuất hiện. Nếu thành công thì sẽ báo theo kiểu sau:
Success! Enabled the kv secrets engine at: thachanpy_kv/
Check Secrets Engines enabled
Để kiểm tra các secrets engines đang enabled tương ứng với từng path cụ thể, thì chạy command sau:
vault secrets list
Bạn có thể thấy là thachanpy_kv secret engine đã tạo thành công rồi
Path Type Accessor Description
---- ---- -------- -----------
cubbyhole/ cubbyhole cubbyhole_bb15b264 per-token private secret storage
identity/ identity identity_145b088e identity store
secret/ kv kv_cc8f67a3 key/value secret storage
sys/ system system_cadc87dd system endpoints used for control, policy and debugging
thachanpy_kv/ kv kv_df82100e n/a
Diable một Secrets Engine
Để disable một secres engine nào đó, đơn giản là bạn chạy lệnh disable thôi
vault secrets disable -path=thachanpy_kv
Nếu thành công sẽ hiện thị log sau:
Success! Disabled the secrets engine (if it existed) at: thachanpy_kv/
Create một secret trên Secrets Engine
Secrets engine đã có, cái mình cần ở Vault là lưu trữ các khóa bị mật. Mình sẽ thử tạo một cặp key/value trên Secrets engine mình vừa tạo ở trên.
Mình thử tạo một sercret thachanpy_secret với cặp key/value có giá trị như sau:
key: thachanpy_key
value: thachanpy_value
Mình chạy command sau:
vault kv put thachanpy_kv/thachanpy_secret thachanpy_key=thachanpy_value
Nếu tạo thành công, thì vault sẽ hiển thị log cho mình như sau:
Success! Data written to: thachanpy_kv/thachanpy_secret
Get giá trị secret trên Secrets Engine
Việc tạo đã thành công, khi mình muốn lấy giá trị này về thì làm như thế nào? Đơn giản là chỉ cần việc get về mà thôi.
vault kv get thachanpy_kv/thachanpy_secret
Những cặp key/value của secret này sẽ hiện ra rõ ràng cho mình.
======== Data ========
Key Value
--- -----
thachanpy_key thachanpy_value
Delete secret trên Secrets Engine
Để xóa một secret nào đó trên một Secrets Engine thì mình dùng lệnh sau:
vault kv delete thachanpy_kv/thachanpy_secret
Và việc xóa cũng sẽ được thông báo rõ ràng:
Success! Data deleted (if it existed) at: thachanpy_kv/thachanpy_secret
Tổng kết
Bài này đã cho các bạn biết được sơ qua Vault là gì, nó được dùng đề làm gì, và một số ví dụ cơ bản trên Vault.
Vault không dùng cho mục đích riêng lẻ, nó sẽ thường được tích hợp vào một hệ thống để cho quá trình build hoặc deployment trở nên trơn tru, hiệu quả và bảo mật.
Cảm ơn các bạn đã theo dõi
0 Nhận xét