Restrict network trong K8s với NetworkPolicy

NetworkPolicy làm gì? Network Policy giúp chúng ta kiểm soát lưu lượng truy cập mạng trong cụm Cluster tại Layer 3,4. Để có thể xác định được gói tin có được chấp nhận hay không ta có thể lọc với các thành phần: Thông qua các label được gắn vào pod Thông qua 1 cụm

NetworkPolicy làm gì?

Network Policy giúp chúng ta kiểm soát lưu lượng truy cập mạng trong cụm Cluster tại Layer 3,4. Để có thể xác định được gói tin có được chấp nhận hay không ta có thể lọc với các thành phần:

Thông qua các label được gắn vào pod
Thông qua 1 cụm các pod chung namespace
Thông qua một dải IP (IP Block) VD: 172.0.1.0/24

Có thể xem NetworkPolicy sẽ định nghĩa ra các “firewall rules” để kiểm tra các gói tin đến và đi trước mỗi Pod.

Định nghĩa NetworkPolicy

NetworkPolicy là một resource trong k8s, chính vì vậy ta sẽ định nghĩa dưới file Yaml.

Network Policy sẽ kiểm soát lưu lượng mạng vào (Ingress) và ra (Egress)

Ingress

Mặc định nếu không khai báo trường Ingress thì sẽ allow toàn bộ traffic vào pod, ví dụ sau sẽ cho phép kết nối đến pod chạy dịch vụ mysql tại port 3306

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-networkpolicy 								(1)
  namespace: default									(2)
spec:
  policyTypes:											(3)
  - Ingress
  ingress:											
  - from:
  	- ipBlock:											(4)
        cidr: 172.17.0.0/16								
      	except:
        - 172.17.1.0/24
    - podSelector:										(5)
        matchLabels:
          role: frontend
    - namespaceSelector:								(6)
        matchLabels:
          kubernetes.io/metadata.name: test-namespace 	
    ports:												(7)
    - port: 3306									
      protocol: TCP
  podSelector:											(8)
    matchLabels:
      app.kubernetes.io/instance: mysql

Giải thích:

(1) Tên của networkPolicy sẽ tạo

(2) Namespace sẽ áp dụng NetworkPolicy này, nếu không khai báo thì mặc định sẽ apply cho namespace mặc định trong kube config.

(3) Liệt kê các loại Policy sẽ định nghĩa. (Ingress, Egress hoặc cả 2)

(4) Liệt kê dải IP sẽ được chấp thuận kết nối (Ví dụ này sẽ allow dải 172.17.0.0 đến 172.17.255.255 trừ dải ở giữa 172.17.1.0 đến 172.17.1.255 )

(5) Cho phép các pod có label là role=fontend được kết nối.

(6) Cho phép các pod từ namespace có label là kubernetes.io/metadata.name=test-namespace được kết nối.

(7) Định nghĩa các destination port được kết nối đến cùng giao thức, ở đây là port của MySQL 3306 với giao thức TCP.

(8) Chọn các pod có label app.kubernetes.io/instance: mysql trong namespace default để áp dụng policy.

Egress:

Tương tự Ingress, Egress sẽ định nghĩa luật cho phép những gói tin nào được phép đi ra ngoài. Egress sẽ lọc gói tin bằng Destination IP và Destination Port.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:						(1)
  - Egress
  egress:
  - to:
    - ipBlock:						(2)
        cidr: 10.0.0.0/24
    ports:							(3)
    - protocol: TCP
      port: 5978
      endPort: 8000

Giải thích:

(1) Định nghĩa kiểu luật sẽ áp dụng (Ingress hoặc Egress)

(2) Xác định IP đích mà được phép giao tiếp

(3) Xác định số hiệu cổng đích được phép giao tiếp (Ở phiên bản K8s 1.22 cho phép ta định nghĩa 1 dải các Port bằng cách thêm trường endPort)

Một số case đặc biệt

Deny toàn bộ Ingress traffic vào toàn bộ pod trong namespace mặc định (Không khai báo namespace thì sẽ áp dụng cho namespace mặc định)

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
spec:
  podSelector: {}
  policyTypes:
  - Ingress

Allow toàn bộ traffic vào toàn bộ pod

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-ingress
spec:
  podSelector: {}
  ingress:
  - {}
  policyTypes:
  - Ingress

Deny toàn bộ Egress traffic

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-egress
spec:
  podSelector: {}
  policyTypes:
  - Egress

Allow toàn bộ Egress traffic

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-egress
spec:
  podSelector: {}
  egress:
  - {}
  policyTypes:
  - Egress

Tham khảo:

https://kubernetes.io/docs/concepts/services-networking/network-policies/

https://sysdig.com/learn-cloud-native/kubernetes-security/network-security/

https://viblo.asia/p/kubernetes-series-bai-14-podsecuritypolicies-networkpolicy-security-cho-cluster-nodes-va-network-djeZ1d1gKWz

Nguồn: viblo.asia

Bài viết liên quan

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dưới đây hoạt động tốt có 1 lỗi không update được postmeta ” meta_key=

Bài 1 – React Native DevOps các khái niệm và các cài đặt căn bản

Hướng dẫn setup jenkins agent để bắt đầu build mobile bằng jenkins cho devloper an t

Chuyển đổi từ monolith sang microservices qua ví dụ

1. Why microservices? Microservices là kiến trúc hệ thống phần mềm hướng dịch vụ,