향상된 API 보안: OPA와 Kong Gateway를 사용한 세밀한 접근 제어

콩 게이트웨이는 보안, 속도 제한, 로깅 등을 관리하면서 올바른 요청만 들어오도록 하는 오픈소스 API 게이트웨이입니다. OPA(오픈 정책 에이전트)는 보안 및 액세스 결정을 제어하는 오픈 소스 정책 엔진입니다. 앱에서 정책 시행을 분리하는 마인드라고 생각하면 되므로 서비스에서 규칙 시행에 대해 스트레스를 받을 필요가 없습니다. 대신, OPA는 Rego 언어를 사용하여 API, 마이크로서비스, 심지어 Kubernetes 전반에서 정책을 평가합니다. 유연하고 안전하며 정책을 쉽게 업데이트할 수 있습니다. OPA는 입력(요청과 같은 실시간 데이터), 데이터(사용자 역할과 같은 외부 정보), 정책(허용 또는 거부 여부를 결정하는 Rego의 로직)이라는 세 가지 주요 사항을 평가하여 작동합니다. 이러한 구성 요소를 함께 사용하면 OPA는 단순하고 일관되게 유지하면서 보안 게임을 강력하게 유지할 수 있습니다.

우리가 달성하거나 해결하고자 하는 것은 무엇인가요?

자주 사용되는 데이터 항목은 정적이거나 徐々に 変化하는 것이 OPA의 데이터입니다. 멋진 결정을 내리기 위해 계속 변하는 입력 데이터와 함께 사용합니다. 하지만, 마이크로 서비스로 이루어진 错綜复杂的 웹, 大量的 사용자, PostgreSQL과 같은 대容量 데이터베이스를 갖추는 시스템을 상상해보세요. 이 시스템은 초당 많은 트랜잭션을 처리하며, 기계의 기능을 transcend 하는 것처럼 빨라고 Crisp 하게 처리해야 합니다.

이러한 시스템에서 얇은 접근 제어는 어렵지만, OPA를 사용하면 마이크로 서비스에서 重荷를 옮기고 게이트웨이 阶层에서 처리할 수 있습니다. Kong API Gateway과 OPA를 함께 사용하면 吞吐量과 精巧한 접근 제어를 동시에 얻을 수 있습니다.

사용자 데이터를 정확하게 유지하면서 느리게 만들지 않는 방법이 무엇입니까? 멀리서 PostgreSQL 데이터베이스에 이를 계속해서 찍는 것은 昂扬의 비용과 遅缓을 초래합니다. 정확성과 빨라짐을 동시에 달성하기 위해서는 그 두 사이에 comprise를 해야 합니다. 오PA가 정책 평가에 사용하기 위해 자주 불러오고 로컬 캐시에 데이터를 저장하는 custome plugin(게이트웨이 阶层)을 개발하여 실제 balace를 달성하는 것이 일어납니다.

데모를 보세요.

시범 演示 demo에 대해, PostgreSQL에서 이름, 이메일, 역할 등의 사용자 정보를 포함하는 サンプル 데이터를 세팅했습니다. 사용자가 특정 URL을 통해 서비스에 액세스하려고 하면, OPA가 요청이 허용되는지 여부를 평가합니다. Rego 정책은 요청 URL(리소스), 방법을 확인하고 사용자의 역할에 따라 true나 false를 리턴합니다. true이면 요청이 통과하게 되고, false이면 접근이 거부되게 됩니다. 지금까지는 간단한 구성입니다. 이제 カスタム 플러그인에 대해 들어가겠습니다. 구현을 명확하게 이해하기 위해서는 아래 diagram을 참고하시기 바랍니다.

Kong 프록시로 들어오는 요청에 따라 Kong カスタム 플러그인이 동작하게 됩니다. 플러그인은 필요한 데이터를 가져와 OPA에 입력/쿼리와 함께 전달합니다. 이 데이터 가져오는 과정은 두 부분이 있습니다: 하나는 Redis로 필요한 값을 찾는 것과, 발견되면 OPA로 전달하고, 아니면 Postgres에서 추가적인 쿼리를 수행하여 데이터를 가져와 Redis에 캐시하고 OPA로 전달합니다. 이러한 방법을 실행하면 다음 sectiion에서 명령을 실행하고 로그를 관찰할 수 있습니다. OPA는 정책, 입력 및 데이터에 따라 결정을 하고, 허용되면 Kong이 API로 요청을 转发할 것입니다. 이러한 접근 방식으로 Postgres에 대한 쿼리의 수를 Significantly reduced하게 하면서, OPA에 공급되는 데이터가 상당히 정확하면서 낮은 лаTAency를 보장할 수 있습니다.

NPALGUBUNGAPNYEOG handler.lua 을(를) 사용하여 플러그인의 주요 로직을 구현하고 schema.lua를 사용하여 플러그인 구성의 스키마를 정의합니다. Kong에 대한 사용자 정의 플러그인을 시작하시는 분들은 이 링크을 참조하여 더 많은 정보를 얻어야 합니다. 文档에는 플러그인을 パッケージ화하고 설치하는 방법도 설명합니다. 이제 让我们 进め서 이 플러그인의 로직을 이해하겠습니다.

데모의 첫 단계는 로컬 세팅 또는 クラウド 세팅에 OPA, Kong, Postgres, 以及 Redis를 설치하는 것입니다. 이 저장소을 克隆하십시오.

옆에 있는 docker-compose yaml을 확인하여 이전에 언급한 네 가지 서비스를 배포하는 방법을 정의하고 있음을 알아보십시오. Kong Env 변수를 확인하여 사용자 정의 플러그인이 어떻게 로드되는지 살펴보십시오.

아래 명령어를 실행하여 서비스를 배포하십시오.

Dockerfile

 

컨테이너가 실행 중인지 확인한 다음, Kong 관리자와 OPA는 다음과 같은 エンド 포인트에 사용할 수 있습니다. https://localhost:8002 및 https://localhost:8181

아래 명령어를 사용하여 테스트 서비스를 생성하고 이 경로에 사용자 정의 Kong 플러그인을 추가하십시오.

Shell

OPA 정책을 authopa.rego 파일에 정의하고 이를 OPA 서비스로 발행하고 갱신하는 다음 명령어를 사용하십시오.

Shell

이 예시 정책은 /demo 경로에 GET 方法的로 접근하고 "Moderator" 역할을 갖춘 사용자만 요청에 대한 액세스를 허용합니다. 필요에 따라 추가적인 규칙을 추가하여 다양한 기준에 따라 액세스 제어를 맞춰 입니다.

JSON

现在 셋업이 완료되었습니다만, 시험하기 전에는 Postgres에 샘플 데이터를 추가해야 합니다. 다음과 같은 샘플 데이터(이름, 이메일, 역할)를 몇 명의 직원에 대해 추가했습니다(PostgresReadme를 참조하세요).

다음은 실패한 요청과 성공한 요청의 예시입니다:

이제 이 사용자 정의 플러그인의 기본 기능을 시험하기 위해 두 개의 连续한 요청을 하고 로그에서 데이터 조회가 어떻게 이루어지는지 확인하세요.

이 로그가 있습니다:

JSON

 

로그는 첫 번째 요청에서 Redis에 데이터가 없으면 Redis에서 데이터를 가져와 예전에 캐시하고 OPA를 통해 평가하는 것을 보여줍니다. 그 이후 요청에서는 Redis에 데이터가 있으므로 응답이 훨씬 빨라집니다.

결론

결론적으로, Kong Gateway와 OPA를 결합하고 Redis 캐싱을 사용하여 커스텀 플러그인을 구현함으로써, 우리는 고천력 환경에서 액세스 제어를 위한 정확성과 속도를 효율적으로 조율합니다. 이 플러그인은 초기 쿼리 후 Redis에 사용자 역할을 캐싱함으로써 비용이高昂한 Postgres 쿼리의 수를 최소화합니다. 이후의 요청에서는 Redis에서 데이터를 가져오는 대신 레이턴시를 显著하게 줄입니다. OPA 정책 평가를 위해 정확하고 최신의 사용자 정보를 유지합니다. 이 접근 방식은 이중적인 액세스 제어를 게이트웨이 수준에서 퍼포먼스나 보안을 牺牲하지 않고 효율적으로 처리하여, 정밀한 액세스 정책을 강제하는 마이크로서비스를 확장하는理想的解決方案입니다.

Source:
https://dzone.com/articles/enhanced-api-security-fine-grained-access-control