Bảo mật lưu lượng cụm Kubernetes

[ad_1]

Sửa máy tính tại nhà TPHCM

Kubernetes Pods có thể tự do giao tiếp với nhau theo mặc định. Điều này gây rủi ro bảo mật khi cụm của bạn được sử dụng cho nhiều ứng dụng hoặc nhóm. Hành vi sai trái hoặc truy cập độc hại trong một Nhóm có thể hướng lưu lượng truy cập đến các Nhóm khác trong cụm của bạn.

Bài viết này sẽ hướng dẫn bạn cách tránh tình huống này bằng cách thiết lập các chính sách mạng. Các quy tắc này cho phép bạn kiểm soát các luồng lưu lượng Pod-to-Pod ở cấp địa chỉ IP (OSI lớp 3 hoặc 4). Bạn có thể xác định chính xác các nguồn đầu vào và đầu ra được phép cho mỗi Pod.

Tạo chính sách mạng

Chính sách mạng được tạo bằng cách thêm NetworkPolicy các đối tượng vào cụm của bạn. Mỗi chính sách xác định các Nhóm mà nó áp dụng và một hoặc nhiều quy tắc vào và ra. Đây là một bảng kê khai chính sách cơ bản:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: app
spec:
  podSelector:
    matchLabels:
      component: database
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
      - podSelector:
          matchLabels:
            component: api
  egress:
    - to:
        - podSelector:
            matchLabels:
              component: api

Chính sách mạng này áp dụng cho bất kỳ Pod nào có component: database nhãn trong app không gian tên. Nó tuyên bố rằng lưu lượng truy cập vào (đến) và đi ra (đi) chỉ được phép từ và đến Pods với một component: api nhãn mác. Mọi yêu cầu bắt nguồn từ các Nhóm khác, chẳng hạn như component: web-frontendsẽ bị chặn.

Các chính sách mạng có thể được áp dụng giống như bất kỳ đối tượng nào khác bằng cách sử dụng Kubectl. Chúng sẽ có hiệu lực ngay lập tức sau khi được tạo. Bạn có thể thêm chính sách kết nối mạng trước khi khởi động các Nhóm mà nó chọn.

$ kubectl apply -f policy.yaml
networkingpolicy.networking.k8s.io/network-policy created

Chính sách mạng hoạt động như thế nào

Các chính sách mạng được triển khai bởi plugin mạng đang hoạt động của cụm của bạn. Chính sách của bạn sẽ không có hiệu lực nếu plugin của bạn không hỗ trợ tính năng này. Hầu hết các tùy chọn phổ biến như Calico và Cilium đều có hỗ trợ chính sách mạng được bật.

Khi một chính sách mạng áp dụng cho một Pod, plugin sẽ kiểm tra lưu lượng truy cập của nó để kiểm tra xem nó có tuân thủ các yêu cầu của chính sách hay không. Bất kỳ kết nối nào không đáp ứng các tiêu chí sẽ không được phép. Pod đã cố gắng bắt đầu kết nối sẽ nhận thấy máy chủ từ xa không thể truy cập được, vì nó đang cố truy cập vào tài nguyên bị chặn bởi quy tắc đầu ra hoặc do Pod từ xa đã từ chối kết nối đến bằng quy tắc đầu vào.

Chỉ có thể thiết lập kết nối thành công giữa hai Pod khi chính sách mạng được bật cả hai trong số họ cho phép nó. Kết nối có thể bị cấm bởi quy tắc đầu ra của Pod khởi tạo hoặc quy tắc xâm nhập của mục tiêu.

Chính sách mạng luôn phụ gia trong thiên nhiên. Khi nhiều chính sách chọn cùng một Nhóm, danh sách các nguồn vào và ra được phép sẽ là sự kết hợp của tất cả các chính sách.

Chính sách mạng ví dụ

Các chính sách mạng hỗ trợ nhiều tùy chọn khác nhau để tùy chỉnh các Nhóm mà chúng nhắm mục tiêu và các loại kết nối được phép. Các ví dụ sau giới thiệu một số trường hợp sử dụng phổ biến.

Áp dụng chính sách cho mọi Pod trong không gian tên, chỉ cho phép lưu lượng truy cập Xâm nhập từ một khối địa chỉ IP cụ thể

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: app
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - ipBlock:
            cidr: 172.17.0.0/16

trống rỗng podSelector khối có nghĩa là tất cả các Nhóm của không gian tên đều được chính sách nhắm mục tiêu. Các ipBlock quy tắc hạn chế lưu lượng truy cập vào các Nhóm có địa chỉ IP trong phạm vi được chỉ định. Lưu lượng đi ra không bị chặn.

Cho phép lưu lượng truy cập vào từ một khối địa chỉ IP, nhưng loại trừ một số IP cụ thể

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: app
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - ipBlock:
            cidr: 172.17.0.0/16
            except:
              - 172.17.0.1/24
              - 172.17.0.2/24
              - 172.17.0.3/24

ipBlock quy tắc hỗ trợ một except trường để loại trừ lưu lượng truy cập bắt nguồn từ hoặc được chuyển hướng đến các IP cụ thể.

Cho phép lưu lượng truy cập Ingress từ tất cả các Pod trong không gian tên, nhưng chỉ từ một cổng cụ thể

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: app
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector: {}
          ports:
            - protocol: TCP
              port: 443

Các ports trường có sẵn trên các quy tắc vào và ra. Nó xác định các cổng mà lưu lượng có thể được nhận và gửi đến. Bạn có thể tùy chọn chỉ định một loạt các cổng, chẳng hạn như 3000 – 3500, bằng cách đặt endPort trường (3500) ngoài port (3000).

Cho phép lưu lượng truy cập từ các Nhóm có nhãn cụ thể tồn tại trong một không gian tên khác

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: database
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              application: demo-app
          podSelector:
            matchLabels:
              component: database

Chính sách quy định rằng bất kỳ Pod nào được dán nhãn component: database có thể tiếp cận tất cả các Nhóm trong database không gian tên, nếu không gian tên riêng của nó được gắn nhãn demo-app.

Bạn có thể cho phép lưu lượng truy cập từ tất cả các các Nhóm trong một không gian tên bên ngoài bằng cách tạo một quy tắc chỉ bao gồm một namespaceSelector đồng ruộng.

Cho phép rõ ràng tất cả lưu lượng truy cập

Đôi khi bạn có thể muốn cho phép rõ ràng tất cả lưu lượng của một loại cụ thể trong một không gian tên. Bao gồm loại trong chính sách của bạn nhưng cung cấp bộ chọn Pod trống và không có quy tắc:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy
  namespace: app
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - {}
  egress:
    - {}

Tất cả các Nhóm trong không gian tên có thể tự do giao tiếp, như thể không có chính sách nào. Dù sao đi nữa, việc tạo chính sách cho phép bạn cho biết ý định của mình với những người dùng cụm khác. Họ có thể đặt câu hỏi về sự hiện diện của một không gian tên với mạng không hạn chế trong một cụm đã được bảo mật.

Khi nào nên sử dụng Chính sách mạng

Các chính sách mạng phải được tạo cho từng không gian tên và Nhóm trong cụm của bạn. Điều này giúp cô lập các Pod của bạn tốt hơn và giúp bạn kiểm soát luồng giao thông.

Cố gắng làm cho các chính sách của bạn càng chi tiết càng tốt. Mở rộng quyền truy cập quá nhiều, chẳng hạn như cho phép truy cập giữa tất cả các Nhóm trong một không gian tên, khiến bạn gặp rủi ro nếu một trong các vùng chứa của bạn bị xâm phạm. Cân nhắc sử dụng các bộ chọn chính xác để xác định các điều khiển từ xa vào và ra riêng lẻ cho các Nhóm nhạy cảm, chẳng hạn như dịch vụ xác thực, cơ sở dữ liệu và trình xử lý thanh toán.

Kubernetes không kích hoạt bất kỳ chính sách mạng nào theo mặc định, điều này có thể cho phép xảy ra tình trạng giám sát, ngay cả khi bạn dự định tất cả các Nhóm sẽ được bảo vệ bởi một chính sách. Bạn có thể giảm thiểu rủi ro này bằng cách thêm chính sách nhận tất cả vào không gian tên của mình. Chính sách này chọn mọi Pod trong không gian tên và áp dụng quy tắc cấm tất cả giao tiếp mạng:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: app
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress

Các chính sách mạng luôn nằm trong phạm vi không gian tên, vì vậy bạn sẽ cần tạo một danh sách bắt tất cả riêng biệt cho từng chính sách.

Bản tóm tắt

Kubernetes cho phép tất cả các Pod trong cụm của bạn giao tiếp với nhau. Điều này quá dễ dãi đối với các ứng dụng trong thế giới thực chạy trong các cụm đa mục đích. Các chính sách mạng giải quyết vấn đề này bằng cách cung cấp một hệ thống giống như tường lửa để quản lý các nguồn vào và mục tiêu ra mà mỗi Pod chấp nhận.

Bạn nên định cấu hình chính sách mạng trên tất cả các Nhóm của mình. Điều này sẽ bảo vệ cụm của bạn để chỉ các luồng lưu lượng truy cập hợp pháp mới được phép. Tuy nhiên, các chính sách mạng chỉ là một phần của bảo mật Kubernetes: các cơ chế bảo vệ khác như bối cảnh bảo mật RBAC và Pod cũng là những công cụ cần thiết để củng cố môi trường của bạn.

dịch vụ cài win online từ xa

[ad_2]