데이터베이스 소유자를위한 특권; 응용 프로그램 사용자


15

빠른 버전 :

데이터베이스 소유자가이 데이터베이스의 테이블에 액세스 할 수 있도록하려면 어떤 명령을 실행해야하며 해당 소유자의 계정에서 수행 할 수 있습니까?


더 긴 버전 :

RDS에서 데이터베이스를 작성 중입니다. Amazon으로 구성한 '루트'사용자가 있습니다.

Amazon은 매우 권한이 있지만 실제로는 수퍼 유저가 아닌 그룹 역할 'rds_superuser'를 자동으로 생성합니다.

다음과 같이 응용 프로그램의 데이터베이스와 사용자를 만들고 있습니다.

create database master_integration;
CREATE ROLE master_application LOGIN ENCRYPTED PASSWORD '...' VALID UNTIL 'infinity';
GRANT ALL ON DATABASE master_integration TO GROUP rds_superuser WITH GRANT OPTION;
GRANT ALL ON DATABASE master_integration TO GROUP master_application;

\c master_integration;
ALTER DEFAULT PRIVILEGES GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO rds_superuser;

Craig Ringer가이 문제를 어떻게 처리해야하는지 제안하기 위해이 스크립트를 업데이트했습니다.

앱이 master_application 자격 증명으로 연결되면 테이블이 만들어 지므로 소유합니다.

내 문제는 사용자에게 테이블에 대한 권한이 없기 때문에 관리 (루트) 로그인을 사용하여 쿼리를 실행할 수 없다는 것입니다.

응용 프로그램 계정에서 다음을 실행 하여이 문제를 해결할 수있었습니다.

GRANT ALL privileges ON ALL TABLES IN SCHEMA public to rds_superuser;

그러나 하위 사용자 권한을 관리자에게 다시 부여하는 것은 해킹적인 것 같습니다.

그래서 ... 데이터베이스 소유자가 데이터베이스 내의 테이블에 액세스 할 수 있도록 응용 프로그램에서 테이블을 만들기 전후에 실행할 수있는 명령이 있습니까?


기본 권한 변경을 다시 시도한 후 업데이트 ...

이것은 여전히 ​​테이블에 대한 액세스 권한을 부여하지 않습니다. 나는 그것이 다른 곳에서 제안되는 것을 보았고 완전히 의미가 있지만 그것은 나를 위해 작동하지 않습니다. psql 쉘에서 :

master_integration=> \ddp
                           Default access privileges
      Owner       | Schema | Type  |             Access privileges             
------------------+--------+-------+-------------------------------------------
 integration_root |        | table | integration_root=arwdDxt/integration_root+
                  |        |       | rds_superuser=arwdDxt/integration_root
(1 row)

master_integration=> \dp users
                           Access privileges
 Schema | Name  | Type  | Access privileges | Column access privileges 
--------+-------+-------+-------------------+--------------------------
 public | users | table |                   | 
(1 row)

integration_root는 수퍼 유저 사용자이며 users는 내 데이터베이스 내의 테이블입니다.


최신 정보

아마존의 누군가로부터 상당히 쓸모없는 답변을 받았습니다.

그들은 master_application 로그인에서 ALTER DEFAULT PRIVILEGES를 호출하도록 요청했습니다. 이것은 아마도 효과가 있지만 내 질문에 대답하지는 않습니다 (rds_superuser 계정에서만이 작업을 수행하는 방법입니다).

나는 이것을 명확히 해달라고 요청했다.

답변:


9

당신은 원합니다 ALTER DEFAULT PRIVILEGES.

rds_superuser모든 새 테이블에 기본 액세스 권한을 부여하십시오 .

이것은 이후에 생성 된 테이블에만 영향을줍니다 ALTER. 기존 테이블의 경우 GRANT권한 이 있어야합니다 .


나는 이것을 시도했다. 나는 원래 질문에서 이것을 잘못 말했고, 내가 실행중인 명령을 정확하게 표시하도록 편집했습니다. 내가 뭔가 잘못 받았 니?
앤디 데이비스

다음 에 생성 테이블에만 영향을줍니다 ALTER. 언제 했어요? 기존 테이블의 경우 GRANT권한 이 있어야합니다 .
Craig Ringer

기본 개인 정보를 변경 한 다음 테이블을 작성했습니다. 다시 시도 할 것입니다. 아마 실수했을 것입니다.
Andy Davis

문제를 해결 해야하는 명령처럼 보이지만 여전히 운이 없습니다. 표 중 하나의 \ ddp 및 \ dp의 출력을 포함하도록 명령을 업데이트했습니다.
Andy Davis

엄청 이상해 RDS가 ​​아닌 일반 PostgreSQL에서 문제를 재현 할 수 있습니까?
Craig Ringer

0

공개 스키마는 모든 사용자가 볼 수 있어야합니다. 공용 스키마의 권한을 하나의 그룹으로 제한해서는 안됩니다.

따라서 사용하지 않으면 :

GRANT ALL ON SCHEMA public TO GROUP rds_superuser WITH GRANT OPTION;

모든 계정으로 공개 스키마를 안전하게 사용할 수 있습니다.

특정 계정으로 퍼블릭 스키마 테이블을 엉망으로 만들지 않으려면 앱 사용자를 위해 새 역할을 생성하고 퍼블릭 스키마 내에서이 특정 역할의 권한을 취소하십시오. 다음과 같은 것 :

CREATE USER mywebuser WITH PASSWORD '*****';
REVOKE ALL PRIVILEGES ON SCHEMA public FROM mywebuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mywebuser; (or whatever rights you need to provide)

당신이 그것을하려고 할 때 다른 방법은 아닙니다.


응? A GRANT는 액세스 권한 을 줄일 수 없어야합니다 . 나는 확신하지 못한다. 스키마에 대한 권한도 해당 스키마의 새 테이블로 상속 public되지 않으므로 스키마에 액세스한다고해서 스키마 내에서 테이블을 사용할 수있는 것은 아닙니다.
Craig Ringer

나는 마침내 이것을 시험해 보았고 상황에 도움이되지 않습니다.
Andy Davis

@Aleandros가 언급 한 그랜트를 제거하기 위해 질문을 편집했습니다. 문제가 아닌 것 같지만, 산만하다고 생각합니다.
Andy Davis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.