API의 액세스 제어 및 RBAC
1) API 액세스 제어 이유
승인은 "이 배우가 지금이 리소스에서이 작업을 수행 할 수 있습니까?" 라는 질문에 대한 답변입니다 ». 오류로 인해 BOLA/IDOR 누출, 권리 상승 및 규제 요구 사항 위반이 발생합니다. 목표는 객체 수준에서 명시 적 정책 및 점검을 통해 다단계 모델 인 주변 → 서비스 매쉬 → 비즈니스 규칙을 구축하는 것입니다.
2) 승인 모델: 무엇을 선택할 때
RBAC (Role-Based Access Control) - 역할 → 권한. 단순하고 안정적이지만 "역할 폭발" 이 발생하기 쉽습니다.
ABAC (속성 기반) - 주제/객체/컨텍스트 (국가, KYC 레벨, 리소스 소유자, 위험) 의 속성에 대한 결정.
ReBAC (Relationship-Based) - 관계 그래프 (소유자, 팀원, "프로젝트 관리자"); 복잡한 계층 구조를 해결합니다.
Scopes (OAuth) - "액세스 영역" (예: '결제: 쓰기') 에 대한 클라이언트와 리소스 서버 간의 계약.
실습: 기본 행렬에 대한 RBAC, 컨텍스트 및 제약 조건에 대한 ABAC, 복잡한 계층 구조에 대한 ReBAC (폴더, 조직, 한계 및 팟 계정).
3) 자원과 행동의 분류
계층 구조: 'org → project → 지갑 → 트랜잭션'. 가능한 "리미터" 를 사용하여 위에서 아래로 권리를 상속합니다.
작업: CRUD + 도메인 별 ('승인', '환불', '결제').
자원 속성: 소유자, 지역, 상태, 위험 태그 (AML/KYC), 제한.
멀티 테넌시: 모든 솔루션에는 '테넌트 _ id' 가 포함됩니다. 기본값으로 거부합니다.
4) 건축: 결정이 내려지는 곳
PEP (Policy Enforcement Point) -검증 사이트: 게이트웨이/API- 게이트웨이, 사이드카 매쉬, 서비스 자체.
PDP (Policy Decision Point) -정책 엔진: 중앙 집중식 (OPA 서비스, 삼나무 엔진) 또는 내장 라이브러리.
PIP (Policy Information Point) - 속성 소스: 사용자/역할 디렉토리, 테넌트 프로필, CCP/위험, 리소스 소유권 맵.
PAP (Policy Administration Point) -정책 버전 지정, 출판, 감사.
권장 사항: PEP의 중앙 집중식 PDP + 로컬 솔루션 캐시; 도메인 불변량이있는 경우 서비스에서 복잡한 객체 검사.
5) 토큰, 우표 및 정체성
OIDC/OAuth2: 'sub' (주제 식별자), 'aud' (대상 서비스), 'scope '/' alces', 'tenant', 'kyc _ level', 'risk _ tier'.
JWT: RS/ES 시그니처, 짧은 'exp', 새로 고침하여 다시 릴리스하십시오. PII를 넣지 마십시오. 해지/추적 감사에 'jti' 를 사용하십시오.
mSL/HMAC: 서비스 간 서비스 및 파트너; 'client _ id' 로 디렉토리에서 스탬프를 가져옵니다.
장치/컨텍스트: IP/ASN, 지리, 시간-ABAC 솔루션에 로그인 (예: 근무 시간 외 쓰기 금지).
6) 객체 수준 인증 (BOLA 우선)
각 작업은 "소유자/이 '자원 _ id' 에 대한 권리가있는 주제" 에 응답해야합니다.
소유권 점검: '리소스. 소유자 _ id = = 주제. 역할이있는 'org' 의 id '또는 멤버십.
필터 샘플: 항상 'WHERE 리소스' 오버레이. 테넌트 _ id =: 테넌트 AND... '(행 수준 보안).
참조 작업 (경로/본체의 ID) 의 경우-비즈니스 논리를 정규화하고 검증합니다.
7) RBAC 설계: 역할, 권한, 세트
권한 - 원자 권리: '지갑. ',' 지갑을 읽으십시오. ',' 결제를 작성하십시오. 환불 '.
역할-명명 된 권한 세트: '관리자', '지원. ',' 계산원 ',' 사기를 읽으십시오. 분석가 '.
스코프-고객을위한 외부 계약 (scope → 권한 매핑)
폭발적인 역할을 피하십
기본 역할 + 허가 팩,
ABAC 제한 (국가/지역/테넌트),
"Just-In-Time 액세스".
8) ABAC/컨텍스트 제약
지리/관할권: 금지 된 국가의 서면 금지 (제재/규제).
시간/위험: 대규모 작업에 대한 'risk _ score <임계 값'.
ACC/한계: 핀의 경우 'kyc _ 수준> = 2'> X; 트랜잭션 간 "냉각" 제어.
"신뢰할 수있는 장치": 위험한 경로의 파트너에게는 mTLS가 필요합니다.
9) ReBAC 및 권리 그래프
복잡한 비즈니스 구조 (그룹, 팀, 브랜드, 지점) 에 유용합니다.
관계: '멤버', '관리자', '소유자', '뷰어'.
파생 된 권리: 리소스의 '뷰어' 는 'org' 에 속하는 프로젝트의 '멤버' 에서 상속됩니다.
그래프 스토리지: 관계 매트릭스가있는 데이터베이스, 특수 서비스 (잔지바르 접근 방식의 정신). 캐시 '체크 (주제, 관계, 객체)' 응답.
10) 솔루션 캐시 및 성능
PEP 레벨 (예: 게이트웨이) 의 PDP 캐시에는 'sub' 테넌트 '리소스' 동작 'policy _ version' 이 있습니다.
이벤트 별 TTL 쇼트 (초) + 장애: 역할/관계/테넌트 변경.
목록에 대한 배치 점검 (대량 저작): PDP 요금 감소.
측정 대기 시간 솔루션; 성능 저하 중-읽기에 대해서만 우아한 저하 (쓰기/화폐에 대해서는 절대).
11) 정책 예
11. 1 JWT 스탬프 → 거친 PEP (의사 게이트웨이)
yaml
- match: { prefix: "/api/v1/wallets" }
authz:
require:
- claim: "aud"
equals: "wallet-service"
- claim: "scope"
includes_any: ["wallet. read", "wallet. write"]
context:
tenant_from: "claim:tenant"
11. 2 OPA/레고 (ABAC + BOLA)
rego package authz
default allow = false
allow {
input. action == "wallet. read"
input. subject. tenant == input. resource. tenant some role role:= input. subject. roles[_]
role == "support. read"
}
allow {
input. action == "payment. refund"
input. subject. tenant == input. resource. tenant input. subject. kyc_level >= 2 input. subject. risk_tier <= 2 input. subject. id == input. resource. owner_id # BOLA
}
11. 3 관할권 제한 (거부 목록 정책)
rego deny[msg] {
input. action == "withdraw. create"
input. context. country in {"IR","KP","SY"}
msg:= "Jurisdiction not allowed"
}
11. 4 ReBAC 정책 (의사)
allow(subject, "wallet. write", wallet) --
related(subject, "member", wallet. project) ∧ related(subject, "admin", wallet. org) ∧ wallet. tenant == subject. tenant.
12) 정책 및 버전 관리
위험한 변경에 대한 정책 버전 ('policy _ version') 및 카나리아.
"드라이 런" (드라이 런/섀도우 결정) -영향없이 '허용/거부' 로그.
정책 및 마이그레이션 디렉토리: 언제, 왜 바뀌 었는지; 사건에 대한 매핑.
CI에 필요한 부정적인 시나리오 (금지 된 경우) 테스트.
13) 관찰 및 감사
결정 로그: 'trace _ id', '주제', '테넌트', '동작', 'resource _ id', '결과', 'policy _ version', 실패 이유.
메트릭: 'autz _ decision _ latency', '소 _ dead _ total {action}', BOLA 시도의 공유, 캐시 적중률.
대시 보드: 행동/테넌트에 의한 최고 실패, 정책 릴리스 후 추세.
14) 안전과 지속 가능성
기본값으로 거부: 명시 적 권한 없음 = 거부.
실패: PDP를 사용할 수없는 경우 중요한 쓰기 → 금지 (또는 엄격하게 검증 된 역할의 "최소 세트" 로 저하).
중요한 불변량에 대한 서비스 내 로컬 "가드 점검" (예: '테넌트 '/' 소유자').
JWT의 특징 최소화; 보안 채널을 통해 PIP를 통해 민감한 속성을로드하십시오.
15) iGaming/Finance의 세부 사항
역할: '계산원', 'kyc. 에이전트 ',' aml. 장교 ',' 사기. 분석가 ',' vip. 관리자 ',' 위험. 관리자 '.
제한 사항: 결제 거래는 'kyc _ level', 책임있는 지불 한도, AML 상태/제재에 따라 다릅니다.
잠금 레지스터: 'org/브랜드/장치/결제 _ 기기' -기록시 ABAC 필터.
KYC/AML/핀 동작에 대해 변경되지 않은 감사 로그; 규제 마감일에 따른 저장.
파트너 API: 경로의 mSL + 계약 '범위', 주변의 지리/ASN 필터.
16) 테스트 및 검증
음수 매트릭스: 명시 적 "금지 된" 사례를 나열하고 테스트로 수정하십시오.
퍼즈 인증: 페이지 분류/정렬 할 때 필터를 우회하여 'tenant _ id', 'owner _ id' 를 대체합니다.
PDP로드 테스트: p95/p99에서 캐시의 대기 시간 및 동작을 확인하십시오.
정책 릴리스: 예상 거부/허용으로 드라이 런 + 카나리아 + 자동 테스트.
사건: 정확한 버전의 정책으로 스탠드에서 요청을 재생합니다.
17) 안티 패턴
객체 검사 (BOLA) 없이 '범위' 에서만 유효합니다.
중앙 집중식 모델없이 각 핸들러에서 비즈니스 논리 및 권한 검사를 혼합하십시오.
UI 및 신뢰 클라이언트 솔루션에서 하드 코드 역할.
데이터베이스 요청시 '테넌트 '/' 소유자' 필터가 없습니다 (누설 된 읽기).
역할/관계를 변경할 때 캐시 솔루션 장애가 없습니다.
리콜/로테이션없이 수명이 긴 JWT.
18) Prod 준비 점검표
- 자원/활동, 계층 및 다중 임차가 정의됩니다.
- 필요한 경우 기본 RBAC 행렬 + ABAC 리미터- ReBAC.
- PDP/PEP는 설계되었습니다. 로컬 솔루션 캐시와 장애가 있습니다.
- CI의 정책은 다양하고 부정적인 시나리오 테스트입니다.
- BOLA는 특정 'resource _ id' 에 대한 각 쓰기/읽기에서 확인합니다.
- 최소한의 우표를 가진 JWT, 짧은 'exp'; 'jti' 에 대한 감사/리콜.
- 메트릭/결정 로그, 대시 보드, 거부/대기 시간별 경고.
- 중요한 글쓰기에 실패했습니다. 대체 모드가 문서화되어 있습니다
- 고객 문서: 'scopes', 오류 코드 (401/403/404/409), 예.
19) TL; DR
BOLA 최초 승인 구축: 중앙 PDP + 솔루션 캐시, 기본 RBAC, 컨텍스트 용 ABAC, 관계 용 ReBAC. 모든 요청은 '테넌트' 및 특정 '리소스 _ id' 와 관련이 있습니다. 데이터베이스에서 기본값으로 거부되는 짧은 JWT 개체 필터. 버전 및 테스트 정책, 대기 시간/거부 측정, 재생 사건. iGaming의 경우 개별 역할 (KYC/AML/cash register), 하드 ABAC 리미터 및 변경 불가능한 감사.