Cách xây dựng máy chủ Hashicorp Vault bằng cách sử dụng Packer và Terraform trên DigitalOcean

Tác giả đã chọn Quỹ Nguồn mở và Miễn phí để nhận một khoản đóng góp như một phần của chương trình Viết cho DO donate.

Giới thiệu

Vault, của HashiCorp, là một công cụ mã nguồn mở để lưu trữ bí mật và dữ liệu nhạy cảm một cách an toàn trong môi trường đám mây động. Nó cung cấp mã hóa dữ liệu mạnh mẽ, truy cập dựa trên danh tính bằng cách sử dụng các chính sách tùy chỉnh, cho thuê và thu hồi bí mật, cũng như nhật ký kiểm tra chi tiết luôn được ghi lại. Vault cũng có API HTTP, làm cho nó trở thành lựa chọn lý tưởng để lưu trữ thông tin xác thực trong các triển khai hướng dịch vụ phân tán, chẳng hạn như Kubernetes.

Packer và Terraform, cũng được phát triển bởi HashiCorp, có thể được sử dụng cùng nhau để tạo và triển khai hình ảnh của Vault. Trong quy trình làm việc này, các nhà phát triển có thể sử dụng Packer để viết các hình ảnh bất biến cho các nền tảng khác nhau từ một tệp cấu hình duy nhất, tệp này chỉ định những gì hình ảnh phải chứa. Terraform sau đó sẽ triển khai nhiều phiên bản tùy chỉnh của các hình ảnh đã tạo nếu cần.

Trong hướng dẫn này, bạn sẽ sử dụng Packer để tạo một ảnh chụp nhanh bất biến của hệ thống đã cài đặt Vault và sắp xếp việc triển khai bằng Terraform. Cuối cùng, bạn sẽ có một hệ thống tự động để triển khai Vault, cho phép bạn tập trung vào làm việc với chính Vault chứ không phải vào quá trình cài đặt và cung cấp cơ bản.

Điều kiện tiên quyết

  • Trình đóng gói được cài đặt trên máy cục bộ của bạn. Để được hướng dẫn, hãy truy cập tài liệu chính thức.
  • Terraform được cài đặt trên máy cục bộ của bạn. Để đạt được điều này, hãy làm theo Bước 1 của hướng dẫn Cách sử dụng Terraform với DigitalOcean.
  • Mã thông báo truy cập cá nhân (khóa API) có quyền đọc và ghi cho tài khoản DigitalOcean của bạn. Để tìm hiểu cách tạo một mã, hãy truy cập Cách tạo Mã truy cập cá nhân từ tài liệu.
  • Khóa SSH bạn sẽ sử dụng để xác thực với Vault Droplets đã triển khai, có sẵn trên máy cục bộ của bạn và được thêm vào tài khoản DigitalOcean của bạn. Bạn cũng sẽ cần dấu vân tay của nó, bạn có thể sao chép dấu vân tay này từ trang Bảo mật trong tài khoản của mình sau khi bạn thêm nó. Xem tài liệu DigitalOcean để biết hướng dẫn chi tiết hoặc hướng dẫn Cách thiết lập khóa SSH.

Bước 1 – Tạo mẫu trình đóng gói

Trong bước này, bạn sẽ viết một tệp cấu hình Packer, được gọi là bản mẫu, điều đó sẽ hướng dẫn Packer về cách tạo một hình ảnh có chứa Vault được cài đặt sẵn. Bạn sẽ viết cấu hình ở định dạng JSON, một định dạng tệp cấu hình mà con người có thể đọc được.

Đối với mục đích của hướng dẫn này, bạn sẽ lưu trữ tất cả các tệp trong ~/vault-orchestration. Tạo thư mục bằng cách chạy lệnh sau:

  • mkdir ~/vault-orchestration

Điều hướng đến nó:

You'll store config files for Packer and Terraform separately, in different subdirectories. Create them using the following command:

Because you'll first be working with Packer, navigate to its directory:

Using Template Variables

Storing private data and application secrets in a separate variables file is the ideal way of keeping them out of your template. When building the image, Packer will substitute the referenced variables with their values. Hard coding secret values into your template is a security risk, especially if it's going to be shared with team members or put up on public sites, such as GitHub.

You'll store them in the packer thư mục con, trong một tệp được gọi là variables.json. Tạo nó bằng cách sử dụng trình soạn thảo văn bản yêu thích của bạn:

Add the following lines:

~/vault-orchestration/packer/variables.json

{
    "do_token": "your_do_api_key",
    "base_system_image": "ubuntu-20-04-x64",
    "region": "fra1",
    "size": "s-1vcpu-1gb"
}

Tệp biến bao gồm một từ điển JSON, từ điển này ánh xạ các tên biến với giá trị của chúng. Bạn sẽ sử dụng các biến này trong mẫu mà bạn sắp tạo. Nếu muốn, bạn có thể chỉnh sửa hình ảnh cơ sở, vùng và giá trị kích thước giọt theo tài liệu của nhà phát triển.

Nhớ thay your_do_api_key bằng khóa API mà bạn đã tạo như một phần của điều kiện tiên quyết, sau đó lưu và đóng tệp.

Tạo nhà xây dựng và nhà cung cấp

Với tệp biến đã sẵn sàng, bây giờ bạn sẽ tự tạo mẫu Packer.

Bạn sẽ lưu trữ mẫu Packer cho Vault trong một tệp có tên template.json. Tạo nó bằng cách sử dụng trình soạn thảo văn bản của bạn:

Add the following lines:

Xem tiếp:   Lỗi Operation failed with error 0x0000011b là gì?

~/vault-orchestration/packer/template.json

{
     "builders": [{
         "type": "digitalocean",
         "api_token": "{{user `do_token`}}",
         "image": "{{user `base_system_image`}}",
         "region": "{{user `region`}}",
         "size": "{{user `size`}}",
         "ssh_username": "root"
     }],
     "provisioners": [{
         "type": "shell",
         "inline": [
             "sleep 30",
             "sudo apt-get update",
             "sudo apt-get install unzip -y",
             "curl -L https://releases.hashicorp.com/vault/1.8.4/vault_1.8.4_linux_amd64.zip -o vault.zip",
             "unzip vault.zip",
             "sudo chown root:root vault",
             "mv vault /usr/local/bin/",
             "rm -f vault.zip"
         ]
    }]
}

Trong mẫu, bạn xác định các mảng thợ xâyngười dự phòng. Người xây dựng cho Packer biết cách xây dựng hình ảnh hệ thống (tùy theo loại của họ) và nơi lưu trữ nó, trong khi trình cấp phép chứa các tập hợp hành động mà Packer nên thực hiện trên hệ thống trước khi biến nó thành một hình ảnh bất biến, chẳng hạn như cài đặt hoặc cấu hình . Nếu không có bất kỳ trình cung cấp nào, bạn sẽ có một hình ảnh hệ thống cơ sở không được chỉnh sửa. Cả người xây dựng và người cung cấp đều hiển thị các thông số để tùy chỉnh quy trình công việc hơn nữa.

Trước tiên, bạn xác định một trình tạo duy nhất của loại digitalocean, có nghĩa là khi được lệnh xây dựng hình ảnh, Packer sẽ sử dụng các tham số được cung cấp để tạo Giọt tạm thời có kích thước xác định bằng cách sử dụng khóa API được cung cấp, với hình ảnh hệ thống cơ sở được chỉ định và trong vùng được chỉ định. Định dạng để tìm nạp một biến là {{user 'variable_name'}}, trong đó phần được đánh dấu là tên của nó.

Khi Droplet tạm thời được cấp phép, người cung cấp sẽ kết nối với nó bằng SSH với tên người dùng được chỉ định và sẽ thực thi tuần tự tất cả các cấp phép đã xác định trước khi tạo Ảnh chụp nhanh DigitalOcean từ Droplet và xóa nó.

Người cung cấp là loại shell, sẽ thực hiện các lệnh đã cho trên mục tiêu. Các lệnh có thể được chỉ định inline, dưới dạng một mảng chuỗi hoặc được định nghĩa trong các tệp kịch bản riêng biệt nếu việc chèn chúng vào mẫu trở nên khó sử dụng do kích thước. Các lệnh trong mẫu sẽ đợi 30 giây để hệ thống khởi động, sau đó sẽ tải xuống và giải nén Vault 1.8.4. Kiểm tra trang tải xuống Vault chính thức và thay thế liên kết trong các lệnh bằng một phiên bản mới hơn cho Linux, nếu có.

Khi bạn hoàn tất, hãy lưu và đóng tệp.

Để xác minh tính hợp lệ của mẫu của bạn, hãy chạy lệnh sau:

  • packer validate -var-file=variables.json template.json

Packer chấp nhận một đường dẫn đến tệp biến thông qua -var-file tranh luận.

Bạn sẽ thấy kết quả sau:

Output

The configuration is valid.

Nếu bạn gặp lỗi, Packer sẽ chỉ định chính xác nơi nó xảy ra, vì vậy bạn sẽ có thể sửa nó.

Bây giờ, bạn có một mẫu làm việc tạo ra một hình ảnh có cài đặt Vault, với khóa API của bạn và các thông số khác được xác định trong một tệp riêng biệt. Bây giờ bạn đã sẵn sàng để gọi Packer và tạo ảnh chụp nhanh.

Bước 2 - Xây dựng Ảnh chụp nhanh

Trong bước này, bạn sẽ tạo Ảnh chụp nhanh DigitalOcean từ mẫu của mình bằng Trình đóng gói build chỉ huy.

Để tạo ảnh chụp nhanh của bạn, hãy chạy lệnh sau:

  • packer build -var-file=variables.json template.json

Lệnh này sẽ mất một khoảng thời gian để hoàn thành. Bạn sẽ thấy rất nhiều đầu ra, tương tự như sau:

Output

digitalocean: output will be in this color. ==> digitalocean: Creating temporary RSA SSH key for instance... ==> digitalocean: Importing SSH public key... ==> digitalocean: Creating droplet... ==> digitalocean: Waiting for droplet to become active... ==> digitalocean: Using SSH communicator to connect: ... ==> digitalocean: Waiting for SSH to become available... ==> digitalocean: Connected to SSH! ==> digitalocean: Provisioning with shell script: /tmp/packer-shell464972932 digitalocean: Hit:1 http://mirrors.digitalocean.com/ubuntu focal InRelease ... ==> digitalocean: % Total % Received % Xferd Average Speed Time Time Time Current ==> digitalocean: Dload Upload Total Spent Left Speed ==> digitalocean: 100 63.5M 100 63.5M 0 0 110M 0 --:--:-- --:--:-- --:--:-- 110M digitalocean: Archive: vault.zip digitalocean: inflating: vault ==> digitalocean: Gracefully shutting down droplet... ==> digitalocean: Creating snapshot: packer-1635876039 ==> digitalocean: Waiting for snapshot to complete... ==> digitalocean: Destroying droplet... ==> digitalocean: Deleting temporary ssh key... Build 'digitalocean' finished after 5 minutes 6 seconds. ==> Wait completed after 5 minutes 6 seconds ==> Builds finished. The artifacts of successful builds are: --> digitalocean: A snapshot was created: 'packer-1635876039' (ID: 94912983) in regions 'fra1'

Trình đóng gói ghi lại tất cả các bước đã thực hiện trong khi xây dựng mẫu của bạn. Dòng cuối cùng chứa tên của ảnh chụp nhanh (chẳng hạn như packer-1635876039) và ID của nó trong ngoặc đơn, được đánh dấu màu đỏ. Lưu ý ID của ảnh chụp nhanh của bạn, vì bạn sẽ cần nó trong bước tiếp theo.

Nếu quá trình xây dựng không thành công do lỗi API, hãy đợi vài phút rồi thử lại.

Bạn đã tạo Ảnh chụp nhanh DigitalOcean theo mẫu của mình. Ảnh chụp nhanh đã được cài đặt sẵn Vault và bây giờ bạn có thể triển khai Droplets với nó làm hình ảnh hệ thống của chúng. Trong bước tiếp theo, bạn sẽ viết cấu hình Terraform để tự động hóa việc triển khai như vậy.

Xem tiếp:   Cách tự động khởi động lại ứng dụng Node.js của bạn với gật gù

Bước 3 - Viết cấu hình Terraform

Trong bước này, bạn sẽ viết cấu hình Terraform để tự động triển khai Droplet của ảnh chụp nhanh có chứa Vault mà bạn vừa tạo bằng Packer.

Trước khi viết cấu hình Terraform thực tế để triển khai Vault từ ảnh chụp nhanh đã xây dựng trước đó, trước tiên bạn cần định cấu hình nhà cung cấp DigitalOcean cho nó. Điều hướng đến terraform thư mục con bằng cách chạy:

  • cd ~/vault-orchestration/terraform

Sau đó, tạo một tệp có tên do-provider.tf, nơi bạn sẽ lưu trữ nhà cung cấp:

Add the following lines:

~/vault-orchestration/terraform/do-provider.tf

terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

variable "do_token" {
}

variable "ssh_fingerprint" {
}

variable "instance_count" {
  default = "1"
}

variable "do_snapshot_id" {
}

variable "do_name" {
  default = "vault"
}

variable "do_region" {
}

variable "do_size" {
}

provider "digitalocean" {
  token = var.do_token
}

Tệp này khai báo các biến tham số và cung cấp digitalocean nhà cung cấp có khóa API. Sau đó, bạn sẽ sử dụng các biến này trong mẫu Terraform của mình, nhưng trước tiên bạn cần chỉ định giá trị của chúng. Với mục đích đó, Terraform hỗ trợ chỉ định các giá trị biến trong một tệp định nghĩa biến tương tự như Packer. Tên tệp phải kết thúc bằng .tfvars hoặc .tfvars.json. Sau đó, bạn sẽ chuyển tệp đó tới Terraform bằng cách sử dụng -var-file tranh luận.

Lưu và đóng tập tin.

Tạo một tệp định nghĩa biến được gọi là definitions.tfvars sử dụng trình soạn thảo văn bản của bạn:

Add the following lines:

~/vault-orchestration/terraform/definitions.tfvars

do_token         = "your_do_api_key"
ssh_fingerprint  = "your_ssh_key_fingerprint"
do_snapshot_id   = your_do_snapshot_id
do_name          = "vault"
do_region        = "fra1"
do_size          = "s-1vcpu-1gb"
instance_count   = 1

Nhớ thay your_do_api_key, your_ssh_key_fingerprint, và your_do_snapshot_id với khóa API tài khoản của bạn, dấu vân tay của khóa SSH và ID ảnh chụp nhanh mà bạn đã ghi nhận từ bước trước tương ứng. Các do_regiondo_size các tham số phải có cùng giá trị như trong tệp biến Packer. Nếu bạn muốn triển khai nhiều phiên bản cùng một lúc, hãy điều chỉnh instance_count đến giá trị mong muốn của bạn.

Khi hoàn tất, hãy lưu và đóng tệp.

Để biết thêm thông tin về nhà cung cấp DigitalOcean Terraform, hãy truy cập tài liệu chính thức.

Bạn sẽ lưu trữ cấu hình triển khai ảnh chụp nhanh Vault trong một tệp có tên deployment.tf, Bên dưới terraform danh mục. Tạo nó bằng cách sử dụng trình soạn thảo văn bản của bạn:

Add the following lines:

~/vault-orchestration/terraform/deployment.tf

resource "digitalocean_droplet" "vault" {
  count              = var.instance_count
  image              = var.do_snapshot_id
  name               = var.do_name
  region             = var.do_region
  size               = var.do_size
  ssh_keys = [
    var.ssh_fingerprint
  ]
}

output "instance_ip_addr" {
  value = {
    for instance in digitalocean_droplet.vault:
    instance.id => instance.ipv4_address
  }
  description = "The IP addresses of the deployed instances, paired with their IDs."
}

Ở đây bạn xác định một nguồn thuộc loại digitalocean_droplet được đặt tên vault. Sau đó, bạn đặt các thông số của nó theo các giá trị biến và thêm khóa SSH (sử dụng dấu vân tay của nó) từ tài khoản DigitalOcean của bạn vào tài nguyên Droplet. Cuối cùng, bạn output địa chỉ IP của tất cả các phiên bản mới được triển khai vào bảng điều khiển.

Lưu và đóng tập tin.

Trước khi làm bất kỳ điều gì khác với cấu hình triển khai của bạn, bạn sẽ cần khởi tạo thư mục dưới dạng một dự án Terraform:

You'll see the following output:

Output

Initializing the backend... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.15.0... - Installed digitalocean/digitalocean v2.15.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.

Khi khởi tạo một thư mục dưới dạng một dự án, Terraform đọc các tệp cấu hình có sẵn và tải xuống các phần bổ trợ được cho là cần thiết, như đã đăng nhập trong đầu ra.

Bây giờ bạn đã có cấu hình Terraform để triển khai ảnh chụp nhanh Vault của mình đã sẵn sàng. Bây giờ bạn có thể chuyển sang xác thực nó và triển khai nó trên Droplet.

Bước 4 - Triển khai Vault bằng Terraform

Trong phần này, bạn sẽ xác minh cấu hình Terraform của mình bằng cách sử dụng validate chỉ huy. Sau khi xác minh thành công, bạn sẽ apply nó và kết quả là triển khai Droplet.

Xem tiếp:   Cách triển khai nhiều môi trường trong dự án Terraform của bạn mà không cần mã trùng lặp

Chạy lệnh sau để kiểm tra tính hợp lệ của cấu hình của bạn:

You'll see the following output:

Output

Success! The configuration is valid.

Tiếp theo, chạy plan để xem Terraform sẽ cố gắng gì khi cung cấp theo cấu hình của bạn:

  • terraform plan -var-file="definitions.tfvars"

Terraform chấp nhận một tệp định nghĩa có thể thay đổi thông qua -var-file tham số.

Đầu ra sẽ tương tự như:

Output

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.vault[0] will be created + resource "digitalocean_droplet" "vault" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "94912983" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "vault" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + ssh_keys = [ + "...", ] + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. Changes to Outputs: + instance_ip_addr = (known after apply) ...

Mau xanh + vào đầu của resource "digitalocean_droplet" "vault" có nghĩa là Terraform sẽ tạo một Droplet mới có tên là vault, sử dụng các tham số theo sau. Điều này đúng, vì vậy bây giờ bạn có thể thực hiện kế hoạch bằng cách chạy terraform apply:

  • terraform apply -var-file="definitions.tfvars"

Vào yes khi được nhắc. Sau một vài phút, Droplet sẽ hoàn tất cấp phép và bạn sẽ thấy đầu ra tương tự như sau:

Output

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.vault[0] will be created + resource "digitalocean_droplet" "vault" { ... } Plan: 1 to add, 0 to change, 0 to destroy. Changes to Outputs: + instance_ip_addr = (known after apply) ... digitalocean_droplet.vault[0]: Creating... digitalocean_droplet.vault[0]: Still creating... [10s elapsed] ... digitalocean_droplet.vault[0]: Creation complete after 44s [id=271950984] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: instance_ip_addr = { "271950984" = "your_new_server_ip" }

Trong đầu ra, Terraform ghi lại những hành động mà nó đã thực hiện (trong trường hợp này là tạo Droplet) và hiển thị địa chỉ IP công khai của nó ở cuối. Bạn sẽ sử dụng nó để kết nối với Droplet mới của mình trong bước tiếp theo.

Bạn đã tạo một Giọt mới từ ảnh chụp nhanh chứa Vault và hiện đã sẵn sàng để xác minh.

Bước 5 - Xác minh giọt đã triển khai của bạn

Trong bước này, bạn sẽ truy cập Droplet mới của mình bằng SSH và xác minh rằng Vault đã được cài đặt đúng cách.

Nếu đang sử dụng Windows, bạn có thể sử dụng phần mềm như Kitty hoặc Putty để kết nối với Droplet bằng khóa SSH.

Trên máy Linux và macOS, bạn có thể sử dụng ssh lệnh để kết nối:

Bài giải yes khi được nhắc. Khi bạn đã đăng nhập, hãy chạy Vault bằng cách thực hiện:

You'll see its “help” output, which looks like this:

Output

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 agent Start a Vault agent 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 debug Runs the debug command kv Interact with Vault's Key-Value storage lease Interact with leases namespace Interact with namespaces operator Perform operator-specific tasks path-help Retrieve API help for paths plugin Interact with Vault plugins and catalog policy Interact with policies print Prints runtime configurations secrets Interact with secrets engines ssh Initiate an SSH session token Interact with tokens

Bạn có thể thoát kết nối bằng cách nhập exit.

Bây giờ, bạn đã xác minh rằng Droplet mới được triển khai của bạn được tạo từ ảnh chụp nhanh bạn đã thực hiện và Vault đã được cài đặt đúng cách.

Để phá hủy các tài nguyên được cung cấp, hãy chạy lệnh sau, nhập yes khi được nhắc:

  • terraform destroy -var-file="definitions.tfvars"

Phần kết luận

Giờ đây, bạn có một hệ thống tự động để triển khai Hashicorp Vault trên DigitalOcean Droplets bằng Terraform và Packer. Giờ đây, bạn có thể triển khai bao nhiêu máy chủ Vault nếu bạn cần. Để bắt đầu sử dụng Vault, bạn sẽ cần khởi tạo nó và định cấu hình thêm. Để biết hướng dẫn về cách thực hiện điều đó, hãy truy cập tài liệu chính thức.

Để có thêm hướng dẫn sử dụng Terraform, hãy xem trang nội dung Terraform và loạt bài Cách quản lý với Terraform, bao gồm một số chủ đề về Terraform từ việc cài đặt Terraform lần đầu tiên đến quản lý các dự án phức tạp.

.

Check Also

Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu

Giới thiệu Trong hướng dẫn này, bạn sẽ xây dựng một ứng dụng Python bằng …