https://cloud.google.com/kubernetes-engine/docs/concepts/security-overview
這裡主要提到兩點
在預設的情況下, pod 與 pod 之間可以透過 pod ip 來溝通,但是以資安考量,這樣是不適合的,hacker 之要進到一個 pod 就可以連到所有的服務。
這裡建議使用 network policies 來進行限制,可以的話最好先限制所有的溝通,然後再來進行允許。
https://kubernetes.io/docs/concepts/services-networking/network-policies/
使用範例如下 :
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
然後以下為拒絕所有流量的寫法。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
這裡的 load balanced 指的是 :
GCP load balancer + k8s service ( type LoadBalancer )
然後當你在使用時,建議 filtering 已經 authorized traffic,不要讓所有的請求都進到裡面,然後這裡有兩種手法 :
在 service 設定 loadBalancerSourceRanges。通過這個配置參數,您可以提供一個 CIDR 範圍列表,指定您允許訪問 Service 的地址。如果不配置 loadBalancerSourceRanges,則所有地址都被允許通過其外部 IP 訪問 Service。
不需要外部訪問 service 的情況使用 internal load balancer.。
https://cloud.google.com/kubernetes-engine/docs/concepts/security-overview
限制每個 pod container 的 process 權限,像在 gke autopilot 就有強制限定了這件事,下面這份文件中就有提到 autopilot 為了資安,有限制那些 :
https://cloud.google.com/kubernetes-engine/docs/concepts/autopilot-security#built-in-security
然後主要的手法如下 :
使用 gke 所提到的 security context,這個可以設定 pod 的 container。
然後如果想要以 cluster 層級來設定,可以使用 PodSecurityAdmission controller。
這個 node security 那事實上有不小心提到,我們可以用 workload identity 來進行這個的限制。
Binary Authorization 是 Google Cloud 上的一個服務,它可以確保我們的 application 的 software supply-chain security 的安全。
我們這裡可以強制執行 Binary Authorization,這可以幫助防止未經過安全審查的 code 進入正式環境。
而且還可以使用 Binary Authorization 持續驗證(CV 可以確保與 Pod 相關聯的 container 與 image 定期受監控,以確保它們符合您內部流程的不斷演變。這意味著容器映像會受到定期的驗證,以確保其符合安全標準。