Zero Trust trên Linux: Hướng dẫn thực tế triển khai HashiCorp Boundary

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Sự chuyển dịch từ VPN sang Truy cập dựa trên Danh tính

VPN là một công cụ thô sơ. Trước đây, quản lý truy cập từ xa đồng nghĩa với việc cấp thông tin đăng nhập và cầu nguyện không ai làm lộ mật khẩu. Nhưng khi hạ tầng mở rộng lên hơn 500 node, chiến lược “lâu đài và hào nước” (castle and moat) sẽ sụp đổ. Khi người dùng đã vào được VPN, họ thường có thể di chuyển ngang (lateral movement) trong toàn bộ subnet. Tôi đã dành quá nhiều đêm để kiểm tra log tường lửa nhằm tìm ra nhà phát triển nào đã truy cập vào cơ sở dữ liệu production lúc 3 giờ sáng.

Boundary thay đổi hoàn toàn cuộc chơi. Nó tập trung vào việc bạn là ai, chứ không phải bạn đang ở mạng nào. Nó cấp quyền truy cập vào các mục tiêu cụ thể—như một thực thể Postgres duy nhất trên cổng 5432—mà không làm lộ phần còn lại của mạng. Đây chính là cốt lõi của Zero Trust: Xác thực mọi thứ, không tin tưởng bất kỳ ai và chỉ cấp các quyền tối thiểu cần thiết cho công việc hiện tại.

So sánh các chiến lược truy cập: VPN vs. Jump Hosts vs. Boundary

Trước khi bắt tay vào terminal, hãy xem Boundary so với các phương pháp chúng ta đã sử dụng trong thập kỷ qua như thế nào.

  • VPN (Virtual Private Network): Những mạng này cấp quyền truy cập vào toàn bộ phân đoạn mạng. Việc giới hạn người dùng ở một IP cụ thể đòi hỏi các quy tắc tường lửa phức tạp, dễ hỏng và hiếm khi được cập nhật kịp thời.
  • Jump Hosts (Bastions): Cung cấp một điểm truy cập duy nhất. Tuy nhiên, việc quản lý SSH key cho hơn 100 nhà phát triển trên một bastion duy nhất là một cơn ác mộng thủ công. Bạn vẫn phải đối mặt với vấn đề “thông tin đăng nhập tĩnh”, nơi các key tồn tại vĩnh viễn trên máy tính xách tay.
  • HashiCorp Boundary: Hoạt động như một proxy nhận biết danh tính. Người dùng xác thực qua OIDC (như Okta hoặc GitHub). Sau đó, Boundary thiết lập đường truyền trực tiếp đến mục tiêu. Không có SSH key tĩnh hay mật khẩu DB nào chạm vào máy của người dùng.

Các sự đánh đổi

Ưu điểm

  • Kiểm soát chi tiết: Bạn có thể cho phép một dev junior truy cập vào staging DB trong khi chặn họ khỏi production, ngay cả khi cả hai máy chủ nằm trên cùng một VLAN.
  • Nhật ký kiểm tra (Audit Trails): Boundary ghi lại mọi nỗ lực kết nối. Điều này biến việc kiểm tra tuân thủ từ một cơn đau đầu kéo dài cả tuần thành một báo cáo chỉ mất năm phút.
  • Dịch vụ ẩn (Dark Services): Cơ sở dữ liệu của bạn không cần IP công cộng. Chúng thậm chí không cần có thể kết nối được từ mạng văn phòng; chúng chỉ cần giao tiếp với Boundary Worker.

Thách thức

  • Chi phí hạ tầng: Bạn đang thêm nhiều thành phần chuyển động hơn, bao gồm Controller, Worker và một cơ sở dữ liệu chuyên dụng.
  • Thay đổi quy trình làm việc: Nhóm của bạn phải sử dụng CLI hoặc ứng dụng Desktop của Boundary. Đây là một rào cản nhỏ, nhưng cần sự đồng thuận từ đội ngũ.

Kiến trúc

Để có một thiết lập linh hoạt, bạn cần tách biệt ba vai trò sau:

  1. Controller: Bộ não. Quản lý API, xác thực và chính sách.
  2. Worker: Cơ bắp. Proxy dữ liệu thực tế giữa người dùng và tài nguyên mục tiêu.
  3. PostgreSQL: Trạng thái. Lưu trữ cấu hình và siêu dữ liệu phiên của bạn.

Thiết lập backend PostgreSQL yêu cầu một mật khẩu master cực kỳ vững chắc. Tôi thường tạo một chuỗi 32 ký tự bằng trình tạo mật khẩu Toolcraft. Nó chạy hoàn toàn trong trình duyệt, vì vậy thông tin đăng nhập gốc của bạn không bao giờ truyền qua mạng. Điều này giúp giữ các key nhạy cảm khỏi log máy chủ của bên thứ ba.

Triển khai từng bước

1. Cài đặt Binary Boundary

Lấy kho lưu trữ chính thức của HashiCorp cho bản phân phối của bạn. Tôi đang sử dụng Ubuntu 22.04 cho ví dụ này.

wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install boundary

2. Cấu hình Controller

Boundary sử dụng HCL (HashiCorp Configuration Language). Bạn cần xác định cách controller kết nối với cơ sở dữ liệu. Tạo file controller.hcl.

disable_mlock = true

controller {
  name = "boundary-controller-01"
  description = "Controller chính"
  database {
    url = "postgresql://boundary_user:your_secure_password@localhost:5432/boundary"
  }
}

listener "tcp" {
  address = "0.0.0.0:9200"
  purpose = "api"
  tls_disable = true # Sử dụng TLS trong môi trường production!
}

kms "aead" {
  purpose   = "root"
  aead_type = "aes-gcm"
  key       = "s3cret_key_for_dev_only"
  key_id    = "global_root"
}

Nếu bạn đang lập bản đồ dải IP cho nhiều worker, Trình tính toán Subnet này sẽ giúp trực quan hóa các khối CIDR. Đây là cách nhanh chóng để đảm bảo các node worker có đường dẫn mạng chính xác đến các mục tiêu của bạn.

3. Khởi tạo Cơ sở dữ liệu

Khi Postgres đang chạy, hãy khởi tạo schema. Việc này sẽ tạo ra bộ thông tin đăng nhập admin đầu tiên của bạn.

boundary database init -config controller.hcl

Mẹo nhỏ: Hãy sao chép Tên đăng nhập (Login Name) và Mật khẩu từ kết quả đầu ra ngay lập tức. Bạn sẽ không có cơ hội thứ hai để xem lại chúng đâu.

4. Khởi chạy Dịch vụ

Đối với môi trường production, bạn nên sử dụng file unit systemd. Hiện tại, hãy chạy trực tiếp để kiểm tra lỗi:

boundary server -config controller.hcl

5. Triển khai Worker

Worker phải kết nối được với cả controller và các máy chủ mục tiêu. Tạo file worker.hcl:

disable_mlock = true

worker {
  name = "boundary-worker-01"
  public_addr = "1.2.3.4" # IP có thể truy cập của worker
  initial_upstreams = ["controller-ip:9201"]
}

listener "tcp" {
  address = "0.0.0.0:9202"
  purpose = "proxy"
  tls_disable = true
}

Truy cập Just-In-Time (JIT)

Boundary tỏa sáng nhất khi kết hợp với HashiCorp Vault. Thay vì sử dụng mật khẩu cơ sở dữ liệu tĩnh, Boundary yêu cầu các thông tin đăng nhập tạm thời sẽ hết hạn ngay khi phiên làm việc kết thúc. Người dùng thậm chí không bao giờ nhìn thấy mật khẩu; Boundary sẽ tự động chèn nó trực tiếp vào kết nối.

Ví dụ: Kết nối với Postgres

  1. Xác định một Target trong giao diện Boundary trỏ đến IP DB nội bộ của bạn.
  2. Liên kết một Credential Library với target đó.
  3. Chạy lệnh boundary connect postgres -target-id t_12345.

Tôi sử dụng Trình tạo Hash này để xác minh tính toàn vẹn của các binary Boundary. Nó cũng hữu ích để tạo checksum cho các script triển khai. Vì nó chạy ở phía client, tôi không phải lo lắng về việc siêu dữ liệu tệp của mình bị rò rỉ lên web.

Các thực hành tốt nhất từ thực tế

  • Bắt buộc sử dụng TLS: Tôi đã tắt nó ở đây để thao tác nhanh, nhưng lưu lượng production phải được mã hóa. Boundary xử lý dữ liệu danh tính; đừng để nó truyền đi dưới dạng văn bản thuần túy.
  • Ủy quyền quản lý người dùng: Đừng tạo người dùng thủ công. Hãy kết nối Boundary với nhà cung cấp OIDC của bạn để quyền truy cập được thu hồi tự động khi một nhân viên nghỉ việc.
  • Theo dõi độ trễ: Mọi lưu lượng đều đi qua worker. Hãy đặt các worker trong cùng vùng đám mây (cloud region) với các mục tiêu để giữ cho các truy vấn cơ sở dữ liệu luôn nhanh chóng. Hãy nhắm tới độ trễ dưới 10ms nếu có thể.
  • Terraform mọi thứ: Đừng click chuột trên giao diện người dùng. Hãy sử dụng provider Terraform của Boundary để quản lý các target và role dưới dạng mã (as code).

Loại bỏ các key tĩnh và các đường truyền VPN mở sẽ thu hẹp đáng kể bề mặt tấn công của bạn. Việc thiết lập ban đầu có thể tốn công sức, nhưng khả năng hiển thị và kiểm soát mà bạn có được đối với hạ tầng của mình là hoàn toàn xứng đáng.

Share: