Amazon Redshift에서 새로 생성한 객체에 권한을 부여하려면 어떻게 해야 하나요?

3분 분량
0

사용자가 새로 만든 객체에 대해 권한 거부 오류를 받았습니다. 스키마에서 새로 생성된 객체에 액세스하는 데 필요한 권한을 사용자에게 부여하려면 어떻게 해야 하나요?

간략한 설명

사용자가 스키마에서 새로 생성된 객체에 액세스하려면 superuser가 객체에 권한을 부여해야 합니다.

사용자가 스키마에서 새로 만든 객체에 액세스할 수 없는 경우 다음 오류가 발생할 수 있습니다.

ERROR: permission denied for relation “objectname”.

이 오류는 액세스 권한이 부여되었을 때 스키마에 있는 현재 객체에 대해서만 액세스 권한이 부여될 때 발생합니다. 기본적으로 스키마에서 생성되는 향후 객체에는 액세스 권한이 자동으로 부여되지 않습니다.

이 문제를 해결하려면 ALTER DEFAULT PRIVILEGES 명령을 사용하여 사용자에게 액세스 권한을 부여하세요.

해결 방법

스키마의 현재 및 향후 테이블에 대한 권한을 부여하려면 superuser로서 다음단계를 따르세요.

1.    스키마에 대한 사용 액세스 권한을 부여하고 현재 스키마에 있는 모든 테이블에 SELECT 액세스 권한을 부여하려면 다음 명령을 실행합니다.
참고: newtestschema를 스키마의 이름으로 바꾸고 newtestuser를 사용자 이름으로 바꾸세요.

grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;

2.    스키마에서 생성된 향후 테이블에 대해 사용자에게 SELECT 액세스 권한을 부여하려면 다음 명령을 실행하세요. 참고: awsuser를 스키마에서 향후 객체를 생성하는 데 사용되는 사용자 이름으로, newtestschema를 스키마 이름으로, newtestuser를 향후 객체에 액세스해야 하는 사용자 이름으로 바꾸세요.

alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

참고: 기본 권한은 새 객체에만 적용됩니다. ALTER DEFAULT PRIVILEGES를 실행해도 기존 객체에 대한 권한은 변경되지 않습니다.

3.    사용자에게 기본 권한이 부여되었는지 확인하려면 다음 쿼리를 superuser로 실행합니다.

select pg_get_userbyid(d.defacluser) as user, 
n.nspname as schema, 
case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end 
as object_type, 
array_to_string(d.defaclacl, ' + ')  as default_privileges 
from pg_catalog.pg_default_acl d 
left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;

접근 권한이 있는 경우 default_privileges 열 아래에 해당 사용자에 대한 항목이 표시됩니다.

이제 superuser가 스키마에서 새 객체를 생성할 때 사용자는 테이블에 대한 SELECT 액세스 권한을 갖게 됩니다.

예시

다음 예시는 이 구성으로 시작합니다.

  • superuser가 아닌 newtestuser라는 이름의 사용자입니다.
  • 몇 개의 레코드가 있는 스키마 아래에 newtestschema라는 스키마와 newtesttable1이라는 테이블 하나가 있습니다.

awsuser라는 superuser는 다음 예시 명령을 사용하여 newtestschema 스키마와 현재 해당 스키마에 있는 모든 테이블의 newtestuser에 대한 액세스 권한을 부여합니다.

grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;

이전 명령은newtestusernewtestschema에 있는 현재 테이블에 대한 SELECT 액세스 권한을 부여합니다. 현재는 newtesttable1 테이블만 newtestschema에 있습니다. newtesttable1 테이블은 newtestuser가 액세스할 수 있습니다.

다음으로, awsusernewtestschema에서 newtesttable2라는 이름의 다른 테이블을 만듭니다. newtestusernewtestschema.newtesttable2 테이블에서 SELECT 쿼리를 실행하면 다음 오류가 표시됩니다.

ERROR: permission denied for relation newtesttable2.

오류를 해결하기 위해 awsuser는 다음을 수행합니다.

1.    다음 예시 명령을 실행하여 newtesttable2 테이블에 대한 액세스 권한을 부여합니다.

grant select on table newtestschema.newtesttable2 to newtestuser;

2.    다음 예시 명령을 실행하여 newtestschema에서 awsuser가 향후 생성하는 모든 테이블에서 newtestuser에 대한 액세스 권한을 부여합니다.

alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;

이제 awsusernewtesttable3이라는 새 테이블을 생성할 때 newtestschema에서 newtestusernewtesttable3에 대해 SELECT 액세스 권한을 갖게 됩니다.

3.    newtestuser에게 기본 권한이 부여되었는지 확인하기 위해 awsuser는 다음 쿼리를 실행합니다.

select pg_get_userbyid(d.defacluser) as user, 
n.nspname as schema, 
case d.defaclobjtype when 'r' then 'tables' when 'f' then 'functions' end 
as object_type, 
array_to_string(d.defaclacl, ' + ')  as default_privileges 
from pg_catalog.pg_default_acl d 
left join pg_catalog.pg_namespace n on n.oid = d.defaclnamespace;

이전 쿼리의 결과는 다음과 비슷합니다.

user    | schema    | object_type    | default_privileges
awsuser | newtestschema    | tables    | newtestuser=r/awsuser

결과는 awsusernewtestschema에서 awsuser가 생성한 모든 새 테이블에 대해 newtestuserSELECT 권한을 부여하는 것을 보여줍니다.


관련 정보

PG_DEFAULT_ACL

AWS 공식
AWS 공식업데이트됨 2년 전
댓글 없음

관련 콘텐츠