147 lines
3.7 KiB
JSON
147 lines
3.7 KiB
JSON
{
|
|
"version": "1.1",
|
|
"id": "rls-three-preconditions",
|
|
"title": "PostgreSQL RLS 적용 여부를 가르는 분기",
|
|
"question": "현재 role과 table에서 RLS policy가 실제로 적용되는가?",
|
|
"type": "data-flow",
|
|
"direction": "TB",
|
|
"audience": [
|
|
"백엔드 엔지니어"
|
|
],
|
|
"summary": "RLS 활성 여부, 우회 role, owner와 FORCE RLS, applicable policy 유무를 차례로 구분한다.",
|
|
"alt": "RLS 비활성은 policy 미적용으로, superuser와 BYPASSRLS는 우회로, owner는 FORCE 여부로 갈리고, policy 대상인데 applicable policy가 없으면 default deny가 되는 흐름도",
|
|
"long_description": "PostgreSQL RLS를 세 개의 동시 전제로 보지 않는다. RLS가 활성화된 뒤 superuser 또는 BYPASSRLS인지, table owner인지와 FORCE RLS 여부를 확인한다. policy 대상 role에 applicable policy가 없으면 default deny이고, policy가 있으면 USING과 WITH CHECK를 평가한다.",
|
|
"source_context": {
|
|
"document": "docs/clean-architecture-backend-template/final/document.md",
|
|
"document_sha256": "7c986b30b6ef3c12060b6749ee60d53e37d6994493d2703419732c9cab6077d8",
|
|
"anchor": {
|
|
"kind": "line",
|
|
"value": 7400,
|
|
"line": 7400
|
|
}
|
|
},
|
|
"composition": {
|
|
"profile": "two-zone-pipeline",
|
|
"diagram_only": true,
|
|
"reference_ids": [
|
|
"localization-pipeline"
|
|
],
|
|
"rationale": "정책 적용 여부를 결정하는 검사 경로와 각 단계에서 빠져나가는 결과를 짧은 파이프라인으로 보여 준다.",
|
|
"focus_node": "policy"
|
|
},
|
|
"groups": [
|
|
{
|
|
"id": "role",
|
|
"label": "policy 적용 대상 판정",
|
|
"evidence": [
|
|
{
|
|
"start_line": 7400,
|
|
"end_line": 7432
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "policy-zone",
|
|
"label": "policy 존재와 평가",
|
|
"evidence": [
|
|
{
|
|
"start_line": 7400,
|
|
"end_line": 7432
|
|
}
|
|
],
|
|
"assumption": false
|
|
}
|
|
],
|
|
"nodes": [
|
|
{
|
|
"id": "rls",
|
|
"label": "RLS 활성 여부",
|
|
"kind": "process",
|
|
"role": "stage",
|
|
"evidence": [
|
|
{
|
|
"start_line": 7400,
|
|
"end_line": 7432
|
|
}
|
|
],
|
|
"assumption": false,
|
|
"group": "role",
|
|
"details": [
|
|
"no → policy 미적용"
|
|
]
|
|
},
|
|
{
|
|
"id": "subject",
|
|
"label": "policy 적용 대상",
|
|
"kind": "process",
|
|
"role": "stage",
|
|
"evidence": [
|
|
{
|
|
"start_line": 7400,
|
|
"end_line": 7432
|
|
}
|
|
],
|
|
"assumption": false,
|
|
"group": "role",
|
|
"details": [
|
|
"superuser / BYPASSRLS → 우회",
|
|
"owner + FORCE off → 우회",
|
|
"non-owner 또는 owner + FORCE on → 대상"
|
|
]
|
|
},
|
|
{
|
|
"id": "policy",
|
|
"label": "applicable policy",
|
|
"kind": "process",
|
|
"role": "stage",
|
|
"evidence": [
|
|
{
|
|
"start_line": 7400,
|
|
"end_line": 7432
|
|
}
|
|
],
|
|
"assumption": false,
|
|
"group": "policy-zone",
|
|
"emphasis": "primary",
|
|
"details": [
|
|
"none → default deny",
|
|
"exists → USING / WITH CHECK 평가"
|
|
]
|
|
}
|
|
],
|
|
"edges": [
|
|
{
|
|
"id": "e1",
|
|
"from": "rls",
|
|
"to": "subject",
|
|
"label": "RLS on",
|
|
"kind": "request",
|
|
"evidence": [
|
|
{
|
|
"start_line": 7400,
|
|
"end_line": 7432
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "e2",
|
|
"from": "subject",
|
|
"to": "policy",
|
|
"label": "적용",
|
|
"kind": "request",
|
|
"evidence": [
|
|
{
|
|
"start_line": 7400,
|
|
"end_line": 7432
|
|
}
|
|
],
|
|
"assumption": false,
|
|
"emphasis": "primary"
|
|
}
|
|
],
|
|
"legend": [],
|
|
"metadata": {}
|
|
}
|