SCHEMA에서 GRANT 사용은 정확히 무엇을합니까?


121

저는 처음으로 Postgres 데이터베이스를 만들려고하므로 이것은 아마도 어리석은 질문 일 것입니다. 내 PHP 스크립트에서 데이터베이스에 액세스해야하는 db 역할에 기본 읽기 전용 권한을 할당했는데 궁금한 점이 있습니다.

GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;

실행해야 할 필요가 있습니까?

GRANT USAGE ON SCHEMA schema TO role;

?

에서 문서 :

USAGE : 스키마의 경우 지정된 스키마에 포함 된 개체에 대한 액세스를 허용합니다 (개체의 고유 한 권한 요구 사항도 충족된다고 가정). 기본적으로 피부 여자는 스키마 내에서 개체를 "조회"할 수 있습니다.

스키마에 포함 된 데이터를 선택하거나 조작 할 수 있으면 스키마 자체의 모든 개체에 액세스 할 수 있다고 생각합니다. 내가 잘못? 그렇지 않다면 무엇 GRANT USAGE ON SCHEMA을 위해 사용됩니까? "객체의 고유 한 권한 요구 사항도 충족된다고 가정 할 때"문서는 정확히 무엇을 의미합니까?

답변:


126

GRANT다른 개체에있는 s는 분리되어 있습니다. GRANT데이터베이스에 대한 GRANT것은 스키마에 대한 권한 이 없습니다 . 유사 GRANT하게 스키마에 대한 작업은 내부 테이블에 대한 권한을 부여하지 않습니다.

SELECT테이블에 대한 권한은 있지만이를 포함하는 스키마에서 볼 수있는 권한이없는 경우 테이블에 액세스 할 수 없습니다.

권한 테스트는 순서대로 수행됩니다.

Do you have `USAGE` on the schema? 
    No:  Reject access. 
    Yes: Do you also have the appropriate rights on the table? 
        No:  Reject access. 
        Yes: Check column privileges.

public스키마에 모든 사용자 / 그룹이 구성원 인 GRANT역할에 대한 모든 권한 의 기본값이 있다는 사실로 인해 혼란이 발생할 수 있습니다 public. 따라서 모든 사람이 이미 해당 스키마를 사용하고 있습니다.

문구 :

(객체의 고유 한 권한 요구 사항도 충족된다고 가정)

USAGE개체를 사용하려면 스키마에 있어야 하지만 USAGE스키마에있는 것만으로는 스키마 내의 개체를 사용하는 데 충분하지 않으며 개체 자체에 대한 권한도 있어야합니다.

디렉토리 트리와 같습니다. somedir파일이 somefile포함 된 디렉토리 를 만든 다음 자신의 사용자 만 디렉토리 또는 파일 (디렉토리의 모드, 파일의 모드) rwx------에 액세스 할 수 있도록 설정하면 rw-------다른 사람이 파일이 있는지 확인하기 위해 디렉토리를 나열 할 수 없습니다.

파일 (mode rw-r--r--) 에 대한 세계 읽기 권한을 부여 하고 디렉토리 권한을 변경하지 않으면 아무런 차이가 없습니다. 디렉토리를 나열 할 권한이 없기 때문에 아무도 파일을 읽기 위해 수 없습니다.

대신 rwx-r-xr-x디렉토리를 설정하여 사람들이 디렉토리를 나열하고 탐색 할 수 있지만 파일 권한을 변경할 수 없도록 설정하면 사람들은 파일을 나열 할 수 있지만 파일에 대한 액세스 권한이 없기 때문에 읽을 수 없습니다 .

사람들이 실제로 파일을 볼 수 있도록하려면 권한을 모두 설정해야 합니다.

Pg에서도 마찬가지입니다. 테이블에서 USAGE와 같이 개체에 대한 작업을 수행하려면 스키마 권한과 개체 권한 이 모두 필요 SELECT합니다.

(비유는 사용자가 계속하여 테이블이 스키마에 존재하는 "볼"수의 PostgreSQL는, 아직 행 수준 보안이없는 점에서 조금 아래로 떨어지면 SELECT에서 보내고 pg_class직접. 그들은 수없는 상호 작용이 어떤 방식으로 , 그렇기 때문에 완전히 동일하지 않은 "목록"부분 일뿐입니다.)


2
이제 디렉토리 예제로 매우 명확합니다. :) 수퍼 유저가있는 테이블이나 행을 삽입하는 경우 (예 :를 사용하여 postGIS를 추가 할 때) 이것이 문제라고 말해야합니다 CREATE EXTENSION. .NET을 사용하는 동안 Linux에서 생성 된 파일과 거의 동일한 문제입니다 su. sudo -epqsl에 일종의 for 문이 있으면 좋을 것입니다.
Marco Sulla

어쨌든 지금은 그 실현 GRANT테이블에 대한 특정하지 진술, 내가 원하지 무엇 그들은 모든 데이터베이스에 영향을 미칠 때문에 ... : S
마르코 술라

1
@LucasMalor Er ... 아니, 그들은하지 않습니다. GRANT스키마에 영향을줍니다. GRANT ... ON ALL TABLES IN SCHEMA ...특정 데이터베이스의 스키마에있는 모든 테이블에 영향을줍니다. GRANT모든 데이터베이스에 영향을 미치는는 없습니다 ( GRANT사용자에 대한 역할 멤버십 제외 ).
Craig Ringer

아, 실례합니다. "postgres"수퍼 유저로 로그인했을 때 명령문을 실행했으며 "postgres"데이터베이스에 영향을 미쳤습니다. DB를 "외부"에서 작동 psql하지 않고 실행하는 경우 -d db항상 db에 연결되어 있고 기본적으로 역할 이름이 같은 db에 연결되어 있다고 생각했습니다. dB = 역할 = 사용자 = 그룹 ... 그것은 혼란을 조금입니다 : D
마르코 술라

@LucasMalor 이렇게 생각해보세요. 기본적으로 연결하는 로그인 역할 ( "사용자") 과 동일한 이름으로 DB에 연결합니다. "사용자"는 다음과 같은 역할을합니다 WITH LOGIN. 기본적으로, 모든 그룹이 될 수 있고, 그룹이 로그인 할 수 있도록 설정할 수 있습니다.
크레이그 벨소리

72

프로덕션 시스템의 경우 다음 구성을 사용할 수 있습니다.

--ACCESS DB
REVOKE CONNECT ON DATABASE nova FROM PUBLIC;
GRANT  CONNECT ON DATABASE nova  TO user;

--ACCESS SCHEMA
REVOKE ALL     ON SCHEMA public FROM PUBLIC;
GRANT  USAGE   ON SCHEMA public  TO user;

--ACCESS TABLES
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC ;
GRANT SELECT                         ON ALL TABLES IN SCHEMA public TO read_only ;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO read_write ;
GRANT ALL                            ON ALL TABLES IN SCHEMA public TO admin ;

스키마 admin에도 부여 되지 않아야 CREATE합니까?
Dan

2
액세스는 계층 적 모델 BD-> SCHEMA-> TABLES 에 따라 할당됩니다 . 로 GRANT USAGE ON SCHEMA, 관리자 사용자가 테이블을 만들 수 없습니다 그러나 그는 그것을 할 수 있습니다 ALL GRANT ALL ON SCHEMA....
bilelovitch

@bilelovitch : 당신은 의미 grant all on schema public to admin합니까? 추신 : 또한 추가했습니다 grant usage, select on all sequences in schema public to read_only/read_write; grant execute on all functions in schema public to read_only/read_write;
Marco Sulla

2

글쎄, 이것은 Linux의 간단한 db에 대한 최종 솔루션입니다.

# Read this before!
#
# * roles in postgres are users, and can be used also as group of users
# * $ROLE_LOCAL will be the user that access the db for maintenance and
#   administration. $ROLE_REMOTE will be the user that access the db from the webapp
# * you have to change '$ROLE_LOCAL', '$ROLE_REMOTE' and '$DB'
#   strings with your desired names
# * it's preferable that $ROLE_LOCAL == $DB

#-------------------------------------------------------------------------------

//----------- SKIP THIS PART UNTIL POSTGRES JDBC ADDS SCRAM - START ----------//

cd /etc/postgresql/$VERSION/main
sudo cp pg_hba.conf pg_hba.conf_bak
sudo -e pg_hba.conf

# change all `md5` with `scram-sha-256`
# save and exit

//------------ SKIP THIS PART UNTIL POSTGRES JDBC ADDS SCRAM - END -----------//

sudo -u postgres psql

# in psql:
create role $ROLE_LOCAL login createdb;
\password $ROLE_LOCAL
create role $ROLE_REMOTE login;
\password $ROLE_REMOTE

create database $DB owner $ROLE_LOCAL encoding "utf8";
\connect $DB $ROLE_LOCAL

# Create all tables and objects, and after that:

\connect $DB postgres

revoke connect on database $DB from public;
revoke all on schema public from public;
revoke all on all tables in schema public from public;

grant connect on database $DB to $ROLE_LOCAL;
grant all on schema public to $ROLE_LOCAL;
grant all on all tables in schema public to $ROLE_LOCAL;
grant all on all sequences in schema public to $ROLE_LOCAL;
grant all on all functions in schema public to $ROLE_LOCAL;

grant connect on database $DB to $ROLE_REMOTE;
grant usage on schema public to $ROLE_REMOTE;
grant select, insert, update, delete on all tables in schema public to $ROLE_REMOTE;
grant usage, select on all sequences in schema public to $ROLE_REMOTE;
grant execute on all functions in schema public to $ROLE_REMOTE;

alter default privileges for role $ROLE_LOCAL in schema public
    grant all on tables to $ROLE_LOCAL;

alter default privileges for role $ROLE_LOCAL in schema public
    grant all on sequences to $ROLE_LOCAL;

alter default privileges for role $ROLE_LOCAL in schema public
    grant all on functions to $ROLE_LOCAL;

alter default privileges for role $ROLE_REMOTE in schema public
    grant select, insert, update, delete on tables to $ROLE_REMOTE;

alter default privileges for role $ROLE_REMOTE in schema public
    grant usage, select on sequences to $ROLE_REMOTE;

alter default privileges for role $ROLE_REMOTE in schema public
    grant execute on functions to $ROLE_REMOTE;

# CTRL+D

1
"# Create all tables and objects, and after that :"에 어떤 사용자를 사용해야합니까? 귀하의 경우 테이블 및 기타 개체의 소유자는 누구입니까?
Christophe Furmaniak

@ChristopheFurmaniak 당신 말이 맞아, 내가 그 과정을 수정했다. db와 그 객체의 소유자는 $ ROLE_LOCAL이며, db 구조를 생성 한 후에는 postgres 수퍼 유저로 돌아 가야합니다.
Marco Sulla 2019

"ALTER DEFAULT PRIVILEGES ..."명령에 문제가 있다고 생각합니다. 이 명령은 다른 사용자 (역할)가 객체를 생성 할 때 한 사용자 (역할)에게 권한 부여를 트리거하는 데 사용됩니다. 자세한 내용은이 문서 의 11 페이지, 섹션 7.1을 참조하십시오 . 현재 ROLE_REMOTE는 ROLE_LOCAL이 생성하는 객체에 액세스 할 수 없습니다. ROLE_LOCAL 명령은 역할이 이미 해당 개체의 소유자로 가지고있는 privs 만 제공합니다. ROLE_REMOTE 명령도 마찬가지입니다.
emispowder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.