PostgreSQL:リレーションの許可が拒否されました


14

PostgreSQLで権限を設定することについて少し混乱しています。

私にはこれらの役割があります:

                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 admin     | Superuser, Create role, Create DB, Replication | {}
 meltemi   | Create role, Create DB                         | {rails}
 rails     | Create DB, Cannot login                        | {}
 myapp     |                                                | {rails}

およびデータベース:

                                    List of databases
        Name         | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
---------------------+--------+----------+-------------+-------------+-------------------
 myapp_production    | rails  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ...

ユーザーmyappは、myapp_productionレコードの追加と削除をデータベースにクエリしても問題ありません。私meltemiも同じデータベースを照会できるようにしたいと思います。そこで、railsデータベースを所有するロールを作成し、の両方meltemiとのmyappメンバーを作成しましたrails。しかし、それでもpermission denied for relationエラーが発生します。Meltemiスキーマを表示できますが、DBをクエリできません。

私はテーブルの所有者であることに気付いた(\dtコマンドで)myapp

             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | events            | table | myapp
 public | schema_migrations | table | myapp
 ...
 public | users             | table | myapp
 ...

テーブルはORM(RailsのActiveRecordの移行)を介して作成されました。

(MySQLや私が使用した他のものとは対照的に)PostgreSQLでは承認が非常に異なることを知っています。さまざまなユーザーがアクセスできるようにデータベースを設定するにはどうすればよいですか。いくつかはCRUDできるはずですが、他の人は読み取りなどしかできないかもしれません...

助けてくれてありがとう。申し訳ありませんが、これは非常に基本的な質問ですが、自分で答えを見つけることができませんでした。

回答:


4

これについては、ServerFaultの別のユーザーpostgresqlデータベースの権限付与するという回答で書きました。

基本的に、単一のユーザーがいて、他のユーザーに同じ権限を付与する場合の最適なソリューションは、そのユーザーをグループに変換し、グループのメンバーである元のユーザーと同じ名前で新しいユーザーを作成することです。そのグループを他のユーザーにも許可します。

そのため、あなたの場合、rails名前をsay myapp_usersに変更し、railsand という名前の新しいログインロール(ユーザー)を作成しますGRANT myapp_users TO rails。今あなたGRANT myapp_users TO meltemi。これで、新しいrailsアカウントとmeltemiユーザーの両方が古いrailsアカウントの権限を持ちます。

よりきめ細かな制御を行うために、通常は、日々のログインユーザーまたはそのグループにテーブルの所有権を与えないようにすることをお勧めします。DDLやs などの特権操作には、まったく異なるユーザーをNOINHERIT明示的SET GROUPに使用するか、より適切に使用する必要があるグループを介してアクセス権を付与しGRANTます。残念ながら、これはRailsでは機能しません。Railsは、必要に応じて移行を適用することを好み、AFAIKでは、移行を実行する別のより特権のあるユーザーを指定する機能を提供しないためです。


OK、リンクした投稿を読んでください。非常に役立ちます!今、私が物事を正しく理解しているなら、私はあなたが上記のmyapp代わりに使用するつもりだったと思うrailsmyappテーブルを所有しているため(指定しなかったため、移行が必要です)。とにかく、名前を変更してmyappから、railsアプリがDBに接続するために使用myapp_groupする新しいユーザーmyappを作成した場合、それはかなり理にかなっています。Make myappと、既存のmeltemi、両方のmyapp_group役割のメンバー。しかし、次の移行を実行するとどうなりますか。myappもう一度問題を再現することによって所有されるのではないでしょうか?!?
メルテミ

1
PostgreSQLにはroles(バージョン8.1以降)のみがあることを理解する必要があります。用語usergroupは、歴史的な理由と互換性のために残されています。基本的に「グループ」とは、ログイン特権のないロールです。あなたは付与することができますmyappmeltemiしてもmyappちょうど別の「ユーザー」です。ここからマニュアルを読むことから始めてください
アーウィンブランドステッター

I DOは理解rolesgroupsusers少なくとも私は、Postgresの中での分離と思います私は。上記の間違った(そして混乱を招く)用語を使用して申し訳ありません。しかし、データベースをセットアップする方法がまだわからないため、ログインなしのロールがデータベースと2つのログインロールmyappを所有し、meltemi両方が完全なアクセス権を持つことができます。これらのロールの1つは、必然的に、ログインユーザーが所有する新しいテーブルを作成するRails移行myapp実行します。私はただ「メンバー」を作り、それでやるべきですか?しかし、それはただ気が狂ったように見えます...いいえ?!?myappmeltemimyapp
メルテミ

1
@Meltemi:がmyapp保持するすべての特権を付与する場合meltemi、それは正しいことです。meltemi特権のサブセットのみを取得したい場合、取得しません。次に、一連の特権を保持するグループロールを作成し、それをに付与しmeltemiます。SOに関するこの関連の質問におそらく興味があるでしょう。私が説明する答えDEFAULT PRIVILEGES
アーウィンBrandstetter

@Meltemiはい、通常のRailsの移行は状況を複雑にします。Railsでは、移行を実行する別のユーザーアカウントを実際に指定する必要があります。SET ROLE移行の開始とRESET ROLE終了にコマンドを追加することもできますが、Railsがすべてを適切に順番に実行するとは思わないでしょう。アーウィンの権利。この場合、GRANT1番目のユーザーを2番目のグループとして使用して、ユーザーレールが他のユーザーに所有権を付与することが最善の回避策になります。
クレイグリンガー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.