이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Open Policy Agent

OPA (Open Policy Agent) 프로젝트 리서치

이쿠우우 2022. 1. 13. 21:46
반응형
 
 
 
 
 

OPA (Open Policy Agent) 리서치

 
 

 

목표

 
Open Policy Agent 리서치
 
 

 

프로젝트 소개

 

OPA란?

OPA(Open Policy Agent)는 정책을 통합하여 적용/관리하도록 도와주는 오픈소스 프로젝트임.
OPA는 현재 CNCF의 졸업 프로젝트(graduated project)로 클라우드 네이티브 정책의 사실상 표준으로 자리잡아 있음. 
 

OPA에서 말하는 정책이란?

정책이란
governance(거버넌스), 법적 요구사항 때문에 반드시 지켜져야 하는 정책도 있고
프로젝트를 동작하기 위한 정책 등 다양한 정책이 있음.
 
클라우드 생태계를 보면 많은 오픈소스 프로젝트들이 존재함
그리고 이러한 프로젝트들은 프로그램 동작을 위한 자체적인 정책을 사용하고 있음.
자체적인 정책이기 때문에 양식이 통일성이 없이 모두 다름.
 
이렇게 다양한 정책을 수작업으로 관리하면 휴먼 에러, 개발 기간 증가 등 다양한 문제점이 발생함.
 
클라우드 운영 시 이러한 프로젝트들이 다수 적용되어 있기 때문에 
클라우드의 전체적인 개발, 보안 위협, 취약점을 통제하기 어려움.
 
 

OPA 프로젝트 탄생 배경

 
클라우드를 공부하다보면 public cloud, container runtime, container orchestration, db, was등 
정말 수 많은 프로젝트들을 확인할 수 있음.
public cloud 프로젝트를 한 단계 더 들어가서 살펴보면 
AWS, Azure, GCP 등이 있고 
해당 프로젝트는 모두 수행하는 기능은 유사하지만 각자의 고유 정책으로 동작하고 있음.
container orchestration 마찬가지..
kubernetes, docker swarm, apache mesos 등도 
목표는 container관리로 동작 방식은 모두 유사하지만 각자의 정책으로 동작함.
사용자는 각 제품의 정책 사용법을 알아야 해당 프로젝트를 사용할 수 있음.
즉 cloud를 구축하기 위해서는 각 제품의 사용법을 알아야하기 때문에 학습량이 굉장히 많음.
 
CNCF 측에서는 이러한 문제점을 해결하고자 했고 
그래서 시작하게 된 것이 OPA 프로젝트임.
Open Policy Agent는 정책 통합 프로젝트로 CNCF의 졸업 프로젝트이고
클라우드 네이티브 정책의 표준으로 자리잡아 있음.
OPA를 통해 모든 제품의 정책을 통일하겠다라는 목표가 있음.
 
 

OPA 역할

 
OPA는 위에서 말한대로 다양한 정책을 통합하여 적용/관리할 수 있도록 해주는 프로젝트임. 
정책을 코드로 관리 할 수 있도록 OPA전용 언어인 Rego라는 declarative(선언형) 언어를 사용함.
이를 통해 도메인에 제한 받지 않는 (거의) 모든 종류의 정책의 기술이 가능함.
 
또한 간단한 API를 통해 컴플라이언스 관리 정책 정의를 
application 또는 kubernetes 플랫폼으로부터 독립적으로 가져갈 수 있게 해줌.
 
[home page]
 
[Rego docs]
 
[Rego test page]
 

OPA 동작 매커니즘

 
[OPA 동작]
요청이 들어오면 서비스는 JSON을 이용하여 OPA에 허용 여부 질의.
질의를 받은 OPA는 저장된 Policy를 불러와서 요청에 대한 평가를 하고 결과를 다시 JSON 형식으로 서비스에 반환.
 
[정책 설정]
OPA는 Policy를 기반으로 각종 request 처리를 관리하기 때문에 Policy를 어떻게 작성하는지가 중요함.
Policy는 Rego라는 자체 질의언어를 이용하여 작성해야 하며, 
Rego 언어가 선언적으로 동작하기 때문에 해당 문법에 대한 이해 필요.
 
[OPA 엔진 매커니즘 정리]
OPA 엔진 매커니즘을 간단히 설명드리겠음.
그림에서 Service가 각종 클라우드 프로젝트임.
Service에서 Request를 받으면 OPA 엔진으로 전달함
OPA 엔진에는 Rego라는 OPA 언어로 정책이 설정되어있음.
OPA 엔진은 request를 받아서 
설정되어있는 rego 정책에 따라 request를 판단하여 결과값 json을 생성함.
그리고 Serive에서 해당 json을 리턴해주는 방식으로 동작함.
 
 

OPA 적용 가능 프로젝트

OPA 엔진을 이해하는 플랫폼이라면 모두 동작 가능.

 
넷플릭스, 핀터레스트, 골드만삭스, 아틀라시안 제품군,  Chef 등에서
Kubernetes 및 마이크로서비스, CI/CD, API Gateway등에서 정책 엔진으로 사용하고 있음.

 

 

OPA 프로젝트 목록

OPA 엔진 

OPA(Open Policy Agent) : 오픈 소스 범용 정책 엔진.
 

 

 

OPA Gatekeeper

Gatekeeper는 내부적으로 OPA 엔진을 사용하는 
K8S 제어를 위해 제작된 솔루션임.
 
k8s에 OPA를 적용하기 위해 custom resource가 사용되었고
OPA 정책을 통해 k8s 제어하기 위해 admisstion controller가 사용됨.

 
[Gatekeeper 동작 분석]
Gatekeeper 배포 시 OPA object를 인식할 수 있도록
kubernetst cluster에 custom resource를 생성함.
custom resource가 적용되며 OPA 전용 kubernetes controller도 배포됨.
이후 사용자가 해당 custom resource를 통해 OPA 정책을 배포하면
OPA controller가 Admission Controller Webhook을 설정함
해당 webhook을 gatekeeper webhook이라 함.
OPA 정책에 따라 설정된 gatekeeper webhook이 kube-apiserver로 전달되는
request를 확인하여 Mutating 또는 Validating 함.
 
[주요기능]
Validating Admission Control
 - 웹훅을 트릭거로 OPA와 api-server 다리 역할을 하여 정책 적용
Policies and Constraints
 - Rego 언어로 작성되며 정의한 요구하상을 위반하는 리소스들을 확인
Audit
 - 배포된 자원을 정기적으로 감사하여 Constraints에 반하는 것이 있는지 확인
Data Replication
 - 리소스를 복제 한 후 감사가 진행되며, 복제할 수 있도록 권한 부여 필요
 
 

 

OPA Conftest

OPA를 기반으로 만들어진 testing tool.
개발자들이 익숙한 방식으로 지금 배포하려고 하는 코드가 회사의 중앙 정책과 위배되지는 않는지,
혹은 지금 배포하려는 정책이 예상한 테스트 케이스를 정확히 통과하는지 확인할 수 있게 해줌.
 
예를 들어 Kubernetes 구성, Tekton 파이프라인 정의, Terraform 코드, Serverless 구성 또는 
기타 구조화된 데이터에 대한 테스트를 작성할 수 있음.
 
 

 

OPA opa-envoy-plugin

 
OPA-Envoy 플러그인은 Envoy External Authorization API 를 구현하는 gRPC 서버로 OPA를 확장함. 
이 버전의 OPA를 사용하면 마이크로서비스 를 수정 하지 않고도 
Envoy에서 세분화된 컨텍스트 인식 액세스 제어 정책을 시행할 수 있음.
 
[Envoy란?]
Envoy Proxy는 C++로 개발된 고성능 프록시 사이드카로서 
service mesh의 모든 서비스에 대한 inbound/outbound 트래픽을 처리함.
 
 

 
 
 
 
참고
 
 
 

 

반응형