Amazon RDS PostgreSQL DB 인스턴스의 퍼블릭 스키마에 대한 액세스를 취소하려고 할 때 ‘no privileges be revoked for "public"’이라는 경고 메시지를 해결하려면 어떻게 해야 합니까?

3분 분량
0

Amazon Relational Database Service(Amazon RDS) PostgreSQL DB 인스턴스에서 REVOKE CREATE ON SCHEMA public FROM PUBLIC을 실행하려고 합니다. 하지만 "no privileges be revoked for "public"("퍼블릭"에 대해 권한을 취소할 수 없음)"이라는 경고 메시지가 표시됩니다. 이 경고 메시지를 해결하려면 어떻게 해야 합니까?

간략한 설명

기본적으로 사용자는 자신이 소유하지 않은 스키마의 객체에 액세스할 수 없습니다. 스키마 내에 있는 객체를 사용하려면 해당 스키마에 대한 USAGE 권한이 사용자에게 부여되어야 합니다. 마찬가지로 객체를 생성하려면 해당 스키마에 대한 CREATE 권한이 부여되어야 합니다. 하지만 모든 사용자에게는 퍼블릭 스키마에 대한 CREATE 및 USAGE 권한이 있으므로 데이터베이스에 연결할 수 있는 사용자에게는 데이터베이스의 퍼블릭 스키마에서 객체를 생성할 권한이 있습니다. 모든 사용자가 퍼블릭 스키마에서 객체를 생성하지는 못하도록 하려면 이 권한을 취소하십시오.

REVOKE CREATE ON SCHEMA public FROM PUBLIC;

참고: 이 명령에서 public은 스키마이고 PUBLIC은 모든 사용자를 의미합니다. 즉, public은 식별자이고 PUBLIC은 키워드입니다.

Amazon RDS PostgreSQL DB 인스턴스의 퍼블릭 스키마에 대한 CREATE 권한을 취소하면 "no privileges be revoked for "public"("퍼블릭"에 대해 권한을 취소할 수 없음)"이라는 경고 메시지가 나타날 수 있습니다. 일반적으로 이 경고 메시지는 연결되어 있는 데이터베이스의 퍼블릭 스키마 소유자가 데이터베이스 소유자가 아니라 rdsadmin인 경우 RDS DB 인스턴스에 표시됩니다. 대개 기본값인 template1 대신 template0을 사용하여 데이터베이스를 생성할 때 퍼블릭 스키마의 소유자가 rdsadmin이 됩니다. 자세한 내용은 템플릿 데이터베이스에 대한 PostgreSQL 문서를 참조하십시오.

Amazon RDS PostgreSQL에서 데이터베이스 template0의 소유자는 rdsadmin이고, template1의 소유자는 마스터 사용자입니다. template0을 사용하여 데이터베이스를 생성하는 경우 마스터 사용자 또는 데이터베이스 소유자가 아니라 rdsadmin가 퍼블릭 스키마를 소유합니다. template0을 사용하여 생성된 다음 예제 데이터베이스를 참조하십시오.

testpg=> create database tmp0 template template0;
CREATE DATABASE
tmp0=> SELECT n.nspname AS "Name",
  pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
ORDER BY 1;
List of schemas
Name  |  Owner   
--------+----------
public | rdsadmin
(1 row)

소유자가 rdsadmin이므로 REVOKE 명령을 실행하면 경고 메시지가 반환됩니다.

tmp0=> REVOKE CREATE ON SCHEMA public FROM PUBLIC;
WARNING:  no privileges could be revoked for "public"
REVOKE

해결 방법

1.    퍼블릭 스키마의 소유자를 변경합니다.

ALTER SCHEMA public OWNER TO user1;

참고: 이 예제 명령에서 user1은 데이터베이스 소유자입니다.

2.    소유권이 변경되었는지 확인합니다.

SELECT n.nspname AS "Name",
  pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
ORDER BY 1;
List of schemas
Name  |  Owner   
--------+----------
public | user1
(1 row)

3.    데이터베이스를 소유한 사용자 이름(user1)을 사용하여 데이터베이스 내에서 취소 명령을 실행합니다.

REVOKE CREATE ON SCHEMA public FROM PUBLIC;

관련 정보

퍼블릭 스키마에 대한 PostgreSQL 설명서

Amazon RDS의 PostgreSQL

AWS 공식
AWS 공식업데이트됨 3년 전