OPA와 Istio 결합을 위한 5단계

인증(Authentication)과 권限(Authorization)은 雲기술 architecture 및 DevOps engineerings에 의해 해결되어야 하는 보안 퍼즐 중 큰 部分입니다. 이 블로그 내에서는 특정으로 인증 entity가 Istio 서비스 네트워크 안에서 어떤 행동을 할 수 있는지 권한/접근 제어를 달성하는 방법에 대해 보며, 恶意的 행위를 방지하여 인프라스트럭쳐를 보호하는 것입니다.

서비스 네트워크에서 권한 정의는 OPA 정책을 사용하여 行えます. OPA는 DevOps가 Kubernetes 工作中的 권한 정책을 정의하고 적용하는 도구입니다. 이 글에서는 다음과 같이 보여드릴 것입니다:

  • OPA가 무엇인가?
  • Istio 서비스 네트워크와 OPA를 통합하는 이유
  • Istio와 OPA가 요청을 인증하는 방법
  • OPA를 Istio와 통합하는 정확한 단계

OPA는 무엇인가?

OPA(Open Policy Agent의 缩写)는 개방 소스, 일반 목적의 정책 적용 엔진입니다. 이를 사용하면 DevOps가 정책을 코드로 정의하는 high-level 声明型 言語인 Rego를 사용하여 정책을 정의하고 적용할 수 있습니다. OPA는 개발자들이 인증 정책을 응용 코드에 삽입하지 않고도 중앙적으로 정책을 정의하고 적용할 수 있도록 도울 수 있습니다. OPA는 다음과 같이 작동합니다(그림 1을 참조하세요):

  1. 응용/서비스가 요청을 받습니다.
  2. 서비스는 JSON 형식의 인증 요청을 OPA로 보냅니다.
  3. OPA는 정의된 인증 정책에 대해 요청을 확인합니다.
  4. OPA는 결정을 내고 응용/서비스에 JSON 형식의 인증 응답(ALLOW/DENY)를 돌려냅니다.

그림 1: OPA를 사용한 인가 요청 흐름

인가 요청을 보내는 것이 개발자가 작성한 应用程序인 것이 아니어도 문제가 없음을 명시하자: 이것이 Argo CD, Kubernetes Gateway API 자원, Terraform, Prometheus, 또는 다른 것일 수 있음은 명확하다. OPA는 일반적인 목적으로 사용할 수 있으므로 다양하게 응용할 수 있다. (이곳에서 Kubernetes 集群에 있는 응용 프로그램을 언급하고 그rammar를 그리는 것은 편의와 이해를 위해 이뤄진 것입니다.)

Istio와 OPA를 통합하는 原因有哪些?

Istio는 강健壮한 인가 메カ니즘이 있지만, OPA와 같은 정책 적용 엔진과 함께 Istio 서비스 멀스를 통합하면 자신의 이점이 있다는 것을 기억하자:

  • 정책을 정의하고 적용하는 중앙ized 관리 시스템: OPA를 사용하면 DevOps가 전체 스택에 대한 인가 정책을 중앙ized으로 관리하는 것이 더 간편해진다. 이것은 멀스 작업 경량, 멀스 없는 스택, 또는 인가 점검(例如 금요일에 배치하지 않는 정책)를 포함한다.
  • 정책을 정의할 때 더 유연하고 세세하게 customize할 수 있다: 아래 таблица(그림 2)를 보면 Istio 인가는 많은 것을 할 수 있고, 다양한 데이터 소스의 다양한 필드에 따라 요청을 일치시키는 것이 明显的하다. 그러나 Istio AuthorizationPolicy CRD는 HTTP 요청 몸이나 필드에서 의미 적은 정보를 조정할 수 있는 한 OPA를 사용할 수 있다. Istio와 다르게 OPA는 정책 평가에 사용할 수 있는 모든 데이터를 사용할 수 있다.
  • Authorization Configuration Simplified: DevOps가 Istio에서 複雑한 인가 ルール을 구성하는 것이 Tedious하다. OPA는 Rego를 사용하여 구성할 수 있으며, Rego는 프로그래밍 언어와 가까운 것이다. Rego를 사용하면 기본적이나 복잡한 정책 규칙을 구성하는 것이 더 간단해진다.

그림 2: Istio와 OPA 인가의 표면적 比较 (source)

Istio와 OPA가 요청을 인가하는 방법

DevOps는 OPA를 completely separate 서비스로 배포하거나, Envoy 프록시와 응용 컨테이너가 있는 팩 旁边에 사이드 카가 컨테이너로 배포할 수 있습니다. 사이드 카가 컨테이너 기법은 latency를 줄이는 데에 더 좋습니다.

OPA 사이드 카 컨테이너는 이미 Istio의 Envoy 프록시 사이드 카 컨테이너와 비슷하게 응용 프로그램 팩에 주입되어야 합니다. 우리는 주입되는 OPA 컨테이너에 ConfigMaps를 마운트 시키는 ConfigMaps에 인가 규칙이 포함되어 있는 것처럼 ust set up the injected OPA containers; 그러면 이름 스페이스内의 모든 OPA 사이드 카 컨테이너가 ConfigMap에 정의된 同様의 구성과 AuthZ 규칙을 마운트하게 됩니다.

OPA 사이드 카가 주입되면, Envoy 프록시는 서비스가 요청을 받으면 인가 요청을 OPA로 보냅니다. OPA로 인가 결정을 하도록 만듭니다:

그림 3: Istio-OPA 인가 workflow

DevOps 사람들이 같은 이름 스페이스内의 모든 주입된 OPA 컨테이너가 같은 구성을 따를 것이 아니라고 생각하고 다른 규칙을 적용하고자 하면, 다음 중 하나를 하는 것이 좋습니다:

  • 현재 주입 정책이 특정 ConfigMap을 사용하도록 하드 코딩 제거
  • Mutating webhook을 구성하고 팩 수준에서 sidecar 주입을 사용하지 않도록 사용하기를 비활성화하십시오.
  • 원격 HTTP 서버에서 정책 묶음을 제공합니다
  • 애플리케이션과 사이드카를 다른 네임스페이스에 배치하고 다른 ConfigMap을 사용합니다

OPA와 Istio를 통합하는 단계: 데모

이 여기서의 아이디어는 OPA를 Envoy 프록시 사이드카 대신 외부 인증자로 만드는 것입니다 — 액세스 제어 결정을 합니다.

데모에 Istio 문서의 经典的Bookinfo 애플리케이션을 사용하겠습니다. Istio에서 액세스 제어를 위해 OPA를 구성하고 bookinfo/productpage에 요청을 보내어 강제 여부를 확인합니다:

피그어 4: Istio-OPA 통합 자습서 도표

/productpage는 UI입니다. 다른 서비스들, 예를 들어 검토 및 평점 서비스(도표)로 내부 호출을 합니다. bookinfo 네임스페이스의 모든 Pod에 OPA를 주입하겠습니다; 모든 OPA 컨테이너는 동일한 ConfigMap을 마운트하고 그러므로 같은 권한 정책을 가지게 됩니다. Bookinfo 애플리케이션의 기본 동작은 HTTP 인증을 전달하지 않으므로 내부 호출은 인증에 실패하고 권한부여도 실패합니다.

다음의 지시 사항을 순서대로 따릅니다:

  1. OPA 사이드카 주입을 구성합니다.
  2. Istio 프록시와 OPA간 通信 가능하게 하기
  3. OPA 구성을 배포하기
  4. Istio 구성을 적용하기
  5. 应用程序 배포 및 Istio-OPA 인가 세팅 테스트하기

시범 demo의 前提은 클러스터内에 Istio v1.19+가 설치되어 있어야 합니다. 여기에서는 Istio v1.21.0를 사용합니다.

OPA는 quickstart.yaml을 제공하여 간단한 설치를 제공합니다. yaml를 세 部分로 분할하여 더 이해하기 쉽게 만들었습니다: IMESH GitHub 저장소

Step 1: OPA Sidecar Injection 구성하기

opa_controller.yaml을 적용하기:

YAML

 

kubectl apply -f opa_controller.yaml

opa_controller.yaml는 TLS Cerificates, 삽입 정책을 포함하는 ConfigMap, 准入控制器 배포, 변경하는 webhook 구성을 opa-istio 이름空间(Figure 5를 참조하세요)에 배포합니다:

  1. 변경하는 webhook 컨트롤러(opa-istio-admission-controller)는 이제 특정 라abel(opa-istio-injection)의 값이 enabled로 설정된 것을 监听从에 듣게 됩니다.
  2. 웹훅 컨트롤러는 인삽션 정책을 갖추고 있는 어드미션-컨트롤러를 호출합니다.
  3. 인삽션 정책은 어드미션-컨트롤러가 어떻게 오PA 사이드卡尔 컨테이너를 톱드에 삽입する지 지시합니다.

그림 5: OPA 사이드卡尔 삽입 구성

이제, Bookinfo 应用을 배포하기 전에, bookinfo 네임스페이스를 생성하고 나머지 단계를 따라봅니다:

bookinfo 네임스페이스를 bookinfo-ns.yaml을 적용하여 생성합니다:

YAML

 

kubectl apply -f bookinfo-ns.yaml

You can see the namespace has the label opa-istio-injection: enabled, to auto-inject OPA sidecars.

단계 2: Istio 프록시와 OPA 사이 통신 활성화

istio-system 네임스페이스의 Istio ConfigMap을 수정하고 extensionProviders (opa-ext-authz-grpc)를 추가하여 멀스에서 외부 인증을 사용할 수 있게 한다:

  • opa_controller.yaml의 주석에서 extensionProviders를 복사합니다.
  • Istio ConfigMap을 수정하고 멀스 필드에 extensionProviders를 추가합니다.
  • 缩进이 correct하게 되었는지 확인합니다.
  • config를 저장합니다.

istio-proxy가 인증 요청에 대해 opa-istio 컨테이너로 대화할 수 있도록 해줍니다.

extensionProviders를 보면, Envoy에서 ExtAuthzGrpc 필터 유형과 지정된 서비스 entered과 포트가 있습니다.

YAML

 

...

extensionProviders:
- name: opa-ext-authz-grpc
envoyExtAuthzGrpc:
service: opa-ext-authz-grpc.local
       port: "9191"

...

extensionProviders의 이름, 서비스 주소, 以及 포트는 opa_authz.yamlopa_config.yaml에서 같아야 합니다.

Step 3: OPA Configuration 배포

opa_config.yaml는 오픈 정책에 관한 구성uration입니다. 이곳에는 opa-istio-configopa-policy ConfigMaps가 있습니다. 이들은 gRPC 서비스 구현(envoy_ext_authz_grpc)과 실제 鉴权 정책을 정의합니다.

鉴权 정책은 두 部分로 나뉩니다. 첫 部分은 鉴权이 허용되거나 거부되는 조건을 정의하고, 두 部分은 사용자 역할과 각 역할의 권한을 정의합니다.

鉴权 정책을 이해하는 것이 一些 시간이 걸릴 수 있습니다. 原因은 Rego는 여기에서 许多 키워드를 사용하지 않기 때문입니다. Rego의 새로운 버전을 사용하여 키워드를 얻을 수 있습니다(예: allow if condition 키워드).

bookinfo 이름空間에 OPA 구성uration을 적용합니다. 이것은 应用程序과 함께 적용됩니다.

YAML

 

kubectl apply -f opa_config.yaml -n bookinfo

Step 4: Istio Configuration 적용

opa_authz.yaml 파일은 Istio 구성을 포함하고 있습니다. 이 파일에는 AuthorizationPolicyServiceEntry가 있습니다. 주의: 인가 정책 제공자는 opa-ext-authz-grpc입니다. 이것은 configurations 의 2단계에서 설정한 extensionProvider입니다.

마찬가지로, ServiceEntry에 정의된 호스트 이름은 extensionProvider에 주어진 서비스 주소와 동일합니다. (opa-ext-authz-grpc.local) ServiceEntryistio-proxy 컨테이너 내에서 펀드에 opa-istio 옷을 가져올 수 있게 하는 포트 9191에 있는 localhost 127.0.0.1에서 gRPC 서비스가 실행됩니다.

구성을 배포하십시오:

YAML

 

kubectl apply -f opa_authz.yaml -n bookinfo

단계 5: 응용 프로그램 배포 및 Istio-OPA 인가 구성 시험

Bookinfo 응용 프로그램과 게이트웨이를 배포하십시오:

YAML

 

kubectl apply -f /your_Istio_directory/samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo
kubectl apply -f /your_Istio_directory/samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo

bookinfo 네임스 pace 내의 pods를 확인하십시오:

YAML

 

kubectl get pods -n bookinfo

각 pod에 3개의 컨테이너가 실행되고 있음을 확인할 수 있습니다. 응용 프로그램, Envoy 프록시 (istio-proxy), OPA (opa-istio) 컨테이너입니다.

Istio 게이트웨이의 IP를 얻어 서비스에 접근할 수 있는 것처럼하십시오:

YAML

 

kubectl get svc -n istio-system

이제 모두 준비되었으며 인가 정책을 시험할 준비가 되었습니다. opa_config.yaml에 정의한 정책은 다음과 같습니다:

YAML

 

...

user_roles = {
"alice": ["guest"],
"bob": ["admin"]
}

role_perms = {
"guest": [
{"method": "GET", "path": "/productpage"},
],
"admin": [
{"method": "GET", "path": "/productpage"},
{"method": "GET", "path": "/api/v1/products"},
        ],

...

Alice는 ゲス트 사용자로 /productpage만 ACCESS할 수 있고, Bob은 /productpage/api/v1/products 경로를 모두 ACCESS 할 수 있는 관리자입니다. 정책을 확인해봅시다.

Alice로부터 /api/v1/products에 대한 접근 시도입니다.

YAML

 

curl -vvv your_istio_gateway_ip/api/v1/products -u alice:password

403 Forbidden 응답을 볼 수 있어야 하는 이유는 Alice가 경로에 액세스하는 수단이 없기 때문입니다. Bob의 같은 경로를 시도해봅시다.:

YAML

 

curl -vvv your_istio_gateway_ip/api/v1/products -u bob:password

HTTP 상태 200 OK를 보이고, 응답의 마지막에 페이지 컨텐츠가 나타집니다.

OPA와 함께 사용하는 예시 사zenario

Istio의 AuthorizationPolicy CRD를 사용하여 위에서 보여준 정책을 적용할 수 있습니다. OPA가 필요하지 않습니다. 그러나, Istio 인가가 제한되는 情况和이 있음을 시작하는 표에 나와 있습니다. 간단한 예를 들어보겠습니다.

예를 들어 BookReviews applicaton이 GraphQL 서비스로, 리뷰어들이 리뷰를 제출하고, 리뷰를 편집하고 발행하는 oreditors, 사용자들이 발행된 리뷰를 읽는 경우가 있습니다.

리뷰어가 서비스에 책 리뷰를 추가하면, 리뷰어의 JWT가 포함되어 있는 요청이 있습니다. 리뷰어가 속한 그룹과 역할(리뷰어 또는 oreditor)가 포함되어 있습니다. 요청 oby를 GraphQL 변경 쿼리로 구성되어 있고, 새로 생성된 리뷰 데이터가 포함되어 있습니다.

다음 조건을 보장하고자 하면 좋을까요?

  • 이제는 리뷰어들만 리뷰를 제출할 수 있게 하고.
  • oreditor가 同样 group에 속한 리뷰어가 쓴 리뷰를 편집할 수 있게 하고.
  • 이제는 oreditors만 리뷰를 “publication 준비” 마킹할 수 있게 하고.

이렇게 정책을 포함하는 diagram:

Istio의 AuthorizationPolicy가 이러한 조건을 적용하기에 어려울 수 있습니다. 이유는 Istio가 GraphQL 요청 oby를 인가 확인에 사용할 수 없기 때문입니다. JWT가 정책 평가에 필요한 JSON 오브젝트로 함께 포함되어 있지만, 이를 사용할 수 없습니다.

OPA는 이러한 제한을 가지고 있지 않습니다. 정책 확인 목적으로 모든 데이터를 로드할 수 있으며, DevOps는 Rego를 사용하여 이러한 ルール들을 더 ergonomic 하게 書く 수 있습니다.

동영상: 동적 데모

동영상을 보고자 하시면 아래의 동영상을 확인하십시오:S

Istio 통합 Enterprise Support

대부분의 기업은 전체 스택에 대한 인가 정책을 정의하고 적용하기 위해 OPA를 사용합니다. 액세스 제어의 중앙ized 기능은 IT 팀의 整体적 안전性和 유연성을 개선합니다. 그렇지 않으면, 개발자는 특정 언어로 쓰여진 응용 코드에 인가 정책을 적용하는 시간을 浪費하게 되며, ス케ALIBILITY과 ビジネス 로직 ロールア웃의 速さ를 방해하게 됩니다.

Source:
https://dzone.com/articles/5-steps-to-integrate-istio-with-opa