Layer 4 보안 정책 사용하기
Layer 4 보안 정책 사용하기 (Use Layer 4 security policy)
Istio 보안 정책의 Layer 4(L4) 기능은 ztunnel이 지원하며 앰비언트 모드에서 사용할 수 있어요. 쿠버네티스 네트워크 정책도 클러스터에 그것을 지원하는 CNI 플러그인이 있다면 계속 동작하며, 방어 심층(defense-in-depth)을 제공하는 데 사용할 수 있어요.
출처: Istio 문서
본문
ztunnel과 웨이포인트 프록시의 계층 구조는 주어진 워크로드에 Layer 7(L7) 처리를 활성화할지 여부를 선택할 수 있게 해줘요. L7 정책과 Istio의 트래픽 라우팅 기능을 사용하려면 워크로드를 위해 웨이포인트를 배포할 수 있어요. 이제 정책이 두 곳에서 적용될 수 있기 때문에, 이해해야 할 고려 사항이 있어요.
ztunnel을 사용한 정책 적용 (Policy enforcement using ztunnel)
ztunnel 프록시는 워크로드가 보안 오버레이 모드로 등록되면 인가 정책 적용을 수행할 수 있어요. 적용 지점은 연결 경로에 있는 수신(서버 측) ztunnel 프록시예요.
기본 L4 인가 정책은 다음과 같아요:
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-curl-to-httpbin
spec:
selector:
matchLabels:
app: httpbin
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/ambient-demo/sa/curl
이 정책은 사이드카 모드와 앰비언트 모드에서 모두 사용할 수 있어요.
Istio AuthorizationPolicy API의 L4(TCP) 기능은 앰비언트 모드에서 사이드카 모드와 동일한 기능적 동작을 가져요. 인가 정책이 프로비저닝되지 않았을 때 기본 동작은 ALLOW예요. 정책이 프로비저닝되면, 정책이 대상으로 하는 파드는 명시적으로 허용된 트래픽만 허용해요. 위 예제에서 app: httpbin 레이블이 있는 파드는 신원 프린시펄이 cluster.local/ns/ambient-demo/sa/curl인 소스의 트래픽만 허용해요. 다른 모든 소스의 트래픽은 거부돼요.
정책 대상 지정하기 (Targeting policies)
사이드카 모드와 앰비언트의 L4 정책은 같은 방식으로 대상이 지정돼요. 즉, 정책 오브젝트가 있는 네임스페이스와 spec 안의 선택적인 selector로 범위가 정해져요. 정책이 Istio 루트 네임스페이스(관례적으로 istio-system)에 있다면 모든 네임스페이스를 대상으로 해요. 다른 네임스페이스에 있다면 그 네임스페이스만 대상으로 해요.
앰비언트 모드의 L7 정책은 쿠버네티스 Gateway API로 구성되는 웨이포인트가 적용해요. targetRef 필드를 사용해 *부착(attach)*돼요.
허용되는 정책 속성 (Allowed policy attributes)
인가 정책 규칙은 source(from), operation(to), condition(when) 절을 포함할 수 있어요.
이 속성 목록은 정책이 L4 전용으로 간주되는지 여부를 결정해요:
| 유형 | 속성 | 긍정 매칭 | 부정 매칭 |
|---|---|---|---|
| Source | 피어 신원 | principals |
notPrincipals |
| Source | 네임스페이스 | namespaces |
notNamespaces |
| Source | IP 블록 | ipBlocks |
notIpBlocks |
| Operation | 목적지 포트 | ports |
notPorts |
| Condition | 소스 IP | source.ip |
n/a |
| Condition | 소스 네임스페이스 | source.namespace |
n/a |
| Condition | 소스 신원 | source.principal |
n/a |
| Condition | 원격 IP | destination.ip |
n/a |
| Condition | 원격 포트 | destination.port |
n/a |
Layer 7 조건이 있는 정책 (Policies with Layer 7 conditions)
ztunnel은 L7 정책을 적용할 수 없어요. L7 속성(즉 위 표에 나열되지 않은 것들)과 매칭하는 규칙이 있는 정책이 수신 ztunnel에 의해 적용되도록 대상이 지정되면, 안전하게 실패하여 DENY 정책이 돼요.
이 예제는 HTTP GET 메서드에 대한 검사를 추가해요:
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-curl-to-httpbin
spec:
selector:
matchLabels:
app: httpbin
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/ambient-demo/sa/curl
to:
- operation:
methods: ["GET"]
클라이언트 파드의 신원이 올바르더라도, L7 속성이 있으면 ztunnel이 연결을 거부해요:
command terminated with exit code 56
웨이포인트 도입 시 적용 지점 선택하기 (Choosing enforcement points when waypoints are introduced)
워크로드에 웨이포인트 프록시가 추가되면, 이제 L4 정책을 적용할 수 있는 두 곳이 생겨요. (L7 정책은 웨이포인트 프록시에서만 적용될 수 있어요.)
보안 오버레이만 있을 때 트래픽은 소스 워크로드의 신원으로 목적지 ztunnel에 나타나요.
웨이포인트 프록시는 소스 워크로드의 신원을 가장(impersonate)하지 않아요. 웨이포인트를 트래픽 경로에 도입하면 목적지 ztunnel은 소스 신원이 아니라 웨이포인트의 신원으로 트래픽을 보게 돼요.
이는 웨이포인트를 설치하면 정책을 적용하기에 이상적인 위치가 바뀐다는 뜻이에요. L4 속성에 대해서만 정책을 적용하고 싶더라도, 소스 신원에 의존한다면 정책을 웨이포인트 프록시에 부착해야 해요. 두 번째 정책을 워크로드를 대상으로 해서, "메시 내 트래픽은 내 애플리케이션에 도달하려면 반드시 내 웨이포인트에서 와야 한다" 같은 정책을 그 ztunnel이 적용하게 할 수 있어요.
피어 인증 (Peer authentication)
상호 TLS(mTLS) 모드를 구성하는 Istio의 피어 인증 정책은 ztunnel이 지원해요.
앰비언트 모드의 기본 정책은 PERMISSIVE로, 파드가 mTLS로 암호화된 트래픽(메시 안에서)과 평문 트래픽(메시 밖에서)을 모두 수락할 수 있게 해줘요. STRICT 모드를 활성화하면 파드가 mTLS 암호화 트래픽만 수락하게 돼요.
ztunnel과 HBONE은 mTLS의 사용을 암시하므로, 정책에서 DISABLE 모드를 사용할 수 없어요. 그러한 정책은 무시돼요.