Security/보안

02. Casbin PostgreSQL 연동하기

daeunnniii 2025. 9. 19. 23:09
728x90
반응형

이전 게시글

https://daeunnniii.tistory.com/216

 

01. Casbin으로 접근제어하기

1. 개요1.1 Casbin이란Casbin은 오픈소스 접근 제어(Access Control) 라이브러리로, 애플리케이션에서 권한 관리(Authorization) 기능을 유연하게 구현할 수 있게 해주는 도구이다."누가(subject) 어떤 리소스(obj

daeunnniii.tistory.com

 

1. 필요성

  • Casbin을 쓰면 정책을 파일(policy.csv)에 저장한다.
  • 하지만 실제로 정책이 많아지고 여러 서버가 같은 정책을 공유해야한다면, DB에 정책을 저장하는 것이 일반적이다.

→ PostgreSQL 연동 시, 정책이 많아져도 효율적으로 검색/저장 가능해짐, 여러 서버가 같은 정책 공유 가능, 필터 로딩 기능으로 부분 로딩하여 필요한 정책만 메모리에 로딩 가능함.

 

2. PostgreSQL 연동

2.1 설치 및 연동

  • 설치 및 db 준비
pip install casbin
pip install casbin-sqlalchemy-adapter sqlalchemy
pip install psycopg2-binary   # PostgreSQL 드라이버

 

  • DB 생성
CREATE DATABASE casbin;
CREATE USER casbin_user WITH PASSWORD 'strong_password';
GRANT ALL PRIVILEGES ON DATABASE casbin TO casbin_user;

 

 

  • Enforcer와 Adapter 연결
import casbin
from casbin_sqlalchemy_adapter import Adapter
 
DSN = "postgresql+psycopg2://casbin_user:strong_password@localhost:5432/casbin"
adapter = Adapter(DSN)
 
# 모델 파일과 DB 어댑터를 연결
e = casbin.Enforcer("model_rbac.conf", adapter)
 
# DB에서 정책 로드
e.load_policy()
 
print(e.enforce("alice", "data1", "read"))

 

2.2 Casbin Rule 기본 테이블 구조

CREATE TABLE casbin_rule (
    id    SERIAL PRIMARY KEY,   -- 고유 식별자 (자동 증가)
    ptype VARCHAR(255),         -- 정책 타입 (예: p, g, p2 등)
    v0    VARCHAR(255),         -- 첫 번째 값 (주체 subject, 사용자/역할 등)
    v1    VARCHAR(255),         -- 두 번째 값 (객체 object, 자원/resource 등)
    v2    VARCHAR(255),         -- 세 번째 값 (행위 action, read/write 등)
    v3    VARCHAR(255),         -- 네 번째 값 (효과 effect: allow/deny 등)
    v4    VARCHAR(255),         -- 다섯 번째 값 (필요 시 확장용)
    v5    VARCHAR(255)          -- 여섯 번째 값 (필요 시 확장용)
);
  • id: DB에서 각 정책 라인을 구분하는 PK
  • ptype: Policy Type
    • p: 일반 정책 (Policy)
    • g: 역할 매핑 (Grouping, 사용자 → 역할)
    • p2, g2: 커스텀 확장 정책 타입
  • v0 ~ v5: 정책(rule)의 각 필드를 순서대로 저장
    • 일반적으로 v0=sub, v1=obj, v2=act, v3=eft
    • 도메인 기반 모델은 dom이 들어가서 v1 또는 v2에 할당됨

 

2.3 데이터 예시 (RBAC)

  • 정책 파일에 다음과 같은 내용이 있다고 가정
p, admin, data1, read, allow
p, editor, data2, write, allow
g, alice, admin
g, bob,   editor
  • PostgreSQL casbin_rule 테이블에는 다음과 같이 저장
id type v0 v1 v2 v3 v4 v5
1 p admin data1 read allow    
2 p editor data2 write allow    
3 g alice admin        
4 g bob editor        

 

2.4 RBAC 모델 예시 (model_rbac.conf)

[request_definition]
r = sub, obj, act
 
[policy_definition]
p = sub, obj, act, eft
 
[role_definition]
g = _, _    ; 사용자-역할 매핑
 
[policy_effect]
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
 
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

 

2.5 정책 추가 및 저장

# 역할에 권한 부여
e.add_policy("admin",  "data*", "read",  "allow")
e.add_policy("editor", "data*", "write", "allow")
 
# 사용자에게 역할 부여
e.add_role_for_user("alice", "admin")
e.add_role_for_user("bob",   "editor")
 
# DB에 저장
e.save_policy()
 
# 검증
print(e.enforce("alice", "data1", "read"))  # True
print(e.enforce("bob",   "data9", "write")) # True

 

728x90
반응형

'Security > 보안' 카테고리의 다른 글

01. Casbin으로 접근제어하기  (0) 2025.09.19