Thứ tư, 28/02/2018 | 00:00 GMT+7

Cách quản lý an toàn bí mật với HashiCorp Vault trên Ubuntu 16.04

Vault là một công cụ open-souce cung cấp một cách an toàn, tin cậy để lưu trữ và phân phối các bí mật như khóa API, mã thông báo truy cập và password . Phần mềm như Vault có thể cực kỳ quan trọng khi triển khai các ứng dụng yêu cầu sử dụng bí mật hoặc dữ liệu nhạy cảm.

Trong hướng dẫn này, bạn sẽ:

  • Cài đặt Vault và cấu hình nó như một dịch vụ hệ thống
  • Khởi tạo repodata trên đĩa được mã hóa
  • Lưu trữ và truy xuất một giá trị nhạy cảm một cách an toàn qua TLS

Với một số policy bổ sung được áp dụng, bạn có thể sử dụng Vault để quản lý an toàn dữ liệu nhạy cảm cho các ứng dụng và công cụ khác nhau của bạn .

Như với bất kỳ dịch vụ nào quản lý thông tin nhạy cảm, bạn nên cân nhắc đọc tài liệu bổ sung về các phương pháp triển khai tốt nhất của Vault trước khi sử dụng nó trong môi trường giống như production . Ví dụ: hướng dẫn tăng cường production của Vault bao gồm các chủ đề như policy , mã thông báo root và kiểm toán.

Yêu cầu

Trước khi bắt đầu hướng dẫn này, bạn cần những thứ sau:

Bước 1 - Cài đặt Vault

HashiCorp cung cấp Vault dưới dạng một file binary duy nhất, vì vậy ta sẽ download và cài đặt file thực thi của Vault theo cách thủ công.

Trước tiên, hãy download repository nén Vault zip dành cho Linux 64-bit. Bạn có thể tìm thấy liên kết đến version mới nhất (0.9.5 tại thời điểm viết bài) trên trang download của Vault .

  • wget https://releases.hashicorp.com/vault/0.9.5/vault_0.9.5_linux_amd64.zip

Sau đó download tổng kiểm tra cho file này để bạn có thể xác minh download .

  • wget https://releases.hashicorp.com/vault/0.9.5/vault_0.9.5_SHA256SUMS

Tiếp theo, xác minh tính toàn vẹn của repository zip. Điều này nhằm xác nhận nội dung của repository zip trùng với những gì Hashicorp đã phát hành trong version 0.9.5 của Vault.

  • grep linux_amd64 vault_*_SHA256SUMS | sha256sum -c -

Mỗi dòng trong file SHA256SUMS có tổng kiểm tra và tên file , một cho mỗi file nén zip mà HashiCorp cung cấp. Phần grep của lệnh trên in dòng có tổng kiểm tra và tên file của hệ binary Linux 64-bit, sau đó chuyển ( | ) dòng đó tới lệnh tiếp theo. Lệnh SHA-256 kiểm tra, -c , file có tên file từ dòng đó trùng với tổng kiểm tra từ dòng đó.

Chạy lệnh sẽ cho biết repository là OK . Nếu không, hãy thử download lại file .

Output
vault_0.9.5_linux_amd64.zip: OK

Khi hoàn tất xác minh tổng kiểm tra, hãy cài đặt lệnh unzip để bạn có thể extract file lưu trữ. Đảm bảo repository của bạn được cập nhật trước.

  • sudo apt-get update
  • sudo apt-get install unzip

Sau đó extract file binary Vault vào folder làm việc.

  • unzip vault_*.zip
Output
Archive: vault_0.9.5_linux_amd64.zip inflating: vault

Di chuyển file thực thi Vault vào một folder trong PATH của hệ thống để có thể truy cập file đó từ shell của bạn.

  • sudo cp vault /usr/local/bin/

Cuối cùng, đặt cờ khả năng Linux trên hệ binary . Điều này bổ sung thêm bảo mật bằng cách cho phép binary thực hiện khóa bộ nhớ mà không nâng cao quyền của nó một cách không cần thiết.

  • sudo setcap cap_ipc_lock=+ep /usr/local/bin/vault

Đến đây bạn có thể sử dụng lệnh vault . Hãy thử kiểm tra version của Vault đảm bảo rằng nó hoạt động.

  • vault --version
Output
Vault v0.7.2 ('d28dd5a018294562dbc9a18c95554d52b5d12390')

File thực thi Vault được cài đặt trên server của bạn, vì vậy bước tiếp theo là cấu hình nó để chạy như một dịch vụ hệ thống.

Bước 2 - Tạo file đơn vị Vault

Systemd là hệ thống init của Ubuntu, trong số những thứ khác, quản lý các dịch vụ của hệ thống. Để cài đặt Vault làm dịch vụ hệ thống, ta cần cài đặt những điều sau:

  • User hệ thống cho daemon Vault để chạy như
  • Thư mục dữ liệu để lưu trữ thông tin của Vault
  • Tệp cấu hình của Vault
  • Bản thân tệp đơn vị systemd .

Lưu ý : Trong hướng dẫn này, ta đang sử dụng phần backend của hệ thống file để lưu trữ các bí mật được mã hóa trên hệ thống file local tại /var/lib/vault . Điều này phù hợp cho các triển khai local hoặc một server không cần sao chép. Các chương trình backend khác của Vault, chẳng hạn như chương trình backend Consul, sẽ lưu trữ các bí mật được mã hóa trong repository lưu trữ khóa / giá trị được phân phối.

Đầu tiên, tạo một user hệ thống vault .

  • sudo useradd -r -d /var/lib/vault -s /bin/nologin vault

Ở đây, ta sử dụng /var/lib/vault làm folder chính của user . Điều này sẽ được sử dụng làm folder dữ liệu Vault. Ta cũng đặt shell thành /bin/nologin để hạn chế user là account hệ thống không tương tác.

Đặt quyền sở hữu /var/lib/vault cho riêng user vault và group vault .

  • sudo install -o vault -g vault -m 750 -d /var/lib/vault

Bây giờ, hãy cài đặt file cấu hình của Vault, /etc/vault.hcl . Bạn sẽ sử dụng quyền này để kiểm soát các tùy chọn khác nhau trong Vault, chẳng hạn như nơi lưu trữ các bí mật được mã hóa.

Tạo vault.hcl bằng nano hoặc editor yêu thích của bạn.

  • sudo nano /etc/vault.hcl

Dán nội dung sau vào file và đảm bảo thay thế bằng domain của bạn :

/etc/vault.hcl
backend "file" {         path = "/var/lib/vault" }  listener "tcp" {         tls_disable = 0         tls_cert_file = "/etc/letsencrypt/live/example.com/fullchain.pem"         tls_key_file = "/etc/letsencrypt/live/example.com/privkey.pem"  } 

Tệp cấu hình này hướng dẫn Vault lưu trữ các bí mật được mã hóa trong /var/lib/vault trên đĩa và cho biết Vault sẽ lắng nghe các kết nối qua HTTPS bằng cách sử dụng các certificate được tạo từ hướng dẫn Let's Encrypt.

Lưu file , sau đó bảo mật quyền của file cấu hình Vault bằng cách chỉ cho phép user vault đọc nó.

  • sudo chown vault:vault /etc/vault.hcl
  • sudo chmod 640 /etc/vault.hcl

Tiếp theo, để Systemd quản lý daemon Vault liên tục, hãy tạo một tệp đơn vị tại /etc/systemd/system/vault.service .

  • sudo nano /etc/systemd/system/vault.service

Copy paste phần sau vào file . Điều này cho phép Vault chạy trong nền như một daemon dịch vụ hệ thống liên tục.

/etc/systemd/system/vault.service
[Unit] Description=a tool for managing secrets Documentation=https://vaultproject.io/docs/ After=network.target ConditionFileNotEmpty=/etc/vault.hcl  [Service] User=vault Group=vault ExecStart=/usr/local/bin/vault server -config=/etc/vault.hcl ExecReload=/usr/local/bin/kill --signal HUP $MAINPID CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK Capabilities=CAP_IPC_LOCK+ep SecureBits=keep-caps NoNewPrivileges=yes KillSignal=SIGINT  [Install] WantedBy=multi-user.target 

Danh sách đầy đủ các tùy chọn đơn vị dịch vụ rất phong phú, nhưng các tùy chọn cấu hình quan trọng nhất cần lưu ý trong định nghĩa trên bao gồm:

  • ConditionFileNotEmpty đảm bảo file cấu hình /etc/vault.hcl tồn tại.
  • UserGroup , kiểm soát các quyền của user mà daemon Vault sẽ chạy cùng.
  • ExecStart , trỏ đến file thực thi mà ta đã cài đặt trước đó và xác định những gì sẽ bắt đầu để chạy dịch vụ.
  • ExecReload , được gọi khi Vault reload file cấu hình của nó, ví dụ: khi chạy systemctl reload vault .
  • [Install] , cho phép ta chạy dịch vụ này liên tục khi khởi động nên ta không cần phải khởi động nó theo cách thủ công sau khi khởi động lại.

Cuối cùng, Vault cần quyền để đọc các certificate bạn đã tạo bằng Certbot. Theo mặc định, các certificate và private key này chỉ có thể truy cập bằng root . Để cung cấp các file này một cách an toàn, ta sẽ tạo một group đặc biệt gọi là pki để truy cập các file này. Ta sẽ tạo group và sau đó thêm user vault vào đó.

Lưu file , sau đó tạo group pki .

  • sudo groupadd pki

Cập nhật quyền trên hai folder trong folder /etc/letsencrypt để cho phép group pki đọc nội dung.

  • sudo chgrp pki /etc/letsencrypt/{archive,live}
  • sudo chmod g+rx /etc/letsencrypt/{archive,live}

Sau đó, thêm user vault vào group pki . Điều này sẽ cấp cho Vault quyền truy cập vào các certificate để Vault có thể phân phát các yêu cầu một cách an toàn qua HTTPS.

  • sudo gpasswd -a vault pki

Bước cuối cùng để thuận tiện, hãy thêm luật trong /etc/hosts để chuyển các yêu cầu đến Vault tới localhost .

Theo mặc định, Vault sẽ chỉ lắng nghe các yêu cầu từ giao diện loopback ( lo , hoặc địa chỉ 127.0.0.1 ). Điều này nhằm đảm bảo dịch vụ không bị lộ ra trên mạng internet công cộng trước khi nó được bảo mật đúng cách. Bạn có thể cập nhật điều này sau, nhưng hiện tại, thay đổi cấu hình này sẽ cho phép ta sử dụng lệnh vault và phân giải chính xác domain được bảo mật HTTPS.

Thay thế example.com trong lệnh sau bằng domain bạn đã có được certificate Let's Encrypt cho:

  • echo 127.0.0.1 example.com | sudo tee -a /etc/hosts

Điều này nối dòng 127.0.0.1 example.com với /etc/hosts để mọi yêu cầu HTTP đến example.com đều được chuyển đến localhost .

Với việc cài đặt file thực thi Vault, file dịch vụ được ghi và file cấu hình Vault đã hoàn tất, bây giờ ta đã sẵn sàng khởi động Vault và chạy repository bí mật.

Bước 3 - Khởi tạo Vault

Khi bạn lần đầu tiên khởi động Vault, nó sẽ chưa được khởi tạo, nghĩa là nó chưa sẵn sàng để lấy và lưu trữ dữ liệu.

Lần đầu tiên bạn khởi động Vault, chương trình backend thực sự lưu trữ các bí mật được mã hóa cũng chưa được khởi tạo. Khởi động dịch vụ hệ thống Vault để khởi tạo chương trình backend và bắt đầu chạy chính Vault.

  • sudo systemctl start vault

Bạn có thể kiểm tra nhanh để xác nhận dịch vụ đã chạy .

  • sudo systemctl status vault

Đầu ra của lệnh đó phải bao gồm một số thông tin về dịch vụ đang chạy, chẳng hạn như ID tiến trình và việc sử dụng tài nguyên của nó. Đảm bảo rằng dòng sau có trong kết quả , cho biết dịch vụ đang chạy chính xác.

Output
. . . Active: active (running) . . .

Nếu dịch vụ không hoạt động, hãy xem các dòng log đi kèm ở cuối kết quả của lệnh để xem kết quả của Vault, điều này có thể giúp xác định bất kỳ vấn đề nào.

Tiếp theo, ta sẽ đặt một biến môi trường để cho lệnh vault biết cách kết nối với server Vault. Tại đây, Vault đã được cấu hình để chỉ nghe trên giao diện loopback local , vì vậy hãy đặt biến môi trường VAULT_ADDR thành điểm cuối HTTPS local .

  • export VAULT_ADDR=https://example.com:8200

Như vậy, lệnh vault có thể giao tiếp với daemon. Lưu ý việc xác định tên server thực sự thay vì chỉ là localhost hoặc 127.0.0.1 là cần thiết để xác thực đúng certificate HTTPS.

Xác nhận vault ở trạng thái chưa khởi tạo bằng cách kiểm tra trạng thái của nó.

  • vault status

Server sẽ trả về lỗi 400 cho biết server chưa được khởi tạo.

Output
Error checking seal status: Error making API request. URL: GET https://example.com:8200/v1/sys/seal-status Code: 400. Errors: * server is not yet initialized

Có hai phần thông tin mà Vault sẽ hiển thị tại thời điểm khởi tạo sẽ không có sẵn vào bất kỳ thời điểm nào khác:

  • Mã thông báo root ban đầu . Điều này tương đương với quyền root đối với việc triển khai Vault của bạn, cho phép quản lý tất cả các policy , mount của Vault, v.v.
  • Phím không khóa . Chúng được sử dụng để mở Vault khi daemon khởi động, điều này cho phép daemon Vault giải mã repository bí mật backend .

Cụ thể hơn, quy trình mở khóa của Vault giải mã phần backend bằng cách sử dụng một khóa được hình thành bởi các chia sẻ chính. Nghĩa là, khi chạy Vault, bạn có thể chọn số lượng khóa chưa khóa để tạo và số lượng khóa cần thiết tại thời điểm chưa khóa để mở Vault thành công.

Một giá trị đơn giản, điển hình cho các tham số ẩn sẽ là tạo ba khóa và yêu cầu ít nhất hai trong số các khóa đó tại thời điểm không khóa. Điều này cho phép các chia sẻ quan trọng quan trọng được tách biệt và lưu trữ ở các vị trí riêng biệt đảm bảo rằng việc xâm phạm một phần không đủ để mở khóa Vault.

Nói cách khác, khi nào Vault được khởi động, ít nhất hai khóa không khóa sẽ được yêu cầu để làm cho dịch vụ trở nên khả dụng và sẵn sàng sử dụng. Trong khi được niêm phong, các file lưu trữ các giá trị bí mật thực tế sẽ vẫn được mã hóa và không thể truy cập được.

Khởi tạo Vault với các thông số nói trên:

  • vault init -key-shares=3 -key-threshold=2

Lưu từng mã thông báo chưa được đăng ký và mã thông báo root ban đầu theo cách an toàn. Ví dụ: một tùy chọn sẽ là lưu trữ một khóa không dấu trong trình quản lý password , một khóa khác trên ổ USB và một khóa khác trong file được mã hóa GPG.

Như vậy, bạn có thể mở Vault bằng cách sử dụng các mã thông báo chưa được tạo mới. Bắt đầu bằng cách sử dụng một phím mở.

  • vault operator unseal

Lệnh sẽ yêu cầu một mã thông báo không có mã:

Output
Key (will be hidden):

Sau khi nhập nó, kết quả từ lệnh sẽ cho biết rằng quá trình hủy niêm phong đang diễn ra, nhưng vẫn yêu cầu thêm một khóa mở khóa trước khi Vault sẵn sàng sử dụng.

Output
Sealed: true Key Shares: 3 Key Threshold: 2 Unseal Progress: 1 Unseal Nonce: 3bdc838e-1b74-bc13-1d6f-c772f1694d83

Chạy lại lệnh unseal .

  • vault operator unseal

Và nhập mã thông báo khác với mã bạn đã sử dụng:

Output
Key (will be hidden):

Đầu ra của lệnh cho biết quá trình unseal và đã hoàn tất thành công.

Output
Seal Type shamir Sealed false Total Shares 3 Threshold 2 Version 0.9.5 Cluster Name vault-cluster-5511b3ff Cluster ID 53522534-8ee1-8aec-86db-e13e4a499dd0 HA Enabled false

Vault hiện đã được mở niêm phong và sẵn sàng để sử dụng. Các bước ẩn này là cần thiết khi nào Vault được khởi động hoặc khởi động lại.

Tuy nhiên, hủy niêm phong là một quá trình khác biệt với tương tác thông thường với Vault (chẳng hạn như đọc và ghi giá trị), được xác thực bằng mã thông báo . Trong bước cuối cùng, ta sẽ tạo các policy và mã thông báo truy cập cần thiết để lưu trữ các giá trị bí mật và đọc / ghi vào các đường dẫn cụ thể trong Vault.

Bước 4 - Bí mật đọc và viết

Có một số phần mềm backend bí mật được liệt kê trong tài liệu Vault , nhưng đối với ví dụ này, ta sẽ sử dụng phần backend bí mật chung . Phần backend này lưu trữ các cặp khóa / giá trị đơn giản trong Vault.

Đầu tiên, hãy lưu mã thông báo root đã tạo trước đó vào một biến shell để dễ sử dụng.

  • root_token=your_root_token_here

Để bắt đầu, hãy ghi một giá trị vào một đường dẫn trong Vault.

  • VAULT_TOKEN=$root_token vault write secret/message value=mypassword

Trong lệnh này, tiền tố secret/ cho biết rằng ta đang ghi vào phần backend generic được gắn tại đường dẫn secret và ta đang lưu trữ value khóa tại message đường dẫn với giá trị mypassword . Ta đã sử dụng mã thông báo root , có quyền siêu user , để viết bí mật chung.

Trong trường hợp thực tế, bạn có thể lưu trữ các giá trị như khóa API hoặc password mà các công cụ bên ngoài có thể sử dụng. Mặc dù bạn có thể đọc lại giá trị bí mật bằng cách sử dụng mã thông báo root , nhưng việc tạo mã thông báo ít quyền hơn với quyền chỉ đọc đối với bí mật duy nhất của ta là một minh họa.

Tạo một file có tên là policy.hcl .

  • nano policy.hcl

Điền vào file với policy Vault sau, xác định quyền truy cập chỉ đọc vào đường dẫn bí mật trong folder làm việc của bạn:

policy .hcl
path "secret/message" {      capabilities = ["read"] } 

Lưu file , sau đó ghi policy này vào Vault. Lệnh sau sẽ tạo một policy có tên là message-readonly với các quyền của policy .

  • VAULT_TOKEN=$root_token vault policy write message-readonly policy.hcl

Đến đây bạn có thể tạo mã thông báo với các quyền được chỉ định trong policy .

  • VAULT_TOKEN=$root_token vault token create -policy="message-readonly"

Đầu ra sẽ như thế này:

Output
Key Value --- ----- token your_token_value token_accessor your_token_accessor token_duration 768h0m0s token_renewable true token_policies [default message-readonly]

Lưu giá trị token vào một biến có tên là app_token .

  • app_token=your_token_value

Bạn có thể sử dụng giá trị của app_token để truy cập dữ liệu được lưu trữ trong secret/message đường dẫn (và không có giá trị nào khác trong Vault).

  • VAULT_TOKEN=$app_token vault read secret/message
Output
Key Value --- ----- refresh_interval 768h0m0s value mypassword

Bạn cũng có thể kiểm tra xem mã thông báo không quyền này không thể thực hiện các hoạt động khác, chẳng hạn như liệt kê bí mật trong Vault.

  • VAULT_TOKEN=$app_token vault list secret/
Output
Error reading secret/: Error making API request. URL: GET https://example.com:8200/v1/secret?list=true Code: 403. Errors: * permission denied

Điều này xác minh mã thông báo ứng dụng ít quyền hơn không thể thực hiện bất kỳ hành động phá hoại nào hoặc truy cập các giá trị bí mật khác ngoài những giá trị được nêu rõ ràng trong policy Vault của nó.

Kết luận

Trong bài viết này, bạn đã cài đặt, cấu hình và triển khai Vault trên Ubuntu 16.04. Mặc dù hướng dẫn này chỉ trình bày việc sử dụng mã thông báo không quyền , nhưng tài liệu Vault có thêm thông tin liên quan đến các cách bổ sung để lưu trữ và truy cập bí mật cũng như các phương pháp xác thực thay thế .

Các hướng dẫn này đã trình bày cách triển khai và sử dụng Vault theo cách khá cơ bản, vì vậy hãy đảm bảo đọc tài liệu Vault và áp dụng các thay đổi cấu hình phù hợp cho nhu cầu của bạn. Một số thay đổi sẵn sàng cho production bao gồm:

  • Tạo mã thông báo ít quyền hơn để sử dụng hàng ngày. Các policy cụ thể mà các mã thông báo này nên sử dụng tùy thuộc vào trường hợp sử dụng cụ thể, nhưng app_token trước đó minh họa cách có thể tạo các mã thông báo và policy quyền giới hạn.

  • Nếu Vault đang được triển khai như một phần của dịch vụ group , việc khởi tạo Vault bằng các khóa không dấu cho mỗi thành viên trong group có thể đảm bảo bộ nhớ của Vault chỉ được giải mã khi có nhiều thành viên trong group tham gia vào quá trình này.


Tags:

Các tin liên quan

Cách bảo mật Roundcube trên Ubuntu 16.04
2018-02-24
Cách cài đặt ứng dụng Webmail của riêng bạn với Roundcube trên Ubuntu 16.04
2018-02-24
Cách thiết lập và sử dụng LXD trên Ubuntu 16.04
2018-02-22
Cách cài đặt và bảo mật phpMyAdmin trên Ubuntu 16.04
2018-02-20
Cách thiết lập vsftpd cho Thư mục người dùng trên Ubuntu 16.04
2018-02-20
Cách thiết lập đường ống tích hợp liên tục với GitLab CI trên Ubuntu 16.04
2018-01-26
Cách cài đặt Swift và Vapor trên Ubuntu 16.04
2018-01-25
Cách cài đặt và cấu hình GitLab trên Ubuntu 16.04
2018-01-24
Cách cài đặt và bảo mật Grafana trên Ubuntu 16.04
2017-12-27
Cách cài đặt Prometheus trên Ubuntu 16.04
2017-12-14