kubectl create -f https://raw.githubusercontent.com/cilium/cilium/refs/heads/main/examples/kubernetes-dns/dns-sw-app.yaml
Shell
복사
•
mediabot pod가 api.github.com에만 접근할 수 있도록 하는 정책
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "fqdn"
spec:
endpointSelector:
matchLabels:
org: empire
class: mediabot
egress:
- toFQDNs:
- matchName: "api.github.com"
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: ANY
rules:
dns:
- matchPattern: "*"
YAML
복사
•
위 규칙은 org: empire, class: mediabot 이라는 레이블을 가지고 있는 pod가 api.github.com 이라는 도메인으로의 요청만 kube-dns pod로 53port로 보낼 수 있도록 하는 규칙
•
rules.dns 설정으로 select된 pod의 모든 DNS쿼리를 검사하도록 설정
kubectl exec mediabot -- curl -I -s https://api.github.com | head -1
kubectl exec mediabot -- curl -I -s --max-time 5 https://support.github.com | head -1
kubectl exec mediabot -- curl -I -s --max-time 5 https://google.com | head -1
Shell
복사
•
api.github.com 제외한 도메인이 전부 실패하는 걸 확인 가능
api.github.com 이 아닌 github.com의 모든 sub 도메인을 허용하고 싶다면 *.github.com 을 사용하고 matchName을 matchPattern으로 바꾸면 된다.
( 단 *.github.com 이기 때문에 그냥 github.com에 대한 요청은 차단 )
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "fqdn"
spec:
endpointSelector:
matchLabels:
org: empire
class: mediabot
egress:
- toFQDNs:
- matchPattern: "*.github.com"
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: ANY
rules:
dns:
- matchPattern: "*"
YAML
복사
kubectl exec mediabot -- curl -I -s https://api.github.com | head -1
kubectl exec mediabot -- curl -I -s --max-time 5 https://support.github.com | head -1
kubectl exec mediabot -- curl -I -s --max-time 5 https://google.com | head -1
kubectl exec mediabot -- curl -I -s --max-time 5 https://github.com | head -1
Shell
복사
•
위 2개는 github.com의 서브 도메인 이기 때문에 성공하고, 아래 2개는 github.com의 서브 도메인이 아니기 때문에 실패 확인 가능
DNS 규칙과 port 규칙을 결합하여 특정 도메인으로 https 연결만 허용
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "fqdn"
spec:
endpointSelector:
matchLabels:
org: empire
class: mediabot
egress:
- toFQDNs:
- matchPattern: "*.github.com"
toPorts:
- ports:
- port: "443"
protocol: TCP
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: ANY
rules:
dns:
- matchPattern: "*"
YAML
복사
kubectl exec mediabot -- curl -I -s https://support.github.com | head -1
kubectl exec mediabot -- curl -I -s --max-time 5 http://support.github.com | head -1
Shell
복사
•
HTTPS 프로토콜만 허용하는 모습 확인 가능