web-dev-qa-db-ja.com

データベース所有者の権限。アプリケーションユーザー

クイックバージョン:

データベース所有者がこのデータベース内のテーブルにアクセスできるようにするには、どのコマンドを発行すればよいですか?これは、その所有者のアカウントから実行できますか?


長いバージョン:

RDSでデータベースを作成しています。 Amazonで設定した「root」ユーザーがいます。

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資格情報を使用して)接続すると、テーブルが作成されます(つまり、所有されます)。

私の問題は、そのユーザーにはテーブルに対する権限がないため、管理(rootish)ログインを使用してクエリを実行できないことです。

これは、アプリケーションアカウントから次のコマンドを実行することで解決できました。

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

しかし、従属ユーザーに管理ユーザーに特権を付与するのはおかしいようです。

それで...データベースの所有者がデータベース内のテーブルにアクセスできることを保証するアプリケーションからテーブルを作成する前または後に実行できるコマンドはありますか?


alter default privilegs ...を再試行した後に更新...

これはまだテーブルへのアクセスを許可しません。私はそれが他の場所で提案されているのを見て、それは完全に理にかなっていますが、それは私のために働いていません。 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アカウントからのみ発生させる方法です)。

私は彼らにこれを明確にするように頼み、彼らは立ち去った。

15
Andy Davis

あなたが欲しい ALTER DEFAULT PRIVILEGES

rds_superuserすべての新しいテーブルへのデフォルトのアクセス権。

これは、ALTERの後に作成されたテーブルにのみ影響します。既存のテーブルについては、GRANT権限が必要です。

9
Craig Ringer

パブリックスキーマは、すべてのユーザーが表示できるようになっています。パブリックスキーマの権限を1つのグループだけに制限しないでください。

したがって、使用しない場合:

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)

あなたがそれをしようとするとき、逆ではありません。

0
Alexandros