레이어 7 프로토콜 가시성

레이어 7 프로토콜 가시성 (Layer 7 Protocol Visibility)

기본적으로 Cilium은 L3/L4 패킷 이벤트만 보여줘요. L7 프로토콜 가시성을 얻으려면 L7 Cilium 네트워크 정책을 사용하면 됩니다. 이 문서에서는 L7 가시성을 활성화하는 방법과 보안 고려사항을 다룹니다.

출처: Layer 7 Protocol Visibility

본문

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를 확인하세요.

더 알아보기 (Learn more)