데이터베이스에서 강제 적용

Fóir에서 행을 읽거나 바꿀 수 있는 사람은 Postgres가 결정합니다. 규칙은 하나의 스펙에 한 번 작성되어 행 수준 보안 정책으로 컴파일되므로, 검사는 애플리케이션 코드 아래의 데이터 쪽에 있습니다.

하나의 스펙, 컴파일

액세스 모델은 하나의 스펙 파일에 있습니다. Demesne은 저희가 만든 오픈 소스 컴파일러로, 이 파일을 정책과 정책이 호출하는 데이터베이스 함수로 바꿉니다. 생성된 SQL은 컴파일러가 쓴 그대로 배포되며, 아무도 손으로 수정하지 않습니다. 이 글을 쓰는 시점에 약 백 개의 테이블을 관장합니다.

강제 적용되며, 실제 스키마와 대조해 검증합니다

행 수준 보안은 관리 대상 테이블 모두에서 활성화될 뿐 아니라 강제 적용되므로, 테이블 소유자가 정책을 건너뛰고 읽는 경로가 막힙니다. 테스트가 데이터베이스 카탈로그에서 두 설정을 모두 읽고, 하나라도 꺼져 있으면 실패합니다.

두 번째 테스트는 스키마의 모든 테이블을 나열하고, 보호 방식에 대한 기록된 결정 없이 추가된 테이블이 있으면 실패합니다.

요청이 닿을 수 있는 범위

API 요청은 이러한 정책 아래에서 처리되며, 호출자의 워크스페이스, 프로젝트, 조직이 데이터베이스가 읽는 클레임으로 함께 전달됩니다. 각 테이블의 정책은 다른 어떤 규칙보다 먼저 이 값을 행과 비교합니다. 호출자가 볼 수 없는 행은 존재하지 않는 것처럼 읽힙니다.

애플리케이션이 결정하는 부분

데이터베이스는 일부 동작을 구분하지 못합니다. Postgres 입장에서 레코드 게시는 업데이트일 뿐입니다. 이러한 권한은 요청이 도착할 때, 같은 스펙에서 생성된 맵을 기준으로 확인되며, 행 규칙은 그 동작이 건드릴 수 있는 범위를 계속 제한합니다.

동작 방식 읽어보기

문서에서 소유권, 가시성, 부여, 그리고 자격 증명 종류별로 요청이 어떻게 결정되는지 다룹니다.