GKE + ASM (Istio)에서 Authorization Policy를 사용하여 소스 IP 주소를 제한해보십시오.

5518 단어 gcp

소개



Istio의 Authorization Policy를 사용하여 소스 IP 주소 제한을 시도하고 싶습니다.

Authorization Policy란?



Authorization Policy는 Istio의 CRD에서 Service mesh 내의 워크로드에 대한 액세스 제어를 가능하게 합니다.

승인 정책은 권한 정책과 거부 정책을 모두 지원합니다. 권한 및 거부 정책이 워크로드에 동시에 사용되는 경우 거부 정책이 먼저 평가됩니다. 평가는 다음 규칙에 의해 결정됩니다.

요청과 일치하는 DENY 정책이 있는 경우 요청을 거부합니다.
워크로드에 ALLOW 정책이 없는 경우 요청을 허용합니다.
ALLOW 정책 중 하나가 요청과 일치하면 요청을 허용합니다.
요청을 거부합니다.

Istio 1.7
htps: // 이치오. 이오 / 아 st / 드 cs / 레후 렌세 / 곤후 g / 세쿠 ty / 아테 조리 자치 온 - 포 cy /

Istio 1.6
htps // 이치오. 이오 / v1. 6 / 드 cs / 타 sks / 세쿠리 ty / 아우 쵸리 자치 온 / 아우 th ~ 인 g 렛 s /

확인한 환경



GKE 버전: 1.17.12-gke.1504
Anthos Service Mesh(ASM, Istio): 1.6.11
Anthos Service Mesh는 Google의 완전 관리형 서비스 메쉬입니다. Istio 호환 API, 컨트롤 플레인은 Google에서 관리합니다.
htps : // c ぉ d. 오, ぇ. 코 m / 안테 s / 세 r

시도한 구성



Authorization Policy를 istio-system namespace에서 활성화하여 Istio Ingress Gateway에 대한 통신에서 소스 IP 주소 제한을 구현합니다.
namespace 단위로 enforce 가능합니다. 또, 세세하게 제어하고 싶은 경우는, Selector에서도 지정 가능합니다.



설정 내용



다음 Policy에서 istio-system에 존재하는 워크로드는 지정된 IP 주소(X.X.X.X)로부터의 통신만 허용됩니다. 즉, X.X.X.X 이외의 IP 주소로부터의 통신은 거부됩니다.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: ingress-policy
  namespace: istio-system
spec:
  action: ALLOW
  rules:
  - from:
    - source:
       ipBlocks: ["X.X.X.X"]

시도해 보겠습니다.



다음을 참고로 ASM을 설치합니다.
htps : // c ぉ d. 오, ぇ. 코 m / 세 r ゔ ぃ セ sh / 두 cs / sc 리 p d e s s t l / g 케이 - s s m 온 보아 rd 1-7

다음을 참고로 샘플 애플리케이션을 설치합니다.
h tps : // c ぉ d. 오, ぇ. 코 m / 세 r

AuthorizationPolicy를 작성합니다.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: ingress-policy
  namespace: istio-system
spec:
  action: ALLOW
  rules:
  - from:
    - source:
       ipBlocks: ["X.X.X.X"]

istio ingress gateway에 연결해 봅니다.
$ k get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)                                                      AGE
istio-ingressgateway   LoadBalancer   10.228.5.0   34.X.X.X   15021:32664/TCP,80:31208/TCP,443:31006/TCP,15443:30608/TCP   10d

연결해보십시오. access denied가 됩니다.
$ curl 34.X.X.X
RBAC: access denied

이 문제는 Istio Ingress Gateway로의 통신이 NAT되고 소스 IP 주소가 설정한 것과 다르기 때문에 발생합니다. docker.io/kennethreitz/httpbin을 배포하여 소스 IP 주소를 확인해 봅니다.
htps: // 이치오. 이오 / v1. 6 / 드 cs / 타 sks / 세쿠리 ty / 아우 쵸리 자치 온 / 아우 th ~ 인 g 렛 s /
apiVersion: v1
kind: Service
metadata:
  name: http-bin
spec:
  selector:
    app: httpbin
    version: v1
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpbin
      version: v1
  template:
    metadata:
      labels:
        app: httpbin
        version: v1
    spec:
      containers:
      - image: docker.io/kennethreitz/httpbin
        imagePullPolicy: IfNotPresent
        name: httpbin
        ports:
        - containerPort: 80

로컬에서 연결 확인하면 IP 주소가 VPC 주소로 NAT됩니다.
$ curl 34.Y.Y.Y/ip
{
  "origin": "10.224.3.1"
}

이를 방지하려면 서비스 설정에 externalTrafficPolicy : Local을 입력하십시오. externalTrafficPolicy를 설정하고 다시 확인해 봅니다.
apiVersion: v1
kind: Service
metadata:
  name: http-bin
spec:
  selector:
    app: httpbin
    version: v1
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  externalTrafficPolicy: Local

Local의 송신 IP 주소를 그대로 사용할 수 있게 되었습니다.
$ curl 34.Y.Y.Y/ip
{
  "origin": "164.70.X.X"
}

Istio Ingress Gateway 서비스에도 externalTrafficPolicy: Local을 설정합니다.
k edit svc istio-ingressgateway -n istio-system
$ curl 34.X.X.X -o /dev/null -w '%{http_code}\n' -s
200

연결할 수 있었습니다.

Authorization Policy에서 지정한 IP 주소와 다른 소스에서 발생하면 오류가 발생합니다.
$  curl 34.X.X.X -o /dev/null -w '%{http_code}\n' -s
403
$  curl 34.X.X.X 
RBAC: access denied

주의점



externalTrafficPolicy: Local로 하면 요청을 받은 Node에 해당 Pod가 없는 경우 요청이 파기됩니다.

ASM 버전 업그레이드 시 Istio Ingress Gateway 설정을 덮어쓸 수 있습니다.

좋은 웹페이지 즐겨찾기