Bảo vệ bí mật với HashiCorp Vault trên Kubernetes Magalu Cloud
Quản lý bí mật là một trong những thách thức lớn nhất trong các môi trường phát triển và vận hành hiện đại. Việc để lại mật khẩu trong mã nguồn, chia sẻ token qua chat hoặc cấu hình thủ công các quyền truy cập nhạy cảm có thể mở ra những lỗ hổng bảo mật nghiêm trọng.
Trong bối cảnh này, các công cụ như HashiCorp Vault xuất hiện như một giải pháp mạnh mẽ để lưu trữ, truy cập và kiểm soát bí mật một cách an toàn, có thể kiểm tra và tự động hóa. Trong bài viết này, chúng ta sẽ tìm hiểu cách thức hoạt động của Vault, cách cấu hình nó trong một cluster Kubernetes được cung cấp tại Magalu Cloud, và cách tích hợp nó với các công cụ như ArgoCD.
Giới thiệu về HashiCorp Vault
HashiCorp Vault là một công cụ quản lý bí mật, chứng chỉ, token và các dữ liệu nhạy cảm khác. Nó cho phép kiểm soát quyền truy cập vào các bí mật bằng cách sử dụng kiểm soát dựa trên chính sách và xác thực có thể cắm vào.
Các phụ thuộc cần thiết
- Vault CLI
- Helm
- Kubie
- Kubectl
Truy cập vào Cluster MGC
Để tương tác với một cluster Kubernetes được cung cấp tại Magalu Cloud (MGC), bạn cần sử dụng tệp cấu hình truy cập (kubeconfig). Tệp này chứa thông tin xác thực, endpoint API và các định nghĩa ngữ cảnh cho phép thực hiện các lệnh với các công cụ như kubectl hoặc kubie.
Bước đầu tiên là truy cập vào bảng điều khiển của MGC. Trong bảng điều khiển Kubernetes, hãy xác định cluster mong muốn và sử dụng tùy chọn “Tải về cấu hình” có sẵn trong menu bên.
Với tệp .yaml được lưu lại, bạn có thể cấu hình truy cập vào cluster trong terminal bằng lệnh sau:
bash
kubie ctx -f /đường/dẫn/đến/config.yaml
Lệnh này sẽ xác định ngữ cảnh chính xác, đảm bảo rằng tất cả các thao tác tiếp theo được thực hiện trực tiếp trên cluster đã chọn. Nếu kubie chưa được cài đặt, hãy kiểm tra phần phụ thuộc để thực hiện cài đặt.
Cài đặt thông qua Helm như ứng dụng của ArgoCD
Việc cài đặt Vault trong một cluster Kubernetes có thể được thực hiện bằng cách sử dụng Helm, với việc quản lý qua ArgoCD. Để thực hiện điều này, cần lưu tệp values.yaml có sẵn trong kho Helm Chart chính thức của Vault vào một thư mục đã chứa các ứng dụng khác do ArgoCD quản lý.
Sau khi thực hiện các điều chỉnh cần thiết trong tệp values.yaml, bạn cần tạo một ứng dụng tham chiếu đến tệp này trong Helm chart. Tài liệu của ứng dụng này phải tuân theo cấu trúc tiêu chuẩn của ArgoCD, xác định tên, namespace đích, nguồn kho (từ cả kho Git hạ tầng và Helm chart), và cấu hình đồng bộ hóa tự động. Cú pháp như sau:
yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: vault
namespace: argocd
spec:
destination:
namespace: ns-vault
name: in-cluster
project: default
sources:
- repoURL: git@github.com:Edools/mgc-infra.git
targetRevision: main
ref: values
- repoURL: https://helm.releases.hashicorp.com
chart: vault
targetRevision: 0.29.1
helm:
valueFiles:
- $values/đường/dẫn/đến/values.yaml
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
- ServerSideApply=true
Khi tài liệu đã sẵn sàng, ứng dụng có thể được cài đặt bằng cách thực hiện lệnh:
bash
kubectl apply -f đường/dẫn/đến/application.yaml
Điều quan trọng là tệp application.yaml phải được version hóa trong kho được ArgoCD theo dõi để quá trình đồng bộ hóa diễn ra chính xác.
Truy cập vào giao diện web
Nếu bạn muốn sử dụng giao diện web của Vault để quản lý bí mật hoặc thực hiện cấu hình ban đầu, bạn sẽ cần phải mở dịch vụ ở chế độ cục bộ, vì việc cài đặt qua ArgoCD với Helm không cấu hình một tài nguyên Ingress theo mặc định.
Để thực hiện việc này, hãy thực hiện chuyển tiếp cổng với lệnh sau, thay thế bằng namespace và tên của dịch vụ tương ứng:
bash
kubectl port-forward -n <namespace> svc/<tên-dịch-vụ-của-vault> 8200:8200
Với đường hầm đã được tạo, bạn sẽ có thể truy cập tại http://localhost:8200. Trong lần truy cập đầu tiên, Vault sẽ yêu cầu quá trình khởi tạo, trong đó sẽ tạo ra các Unseal Keys và Root Token. Hãy chắc chắn lưu giữ những thông tin này một cách an toàn, vì chúng sẽ cần thiết để mở khóa và quản lý phiên bản.
Seal, Unseal và Root Token
Vault hoạt động trong trạng thái bảo mật theo mặc định, sử dụng một cơ chế gọi là Seal, ngăn chặn bất kỳ việc đọc hoặc ghi dữ liệu nào cho đến khi dịch vụ được mở khóa.
Seal
Vault sẽ tự động vào chế độ sealed trong các tình huống sau:
- Sau khi khởi động;
- Sau khi khởi động lại dịch vụ;
- Sau khi có lệnh thủ công (vault operator seal);
- Sau khi xảy ra lỗi nghiêm trọng hoặc mất quorum trong chế độ HA.
Unseal
Để mở khóa Vault, bạn cần thực hiện quy trình Unseal. Trong quá trình khởi tạo, Vault tạo ra nhiều Unseal Keys. Một số lượng tối thiểu trong số đó (gọi là quorum) cần được cung cấp để Vault vào chế độ hoạt động. Những khóa này có thể được nhập qua giao diện web hoặc CLI:
-
Web UI: Khi truy cập giao diện web, các khóa unseal sẽ được yêu cầu.
-
CLI: Cung cấp từng khóa được tạo:
bash
vault operator unseal <Unseal-Key-1>
vault operator unseal <Unseal-Key-2>
vault operator unseal <Unseal-Key-3>
Sau khi đạt được quorum cần thiết, Vault sẽ được mở khóa.
Root Token
Cùng với các khóa Unseal, Vault cũng tạo ra một Root Token, cho phép quyền truy cập quản trị hoàn toàn. Token này cần được giữ gìn cẩn thận.
Khi Vault đã được khởi động và mở khóa, chúng ta có thể bắt đầu lưu trữ và truy xuất các bí mật một cách an toàn.
Cách lưu trữ và truy xuất bí mật?
Vault sử dụng các engine lưu trữ để lưu giữ thông tin một cách an toàn. Engine phổ biến nhất là KV (Key/Value), cho phép ghi lại các bí mật đơn giản dưới dạng cặp key:value. Những bí mật này có thể được ghi qua giao diện web hoặc CLI.
-
Web UI: Tại giao diện web của Vault, truy cập engine KV đã cấu hình (thường ở đường dẫn
secret/) và nhấp vào "Create secret". Một màn hình mới sẽ xuất hiện để bạn điền dữ liệu. Bạn có thể nhập các cặp key:value trực tiếp hoặc dán một đối tượng JSON. -
CLI: Việc lưu trữ qua dòng lệnh được thực hiện với lệnh
vault kv put, theo sau là đường dẫn và các cặp dữ liệu. Ví dụ:
bash
vault kv put secret/db password=supersecret
Trong ví dụ này:
vaultlà nhị phân của CLI Vault.kvchỉ ra rằng chúng ta đang sử dụng engine KV.putlà thao tác để ghi dữ liệu.secret/dblà đường dẫn nơi bí mật sẽ được lưu trữ.password=supersecretxác định khóa password với giá trị supersecret.
Lệnh này sẽ tạo ra (hoặc ghi đè) một bí mật tại đường dẫn chỉ định, tự động mã hóa dữ liệu.
Nếu bạn muốn xem một bí mật đã được lưu trữ, điều này cũng có thể được thực hiện qua giao diện web hoặc CLI:
-
Web UI: Chỉ cần điều hướng đến đường dẫn mong muốn trong engine và nhấp vào mục tương ứng để xem các giá trị được lưu trữ.
-
CLI: Đọc bí mật bằng lệnh:
bash
vault kv get secret/db
Lệnh này sẽ trả về dữ liệu của bí mật, bao gồm tất cả các khóa và giá trị tương ứng. Việc truy cập chỉ được phép nếu danh tính hoặc token đang sử dụng có các quyền phù hợp được cấu hình qua chính sách.
Cách kích hoạt một engine bí mật?
Vault có tính mô-đun và cho phép kích hoạt các loại engines bí mật khác nhau tùy theo nhu cầu của môi trường của bạn. Engine KV (Key/Value), được sử dụng trong các ví dụ trước, chỉ là một trong nhiều engine có sẵn. Bạn có thể, ví dụ, kích hoạt các engine cho việc tạo ra các quyền truy cập động cho cơ sở dữ liệu, chứng chỉ TLS qua PKI, hoặc tích hợp với các nhà cung cấp đám mây.
Việc kích hoạt một engine xác định đường dẫn (tiền tố) nơi các bí mật sẽ được lưu trữ hoặc tạo ra, và có thể được thực hiện qua giao diện web hoặc dòng lệnh.
-
Web UI: Trong giao diện web, truy cập phần “Secrets Engines” và nhấp vào “Enable new engine”. Một bảng điều khiển sẽ hiển thị để bạn chọn loại engine, nơi bạn có thể chọn “Key/Value” (nếu chưa được kích hoạt) và xác định đường dẫn lưu trữ bí mật, chẳng hạn như
secret/. -
CLI: Lệnh dưới đây sẽ kích hoạt một engine KV tại đường dẫn
secret/:
bash
vault secrets enable -path=secret kv
Trong lệnh này:
secrets enablekích hoạt một engine mới.-path=secretxác định tiền tố cho phép truy cập vào engine.kvxác định loại engine.
Khi engine đã được kích hoạt và cấu hình, bạn có thể định nghĩa các chính sách truy cập kiểm soát ai có thể xem, viết hoặc quản lý các bí mật đã lưu trữ.
Cách tạo chính sách truy cập?
Kiểm soát quyền truy cập trong Vault được thực hiện thông qua các chính sách xác định, một cách chính xác, những hành động mà một người dùng hoặc ứng dụng có thể thực hiện trên các đường dẫn nhất định. Những chính sách này được viết bằng HCL (HashiCorp Configuration Language) và có thể được áp dụng qua CLI hoặc tạo trực tiếp qua giao diện web.
- Web UI: Trong Web UI, quy trình bắt đầu bằng cách truy cập phần “Policies” trong menu bên. Tại đây, nhấp vào “Create ACL Policy” để mở trình soạn thảo chính sách.
Bạn có thể đặt tên cho chính sách và nhập các quy tắc trong HCL. Ví dụ, một chính sách cho phép đọc một bí mật cụ thể có thể được định nghĩa như sau:
- CLI: Kết quả tương tự có thể đạt được qua CLI. Đầu tiên, tạo một tệp có tên
policy.hclvới nội dung mong muốn:
hcl
path "secret/data/db" {
capabilities = ["read"]
}
Sau đó, áp dụng chính sách vào Vault bằng lệnh:
bash
vault policy write read-db policy.hcl
Điều này sẽ đăng ký chính sách trong Vault với tên read-db. Sau này, chính sách này có thể được liên kết với các token, người dùng, nhóm hoặc thực thể đã được xác thực, đảm bảo rằng chỉ những ai có quyền phù hợp mới có thể truy cập các bí mật.
Tích hợp với ArgoCD (qua AVP)
Để tích hợp Vault với các ứng dụng được quản lý qua ArgoCD, bạn có thể sử dụng ArgoCD Vault Plugin (AVP). Plugin này cho phép các manifests được khai báo với các tham chiếu đến các bí mật được lưu trữ trong Vault, tránh việc thông tin nhạy cảm bị version hóa trong các kho Git.
Việc cấu hình AVP trong ArgoCD yêu cầu cài đặt plugin trong hình ảnh đã sử dụng bởi kho ArgoCD. Sau đó, plugin sẽ chịu trách nhiệm chặn các manifests trước khi được áp dụng, thay thế các biểu thức bằng các giá trị thực được trích xuất từ Vault.
Khi plugin đã được cấu hình, việc sử dụng trong các manifests rất đơn giản. Thay vì khai báo trực tiếp một giá trị nhạy cảm, bạn có thể tham chiếu đến bí mật được lưu trữ trong Vault bằng cú pháp sau:
yaml
apiVersion: v1
kind: Secret
metadata:
name: exemplo-secret
stringData:
PASSWORD: <path:secret/data/db#password>
Trong ví dụ này, giá trị của khóa PASSWORD sẽ được trích xuất từ đường dẫn secret/data/db, tìm kiếm cụ thể trường password.
Tôi đã thay đổi một bí mật, bây giờ làm gì?
Sau bất kỳ thay đổi nào trong các bí mật, bạn cần thực hiện một Hard Refresh của ứng dụng trong ArgoCD để các giá trị được áp dụng chính xác trong cluster. Cách tiếp cận này làm cho quá trình trở nên an toàn và linh hoạt hơn, loại bỏ nhu cầu giữ các bản sao cục bộ của mật khẩu hoặc token nhạy cảm.
Các thực hành tốt nhất
- Không lưu trữ mật khẩu trong mã nguồn: Sử dụng Vault để lưu trữ mật khẩu và token nhạy cảm.
- Thường xuyên kiểm tra và cập nhật chính sách: Đảm bảo rằng các chính sách truy cập luôn được cập nhật theo nhu cầu bảo mật.
- Giám sát và kiểm tra: Sử dụng các tính năng audit log của Vault để theo dõi truy cập vào các bí mật.
Các cạm bẫy phổ biến
- Không lưu trữ Root Token một cách an toàn: Đảm bảo rằng Root Token được lưu trữ ở nơi an toàn và chỉ có những người cần thiết mới có quyền truy cập.
- Bỏ qua quy trình Unseal: Đảm bảo rằng tất cả các bước trong quy trình Unseal được thực hiện chính xác để tránh mất quyền truy cập cần thiết.
Mẹo hiệu suất
- Sử dụng caching: Cân nhắc sử dụng caching cho các truy vấn bí mật thường xuyên để cải thiện hiệu suất.
- Tối ưu hóa cấu hình: Điều chỉnh cấu hình Vault để đáp ứng tốt hơn với nhu cầu của ứng dụng và môi trường.
Giải quyết sự cố
- Không thể mở khóa Vault: Kiểm tra xem bạn đã cung cấp đủ Unseal Keys chưa và đảm bảo không có lỗi trong quá trình nhập.
- Lỗi khi lấy bí mật: Đảm bảo rằng các chính sách truy cập được cấu hình chính xác và người dùng có quyền truy cập thích hợp.
Kết luận
HashiCorp Vault là một công cụ mạnh mẽ cho việc quản lý bí mật trong các môi trường Kubernetes, đặc biệt là khi tích hợp với ArgoCD. Việc bảo vệ thông tin nhạy cảm không chỉ giúp tăng cường bảo mật mà còn giúp tiết kiệm thời gian quản lý và giảm thiểu rủi ro. Hãy bắt đầu tích hợp Vault vào dự án của bạn ngay hôm nay để nâng cao khả năng bảo mật của ứng dụng!
Câu hỏi thường gặp (FAQ)
- Vault có thể được sử dụng với các nền tảng nào?
Vault có thể được sử dụng trên nhiều nền tảng đám mây và on-premises. - Tôi có thể sử dụng Vault mà không cần Kubernetes không?
Có, Vault có thể chạy độc lập trên máy chủ hoặc máy ảo. - Có cần thiết phải cấu hình Ingress cho Vault không?
Nếu bạn muốn truy cập Vault qua internet, cấu hình Ingress là cần thiết.