승인 정책 고급 기능 구성

Cloud Service Mesh 승인 정책은 메시의 워크로드에 대해 메시, 네임스페이스, 워크로드 수준의 액세스 제어를 제공합니다. 이 페이지에서는 테스트 실행 모드거부 로깅을 비롯해 Cloud Service Mesh 승인 정책 고급 기능을 구성하는 방법을 자세히 설명합니다. 이 페이지에 설명된 기능은 사용자가 승인 정책 개요에 설명된 기본 승인 정책 개념에 익숙하다고 가정합니다.

연습 실행 모드

Cloud Service Mesh 승인 정책은 테스트 실행 모드를 지원하므로 승인 정책을 적용하지 않고 실제 프로덕션 트래픽으로 승인 정책을 테스트할 수 있습니다. 테스트 실행 모드를 사용하면 승인 정책을 적용하기 전에 승인 정책의 효과를 더 잘 이해할 수 있습니다. 이렇게 하면 잘못된 승인 정책으로 인해 프로덕션 트래픽이 손상될 위험을 줄일 수 있습니다.

승인 정책에서 "istio.io/dry-run": "true" 주석을 사용하여 테스트 실행 모드로 변경합니다.

테스트 실행 모드 예시

다음 예시 deny-path-headers에서는 dry-run 주석이 "true로 설정된 정책을 보여줍니다. 승인 정책은 headers 경로에 대한 요청을 거부하고 다른 모든 요청을 허용합니다.

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-path-headers
  annotations:
    "istio.io/dry-run": "true"
spec:
  selector:
    matchLabels:
      app: httpbin
  action: DENY
  rules:
  - to:
    - operation:
        paths: ["/headers"]

테스트 실행 모드에서 승인 정책을 적용하면 Cloud Service Mesh는 시행 결과를 Cloud Logging에 로깅하지만 정책을 시행하지는 않습니다. 요청은 항상 허용되며 로그 탐색기를 확인하여 승인 정책이 예상대로 작동하는지 여부를 결정할 수 있습니다.

테스트 실행 로깅 세부정보

테스트 실행 모드에서 승인 정책을 적용하면 로그 탐색기에서 해당 정책의 결과를 볼 수 있습니다.

  1. 로그 탐색기로 이동합니다. 다음 명령어에서 PROJECT_ID를 프로젝트 ID로 바꿉니다.

    https://console.cloud.google.com/logs/query?project=PROJECT_ID
    
  2. 쿼리 빌더 필드에 쿼리를 입력하여 테스트 실행 모드 승인 정책을 찾습니다. 다음 쿼리에서 NAMESPACE를 사용자의 네임스페이스로 바꿉니다.

    logName="projects/PROJECT_ID/logs/server-accesslog-stackdriver" labels.destination_namespace="NAMESPACE" labels.dry_run_result="AuthzDenied"
    
  3. 쿼리 실행을 클릭합니다.

  4. 필요에 따라 시간 범위를 조정하세요.

다음 스크린샷은 deny-path-headers 정책 예시가 적용된 후 로그 탐색기의 트래픽 로그에 있는 테스트 실행 라벨을 보여줍니다.

이미지

테스트 실행 모드는 Istio 테스트 실행 결과 외에도 ALLOWDENY 승인 정책을 지원합니다. Cloud Service Mesh는 테스트 실행 결과를 Cloud Logging에 다음 라벨로 저장합니다.

  • dry_run_result: 테스트 실행 결과는 'AuthzAllowed' 또는 'AuthzDenied'입니다.
  • dry_run_policy_name: 테스트 실행 결정을 내리는 일치하는 승인 정책의 네임스페이스 및 이름입니다.
  • dry_run_policy_rule: 테스트 실행 결정을 내리는 일치하는 승인 정책 규칙의 색인입니다.

다음 표는 테스트 실행 모드에서 승인 정책에 로깅되는 세부정보를 보여줍니다.

테스트 실행 모드에 적용된 승인 정책 일치 결과 테스트 실행 결과 Cloud Logging
DENY 정책만 불일치 허용됨 dry_run_result: "AuthzAllowed"
일치함 거부됨 dry_run_result: "AuthzDenied"
dry_run_result: .
dry_run_policy_rule:
ALLOW 정책만 불일치 거부됨 dry_run_result: "AuthzDenied"
일치함 허용됨 dry_run_result: "AuthzAllowed"
dry_run_result: .
dry_run_policy_rule:
ALLOWDENY 정책 모두 둘 다 불일치 거부됨 dry_run_result: "AuthzDenied"
일치하는 DENY 정책만 거부됨 dry_run_result: "AuthzDenied"
dry_run_result: .
dry_run_policy_rule:
일치하는 ALLOW 정책만 허용됨 dry_run_result: "AuthzAllowed"
dry_run_result: .
dry_run_policy_rule:
두 정책 모두 일치 거부됨 dry_run_result: "AuthzDenied"
dry_run_result: .
dry_run_policy_rule:

테스트 실행 결과에 확신이 서면 다음 접근 방식 중 하나를 사용하여 테스트 실행 모드를 사용 중지할 수 있습니다.

  • 테스트 실행 주석을 완전히 삭제하거나

  • 테스트 실행 주석의 값을 false로 변경하세요.

테스트 실행 모드가 사용 중지된 정책을 적용하면 Cloud Service Mesh에서 정책을 시행합니다.

거부 로깅

승인 정책은 요청이 정책에서 허용되지 않으면 요청을 거부합니다. HTTP(gRPC 포함) 프로토콜의 경우 상태 코드 403과 함께 요청이 거부됩니다. HTTP가 아닌 프로토콜의 경우 연결이 직접 종료됩니다. Cloud Logging 트래픽 로그에는 트래픽이 거부된 이유를 파악하는 데 유용한 추가 정보가 포함됩니다. 예를 들어 로그는 승인 정책에 따라 거부된 요청 수를 보여 주며, 백엔드 애플리케이션에서 거부를 유발한 정책 규칙을 확인하는 데 도움이 됩니다.

다음 예시에서는 dry-run 주석이 "false로 설정되었습니다. 사용자가 DENY 승인 정책을 적용하면 Cloud Service Mesh가 이를 적용합니다.

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-path-headers
  annotations:
    "istio.io/dry-run": "false"
spec:
  selector:
    matchLabels:
      app: httpbin
  action: DENY
  rules:
  - to:
    - operation:
        paths: ["/headers"]

DENY 승인 정책을 적용하면 로그 탐색기에서 해당 정책의 결과를 볼 수 있습니다.

  1. 로그 탐색기로 이동합니다. 다음 명령어에서 PROJECT_ID를 프로젝트 ID로 바꿉니다.

    https://console.cloud.google.com/logs/query?project=PROJECT_ID
    
  2. 쿼리 빌더 필드에 쿼리를 입력하여 DENY 승인 정책을 찾습니다. 다음 쿼리에서 NAMESPACE를 사용자의 네임스페이스로 바꿉니다.

    logName="projects/PROJECT_ID/logs/server-accesslog-stackdriver" labels.destination_namespace="NAMESPACE" labels.response_details="AuthzDenied"
    
  3. 쿼리 실행을 클릭합니다.

  4. 필요에 따라 시간 범위를 조정하세요.

다음 스크린샷은 deny-path-headers 정책 예시가 적용되어 정책이 시행된 후 로그 탐색기의 로그 항목을 보여줍니다. 다음과 같이 라벨을 확인하여 승인 정책이 403을 담당한다는 사실을 알 수 있습니다.

이미지

로그 탐색기 트래픽 로그에는 승인 거부에 대한 다음 라벨이 포함됩니다.

  • response_details: 승인 정책으로 인해 거부가 발생하는 경우 'AuthzDenied'로 설정됩니다.
  • policy_name: 거부를 유발한 승인 DENY 정책의 네임스페이스와 이름이 포함됩니다. 이 값은 <Namespace>.<Name> 형식으로, 예를 들어 foo.deny-path-headersfoo 네임스페이스의 승인 정책 deny-path-headers를 의미합니다.
  • policy_rule: 거부를 유발한 승인 정책 내 규칙의 색인이 포함됩니다. 예를 들어 0은 정책 내 첫 번째 규칙을 의미합니다.

다음 단계

서비스 메시의 모든 승인 정책 목록을 보려면 다음을 실행하세요.

kubectl get authorizationpolicy --all-namespaces

적용된 승인 정책이 있는 경우 kubectl delete를 사용하여 삭제할 수 있습니다.

kubectl delete authorizationpolicy -n NAMESPACE AUTH_POLICY_NAME

트래픽 로그를 가져오는 방법에 대한 상세 설명은 Cloud Logging의 액세스 로그를 참조하세요.