HomeBlog10 nguyên tắc Bảo mật Kubernetes quan trọng nhưng thường bị xem nhẹ

10 nguyên tắc Bảo mật Kubernetes quan trọng nhưng thường bị xem nhẹ

Locker blog reading time13 phút để đọc
Locker Avatar

anhtp

11/07/2024
Copy

Winston is a highly experienced digital marketing professional, specializing in Cybersecurity, IT services, and Software as a Service (SaaS).

Reading Time: 13 minutes

Bảo mật Kubernetes (Kubernetes security) đề cập đến các quy trình và biện pháp được thực hiện để bảo vệ môi trường K8s, bao gồm việc bảo mật cả hạ tầng và các ứng dụng chạy trong container.

Bảo mật Kubernetes là gì?

Do tính chất thay đổi liên tục và phức tạp của Kubernetes, việc bảo mật Kubernetes có thể khá khó khăn. Khi Kubernetes trở thành lựa chọn phổ biến cho cơ sở hạ tầng CNTT, nó cũng trở thành mục tiêu béo bở cho những kẻ tấn công. Bằng cách triển khai chính xác các biện pháp bảo mật Kubernetes, bạn có thể bảo vệ dữ liệu nhạy cảm, duy trì tính ổn định của hệ thống và ngăn chặn truy cập trái phép.

kubernetes security

Các mối nguy và thách thức về bảo mật thường gặp trong Kubernetes

Mạng lưới Pod-to-Pod trong Kubernetes

Mạng lưới pod-to-pod trong Kubernetes cho phép các pod giao tiếp với nhau, là yếu tố then chốt cho hoạt động của ứng dụng. Tuy nhiên, khả năng giao tiếp này có thể tiềm ẩn rủi ro bảo mật đáng lo ngại.

Mặc định trong Kubernetes, tất cả các pod đều được phép giao tiếp tự do với nhau bất kể vị trí của chúng trong cụm. Giao tiếp không hạn chế này có thể dẫn đến tình trạng lỗ hổng trong một pod nhanh chóng lan sang các pod khác.

Quản lý cấu hình

Quản lý cấu hình là một lĩnh vực khác có thể phát sinh các rủi ro bảo mật trong Kubernetes. Cấu hình sai có thể dẫn đến lỗ hổng bảo mật, khiến các nhánh triển khai Kubernetes của bạn dễ bị tấn công.

Những sai lầm phổ biến trong cấu hình bao gồm sử dụng các cài đặt mặc định (thường không ưu tiên bảo mật), cấp quyền root cho container và không giới hạn đặc quyền truy cập API của Kubernetes. Một môi trường Kubernetes được cấu hình sai có thể khiến cụm của bạn dễ bị truy cập trái phép, rò rỉ dữ liệu và thậm chí là các cuộc tấn công denial-of-service (từ chối dịch vụ).

Rủi ro về bảo mật phần mềm

Bất kỳ triển khai Kubernetes nào cũng bao gồm nhiều phần mềm, cả trong bản phân phối Kubernetes, được bao gồm trong các image container và chạy trong các container đang hoạt động. Tất cả các thành phần này đều có thể có những rủi ro về bảo mật.

Một rủi ro chính trong chuỗi cung ứng phần mềm là việc sử dụng các phần mềm không an toàn hoặc lỗi thời. Các phần mềm này có thể chứa các lỗ hổng đã biết mà kẻ tấn công có thể khai thác. Ngoài ra, việc sử dụng phần mềm từ các nguồn không đáng tin cậy có thể dẫn đến việc đưa phần mềm độc hại vào các triển khai Kubernetes của bạn.

Các mối nguy thời gian chạy

Các mối đe dọa có thể ảnh hưởng đến các node, pod và container trong thời gian chạy. Điều này khiến việc phát hiện và phản hồi thời gian chạy trở thành một khía cạnh quan trọng của bảo mật Kubernetes. Điều quan trọng là phải giám sát các triển khai Kubernetes để phát hiện hoạt động đáng ngờ và xử lý nhanh chóng các sự cố bảo mật tiềm ẩn.

Nếu không có khả năng phát hiện và phản hồi thời gian chạy hiệu quả, kẻ tấn công có thể xâm nhập vào cụm Kubernetes, đánh cắp dữ liệu và gây rối các dịch vụ quan trọng mà không bị phát hiện.

Rủi Ro Lỗ Hổng Cơ Sở Hạ Tầng

Các node Kubernetes chạy trên máy tính vật lý hoặc ảo có thể bị kẻ tấn công xâm nhập nếu không được bảo mật đúng cách. Hệ thống mạng và lưu trữ được sử dụng bởi các cụm Kubernetes cũng dễ bị tấn công. Cơ sở hạ tầng Kubernetes bị tấn công có thể dẫn đến gián đoạn trên diện rộng cho các khối lượng công việc của Kubernetes, mất dữ liệu và làm lộ thông tin nhạy cảm.

Bạn cần chú ý bảo mật những gì trong môi trường Kubernetes của mình?

Môi trường Kubernetes của bạn chứa nhiều thành phần quan trọng, vì vậy việc bảo mật toàn diện là điều cần thiết. Dưới đây là một số lĩnh vực chính cần được quan tâm:

Bảo mật Node

Node là các máy vật lý hoặc ảo nơi container được triển khai và chạy. Để đảm bảo bảo mật node, cần tuân theo các phương pháp như cập nhật hệ điều hành và các thành phần Kubernetes với các bản sửa lỗi bảo mật mới nhất. Quét lỗ hổng thường xuyên và kiểm tra thâm nhập có thể giúp xác định và khắc phục mọi điểm yếu trong các node của bạn.

Ngoài ra, việc triển khai các biện pháp kiểm soát truy cập mạnh mẽ và cơ chế xác thực là rất quan trọng. Hạn chế truy cập vào các node và sử dụng các giao thức truyền thông tin an toàn, chẳng hạn như SSH với xác thực khóa công khai, có thể giúp ngăn chặn truy cập trái phép. Giám sát và ghi nhật ký hoạt động của node cũng có thể cung cấp thông tin chi tiết có giá trị về bất kỳ sự cố bảo mật tiềm ẩn nào.

Bảo mật API Kubernetes

API Kubernetes đóng vai trò giao diện chính để quản lý và tương tác với cụm của bạn. Do đó, việc bảo mật API server là rất quan trọng để ngăn chặn truy cập trái phép và các cuộc tấn công tiềm ẩn. Một bước cơ bản là bật các cơ chế xác thực và ủy quyền, chẳng hạn như kiểm soát truy cập dựa trên vai trò (RBAC), để kiểm soát những ai có thể thực hiện các tác vụ trên API server.

Bảo mật giao tiếp với API server cũng rất quan trọng. Bật mã hóa Transport Layer Security (TLS) và sử dụng chứng chỉ để xác thực máy khách-máy chủ có thể bảo vệ dữ liệu nhạy cảm khỏi bị can thiệp và giả mạo. Kiểm tra nhật ký API server thường xuyên và giám sát bất kỳ hoạt động đáng ngờ nào có thể giúp phát hiện và giảm thiểu các vi phạm bảo mật tiềm ẩn.

Bảo mật Mạng Kubernetes

Bảo mật mạng rất quan trọng trong môi trường Kubernetes vì các container giao tiếp với nhau và với các dịch vụ bên ngoài qua mạng. Triển khai các chính sách mạng có thể xác định các quy tắc cho lưu lượng truy cập đến và đi, chỉ giới hạn quyền truy cập vào các dịch vụ cần thiết. Phân đoạn và kiểm soát mạng chặt chẽ có thể giúp ngăn chặn các vi phạm bảo mật tiềm ẩn.

Ngoài ra, việc mã hóa lưu lượng mạng bằng các công nghệ như Mạng riêng ảo (VPN) hoặc Secure Socket Layer (SSL) có thể bảo vệ dữ liệu khi truyền. Việc triển khai tường lửa container trong môi trường Kubernetes cung cấp một lớp bảo vệ khác.

Bảo mật Pod Kubernetes

Pod là đơn vị quản lý nhỏ nhất trong Kubernetes, đại diện cho một hoặc nhiều container chia sẻ cùng tài nguyên và không gian mạng. Bảo mật pod Kubernetes là cần thiết để bảo vệ các ứng dụng và dữ liệu chúng chứa. Điều cần làm là áp dụng thêm nhiều ràng buộc bảo mật, định nghĩa các cài đặt bảo mật mong muốn cho pod. Điều này có thể tạo ra nhiều ràng buộc đối với giao tiếp giữa các container, khả năng và quyền truy cập vào tài nguyên host.

Thường xuyên quét hình ảnh container để tìm lỗ hổng và cập nhật chúng thường xuyên có thể giúp giảm thiểu rủi ro pod bị xâm phạm. Triển khai các giải pháp bảo mật về thời gian chạy container có thể cung cấp một lớp bảo vệ bổ sung chống lại các mối đe dọa nhắm vào pod đang chạy.

Bảo mật Dữ liệu Kubernetes

Bảo mật dữ liệu là một khía cạnh quan trọng của bất kỳ môi trường Kubernetes nào, đặc biệt là khi xử lý dữ liệu nhạy cảm hoặc được quy định. Mã hóa dữ liệu ở trạng thái tĩnh và ở trạng thái truyền dữ liệu đi nơi khác là điều cần thiết để bảo vệ dữ liệu khỏi truy cập trái phép. Triển khai các biện pháp kiểm soát truy cập mạnh mẽ và cơ chế mã hóa, chẳng hạn như Kubernetes Secrets hoặc hệ thống quản lý khóa bên ngoài, có thể giúp bảo vệ dữ liệu nhạy cảm được lưu trữ trong cụm của bạn. Để thực hiện công việc này một cách khoa học và tiện lợi, đảm bảo tính bảo mật tối đa mà không làm gián đoạn quá trình phát triển cũng như cộng tác của đội nhóm trên môi trường Kubernetes, hãy tham khảo các trình quản lý dữ liệu bí mật như Locker Secrets Manager.

Giám sát và kiểm tra truy cập và sửa đổi dữ liệu là rất quan trọng để phát hiện và xử lý kịp thời cho bất kỳ sự cố bảo mật tiềm ẩn nào. Triển khai các giải pháp sao lưu và khôi phục dữ liệu có thể đảm bảo tính sẵn có và toàn vẹn của dữ liệu trong trường hợp có lỗ hổng bảo mật hoặc bị mất dữ liệu.

10 nguyên tắc để bảo mật môi trường Kubernetes

1. Bật kiểm soát dựa trên vai trò trong Kubernetes (RBAC)

RBAC giúp bạn xác định ai có quyền truy cập vào API Kubernetes và quyền hạn của họ. RBAC thường được bật theo mặc định trên Kubernetes 1.6 trở lên (sau này trên một số nhà cung cấp Kubernetes được lưu trữ). Vì Kubernetes kết hợp các bộ điều khiển ủy quyền, nên khi bạn bật RBAC, bạn cũng phải tắt Kiểm soát Truy cập Dựa trên Thuộc tính (ABAC) cũ.

Khi sử dụng RBAC, hãy ưu tiên các quyền hạn dành riêng cho namespace thay vì quyền hạn trên toàn cụm. Ngay cả khi sửa lỗi, cũng không nên cấp quyền quản trị viên cho cả cụm. Cho phép truy cập chỉ khi cần thiết cho tình huống cụ thể của bạn sẽ an toàn hơn.

2. Sử dụng Xác thực của Bên thứ ba cho Máy chủ API

Nên tích hợp Kubernetes với nhà cung cấp xác thực của bên thứ ba (ví dụ: GitHub). Điều này cung cấp các tính năng bảo mật bổ sung như xác thực đa yếu tố và đảm bảo rằng kube-apiserver không thay đổi khi người dùng được thêm hoặc xóa. Nếu có thể, hãy đảm bảo rằng người dùng không được quản lý ở cấp máy chủ API. Bạn cũng có thể sử dụng các trình kết nối OAuth 2.0 như Dex.

3. Bảo vệ etcd bằng TLS, Tường lửa và Mã hóa

Vì etcd lưu trữ trạng thái của cụm và các bí mật của nó, nên đây là tài nguyên nhạy cảm và là mục tiêu hấp dẫn cho kẻ tấn công. Nếu người dùng trái phép truy cập được vào etcd, họ có thể chiếm quyền toàn bộ cụm. Quyền truy cập đọc cũng nguy hiểm vì kẻ gian có thể sử dụng nó để leo thang đặc quyền.

Để cấu hình TLS cho etcd cho giao tiếp máy khách-máy chủ, hãy sử dụng các tùy chọn cấu hình sau:

  • cert-file=: Giấy chứng nhận được sử dụng cho kết nối SSL/TLS với etcd
  • -key-file=: Khóa chứng nhận (không được mã hóa)
  • -client-cert-auth: Chỉ định rằng etcd nên kiểm tra các yêu cầu HTTPS đến để tìm chứng nhận máy khách được ký bởi CA đáng tin cậy
  • -trusted-ca-file=<path>: Cơ quan chứng nhận đáng tin cậy
  • -auto-tls: Sử dụng chứng nhận tự động tạo ra được ký tự ký cho các kết nối máy khách

Để cấu hình TLS cho etcd cho giao tiếp giữa các máy chủ, hãy sử dụng các tùy chọn cấu hình sau:

  • -peer-cert-file=<path>: Giấy chứng nhận được sử dụng cho các kết nối SSL/TLS giữa các đối tác
  • -peer-key-file=<path>: Khóa chứng nhận (không được mã hóa)
  • -peer-client-cert-auth: Khi tùy chọn này được đặt, etcd kiểm tra các chứng nhận máy khách được ký hợp lệ trên tất cả các yêu cầu đối tác đến
  • -peer-trusted-ca-file=<path>: Cơ quan chứng nhận đáng tin cậy
  • -peer-auto-tls: Sử dụng chứng nhận tự động tạo ra được chữ ký cho các kết nối cùng cấp

Ngoài ra, hãy thiết lập tường lửa giữa máy chủ API và cụm etcd. Ví dụ, hãy chạy etcd trên một nút riêng biệt và sử dụng Calico để cấu hình tường lửa trên nút đó.

Bật mã hóa ở trạng thái tĩnh cho các bí mật etcd:

Mã hóa là rất quan trọng để bảo mật etcd và không được bật theo mặc định. Bạn có thể bật nó thông qua quá trình kube-apiserver, bằng cách truyền đối số –encryption-provider-config. Trong cấu hình, bạn cần chọn một nhà cung cấp để thực hiện mã hóa và xác định khóa bí mật của mình.

4. Cô lập các Node Kubernetes

Các node Kubernetes phải nằm trên một mạng riêng biệt và không nên được kết nối trực tiếp với mạng công cộng. Nếu có thể, bạn nên tránh cả các kết nối trực tiếp đến mạng công ty nói chung.

Điều này chỉ khả thi nếu lưu lượng truy cập kiểm soát và dữ liệu Kubernetes được phân tách. Nếu không, cả hai đều đi chung một đường, và quyền truy cập mở vào mặt phẳng dữ liệu đồng nghĩa với quyền truy cập mở vào mặt phẳng điều khiển. Lý tưởng nhất, các node nên được cấu hình với bộ điều khiển đầu vào, được cài đặt để chỉ cho phép các kết nối từ node chính trên cổng được chỉ định thông qua danh sách kiểm soát truy cập mạng (ACL).

Nội dung liên quan: StatefulSet trong Kubernetes

5. Giám sát Lưu lượng Mạng để Giới hạn Giao tiếp

Các ứng dụng container hóa thường sử dụng nhiều mạng cụm. Quan sát lưu lượng mạng đang hoạt động và so sánh nó với lưu lượng được cho phép bởi chính sách mạng Kubernetes, để hiểu cách ứng dụng của bạn tương tác và xác định các giao tiếp truyền thông tin bất thường.

Đồng thời, nếu bạn so sánh lưu lượng đang hoạt động với lưu lượng được cho phép, bạn có thể xác định các chính sách mạng không được sử dụng tích cực bởi khối lượng công việc của cụm. Thông tin này có thể được sử dụng để tăng cường thêm chính sách mạng được phép, loại bỏ các kết nối không cần thiết để giảm bề mặt tấn công (attack surface).

6. Sử dụng Danh sách Trắng Quy trình (Process Whitelisting)

Danh sách trắng quy trình là một cách hiệu quả để xác định các quy trình chạy bất ngờ. Đầu tiên, hãy quan sát ứng dụng trong một khoảng thời gian để xác định tất cả các quy trình chạy trong hành vi bình thường của ứng dụng. Sau đó sử dụng danh sách này làm danh sách trắng cho hành vi ứng dụng trong tương lai.

Rất khó để thực hiện phân tích thời gian chạy ở cấp độ quy trình. Một số giải pháp bảo mật thương mại có sẵn có thể giúp phân tích và xác định các bất thường trong các quy trình chạy trên các cụm.

7. Bật Ghi nhật Kiểm Toán

Bảo đảm rằng ghi nhật kiểm toán được bật và bạn đang theo dõi các yêu cầu gọi API bất thường hoặc không mong muốn, đặc biệt là các lỗi xác thực. Các mục nhật này hiển thị thông báo trạng thái “Bị cấm” (Forbidden). Thất bại trong việc ủy quyền có thể có nghĩa là kẻ tấn công đang cố gắng sử dụng thông tin đăng nhập bị đánh cắp.

Khi truyền tệp tới kube-apiserver, bạn có thể sử dụng cờ –audit-policy-file để bật ghi nhật kiểm toán và cũng xác định chính xác các sự kiện nào nên được ghi nhật. Bạn có thể đặt một trong bốn mức ghi nhận – Không có (None), Chỉ siêu dữ liệu (Metadata only), Yêu cầu (Request) ghi nhận siêu dữ liệu và yêu cầu nhưng không ghi nhận phản hồi (Response), và Yêu cầu-Phản hồi (RequestResponse) ghi nhận cả ba. Để biết ví dụ về tệp chính sách kiểm toán, hãy xem tài liệu.

Nhà cung cấp Kubernetes được quản lý có thể cung cấp quyền truy cập vào dữ liệu này trong bảng điều khiển của họ và thiết lập thông báo cho các lỗi ủy quyền.

8. Giữ Phiên bản Kubernetes Cập nhật

Bạn luôn nên chạy phiên bản Kubernetes mới nhất. Luôn lên kế hoạch nâng cấp phiên bản Kubernetes của bạn lên phiên bản mới nhất có sẵn. Nâng cấp Kubernetes có thể là một quá trình phức tạp; nếu bạn đang sử dụng nhà cung cấp Kubernetes được lưu trữ, hãy kiểm tra xem nhà cung cấp của bạn có xử lý các bản nâng cấp tự động không.

9. Khóa Chặt Kubelet

Kubelet là một trung gian (agent) chạy trên mỗi node, tương tác với thời gian chạy container để khởi chạy các pod và báo cáo số liệu cho các node và pod. Mỗi kubelet trong cụm cho phép truy cập API, mà bạn có thể sử dụng để khởi động và dừng các pod, và thực hiện các hoạt động khác. Nếu một người dùng trái phép truy cập vào API này (trên bất kỳ node nào) và có thể chạy mã trên cụm, họ có thể xâm nhập toàn bộ cụm.

Dưới đây là các tùy chọn cấu hình bạn có thể sử dụng để khóa kubelet và giảm bề mặt tấn công:

  • Vô hiệu hóa truy cập ẩn danh với --anonymous-auth=false để các yêu cầu không được xác thực nhận được phản hồi lỗi. Để thực hiện việc này, máy chủ API cần tự xác định với kubelet. Điều này có thể được đặt bằng cách thêm các cờ -kubelet-clientcertificate--kubelet-client-key.
  • Đặt --authorization mode thành một giá trị khác ngoài AlwaysAllow để xác minh rằng các yêu cầu được ủy quyền. Theo mặc định, công cụ cài đặt kubeadm đặt đây là webhook, đảm bảo rằng kubelet gọi SubjectAccessReview trên máy chủ API để xác thực.
  • Bao gồm NodeRestriction trong cài đặt API server –admission-control để hạn chế quyền kubelet. Điều này chỉ cho phép kubelet sửa đổi các pod được ràng buộc với đối tượng node của riêng nó.
  • Đặt -read-only-port=0 để đóng các cổng chỉ đọc. Điều này ngăn chặn người dùng ẩn danh truy cập thông tin về khối lượng công việc đang chạy. Cổng này không cho phép tin tặc kiểm soát cụm, nhưng có thể được sử dụng trong giai đoạn trinh sát của một cuộc tấn công.
  • Tắt cAdvisor, được sử dụng trong các phiên bản Kubernetes cũ để cung cấp số liệu và đã được thay thế bằng số liệu API của Kubernetes. Đặt cadvisor-port=0 để tránh tiết lộ thông tin về khối lượng công việc đang chạy. Đây là cài đặt mặc định cho Kubernetes v1.11. Nếu bạn cần chạy cAdvisor, hãy sử dụng DaemonSet.

10. Bảo mật Kubernetes với Aqua

Aqua giúp bạn chế ngự sự phức tạp của bảo mật Kubernetes với KSPM (Quản lý Tư thế Bảo mật Kubernetes) và tính năng Bảo vệ Thời gian chạy Kubernetes tiên tiến không cần agent.

Aqua cung cấp các khả năng dành riêng cho Kubernetes để đạt được bảo vệ và tuân thủ theo chính sách, toàn vòng đời cho các ứng dụng K8s:

  • Quản lý Tư thế Bảo mật Kubernetes (KSPM) – cung cấp cái nhìn toàn diện về tình trạng bảo mật của cơ sở hạ tầng Kubernetes của bạn để báo cáo và khắc phục chính xác. Giúp bạn xác định và khắc phục các rủi ro bảo mật.
  • Tự động hóa cấu hình và tuân thủ bảo mật Kubernetes – xác định và khắc phục rủi ro thông qua đánh giá bảo mật và giám sát tuân thủ tự động. Giúp bạn thực thi giám sát và quản trị bảo mật theo chính sách.
  • Kiểm soát triển khai pod dựa trên rủi ro K8s – xác định việc chấp nhận khối lượng công việc trên toàn cụm dựa trên các thuộc tính của pod, node và cụm. Cho phép giảm thiểu rủi ro theo ngữ cảnh với các quy tắc Open Policy Agent (OPA) tốt nhất sẵn có và tùy chỉnh.
  • Bảo vệ toàn bộ cụm với bảo mật thời gian chạy không cần agent – bảo vệ thời gian chạy cho khối lượng công việc Kubernetes mà không cần truy cập hệ điều hành host, giúp triển khai dễ dàng, liền mạch trong môi trường K8s được quản lý hoặc hạn chế.

Trải nghiệm giải pháp quản lý dữ liệu bí mật giúp tăng cường bảo mật tối đa cho môi trường Kubernetes.

Tin mới nhất

Locker blog

Mẹo, tin tức, hướng dẫn và các best practice độc quyền của Locker

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của Locker sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.