SCHEMA에서 GRANT USAGE는 정확히 어떤 역할을 합니까?
처음으로 Postgres 데이터베이스를 작성하려고 합니다.
PHP 스크립트에서 데이터베이스에 액세스해야 하는 DB 역할에 기본 읽기 전용 권한을 할당했는데, 궁금한 점이 있습니다.내가 실행하면
GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;
이것도 실행할 필요가 있습니까?
GRANT USAGE ON SCHEMA schema TO role;
설명서에서 다음을 참조하십시오.
용도: 스키마의 경우 지정된 스키마에 포함된 개체에 대한 액세스를 허용합니다(개체의 권한 요구 사항도 충족된다고 가정).기본적으로 이를 통해 허가받은 사람은 스키마 내의 개체를 "찾아볼" 수 있습니다.
스키마에 포함된 데이터를 선택하거나 조작할 수 있다면 스키마 자체의 모든 개체에 액세스할 수 있다고 생각합니다.내가 틀렸나요?그렇지 않다면, 무엇입니까?GRANT USAGE ON SCHEMA
에 사용됩니까?그리고 문서는 "개체 자체의 권한 요구사항도 충족된다고 가정"하는 정확한 의미는 무엇입니까?
GRANT
son 서로 다른 객체는 별개입니다. GRANT
데이터베이스에 있는 ing은 그렇지 않습니다.GRANT
내부 스키마에 대한 권한. 마가지로찬,GRANT
스키마의 ining은 내부 테이블에 대한 권한을 부여하지 않습니다.
당신이 경우있는에 대한 .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
수 합니다(모드 그 다 사 모 디 또 파 액 수 다 설 있 니 정 합 록 도 드 할 스 세 에 일 런 는 음 토 자 만 리 용 렉 모 mode ▁within ▁set 드 ▁it).rwx------
modedir, 모에서드에서rw-------
다른 사용자는 디렉토리를 나열하여 파일이 존재하는지 확인할 수 없습니다.
파에대월모읽드권기한을부경는우여하한드일모▁on경우(▁if▁world는-)▁youmode▁were▁(▁filerw-r--r--
디렉터리 권한을 변경하지 않으면 아무런 차이가 없습니다.디렉터리를 나열할 권한이 없기 때문에 아무도 파일을 읽을 수 없습니다.
대신 설정하는 경우rwx-r-xr-x
사람들이 디렉토리를 나열하고 이동할 수 있도록 설정하고 파일 권한은 변경하지 않으며, 사람들은 파일을 나열할 수 있지만 파일에 대한 액세스 권한이 없기 때문에 읽을 수 없습니다.
사용자가 실제로 파일을 볼 수 있도록 두 가지 권한을 모두 설정해야 합니다.
페이지에서도 마찬가지입니다.두 스키마가 모두 필요합니다.USAGE
개체에 대한 작업을 수행할 수 있는 권한 및 개체 권한, 예를 들어SELECT
테이블에서
(그 Postgre에서 유추는 약간 내려갑니다.SQL에는 아직 행 수준 보안이 없으므로 사용자는 여전히 테이블이 스키마에 존재하는지 "확인"할 수 있습니다.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-does-grant-usage-on-schema-do-exactly
'source' 카테고리의 다른 글
다른 색상의 표준 Android 버튼 (0) | 2023.05.31 |
---|---|
아이폰에 호스트 파일이 있습니까?어떻게 바꿀까요? (0) | 2023.05.31 |
Fragments에서 BackPressed()를 구현하는 방법은 무엇입니까? (0) | 2023.05.31 |
MongoDB용 C# 드라이버를 사용하여 주문 또는 정렬을 지정하는 방법은 무엇입니까? (0) | 2023.05.31 |
응용 프로그램을 업데이트하려고 할 때 [INSTALL_FAILED_ALREADY_EXIST] 오류가 발생함 (0) | 2023.05.31 |