Tìm hiểu về Vault và cách lưu trữ các khóa bí mật trên 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 😛


5 1 vote
Article Rating
guest
0 Comments
Inline Feedbacks
View all comments