인가 정책 적용하기

인가 정책 적용하기 (Enforce authorization policies)

애플리케이션을 앰비언트 메시에 추가한 후에는, Layer 4 인가 정책을 사용해 애플리케이션 접근을 보호할 수 있어요.

출처: Istio 문서

본문

이 기능을 사용하면 메시 안의 모든 워크로드에 자동으로 발급되는 클라이언트 워크로드 신원을 기반으로, 서비스에 대한 접근을 제어할 수 있어요.

Layer 4 인가 정책 적용하기 (Enforce Layer 4 authorization policy)

productpage 서비스와 통신할 수 있는 서비스를 제한하는 인가 정책을 만들어 봐요. 정책은 app: productpage 레이블이 있는 파드에 적용되며, cluster.local/ns/default/sa/bookinfo-gateway-istio 서비스 계정에서만 호출을 허용해요. 이는 이전 단계에서 배포한 Bookinfo 게이트웨이가 사용하는 서비스 계정이에요.

$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: productpage-ztunnel
  namespace: default
spec:
  selector:
    matchLabels:
      app: productpage
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - cluster.local/ns/default/sa/bookinfo-gateway-istio
EOF

브라우저에서 Bookinfo 애플리케이션(http://localhost:8080/productpage)을 열면, 이전과 마찬가지로 제품 페이지가 보여요. 하지만 다른 서비스 계정에서 productpage 서비스에 접근하려 하면 오류가 보일 거예요.

클러스터 안의 다른 클라이언트에서 Bookinfo 애플리케이션에 접근해 봐요:

$ kubectl apply -f @samples/curl/curl.yaml@

curl 파드는 다른 서비스 계정을 사용하므로 productpage 서비스에 접근할 수 없어요:

$ kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage"
command terminated with exit code 56

Layer 7 인가 정책 적용하기 (Enforce Layer 7 authorization policy)

Layer 7 정책을 적용하려면 먼저 네임스페이스용 웨이포인트 프록시가 필요해요. 이 프록시는 네임스페이스로 들어오는 모든 Layer 7 트래픽을 처리해요.

$ istioctl waypoint apply --enroll-namespace --wait
✅ waypoint default/waypoint applied
✅ waypoint default/waypoint is ready!
✅ namespace default labeled with "istio.io/use-waypoint: waypoint"

웨이포인트 프록시를 확인하고 Programmed=True 상태인지 확인할 수 있어요:

$ kubectl get gtw waypoint
NAME       CLASS            ADDRESS       PROGRAMMED   AGE
waypoint   istio-waypoint   10.96.58.95   True         42s

L7 인가 정책을 추가하면 curl 서비스가 productpage 서비스에 GET 요청을 보내는 것을 명시적으로 허용하지만, 다른 작업은 수행하지 못하게 해요:

$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: productpage-waypoint
  namespace: default
spec:
  targetRefs:
  - kind: Service
    group: ""
    name: productpage
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - cluster.local/ns/default/sa/curl
    to:
    - operation:
        methods: ["GET"]
EOF

targetRefs 필드는 웨이포인트 프록시의 인가 정책 대상 서비스를 지정하는 데 사용된다는 점을 명심하세요. rules 섹션은 이전과 비슷하지만, 이번에는 허용하는 작업을 지정하는 to 섹션을 추가했어요.

우리의 L4 정책이 ztunnel에게 게이트웨이에서의 연결만 허용하라고 지시했다는 것을 기억하나요? 이제는 웨이포인트에서의 연결도 허용하도록 업데이트해야 해요.

$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: productpage-ztunnel
  namespace: default
spec:
  selector:
    matchLabels:
      app: productpage
  action: ALLOW
  rules:
  - from:
    - source:
        principals:
        - cluster.local/ns/default/sa/bookinfo-gateway-istio
        - cluster.local/ns/default/sa/waypoint
EOF

새 웨이포인트 프록시가 업데이트된 인가 정책을 적용하고 있는지 확인하세요:

$ # This fails with an RBAC error because you're not using a GET operation
$ kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage" -X DELETE
RBAC: access denied
$ # This fails with an RBAC error because the identity of the reviews-v1 service is not allowed
$ kubectl exec deploy/reviews-v1 -- curl -s http://productpage:9080/productpage
RBAC: access denied
$ # This works as you're explicitly allowing GET requests from the curl pod
$ kubectl exec deploy/curl -- curl -s http://productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

다음 단계 (Next steps)

웨이포인트 프록시가 갖춰졌으니 이제 네임스페이스에서 Layer 7 정책을 적용할 수 있어요. 인가 정책 외에도 웨이포인트 프록시를 사용해 서비스 간 트래픽을 분할할 수 있어요. 카나리 배포나 A/B 테스트를 할 때 유용해요.

더 알아보기 (Learn more)