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


15

クイックバージョン:

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


長いバージョン:

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資格情報で)接続すると、テーブルを作成します(したがって、所有します)。

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

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

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権限が必要です。


私はこれをやろうとしました。私は元の質問でこれを不適切に言いました。私が実行していたコマンドを正確に示すように編集しました。何かおかしくなりましたか?
アンディデイビス14

に作成されテーブルにのみ影響しALTERます。いつやったの?既存のテーブルの場合、GRANT権限が必要です。
クレイグリンガー14

デフォルトの特権を変更してから、テーブルを作成しました。もう一度試してみますが、おそらく間違いを犯しました。
アンディデイビス14

まだ問題はありませんが、問題を解決するコマンドのように思えます。コマンドを更新して、いずれかのテーブルの\ ddpおよび\ dpからの出力を含めました。
アンディデイビス14

ひどく奇妙だ。通常の(非RDS)PostgreSQLで問題を再現できますか?
クレイグリンガー14

0

パブリックスキーマは、すべてのユーザーに表示されることになっています。パブリックスキーマの権利を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)

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


え?A GRANTは決してアクセス権を減らすことはできません。私は確信していません。スキーマの権限は、そのスキーマの新しいテーブルにも継承されないため、publicスキーマにアクセスできるということは、スキーマ内でテーブルを使用できることを意味しないことに注意してください。
クレイグリンガー14

私はついにこれを試してみましたが、状況を改善することはできません。
アンディデイビス14

私は質問を編集して、@ Aleandrosが言及していたグラントを削除しました。それは問題ではないように見えましたが、気が散ることだと思います。
アンディデイビス14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.