레이어 7 프로토콜 가시성
레이어 7 프로토콜 가시성 (Layer 7 Protocol Visibility)
기본적으로 Cilium은 L3/L4 패킷 이벤트만 보여줘요. L7 프로토콜 가시성을 얻으려면 L7 Cilium 네트워크 정책을 사용하면 됩니다. 이 문서에서는 L7 가시성을 활성화하는 방법과 보안 고려사항을 다룹니다.
본문
Note
이 기능은 L7 Proxy 지원을 활성화해야 해요.
모니터링 데이터패스 상태는 데이터패스 상태를 들여다볼 수 있게 해주지만, 기본적으로 L3/L4 패킷 이벤트만 가시성을 제공해요. L7 프로토콜 가시성을 원한다면 L7 Cilium 네트워크 정책을 사용할 수 있어요 (레이어 7 정책 참고).
L7 트래픽 가시성을 활성화하려면 L7 규칙을 지정한 CiliumNetworkPolicy를 만들면 돼요. CiliumNetworkPolicy의 L7 규칙과 일치하는 트래픽 흐름은 Cilium에 보이게 되고, 따라서 최종 사용자에게 노출될 수 있어요. L7 네트워크 정책은 가시성만 활성화하는 것이 아니라 파드 안팎으로 흐르는 트래픽을 제한한다는 점을 꼭 기억하세요.
다음 예제는 두 개의 L7 규칙(DNS용 하나, HTTP용 하나)을 지정해서 default 네임스페이스 안의 DNS(TCP/UDP/53)와 HTTP(TCP/80, TCP/8080) 트래픽에 대한 가시성을 활성화해요. 또한 egress 통신을 제한해서 일치하지 않는 모든 것을 드랍합니다. 규칙의 L7 일치 조건은 생략하거나 와일드카드 처리되어, 각 규칙의 L4 섹션과 일치하는 모든 요청을 허용합니다:
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "l7-visibility"
spec:
endpointSelector:
matchLabels:
"k8s:io.kubernetes.pod.namespace": default
egress:
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: ANY
rules:
dns:
- matchPattern: "*"
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": default
toPorts:
- ports:
- port: "80"
protocol: TCP
- port: "8080"
protocol: TCP
rules:
http: [{}]
위 정책을 바탕으로 Cilium은 default 네임스페이스의 파드에서 kube-dns의 53 포트로 가는 DNS 트래픽과 TCP/80, TCP/8080의 HTTP 트래픽을 가로채서 프록시로 리다이렉트해요(프록시 주입 참고). 그래서 cilium monitor나 hubble observe의 출력에 L7 흐름 상세 내용이 표시됩니다.
아래는 hubble observe -f -t l7 -o compact 명령을 실행한 예시예요:
default/testapp-5b9cc645cb-4slbs:45240 (ID:26450) -> kube-system/coredns-787d4945fb-bdmdq:53 (ID:9313) dns-request proxy FORWARDED (DNS Query web.default.svc.cluster.local. A)
default/testapp-5b9cc645cb-4slbs:45240 (ID:26450) <- kube-system/coredns-787d4945fb-bdmdq:53 (ID:9313) dns-response proxy FORWARDED (DNS Answer "10.96.118.37" TTL: 30 (Proxy web.default.svc.cluster.local. A))
default/testapp-5b9cc645cb-4slbs:33044 (ID:26450) -> default/echo-594485b8dc-fp57l:8080 (ID:32531) http-request FORWARDED (HTTP/1.1 GET http://web/)
default/testapp-5b9cc645cb-4slbs:33044 (ID:26450) <- default/echo-594485b8dc-fp57l:8080 (ID:32531) http-response FORWARDED (HTTP/1.1 200 4ms (GET http://web/))
보안 영향 (Security Implications)
L7 트래픽을 모니터링하면 사용자 이름, 비밀번호, 쿼리 파라미터, API 키 등 잠재적으로 민감한 정보를 처리해야 하는 보안 고려사항이 생겨요.
Warning
기본적으로 Hubble은 레이어 7 Hubble 흐름에 포함된 잠재적으로 민감한 정보를 편집(redact)하지 않아요.
보안을 강화하기 위해 Cilium은 --hubble-redact-enabled 옵션을 제공하며, 이를 통해 Hubble이 레이어 7 흐름의 민감한 정보를 처리할 수 있게 해요. 구체적으로 지원되는 L7 프로토콜에 대해 다음과 같은 기능을 제공합니다:
- HTTP: URL 쿼리(GET) 파라미터 편집 (
--hubble-redact-http-urlquery) - HTTP: URL 사용자 정보 편집 (예: basic auth에 사용되는 비밀번호) (
--hubble-redact-http-userinfo) - HTTP 헤더:
--hubble-redact-http-headers-allow목록에 정의된 헤더를 제외한 모든 헤더 편집, 또는--hubble-redact-http-headers-deny목록에 정의된 헤더만 편집
Cilium 구성에 대한 자세한 내용은 Cilium 구성을 참고하세요.
제한 사항 (Limitations)
- DNS 가시성은 egress에서만 사용할 수 있어요.
- SNAT된 IPv6 트래픽(예: pod-to-world)에 대한 L7 정책은 fix가 적용된 커널이 필요해요. 해당 픽스가 포함된 안정 커널 버전은 6.14.1, 6.12.22, 6.6.86, 6.1.133, 5.15.180, 5.10.236입니다. 참고로 GitHub 이슈 37932를 확인하세요.