これは同一の権限を複数のロールでまとめて扱いたいときに便利です。 ここでいう権限とは「データベース全体に対する権限」の方です。 What is going on with this article? PostgreSQLでの権限の操作を行うにはまずロールという概念を知る必要があります。, ロールとは、簡単に言えばユーザーのようなもので「データベース全体に対する権限」と「オブジェクトに対する権限」の2通りの権限を持ちます。 データベースユーザのパスワードを変更するには、次のように psql コマンドのオプションでデータベース template1 を指定するか、 # psql -U postgres template1. Help us understand the problem. 権限を与えられたユーザが、所有者と同様に他のユーザに権限を付与することが可能になります。 付与や剥奪ができます。しかし"with grant option"を付けることで、 権限の付与と同じく、グループも権限とみなして同じコマンドを使います。, これでtestuserは直接sampleテーブルへのSELECT権限を持ちませんが、testgroupロールを通して権限を持てるようになりました。 なんならユーザーとグループにも明確な違いはありません(グループも別のグループに所属できるため)。, まずtestgroupロールを作成し、そこにsampleテーブルへのSELECT権限を付与します。, そしてtestuserロールをtestgroupロールに所属させます。 ロールのグループへの所属はGRANTコマンドで行います。 これがないとSELECTだけGRANTしても使用できません。 -----------+------------------------------------------------------------+-----------, --------+--------+-------+-------------------+-------------------+----------, --------+--------+-------+---------------------------+-------------------+----------, -----------+------------------------------------------------------------+-------------, -- publicスキーマのテーブルにデフォルトでtestuserロールへのSELECT権限を付与する, -- testuserロールに対してusernameがtestuserのような行のみアクセスできるようにポリシーを作成, -- testuserロールでログインして取得。username=testuserの行のみ取得されている, https://www.postgresql.jp/document/11/html/sql-createrole.html, https://www.postgresql.jp/document/11/html/sql-alterrole.html, https://www.postgresql.jp/document/11/html/sql-grant.html, https://www.postgresql.jp/document/11/html/sql-revoke.html, https://www.postgresql.jp/document/11/html/sql-alterdefaultprivileges.html, https://www.postgresql.jp/document/11/html/ddl-rowsecurity.html, LOGIN:ログインすることができる(権限がなければCannot loginと表示される), INHERIT:グループからの権限の継承を行う(権限がなければNo inheritanceと表示される), you can read useful information later efficiently. you can read useful information later efficiently. デフォルトでは、オブジェクトの所有者のみがオブジェクトに対して操作を行うことができます。 \dコマンドでテーブルの存在は確認することができます。 https://www.postgresql.jp/document/11/html/sql-createrole.html なのでロールとユーザーはイコールではなく、ロールというくくりの中にユーザーとグループがいることになります。, \duコマンドで出てきたAttributesがロールに付与されている権限の属性です。 ALTERコマンドを使用してください。, 権限を割り当てるには、GRANTコマンドを使用します。 以降の節および章でもこれらの権限の使用方法についての説明があります。, 注意: テーブル、インデックス、シーケンスまたはビューの所有者を変更するには、 詳細は公式ページをご確認ください。 ALTER TABLEコマンドを使用してください。他のオブジェクト型については PostgreSQL内でユーザ名やパスワードの生成、変更の仕方をまとめたいと思います。 postgres ユーザーにログイン. (しかし、スーパーユーザ属性を持つユーザはいつでも、どのようなオブジェクトにでもアクセスできます)。, 権限にはいくつかの種類があります。 PostgreSQLでの権限の操作を行うにはまずロールという概念を知る必要があります。 ロールとは、簡単に言えばユーザーのようなもので「データベース全体に対する権限」と「オブジェクトに対する権限」の2通りの権限を持ちます。 コマンドにpsql -U postgresと入力するとpostgres のパスワードを求められますのでパスワードを入れましょう。, ユーザーを生成する際にはCREATE ROLEを用います。今回はユーザー:user01,パスワード:pass01と設定してみます。コードはCREATE ROLE {ユーザー名} WITH PASSWORD '{パスワード}';となります。#内では最後に;をつけるのを忘れないようにします。, そして生成したユーザーはデーターベースに接続できるようにログイン権限を持たせます。ALTER ROLEを用います。コードはALTER ROLE {ユーザー名} LOGIN;となります。, ユーザー一覧を表示するには/duを入力します。そうすると一覧を表示することができます。, パスワードの変更もALTER ROLEを用います。コードは`ALTER ROLE {ユーザー名} WITH PASSWORD '{新しいパスワード}';となります。今回は先ほど作ったユーザ名:user01のパスワードをword01に変えてみます。, これで変更することができました。 https://www.postgresql.jp/document/11/html/sql-alterdefaultprivileges.html, テーブル単位よりさらに細かく行レベルでアクセス権を設定することもできます。 しかしオブジェクト所有者は、テーブルを他のユーザ同様に自分自身に対しても読み取り専用にしたい時などに、自分の通常の権限を取り消すことができます。, 普通はオブジェクトの所有者(またはスーパーユーザ)は、オブジェクトにおける権限の Why not register and get more from Qiita? 通常、データベースのログインに使用しているのもこのロールです。, なぜ、ユーザーといわず、あえてロールかというと、ロールにはユーザーとグループという概念が内包されているからです。 また、"グループ"ロールを使用すれば、データベース内に多くのユーザが存在する場合に権限の管理が簡単になります。 もし後になってグラントオプションが剥奪されると、剥奪されたユーザから(直接もしくは権限付与の連鎖により)権限を与えられていたユーザは全て、その権限が剥奪されます。 https://www.postgresql.jp/document/11/html/ddl-rowsecurity.html. はじめの方でも述べましたが、ユーザー・グループはロールに内包される概念であり、厳密な設定でロールと異なるわけではありません。 https://www.postgresql.jp/document/11/html/sql-alterrole.html, なおLOGIN権限については次のように書くことでデフォルトLOGIN権限ありのロールとすることもできます。, 先程は「データベース全体に対する権限」でしたが、次に「オブジェクトに対する権限」を見ていきます。 ユーザーもグループもどちらもロールとして作られるものですが、ユーザーはグループに属し、グループの権限を継承することができます。 PostgreSQL内でユーザ名やパスワードの生成、変更の仕方をまとめたいと思います。, まず、postgres ユーザーにログインします。 まず、postgres ユーザーにログインします。 コマンドにpsql -U postgresと入力するとpostgres のパスワードを求められますのでパスワードを入れましょう。 存在自体知らせたくないテーブルの場合、データベースを別にするなどの対策が必要です。, このテーブルを取得できるようにするには次のようにtestuserロールに権限の付与をする必要があります。 What is going on with this article? オブジェクトに対する権限とは、テーブルや関数に関する権限のことです。, 確認の前に試しにsampleテーブルを作成して、先程作ったtestuserロールでの権限がどうなっているか確認してみます。, testuserでログインしてsampleテーブルを取得しようとしますが権限がなく取得できないことがわかります。, 注意点として、権限がないと言ってもデータベースにアクセスできている時点でテーブルの存在自体は隠せません。 Why not register and get more from Qiita? 初期ユーザーであるpostgresに対しても、同様に ALTER ROLEを用いてパスワードを変更することができます。, PostgreSQLにおけるユーザの生成、またパスワード変更の行い方についてまとめました。参考になればいいなと思います。. GRANT コマンドを使用することでロールに対して権限を追加することができます。目的ごとにいくつかの書式が用意されています。 色々ありますが、基本は下記の通りです。 「権限」は対象によって異なりますが、簡単に記載すると次の通りです。 「対象」はテーブル、テーブルのカラム、データベース、スキーマ、などです。 「誰に」はロール名を指定します。現在のユーザーを表す CURRENT_USER や現在のセッションユーザーを表す SESSION_USER も指定できます。また PUBLIC を指定した場合にはす … その手間を防ぐためにALTER DEFAULT PRIVILEGESコマンドというデフォルトのアクセス権限を定義するコマンドが用意されています。, なお、今後追加されるテーブルにデフォルトで権限が付与されるだけで、現在存在するテーブルに権限が付与されるわけではないので注意してください。 この権限の主な目的は、どのユーザがある型への依存関係を作ることができるかを制御し、後で所有者がこの型を変更するのを防ぐためです。 外部データラッパーに対しては、その外部データラッパーを使って新しいサーバを作ることを許可します。 これでSELECTはできるようになりましたが、INSERT, UPDATE, DELETEなどはできません。 代表的なものをいくつか軽く解説します。, その他の属性については下記のCREATE ROLEとALTER ROLEについての公式ページでご確認ください。 なお、権限が継承されるのはロールにINHERIT属性がデフォルトでついているからであり、NOINHERIT属性になっている場合は権限が継承されません。, また、\duコマンドで調べるとtestuserロールがtestgroupロールのメンバーであることがわかります。, これまでのようにロールにテーブルへの権限を設定したとしても、新規テーブルが作成されたら新たに権限設定をしなくてはなりません。 他のユーザがこのオブジェクトを使用するには、権限が付与されていなければなりません これはテーブルに対してではなくスキーマに対してなので上述のGRANT ALL ON ALL TABLESでも付与されないことに注意が必要です。, その他詳細はGRANTコマンドの公式ページでご確認ください。 詳細は、GRANTとREVOKEを参照してください。. https://www.postgresql.jp/document/11/html/sql-grant.html, オブジェクトの権限の削除はREVOKEで行います。 GRANTではTO ロール名だったのが、FROM ロール名になっていることに注意してください。, その他詳細はREVOKEコマンドの公式ページでご確認ください。 例えば、joeという既存のユーザとaccountsという既存のテーブルがある場合、このテーブルを更新する権限を付与するには以下のようにします。, 特定の権限名を指定する代わりにALLを指定すると、そのオブジェクト型に関連する全ての権限が付与されます。, システム内の全てのユーザに権限を付与するには、特別な"ユーザ"名であるPUBLICを使用することができます。 データベースオブジェクトを作成すると、作成者はその所有者となります。 PostgreSQL がサポートする様々な権限の詳細についてはGRANTリファレンスページを参照してください。 ロールにはpublicスキーマのUSAGE権限は最初から付与されていますが、それ以外のスキーマには新たに渡して上げる必要があります。 # パスワードの設定・変更. PostgreSQLのロールとは、ユーザやグループがデータベースへアクセスすることを管理するための仕組みだ。ロールには名前が付けられ、データベース・オブジェクト(テーブルや関数など)を所有し、他のロールからのアクセスを制限する権限を持つ。オペレーティング・システムのユーザとは完全に独立したものだ。 最初にPostgreSQL が立ち上がるとpostgresという名前のロールが作成されている。このロールは何でもできるスーパーユーザだ。それで、postgresという名前のロールから他のロールに与え … By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. 特定のオブジェクトに適用する特権は、オブジェクトの型(テーブル、関数など)により変わります。 https://www.postgresql.jp/document/11/html/sql-revoke.html, これまではユーザーしか扱わなかったですが、このユーザーをグループに所属させてみます。 By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. \dpコマンドで見ると下記のようになっています。, これらの権限は一度にすべて指定できたり、テーブルもスキーマ内のテーブルすべてに指定できたりします。, そのオブジェクトを使用できるかの権限です。 すなわちSELECT、 INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、CREATE、CONNECT、TEMPORARY、 EXECUTE、USAGEです。 詳細は第19章を参照してください。. REVOKE command: オブジェクト所有者の特別の権限(DROP、GRANT、REVOKEを行う権限など)は、所有者であることを前提とした権限なので、付与したり取り消したりすることはできません。 これを行セキュリティポリシー、行単位セキュリティなどと呼びます。, 行セキュリティポリシーの詳細 権限を取り消すにはREVOKEコマンドを使用します。 PostgreSQL がサポートする様々な権限の詳細についてはGRANTリファレンスページを参照してください。 以降の節および章でもこれらの権限の使用方法についての説明があります。 オブジェクトの変更や削除の権限は常に所有者のみに与えられるものです。 権限の付与にはGRANTコマンドを使用します。, 指定の権限の種類を、指定オブジェクト上に、指定ロールに付与すると英語的に指定できます。 Help us understand the problem.