OPA 번들을 사용하여 API 권한 부여 정책 배포

일반적인 조직에는 여러 환경에 여러 애플리케이션 및 배포가 있습니다. 그들 대부분은 Keycloak 또는 Azure AD/Okta와 같은 일부 중앙 ID 공급자를 가지고 있습니다...
ID 공급자가 OAuth2.0 토큰을 발급하고 ID 문제를 해결하는 동안 API 권한 부여를 처리하는 명확한 중앙 방법이 없었습니다. 이것은 일반적으로 애플리케이션 코드와 함께 번들로 제공될 수 있습니다.

권한 부여의 경우 OPA는 선언문에 권한 부여 논리를 작성할 수 있는 오픈 소스 CNCF 졸업 프로젝트입니다.

오늘의 목표는 OPA 번들 기능을 탐색하는 것입니다. 우리는 할 수 있습니다
  • Rego를 사용하여 정책 구축,
  • 번들로 패키징(tar 파일),
  • 중앙 위치에서 다양한 응용 프로그램 또는 배포 클러스터에 배포합니다.



  • 중앙 정책 포털은 아래 그림과 같이 정책을 구성할 수 있습니다. 개별 번들은 환경 수준에서 생성되며 환경에서 호스팅하는 프로젝트의 모든 정책을 포함합니다.



    우리 조직에는 비슷한 환경 분포가 있었습니다.
    모든 API는 다양한 API 게이트웨이로 전면에 배치되었습니다. 우리가 원하는 것은 모든 호출이 API 게이트웨이에 의해 가로채서 인증 엔진으로 전달되어야 한다는 것입니다. 인증 엔진이 false를 반환하면 HTTP 상태 403으로 요청이 거부되어야 합니다. 아래 다이어그램은 이를 나타냅니다.



    아래 표는 다양한 API 게이트웨이로 이를 달성할 수 있는 방법에 대한 세부 정보를 제공합니다.


    API 게이트웨이
    세부


    AWS API 게이트웨이
    -

    Traefik
    Using Forward Auth Middleware

    NGINX
    Module ngx_http_auth_request_module


    우리의 경우 OPA를 golang API 프로젝트에 사이드카로 배포했습니다. API는 API Gateway에서 요청을 받은 다음 OPA를 호출합니다. 수신된 응답을 구문 분석하고 Allow가 false로 설정된 경우 API는 API Gateway에 403을 반환합니다.

    아래는 API 프로젝트 및 OPA 배포를 위한 yaml입니다. 구성은 wsl2 데스크탑에서 가져온 것입니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: authorization
      namespace: default
      labels:
        app: authorization
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: authorization
      template:
        metadata:
          labels:
            app: authorization
        spec:
          containers:
          - name: auth-policy-manager
            image: naseemmohammed/policyengine:0.1.7
            imagePullPolicy: IfNotPresent
            env:
            - name: ENV_AUTH_SERVER
              value: ":8080"
            - name: ENV_PPSA
              value: "localhost"
            - name: ENV_OPA_PORT
              value: "8181"
            ports:
            - containerPort: 8080
          - name: opa
            image: openpolicyagent/opa:0.41.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 8181
            env:
            # location to subscribe for new policy bundles
            - name: AWS_REGION 
              value: us-east-2
            - name: AWS_ACCESS_KEY_ID
              value: AKIA52XXXUIISSCC-FAKE
            - name: AWS_SECRET_ACCESS_KEY
              value: E/VLCUZJ2G-NOTEXISTING-aUhmsMcI33yS8O     
            args:
              - "run" 
              - "--ignore=.*"  # exclude hidden dirs created by Kubernetes
              - "--server"
              - "--set=decision_logs.console=true"          
              - "--config-file"
              - "/config/config.yaml"
            volumeMounts:        
            - readOnly: true  
              mountPath: /config
              name: config-volume
            livenessProbe:
              httpGet:
                scheme: HTTP              # assumes OPA listens on localhost:8181
                port: 8181
              initialDelaySeconds: 5      # tune these periods for your environemnt
              periodSeconds: 5000  # in prod reduce to 5
            readinessProbe:
              httpGet:
                path: /health?bundle=true  # Include bundle activation in readiness
                scheme: HTTP
                port: 8181
              initialDelaySeconds: 5
              periodSeconds: 5
          volumes:
          - name: config-volume
            hostPath:
              # directory location on host
              path: /run/desktop/mnt/host/c/Users/nmohammed/Downloads/cluster-files
              # this field is optional
              type: Directory
          imagePullSecrets:
            - name: topsecret
    
    


    이제 아래의 OPA 구성 파일

    services:
      s3:
        url: https://zohoohio.s3.us-east-2.amazonaws.com
        credentials:
          s3_signing:
            environment_credentials: {}
    
    bundles:
      authz:
        service: s3
        resource: Zoho-onprem/bundle.tar.gz
        persist: false
        polling:
          min_delay_seconds: 100
          max_delay_seconds: 200
    

    좋은 웹페이지 즐겨찾기