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 |
|---|