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
'Programming' 카테고리의 다른 글
jquery 모든 양식 요소 가져 오기 : 입력, 텍스트 영역 및 선택 (0) | 2020.08.27 |
---|---|
Heroku 오류 : "권한이 거부되었습니다 (공개 키)" (0) | 2020.08.27 |
모델을 자동으로 마이그레이션하기 위해 Core Data를 얻으려면 어떻게해야합니까? (0) | 2020.08.26 |
Roslyn이 코드를 컴파일하지 못했습니다. (0) | 2020.08.26 |
.NET으로 7-Zip 아카이브를 생성하려면 어떻게합니까? (0) | 2020.08.26 |