Programming

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

procodes 2020. 8. 26. 20:02
반응형

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


저는 처음으로 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을 위해 사용됩니까? "객체의 고유 한 권한 요구 사항도 충족된다고 가정 할 때"문서는 정확히 무엇을 의미합니까?


GRANT다른 개체에 대한 s는 분리되어 있습니다. GRANT데이터베이스에 대한 ing은 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직접. 그들은 수없는 상호 작용이 어떤 방식으로 , 그래서 동일하지 않은 "목록"부분 일뿐입니다.)


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

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

글쎄, 이것은 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

참고 URL : https://stackoverflow.com/questions/17338621/what-grant-usage-on-schema-exactly-do

반응형