PostgreSQL에서 읽기 전용 사용자를 어떻게 만듭니 까?


419

특정 데이터베이스에서만 SELECT를 수행 할 수있는 PostgreSQL에서 사용자를 만들고 싶습니다. MySQL에서 명령은 다음과 같습니다.

GRANT SELECT ON mydb.* TO 'xxx'@'%' IDENTIFIED BY 'yyy';

PostgreSQL에서 동등한 명령 또는 일련의 명령은 무엇입니까?

나는 시도했다 ...

postgres=# CREATE ROLE xxx LOGIN PASSWORD 'yyy';
postgres=# GRANT SELECT ON DATABASE mydb TO xxx;

그러나 데이터베이스에 부여 할 수있는 것은 CREATE, CONNECT, TEMPORARY 및 TEMP뿐입니다.

답변:


641

단일 테이블에 사용량 부여 / 선택

데이터베이스에 CONNECT 만 부여하면 사용자는 연결할 수 있지만 다른 권한은 없습니다. 다음과 같이 네임 스페이스 (스키마)에 USAGE를 부여하고 테이블과 뷰에 대해 SELECT를 개별적으로 부여해야합니다.

GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;

여러 테이블 / 뷰 (PostgreSQL 9.0+)

최신 버전의 PostgreSQL에서는 하나씩 입력하지 않고 단일 명령을 사용하여 스키마의 모든 테이블 / 뷰 / 등에 대한 권한을 부여 할 수 있습니다.

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;

이것은 이미 작성된 테이블에만 영향을줍니다. 보다 강력하게 는 나중에 새 객체기본 역할을 자동으로 할당 할 수 있습니다.

ALTER DEFAULT PRIVILEGES IN SCHEMA public
   GRANT SELECT ON TABLES TO xxx;

기본적으로 이것은이 명령을 발행 한 사용자가 작성한 오브젝트 (테이블)에만 영향을 미칩니다. 발행하는 사용자가 속한 모든 역할에서도 설정할 수 있습니다. 그러나 새 객체를 만들 때 구성원으로 속한 모든 역할에 대한 기본 권한을 선택하지는 않습니다. 데이터베이스에 소유 역할이있는 접근 방식을 채택하고 해당 소유 역할로 스키마 변경이 수행되는 경우 해당 소유 역할에 기본 권한을 지정해야합니다. IMHO 이것은 약간 혼란스럽고 기능적인 워크 플로를 만들기 위해 실험해야 할 수도 있습니다.

여러 테이블 / 뷰 (9.0 이전의 PostgreSQL 버전)

길고 다중 테이블 변경에서 오류가 발생하지 않도록하려면 다음 '자동'프로세스를 사용하여 GRANT SELECT각 테이블 / 뷰에 필요한 항목 을 생성하는 것이 좋습니다 .

SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');

copy-n-paste 방식으로 모든 테이블, 뷰 및 시퀀스에서 관련 GRANT 명령을 GRANT SELECT에 출력해야합니다. 당연히 이것은 이미 작성된 테이블에만 적용됩니다.


22
게시물 상단에 PG9 관련 편집 내용을 입력해야합니다.
Danilo Bargen

5
좋은. 내가 추가 할 한 가지는이 사용자가 시퀀스를 읽도록 허용해야한다는 것입니다. 따라서 : SCHEMA의 모든 시퀀스에 대해 선택을 공개하십시오.
JJC

26
이 사용자가 새 테이블을 만들 수 없도록하려면 필히해야했습니다 REVOKE CREATE ON SCHEMA public FROM PUBLIC;. 그렇지 않으면 "읽기 전용"사용자는 기존 테이블을 수정할 수 없지만 스키마에서 새 테이블을 작성하고 해당 테이블에서 데이터를 추가 / 제거 할 수 있습니다.
Ajedi32

3
@ Ajedi32 이것은 허용되는 답변의 일부 여야합니다! 감사합니다
Asfand Qazi

12
저와 같은 초보자에게는 psql mydb대부분의 조작으로 콘솔을 시작해야한다고 언급 할 가치가 있다고 생각합니다 . 개인적으로 알아내는 데 상당한 시간이 걸렸습니다. 이것이 누군가를 돕기를 바랍니다.
Anass

41

PostgreSQL 9.0 (오늘 베타 테스트에서)에는 간단한 방법이 있습니다 .

test=> GRANT SELECT ON ALL TABLES IN SCHEMA public TO joeuser;

3
이것이 작동하려면 특정 데이터베이스에 있어야했습니다. PostgreSQL 9.5.
user1158559

8
스키마의 기존 테이블에 대해서만 작동합니다. 나중에 쓰기 사용자가 테이블을 만들거나
바꾸면

32

이 블로그에서 가져온 참조 :

읽기 전용 사용자를 작성하는 스크립트 :

CREATE ROLE Read_Only_User WITH LOGIN PASSWORD 'Test1234' 
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL 'infinity';

이 읽기 전용 사용자에게 권한을 지정하십시오.

GRANT CONNECT ON DATABASE YourDatabaseName TO Read_Only_User;
GRANT USAGE ON SCHEMA public TO Read_Only_User;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO Read_Only_User;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO Read_Only_User;

6
이것은 한 가지 누락 된 것을 제외하고는 매우 좋은 대답 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO Read_Only_User; 입니다. 향후 동일한 DB에서 작성된 모든 테이블을 읽을 수도 있습니다.
Ravbaker

2
읽기 전용 사용자가 시퀀스에 액세스하도록 허용하는 것은 드문 일입니다. 시퀀스를 읽으면 업데이트되며 일반적으로 INSERTs 에만 필요합니다 .
jpmc26

완전성을 위해 다음을 추가하십시오.GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA schema_name TO Read_Only_User;
Fabien Haddadi

@ jpmc26 : 그것은 당신이 추천하는 것을 의미 GRANT ALL ON ALL SEQUENCES IN SCHEMA schema_name TO Read_Only_User합니까?
Fabien Haddadi

@FabienHaddadi 일반적인 요구 사항을 벗어나지 않으면 시퀀스에 대한 권한을 읽기 전용 사용자에게 부여 할 필요가 없습니다.
jpmc26

24

다음은 읽기 전용 사용자를 추가하는 가장 좋은 방법입니다 (PostgreSQL 9.0 이상 사용).

$ sudo -upostgres psql postgres
postgres=# CREATE ROLE readonly WITH LOGIN ENCRYPTED PASSWORD '<USE_A_NICE_STRONG_PASSWORD_PLEASE';
postgres=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

그런 다음 모든 관련 시스템 (마스터 + 읽기 슬레이브 / 핫 스탠바이 등)에 로그인하고 다음을 실행하십시오.

$ echo "hostssl <PUT_DBNAME_HERE> <PUT_READONLY_USERNAME_HERE> 0.0.0.0/0 md5" | sudo tee -a /etc/postgresql/9.2/main/pg_hba.conf
$ sudo service postgresql reload

2
나는 접근 방식이 마음에 들지만 데이터베이스 연결 [데이터베이스]를 [사용자 또는 역할]에게 부여해야했습니다. [사용자 또는 역할]에게 공개적으로 SCHEMA에 대한 사용;
Ian Connor

1
공용 스키마는 여전히 그러한 사용자가 테이블을 작성할 수있게합니다. 또한 새 테이블은 다루지 않으며 시퀀스도 다루지 않습니다. 불행히도 이것은 이것보다 훨씬 더 복잡합니다. :-/ 일단 더 검증하면 내가 한 일을 게시 할 것입니다.
JJC

위의 스크립트에서 역할을 두 번 만들려고합니다. 로그인 역할을 활성화하고 비밀번호를 설정할 때 "ALTER ROLE ..."을 사용하려고했다고 생각합니다.
Bogdan

사용자가 이미있는 경우 읽기 전용 역할을 생성하고 select perms를 부여한 후 사용자에게 새 역할을 부여하십시오. GRANT readonly TO <USER>
gonz

18

기본적으로 새 사용자에게는 테이블을 만들 수있는 권한이 있습니다. 읽기 전용 사용자를 만들 계획이라면 이것이 원하는 것이 아닐 것입니다.

PostgreSQL 9.0+를 사용하여 진정한 읽기 전용 사용자를 만들려면 다음 단계를 실행하십시오.

# This will prevent default users from creating tables
REVOKE CREATE ON SCHEMA public FROM public;

# If you want to grant a write user permission to create tables
# note that superusers will always be able to create tables anyway
GRANT CREATE ON SCHEMA public to writeuser;

# Now create the read-only user
CREATE ROLE readonlyuser WITH LOGIN ENCRYPTED PASSWORD 'strongpassword';
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonlyuser;

읽기 전용 사용자에게 테이블을 나열 할 수있는 권한이 없으면 (예 : \d결과가 반환되지 않음) USAGE스키마에 대한 권한 이 없기 때문일 수 있습니다 . USAGE사용자가 할당 된 권한을 실제로 사용할 수있는 권한입니다. 요점이 뭐야? 잘 모르겠습니다. 고치다:

# You can either grant USAGE to everyone
GRANT USAGE ON SCHEMA public TO public;

# Or grant it just to your read only user
GRANT USAGE ON SCHEMA public TO readonlyuser;

8

이를 위해 편리한 스크립트를 만들었습니다. pg_grant_read_to_db.sh . 이 스크립트는 데이터베이스 스키마의 모든 테이블, 뷰 및 시퀀스에 대해 지정된 역할에 읽기 전용 권한을 부여하고 기본값으로 설정합니다.


4

나는 당신이 물건을 부여하기 전에 데이터베이스에 연결하는 것을 기억한다면 모든 가능한 해결책을 모두 읽었습니다.) 다른 모든 해결책에 감사드립니다!

user@server:~$ sudo su - postgres

psql 사용자를 작성하십시오.

postgres@server:~$ createuser --interactive 
Enter name of role to add: readonly
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n

psql cli를 시작하고 작성된 사용자의 비밀번호를 설정하십시오.

postgres@server:~$ psql
psql (10.6 (Ubuntu 10.6-0ubuntu0.18.04.1), server 9.5.14)
Type "help" for help.

postgres=# alter user readonly with password 'readonly';
ALTER ROLE

대상 데이터베이스에 연결하십시오.

postgres=# \c target_database 
psql (10.6 (Ubuntu 10.6-0ubuntu0.18.04.1), server 9.5.14)
You are now connected to database "target_database" as user "postgres".

필요한 모든 권한을 부여하십시오.

target_database=# GRANT CONNECT ON DATABASE target_database TO readonly;
GRANT

target_database=# GRANT USAGE ON SCHEMA public TO readonly ;
GRANT

target_database=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly ;
GRANT

대상 db 공용 shema에 대한 기본 권한을 변경하십시오.

target_database=# ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
ALTER DEFAULT PRIVILEGES

3

데이터베이스가 퍼블릭 스키마에 있으면 쉽다 (이미 이미를 만들었다 고 가정 readonlyuser)

db=> GRANT SELECT ON ALL TABLES IN SCHEMA public to readonlyuser;
GRANT
db=> GRANT CONNECT ON DATABASE mydatabase to readonlyuser;
GRANT
db=> GRANT SELECT ON ALL SEQUENCES IN SCHEMA public to readonlyuser;
GRANT

데이터베이스가를 사용 customschema하는 경우 위를 실행하지만 명령을 하나 더 추가하십시오.

db=> ALTER USER readonlyuser SET search_path=customschema, public;
ALTER ROLE

1

간단하지 않은 방법은 데이터베이스의 각 테이블에서 선택 권한을 부여하는 것입니다.

postgres=# grant select on db_name.table_name to read_only_user;

데이터베이스 메타 데이터에서 권한 부여 명령문을 생성하여이를 자동화 할 수 있습니다.


1
CREATE USER username SUPERUSER  password 'userpass';
ALTER USER username set default_transaction_read_only = on;

0

despesz의 링크 에 대한 응답으로 게시 된 링크에서 가져 왔습니다 .

Postgres 9.x에는 요청 된 작업을 수행 할 수있는 기능이있는 것으로 보입니다. 다음의 데이터베이스 오브젝트에 부여 단락을 참조하십시오.

http://www.postgresql.org/docs/current/interactive/sql-grant.html

"하나 이상의 스키마 내에서 동일한 유형의 모든 개체에 대한 권한을 부여하는 옵션도 있습니다.이 기능은 현재 테이블, 시퀀스 및 함수에 대해서만 지원됩니다. 그러나 모든 테이블에는 뷰가 포함되어 있습니다. 외래 테이블). "

이 페이지는 또한 "모든 PRIVILEGES"라는 ROLE 및 PRIVILEGE 사용에 대해 설명합니다.

GRANT 기능이 SQL 표준과 비교되는 방법에 대한 정보도 제공됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.