[마이크로서비스 취약성 최소화] Open Policy Agent (OPA): 현대 웹 애플리케이션 보안의 새로운 기준

IMKUNYOUNG·2024년 6월 26일
0

CKS

목록 보기
49/70

웹 애플리케이션 보안은 다양한 층위에서 이루어지며, 그중 사용자와 웹 포털 간의 안전한 통신은 매우 중요한 부분입니다. 사용자는 시스템에 로그인하고 자신은 주문 내역을 확인하거나 새로운 주문을 할 수 있어야 합니다. 이번 글에서는 인증과 권한 부여의 차이를 이해하고, 권한 부여를 효율적으로 처리할 수 있는 도구인 Open Policy Agent (OPA)에 대해 알아보겠습니다.

인증과 권한 부여: 무엇이 다를까?

보안의 첫 단계는 인증(authentication)으로, 사용자가 시스템에 접근하기 위해 사용자 이름과 비밀번호를 입력하는 과정입니다. 서비스 간의 통신에서는 보통 인증서를 사용하여 인증을 수행합니다.

인증이 완료된 후에는 권한 부여(authorization)가 뒤따릅니다. 이는 사용자가 어떤 API에 접근할 수 있고, 어떤 작업을 수행할 수 있는지를 정의하는 단계입니다. OPA는 바로 이 권한 부여를 처리하는 도구로, 사용자가 인증된 후 어떤 영역에 접근할 수 있는지를 결정합니다.

간단한 권한 부여 구현 예제

OPA를 도입하기 전에, 기본적인 Python 기반 Flask 애플리케이션에서 간단한 권한 부여 기능을 구현해보겠습니다. 이 애플리케이션은 /home URL을 제공하며, 'welcome home' 메시지를 반환합니다. 초기 상태에서는 아무런 권한 부여 기능이 없어 누구나 접근할 수 있습니다.

from flask import Flask, request

app = Flask(__name__)

@app.route('/home')
def home():
    user = request.args.get('user')
    if user == 'John':
        return 'welcome home'
    else:
        return '권한 없음', 403

if __name__ == '__main__':
    app.run()

위 코드는 URL 파라미터로 사용자 이름을 전달받아, 사용자가 'John'인 경우에만 홈페이지에 접근을 허용합니다. 그렇지 않으면 권한 없음 오류를 반환합니다. 이는 매우 기본적인 권한 부여 방식입니다.

OPA 도입하기

OPA를 사용하면 여러 서비스와 언어로 구성된 복잡한 인프라 환경에서 효율적인 권한 부여 관리를 할 수 있습니다. 각 서비스의 권한 부여 정책을 OPA에 위임하여 중앙 집중식으로 관리할 수 있습니다. 이제 OPA를 환경에 배포하고, 간단한 정책을 작성하여 Flask 애플리케이션과 통합해보겠습니다.

OPA 설정 및 정책 작성

  1. OPA 설치 및 실행
    먼저 OPA 바이너리를 다운로드하고 실행 가능한 상태로 만든 후, 서버 모드로 실행합니다. 기본적으로 포트 8181에서 실행됩니다.
wget https://openpolicyagent.org/downloads/latest/opa_linux_amd64
chmod +x opa_linux_amd64
./opa_linux_amd64 run -s
  1. 정책 작성
    다음 John 사용자 /home 경로에 접근할 수 있도록 허용하는 Rego 정책입니다.
package httpapi.authz

default allow = false

allow {
    input.path == "home"
    input.user == "John"
}
  1. 정책 로드
    작성한 정책을 OPA에 로드합니다. 예를 들어, policy.rego라는 파일로 저장한 후 다음 명령어를 실행합니다.
curl -X PUT --data-binary @policy.rego http://localhost:8181/v1/policies/httpapi

Python 애플리케이션에서 OPA 사용

이제 Flask 애플리케이션에서 직접 권한 체크하는 대신 OPA를 호출하여 권한을 확인하도록 수정해보겠습니다.

import requests
from flask import Flask, request

app = Flask(__name__)

OPA_URL = "http://localhost:8181/v1/data/httpapi/authz"

@app.route('/home')
def home():
    user = request.args.get('user')
    input_data = {
        "input": {
            "path": "home",
            "user": user
        }
    }
    response = requests.post(OPA_URL, json=input_data)
    result = response.json()
    if result.get('result', {}).get('allow'):
        return 'welcome home'
    else:
        return '권한 없음', 403

if __name__ == '__main__':
    app.run()

위 코드에서는 사용자 요청을 OPA에 전달하여 검증을 요청하고, OPA의 응답에 따라 접근을 허용하거나 거부합니다.

마무리

이번 글에서는 Open Policy Agent(OPA)를 활용한 권한 부여의 기본적인 개념과 구현 방법을 살펴보았습니다. OPA를 사용하면 다양한 서비스와 언어로 구성된 복잡한 인프라 환경에서 효율적으로 권한 부여를 관리할 수 있습니다. OPA와 Rego 정책 언어에 대해 더 배우고 싶다면 공식 문서와 Rego 플레이그라운드를 참고하는 것을 추천합니다.

OPA는 Neflix를 비롯한 여러 대형 기업에서 성공적으로 사용되고 있으며, 클라우드 전반에 걸친 권한 부여 문제를 해결하는 데 큰 도움이 되고 있습니다. OPA와 Rego 정책 언어를 통해 더욱 안전하고 효율적인 웹 애플리케이션 환경을 구축하시길 바랍니다.

0개의 댓글