- vừa được xem lúc

Cách cung cấp quyền truy cập an toàn đến các Cụm Kubernetes của bạn bằng Overlay Network

0 0 6

Người đăng: Kubernetes

Theo Viblo Asia

Kubernetes vốn đã phức tạp. Việc bảo mật các cụm Kubernetes còn phức tạp hơn. Tìm được sự cân bằng giữa việc cấp quyền truy cập cho lập trình viên và quản trị viên vào các cụm và dịch vụ Kubernetes mà vẫn đảm bảo an toàn là một thử thách lớn. Mạng chồng (Overlay Network) mang đến giải pháp bằng cách cung cấp quyền truy cập an toàn, có kiểm soát đến các cụm của bạn mà không làm tổn hại đến bảo mật.

Trong bài viết này, chúng ta sẽ khám phá những thách thức khi cung cấp quyền truy cập an toàn vào các cụm Kubernetes, cách mà mạng chồng giúp giải quyết vấn đề này, và hướng dẫn từng bước triển khai bằng NetBird, một VPN mã nguồn mở dựa trên WireGuard.

Những thách thức khi cung cấp quyền truy cập từ xa an toàn đến Cụm Kubernetes

Tổ chức của bạn có thể sử dụng nhiều cụm Kubernetes cho các mục đích khác nhau như phát triển, staging, kiểm thử và production. Việc cấu hình ai có thể truy cập cụm nào hoặc dịch vụ nào trong từng cụm là một quá trình phức tạp. Bạn cũng cần phải xử lý các quy tắc tường lửa (firewall) hiện có do đội IT thiết lập. Nói đơn giản là, không dễ chịu chút nào.

Nhưng tại sao việc kiểm soát truy cập chi tiết lại quan trọng?

  • Giảm sự tấn công toàn diện: Cho phép mọi người truy cập toàn bộ cụm và dịch vụ là công thức cho thảm họa. Dù không bị tấn công, bạn vẫn dễ gặp tai nạn – ví dụ như ai đó vô tình thay đổi dịch vụ hoặc cụm không phải phần việc của họ, gây downtime hoặc mất dữ liệu.
  • Đơn giản hóa truy cập cho người không phải Developer: Những người như QA hoặc quản lý sản phẩm đôi khi cần truy cập vào dịch vụ ở môi trường staging hay testing. Việc thiết lập và thu hồi quyền truy cập cho họ thông qua tường lửa thủ công dễ bị bỏ sót và gây rủi ro bảo mật.
  • Bảo mật các Cụm Staging và Testing: Không nên phơi bày các cụm này lên internet. Nhưng lập trình viên vẫn cần truy cập an toàn để làm việc.

Tóm lại, bạn cần một phương pháp để kiểm soát quyền truy cập chi tiết đến cụm và dịch vụ Kubernetes – ai cần gì thì được cấp đúng cái đó. Đồng thời, bạn cần tuân thủ các quy tắc tường lửa hiện có thay vì sửa đổi chúng mỗi khi có thay đổi người truy cập. Tin tốt là overlay network như NetBird giúp việc này trở nên dễ dàng!

Mạng chồng (Overlay Network) là gì?

Mạng chồng là các mạng ảo hoạt động trên hạ tầng mạng vật lý hiện tại của bạn. Ví dụ, NetBird là một overlay network được xây dựng trên nền tảng WireGuard. Nó cho phép truy cập từ xa an toàn và kết nối các phần khác nhau trong hạ tầng (dù là tại chỗ, trên máy cục bộ, đám mây…) mà không cần thay đổi các quy tắc tường lửa.

NetBird sử dụng giao tiếp peer-to-peer qua các tunnel được mã hóa, cho phép các thiết bị trong mạng chồng giao tiếp trực tiếp, cách ly khỏi mạng vật lý bên dưới. image.png

Kết hợp NetBird với Kubernetes

Chúng ta sẽ chạy agent của NetBird trên máy của lập trình viên và một NetBird Kubernetes operator trong cụm. Control plane của NetBird sẽ đảm bảo kết nối P2P an toàn giữa máy và dịch vụ trong cụm.

Bạn có thể cấu hình:

  • Máy nào được truy cập dịch vụ nào
  • Cổng nào được mở cho nhóm máy nào
  • Quốc gia hoặc địa điểm được phép truy cập
  • Hệ điều hành được phép truy cập (ví dụ: chỉ macOS)

Tất cả điều này được kiểm soát bằng Posture Checks. Và vì là overlay network, NetBird không yêu cầu sửa đổi firewall hiện tại.

Bảo mật truy cập từ xa đến Kubernetes Cluster

Yêu cầu:

  • Một cụm Kubernetes (bạn có thể dùng GKE hoặc nhà cung cấp bất kỳ)
  • Một tài khoản NetBird miễn phí

Cài đặt NetBird Kubernetes Operator

  1. Thêm Helm repo:
helm repo add netbirdio <https://netbirdio.github.io/kubernetes-operator>
  1. Cài cert-manager (yêu cầu để operator hoạt động):
kubectl apply -f <https://github.com/cert-manager/cert-manager/releases/download/v1.17.0/cert-manager.yaml>
  1. Tạo token API từ tài khoản NetBird, lưu vào file nb-pat.secret.

  2. Tạo Secret trong namespace netbird:

kubectl create namespace netbird
kubectl -n netbird create secret generic netbird-mgmt-api-key --from-literal=NB_API_KEY=$(cat ./nb-pat.secret)
  1. Tạo file values.yaml:
ingress: enabled: true router: enabled: true netbirdAPI: keyFromSecret: "netbird-mgmt-api-key"
  1. Cài đặt operator:
helm install --create-namespace -f values.yaml -n netbird netbird-operator netbirdio/kubernetes-operator
  1. Kiểm tra pod đã chạy:
kubectl get pods -n netbird

Triển khai một dịch vụ

Tạo file nginx.yaml chứa:

# nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata: labels: app: nginx name: nginx namespace: default
spec: replicas: 1 selector: matchLabels: app: nginx strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: nginx spec: containers: - image: nginx imagePullPolicy: Always name: nginx
---
apiVersion: v1
kind: Service
metadata: annotations: netbird.io/expose: "true" netbird.io/policy: default netbird.io/resource-name: nginx netbird.io/groups: nginx-k8s-gke labels: app: nginx name: nginx namespace: default
spec: ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: ClusterIP

Trong đó:

  • netbird.io/expose: "true"- Điều này cho người vận hành biết rằng dịch vụ này sẽ được NetBird tiếp xúc. Bất kỳ dịch vụ nào không có chú thích này sẽ không được NetBird phát hiện và bạn sẽ không thể truy cập dịch vụ đó trong bảng điều khiển NetBird.
  • netbird.io/policy: default- Điều này chỉ định chính sách mặc định áp dụng cho dịch vụ. Chính sách trong NetBird xác định ai có thể truy cập dịch vụ và trong điều kiện nào.
  • netbird.io/resource-name: nginx- Đây là tên của dịch vụ sẽ được hiển thị trong bảng điều khiển NetBird. Chúng ta sẽ thấy ảnh chụp màn hình hiển thị điều này sau.
  • netbird.io/groups: nginx-k8s-gke- Điều này chỉ định nhóm mà dịch vụ thuộc về trong bảng điều khiển NetBird. Nhóm trong NetBird là một cách để tập hợp các tài nguyên khác nhau lại với nhau dựa trên những yếu tố như nhóm nào chịu trách nhiệm chăm sóc chúng, chúng thuộc về ứng dụng nào, v.v.

Tạo triển khai và dịch vụ Nginx bằng cách chạy:

kubectl apply -f nginx.yaml

Sau khi tạo xong dịch vụ, bây giờ là lúc chuyển sang bảng điều khiển NetBird và cấu hình kết nối an toàn từ máy dev đến dịch vụ này.

Thiết lập kết nối an toàn với dịch vụ được triển khai

Trong nhiều trường hợp, các lập trình viên cần truy cập vào một dịch vụ chạy bên trong cụm Kubernetes (giống như cụm chúng tôi triển khai) để kiểm tra chức năng từ máy cục bộ của họ. Tuy nhiên, việc công khai các dịch vụ nội bộ không phải là lý tưởng do lo ngại về bảo mật. Đây là lúc giải pháp mạng phủ như NetBird phát huy tác dụng, cho phép các nhà phát triển kết nối an toàn với các dịch vụ nội bộ mà không cần mở chúng ra internet hoặc sửa đổi chính loại dịch vụ đó.

Tôi sẽ trình bày cách thiết lập kết nối an toàn đến dịch vụ Nginx từ máy cục bộ của bạn. Tuy nhiên, cần lưu ý rằng NetBird cho phép bạn cung cấp quyền truy cập vào dịch vụ này từ nhiều máy có thể thuộc về các nhà phát triển khác nhau trong tổ chức của bạn.

1. Cài đặt hệ thống

Bước đầu tiên là cài đặt NetBird agent trên các máy cần truy cập. Vì tôi đang sử dụng macOS, tôi đã làm theo hướng dẫn cài đặt cho Mac. Sau khi cài đặt, máy cục bộ của bạn sẽ xuất hiện trong phần "Peers" của bảng điều khiển NetBird. Tôi đã tạo một Nhóm có tên là "Backend Devs" và thêm máy của tôi vào đó. image.png

2. Tạo chính sách truy cập

Tiếp theo, điều hướng đến phần “Mạng” trong bảng điều khiển NetBird: image.png

Tại đây, bạn sẽ thấy một mạng có tên là kubernetes, được tạo tự động bởi nhà điều hành NetBird khi nó được cài đặt trong cụm. Các mạng trong NetBird đơn giản hóa giao tiếp an toàn với các tài nguyên trong các tình huống mà việc cài đặt tác nhân NetBird không khả thi cho từng tài nguyên.

Ví dụ, bằng cách tạo một mạng cho toàn bộ cụm, chúng ta có thể dễ dàng thiết lập giao tiếp an toàn với các dịch vụ riêng lẻ trong cụm. Điều này có nghĩa là bất kỳ thiết bị nào có tác nhân NetBird được cài đặt đều có thể truy cập an toàn vào các dịch vụ đang chạy trong cụm (với điều kiện là nó có các quyền cần thiết) mà không cần cấu hình bổ sung cho từng dịch vụ từ phía chúng ta.

Khi bạn mở mạng kubernetes, bạn sẽ thấy dịch vụ nginx như một tài nguyên. Bạn cũng sẽ thấy rằng nó được tự động gán cho một nhóm có tên là nginx-k8s-gke, đó là những gì chúng tôi đã chỉ định trong chú thích khi tạo dịch vụ. image.png

Bước tiếp theo của chúng ta là tạo chính sách cho phép truy cập vào dịch vụ này từ máy cục bộ của chúng ta.

Bây giờ, khi bạn nhấp vào nút “Thêm chính sách” cho tài nguyên Nginx, cửa sổ bật lên sau sẽ hiển thị: image.png

Ở đây, tôi đã chọn “Backend Devs” làm nhóm nguồn. Đây là nhóm có máy cục bộ của chúng tôi trong đó. Ưu điểm của việc sử dụng Groups là bạn có thể dễ dàng thêm hoặc xóa các máy của các nhà phát triển khác nhau mà không cần sửa đổi chính sách. Đối với đích, tôi đã chọn nhóm nginx-k8s-gke có dịch vụ Nginx đã triển khai. Tôi đã chọn TCP làm giao thức và mở port 80, là cổng mà dịch vụ Nginx lắng nghe.

Điều quan trọng cần lưu ý là chính sách được cấu hình cho giao tiếp một chiều: từ nhóm “Backend Devs” đến dịch vụ Nginx. Điều này đảm bảo rằng dịch vụ không thể khởi tạo kết nối trở lại máy cục bộ, đây là biện pháp bảo mật tốt nhất. NetBird nổi trội trong việc cung cấp quyền kiểm soát truy cập chi tiết, cho phép bạn xác định chính xác những gì cần thiết và không cần gì thêm.

Hoàn tất việc tạo chính sách bằng cách nhấp vào tiếp tục và đặt tên phù hợp cho chính sách.

3. Thêm nameserver

Tại thời điểm này, dịch vụ Nginx có thể truy cập được, nhưng địa chỉ của nó (nginx.default.svc.cluster.local) cần phải được giải quyết từ các máy cục bộ. Để bật tính năng này, chúng tôi sẽ cấu hình trình phân giải DNS trong NetBird. Điều hướng đến phần “Nameservers” trong DNS và nhấp vào “Add Nameserver”: image.png

Vì cụm của chúng ta nằm trong GKE, hãy chọn Google DNS và trong cấu hình cho máy chủ tên, hãy đảm bảo thêm "Backend Devs" vào nhóm phân phối. Để nguyên mọi thứ khác, tiếp tục tạo máy chủ tên. image.png

Một điều cuối cùng bạn cần làm là bật định tuyến ký tự đại diện DNS trong cài đặt NetBird của bạn. Bạn có thể xem trong tài liệu hướng dẫn tại: https://docs.netbird.io/how-to/networks#enable-dns-wildcard-routing

4. Kiểm tra kết nối

Sau khi thực hiện xong, hãy truy cập URL: nginx.default.svc.cluster.local trong trình duyệt của bạn. Bạn sẽ thấy trang chào mừng Nginx mặc định: image.png

Để xác minh tính bảo mật của thiết lập, hãy quay lại phần "Chính sách" trong bảng điều khiển NetBird (trong mục Kiểm soát truy cập) và vô hiệu hóa chính sách bạn vừa tạo. Sau khi thực hiện, bạn sẽ không thể truy cập dịch vụ Nginx từ máy cục bộ của mình nữa. image.png

Bây giờ, bạn thậm chí có thể vô hiệu hóa quyền truy cập vào cụm của mình bằng điểm cuối công khai bên ngoài trong cài đặt GKE và bạn vẫn có thể truy cập dịch vụ từ tất cả các máy đã cài đặt tác nhân NetBird và là một phần của nhóm "Backend Devs". image.png

Cách tiếp cận này là biện pháp bảo mật tốt nhất được khuyến nghị cho các cụm không cần quyền truy cập công khai, chẳng hạn như cụm được sử dụng cho môi trường phát triển, thử nghiệm hoặc dàn dựng.

Kết luận

Tôi nghĩ bây giờ bạn có thể bắt đầu thấy được lợi ích của việc sử dụng mạng phủ như NetBird để truy cập an toàn vào các tài nguyên và dịch vụ trong cụm Kubernetes. Khi doanh nghiệp của bạn phát triển, việc quản lý quyền truy cập vào các cụm và dịch vụ khác nhau cho các nhóm khác nhau có thể trở nên phức tạp.

NetBird đơn giản hóa quy trình này bằng cách cho phép bạn tạo nhóm cho các nhóm và chỉ cấp cho họ quyền truy cập vào những thứ họ cần. Cách tiếp cận này làm giảm đáng kể bề mặt tấn công và giảm thiểu khả năng xảy ra sự cố.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Deploying A Containerized Web Application On Kubernetes

1. Overview. Kubernetes is an open source project (available on kubernetes.io) which can run on many different environments, from laptops to high-availability multi-node clusters; from public clouds to on-premise deployments; from virtual machines to bare metal.

0 0 73

- vừa được xem lúc

Kubernetes - Học cách sử dụng Kubernetes Namespace cơ bản

Namespace trong Kubernetes là gì. Tại sao nên sử dụng namespace.

0 0 128

- vừa được xem lúc

[Kubernetes] Kubectl và các command cơ bản

Mở đầu. Kubectl là công cụ quản trị Kubernetes thông qua giao diện dòng lệnh, cho phép bạn thực thi các câu lệnh trong Kubernetes cluster.

0 0 71

- vừa được xem lúc

Triển khai EFK Stack trên Kubernetes

EFK stack on K8S. Giới thiệu. Một hệ thống có thể chạy nhiều dịch vụ hoặc ứng dụng khác nhau, vì vậy việc. theo dõi hệ thống là vô cùng cần thiết.

0 0 84

- vừa được xem lúc

Thực hành Kubernetes (K8S) bằng cách sử dụng lệnh Command

Bài hướng dẫn hôm nay sẽ hướng dẫn sử dụng K8S bằng cách sử dụng câu lệnh thay vì UI trên web. Có 2 lựa chọn để thực hiện:. . Sử dụng Cloud Shell.

0 0 68

- vừa được xem lúc

Kubernetes best practices - Liveness và Readiness Health checks

Mở đầu. Kubernetes cung cấp cho bạn một framework để chạy các hệ phân tán một cách mạnh mẽ.

0 0 66