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
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.
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
- Thêm Helm repo:
helm repo add netbirdio <https://netbirdio.github.io/kubernetes-operator>
- 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>
-
Tạo token API từ tài khoản NetBird, lưu vào file
nb-pat.secret
. -
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)
- Tạo file
values.yaml
:
ingress:
enabled: true
router:
enabled: true
netbirdAPI:
keyFromSecret: "netbird-mgmt-api-key"
- Cài đặt operator:
helm install --create-namespace -f values.yaml -n netbird netbird-operator netbirdio/kubernetes-operator
- 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 đó.
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:
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ụ.
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ị:
Ở đâ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”:
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.
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:
Để 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.
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".
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ố.
All Rights Reserved