DATABASE vs SCHEMA에서 사용자의 기본 권한을 관리하는 방법은 무엇입니까?


48

상당히 간단한 내부 데이터베이스 기반 응용 프로그램을 SQLite3에서 PostgreSQL 9.3으로 마이그레이션하고 DB 권한을 강화하고 싶습니다.

응용 프로그램은 현재 데이터를 업데이트하는 명령으로 구성되어 있습니다. 하나는 그것을 쿼리합니다. 당연히 다른 방법으로 데이터베이스를 유지 관리해야합니다 (새 테이블, 뷰, 트리거 등 생성).

이 응용 프로그램은 처음에 서버에서 호스팅되는 유일한 응용 프로그램이지만 나중에 다른 데이터베이스가있는 서버에서 호스팅 될 수 있다고 가정하여 나중에 필요한 경우 나중에 스크램블하지 않아도됩니다. 미래.

나는 이것이 상당히 일반적인 요구 사항이라고 생각하지만 PostgreSQL에서 새로운 데이터베이스를 설정하는 방법을 설명하는 간단한 자습서를 찾는 데 어려움을 겪고 있습니다. 이러한 종류의 사용자 / 권한 분리. 참조는 그룹, 사용자, 역할, 데이터베이스, 스키마 및 도메인에 대해 길게 진행됩니다. 그러나 나는 그들이 혼란스럽게 생각합니다.

지금까지 시도한 내용은 다음과 같습니다 ( psql'postgres' 내에서 ).

CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;
\connect hostdb
CREATE SCHEMA hostdb;
CREATE USER hostdb_admin WITH PASSWORD 'youwish';
CREATE USER hostdb_mgr   WITH PASSWORD 'youwish2';
CREATE USER hostdb_usr WITH PASSWORD 'youwish3';

GRANT ALL PRIVILEGES ON DATABASE hostdb TO hostdb_admin;
GRANT CONNECT ON DATABASE hostdb TO hostdb_mgr, hostdb_usr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO hostdb_mgr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT ON TABLES TO hostdb_usr;

그러나 의도 된 의미를 얻지 못했습니다. hostdb_admin테이블 만 생성 (삭제 및 변경) 할 수 있도록 구성하고 싶습니다 . 는 hostdb_mgr, 읽기, 업데이트를 삽입하고 기본적으로 모든 테이블에서 삭제할 수 있습니다; 그리고 hostdb_usr모든 테이블 (및 뷰) 만 읽을 수 있습니다.

이 작업을 시도했을 때 hostdb이러한 사용자 중 하나로 테이블을 만들 수 있음을 알았습니다 . 그러나 각 사용자에 대해 명시 적으로 사용하지 않으면 해당 사용자가 만든 테이블 만 읽거나 수정할 수 있습니다 GRANT.

나는 무언가가 사이에 실종 같은데요 CREATE DATABASECREATE SCHEMA의를 적용 할 것을 SCHEMA받는 사람을 DATABASE?

(일이 발전함에 따라 TRIGGERS, 저장 프로 시저 VIEWS및 기타 객체 에 대해 비슷한 제한 사항을 적용하는 데 대한 질문이 있습니다 )

이에 대한 적절한 가이드, 튜토리얼 또는 비디오 시리즈는 어디에서 찾을 수 있습니까?


2
나는 당신의 문제가 적어도 publicpseudorole에 있다고 생각합니다 . 다른 모든 역할 (사용자, 그룹-모두 동일)이 구성원 인 역할로 생각할 수 있습니다. 예를 들어 다음과 같은 방법으로 권한을 제거하십시오 REVOKE CREATE ON SCHEMA hostdb FROM public. 데이터베이스 수준에 대한 권한을 취소하면 일부 데이터베이스 수준 권한 만 비활성화되며 스키마 나 테이블에는 영향을 미치지 않습니다.
dezso

@dezso : 스키마에 대한 기본 권한과 관련하여 잘못된 개념이있을 수 있습니다. 기본 스키마 만에 대한 public권한이 제공 PUBLIC됩니다. 그 외에는 새 스키마에 대한 기본 권한 이 없습니다 . 따라서 이는 사용 사례에 영향을 미치지 않습니다. 내 답변의 장을 참조하십시오.
Erwin Brandstetter

답변:


86

이에 대한 적절한 가이드, 튜토리얼 또는 비디오 시리즈는 어디에서 찾을 수 있습니까?

매뉴얼에서 모든 것을 찾을 수 있습니다. 아래 링크.
물론, 그 문제는 사소하지 않고 때로는 혼란 스럽습니다. 유스 케이스의 레시피는 다음과 같습니다.

레시피

hostdb_admin테이블 만 생성 (삭제 및 변경) 할 수 있도록 구성하고 싶습니다 .
hostdb_mgr, 읽기, 업데이트를 삽입하고 기본적으로 모든 테이블에서 삭제할 수 있습니다;
그리고 hostdb_usr모든 테이블 (및 뷰) 만 읽을 수 있습니다.

수퍼 유저로서 postgres:

CREATE USER schma_admin WITH PASSWORD 'youwish';
-- CREATE USER schma_admin WITH PASSWORD 'youwish' CREATEDB CREATEROLE; -- see below
CREATE USER schma_mgr   WITH PASSWORD 'youwish2';
CREATE USER schma_usr   WITH PASSWORD 'youwish3';

당신은 또한 데이터베이스와 역할을 관리 할 수있는보다 강력한 관리를하려면 추가 역할 특성 CREATEDBCREATEROLE 위.

각 역할을 다음 상위 레벨에 부여하여 모든 레벨이 최소한 다음 하위 레벨 (계단식)의 권한 세트를 "상속"합니다.

GRANT schma_usr TO schma_mgr;
GRANT schma_mgr TO schma_admin;

CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;  -- see notes below!

GRANT CONNECT ON DATABASE hostdb TO schma_usr;  -- others inherit

\connect hostdb  -- psql syntax

나는 스키마의 이름을 지정하고 있습니다 (혼동 schma하지 않을 hostdb것입니다). 아무 이름이나 선택하십시오. 선택적으로schma_admin 스키마의 소유자를 만드 십시오.

CREATE SCHEMA schma AUTHORIZATION schma_admin;

SET search_path = schma;  -- see notes

ALTER ROLE schma_admin IN DATABASE hostdb SET search_path = schma; -- not inherited
ALTER ROLE schma_mgr   IN DATABASE hostdb SET search_path = schma;
ALTER ROLE schma_usr   IN DATABASE hostdb SET search_path = schma;

GRANT USAGE  ON SCHEMA schma TO schma_usr;
GRANT CREATE ON SCHEMA schma TO schma_admin;

ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT SELECT                           ON TABLES TO schma_usr;  -- only read

ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO schma_mgr;  -- + write, TRUNCATE optional

ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO schma_mgr;  -- SELECT, UPDATE are optional 

내용은 and drop and alter아래의 정보를 참조하십시오.

일이 발전함에 따라 TRIGGERS, 저장 프로 시저 VIEWS및 기타 객체 에 대해 비슷한 제한 사항을 적용하는 데 대한 질문도 있습니다 .

보기는 특별하다. 하나 :

... (그러나 ALL TABLES뷰와 외부 테이블을 포함 하는 것으로 간주됩니다).

그리고 업데이트 가능한 뷰 :

보기에서 삽입, 업데이트 또는 삭제를 수행하는 사용자에게는보기에 대한 해당 삽입, 업데이트 또는 삭제 권한이 있어야합니다. 또한 뷰의 소유자는 기본 관계에 대한 관련 권한을 가져야하지만 업데이트를 수행하는 사용자는 기본 관계에 대한 권한이 필요하지 않습니다 ( 38.5 절 참조 ).

방아쇠도 특별합니다. TRIGGER테이블에 대한 권한 이 필요합니다 .

그러나 우리는 이미이 질문의 범위를 과도하게 확장하고 있습니다 ...

중요 사항

소유권

schma_admin(단독) 테이블 삭제 및 변경 을 허용 하려면 역할이 모든 오브젝트를 소유 하게하십시오 . 설명서 :

어떤 식 으로든 객체를 떨어 뜨리거나 정의를 변경할 수있는 권리는 허용 가능한 특권으로 취급되지 않습니다. 소유자에 내재되어 있으며 부여하거나 취소 할 수 없습니다. 그러나 개체를 소유 한 역할의 멤버 자격을 부여하거나 취소하면 비슷한 효과를 얻을 수 있습니다 (아래 참조). 소유자는 개체에 대한 모든 부여 옵션도 암시 적으로 제공합니다.

ALTER TABLE some_tbl OWNER TO schma_admin;

또는 역할schma_admin을가진 모든 객체를 생성하여 소유자를 명시 적으로 설정할 필요는 없습니다. 또한 기본 권한을 단순화하므로 한 역할에 대해서만 설정하면됩니다.

기존 객체

기본 권한은 새로 생성 된 개체 및 해당 개체가 생성 된 특정 역할에만 적용됩니다. 기존 객체에 대한 권한도 조정하려고합니다 .

DEFAULT PRIVILEGES수퍼 유저처럼 설정 되지 않은 역할을 가진 객체를 생성하는 경우에도 마찬가지 postgres입니다. 소유권을 다시 할당 schma_admin하고 수동으로 권한을 설정할 - 또는 설정 DEFAULT PRIVILEGES을위한 postgres뿐만 아니라 : (오른쪽 DB에 연결되어있는 동안!)

ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ...  -- etc.

기본 권한

ALTER DEFAULT PRIVILEGES명령 의 중요한 부분이 누락되었습니다 . 달리 지정하지 않는 한 현재 역할에 적용됩니다.

기본 권한은 현재 데이터베이스에만 적용됩니다. 따라서 DB 클러스터의 다른 데이터베이스를 망칠 필요가 없습니다. 설명서 :

현재 데이터베이스에서 생성 된 모든 개체

당신은 할 수 있습니다 또한 대한 기본 권한을 설정할 FUNCTIONSTYPES(단지 TABLESSEQUENCES)하지만, 그 필요되지 않을 수 있습니다.

에 대한 기본 권한 PUBLIC

부여 된 기본 권한 PUBLIC은 일부에 의해 기초적이고 과대 평가됩니다. 설명서 :

PostgreSQL은 일부 객체 유형에 대한 기본 권한을에 부여합니다 PUBLIC. 테이블, 열, 스키마 또는 테이블 스페이스에는 기본적으로 권한이 부여되지 않습니다 PUBLIC. 다른 유형의 기본 권한 부여 PUBLIC다음과 같습니다 CONNECTCREATE TEMP TABLE데이터베이스에 대한; EXECUTE기능에 대한 특권; 및 USAGE 언어에 대한 권한.

대담한 강조 광산. 일반적으로 위의 명령 하나만으로 충분합니다.

REVOKE ALL ON DATABASE hostdb FROM public;

특히 PUBLIC새 스키마 에는 기본 권한이 부여되지 않습니다 . "public"이라는 기본 스키마가에 ALL대한 권한으로 시작하는 것이 혼동 될 수 있습니다 PUBLIC. 새로 작성된 데이터베이스로 쉽게 시작할 수있는 편리한 기능입니다. 어떤 식 으로든 다른 스키마에는 영향을 미치지 않습니다. 당신은 할 수 템플릿 데이터베이스에서 이러한 권한을 취소 template1한 후이 클러스터의 모든 새로 만든 데이터베이스가 그들없이 시작 :

\connect template1
REVOKE ALL ON SCHEMA public FROM public;

특권 TEMP

우리가 모든 권한을 취소 이후 hostdb부터 PUBLIC우리가 명시 적으로 허용하지 않는 한, 일반 사용자는 임시 테이블을 만들 수 없습니다. 이것을 추가하거나 원하지 않을 수 있습니다.

GRANT TEMP ON DATABASE hostdb TO schma_mgr;

search_path

를 설정하는 것을 잊지 마십시오 search_path. 클러스터에 데이터베이스가 하나만 있으면에서 전역 기본값을 설정할 수 있습니다 postgresql.conf. 그렇지 않은 경우 데이터베이스의 속성으로 설정하거나 관련 역할 또는 둘의 조합으로 설정하십시오. 세부:

당신은 그것을 설정할 수 있습니다 schma, public당신은뿐만 아니라, 심지어 (덜) 공개 스키마를 사용하는 경우 $user, schma, public...

다른 방법은 기본 스키마 "public"을 사용하는 것이며, search_path변경하지 않는 한 기본 설정과 함께 작동해야 합니다. PUBLIC이 경우에 대한 권한을 취소해야합니다 .

관련


새로 생성 된 수퍼 유저에게 기본 관리자 권한을 추가하는 방법을 찾고 있었으므로 모든 테이블에서 추가 권한을 부여 할 필요가 없습니다. Anf 나는 이것을 발견했다. 그리고 this우주선에 대한 지시처럼 보인다 ...
Denis Matafonov

@DenisMatafonov : 수퍼 유저는 모든 권한을 자동으로 갖 습니다 . 귀하의 사례에 대해 새로운 질문을 시작하시기 바랍니다. 의견은 장소가 아닙니다. 당신은 항상 문맥에 대한 관련 질문 / 답변에 연결할 수 있습니다.
Erwin Brandstetter

예, 수퍼 유저는 모든 액세스 권한을 갖지만 기본 권한을 일반화 할 수는 없습니다. 스키마에서 역할에 대한 기본 권한을 설정하고 스키마에서 테이블을 만들 때 역할의 모든 구성원에게 해당 기본값을 적용하는 것이 좋습니다. 예를 들어 "엔지니어링 팀의 모든 사람이이 스키마에서 생성 한 테이블을보고 팀의 모든 사람이 읽을 수 있는지 확인하십시오"라고 말합니다. 간단히 말해서, 테이블 작성 역할의 구성원이 기본 권한을 상속하기를 원합니다.
조합 자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.