データベースロールは、権限を定義し、クライアント認証システムと相互作用する数多くの属性を持つことができます。
LOGIN
属性を持つロールのみがデータベース接続の初期ロール名として使用できます。
LOGIN
属性を持つロールは「データベースユーザ」と同じであるとみなすことができます。
ログイン権限を持つロールの作成方法は、以下のいずれかです。
CREATE ROLEname
LOGIN; CREATE USERname
;
(CREATE USER
はデフォルトで LOGIN
を持ち、CREATE ROLE
は持たないという点を除き、CREATE USER
はCREATE ROLE
と同じです。)
ログイン権限を除き、データベーススーパーユーザに対する権限検査は全て行われません。
これは危険な権限ですので、安易に使用してはいけません。
作業のほとんどを非スーパーユーザのロールで行うことが最善です。
新しいデータベーススーパーユーザを作成するには、CREATE ROLE
を使用してください。
これはスーパーユーザのロールで実行しなければなりません。
name
SUPERUSER
(全ての権限検査が行われないスーパーユーザを除き)ロールに明示的にデータベースを作成するための権限を指定しておかねばいけません。
そのようなロールを作るためにはCREATE ROLE
を使用してください。
name
CREATEDB
あるロールがロールを作成するには、明示的な権限が付与されていなければなりません。
(スーパーユーザは、すべての権限検査を迂回しますので、例外です。)
こうしたロールを作成するには、CREATE ROLE
を使用してください。
name
CREATEROLECREATEROLE
権限を持つロールは、ADMIN
オプションを持つCREATEROLE
ユーザのロールを変更したり削除したりすることもできます。
そのような権限付与は、スーパーユーザではないCREATEROLE
ユーザが新しいロールを作った時に自動的に行われ、CREATEROLE
ユーザが、作成したロールを変更したり削除できるようになります。
ロールの変更には、たとえばパスワードの変更などを含む、ALTER ROLE
を使って実行できるほとんどの変更が含まれます。
また、COMMENT
とSECURITY LABEL
コマンドを使って実行できるロールの変更も含まれます。
しかし、CREATEROLE
では、SUPERUSER
ロールを作成する能力は移譲されませんし、既存のSUPERUSER
ロールに対する権限も移譲されません。
さらに、CREATEROLE
では、REPLICATION
ユーザを作成する機能も、REPLICATION
権限を付与または取り消す能力も、そのようなユーザのロール属性を変更する能力も移譲されません。
ただし、REPLICATION
ロールでのALTER ROLE ... SET
およびALTER ROLE ... RENAME
の使用、およびCOMMENT ON ROLE
、SECURITY LABEL ON ROLE
、DROP ROLE
の使用は許可されます。
最後に、CREATEROLE
では、BYPASSRLS
権限を付与または取り消す能力は付与されません。
あるロールがストリーミングレプリケーションの新規接続を実施するには、明示的な権限が付与されていなければなりません。
(スーパーユーザは、すべての権限検査を迂回しますので、例外です。)
ストリーミングレプリケーションを行うロールは、LOGIN
権限も持っていることが必要です。
こうしたロールを作成するには、CREATE ROLE
を使用してください。
name
REPLICATION LOGIN
パスワードは、クライアント認証方法においてデータベースに接続する際にユーザにパスワードを要求する場合にのみ重要になります。
password
とmd5
認証方式でパスワードが使用されます。
データベースパスワードはオペレーティングシステムのパスワードとは異なります。
ロール作成時にCREATE ROLE
のようにパスワードを指定します。
name
PASSWORD 'string
'
ロールは、デフォルトでメンバであるロールの権限を継承します。
ただし、デフォルトで権限を継承しないロールを作成するには、CREATE ROLE
を使用します。
別の方法として、name
NOINHERITWITH INHERIT TRUE
、あるいはWITH INHERIT FALSE
を使用して個々の権限の継承を上書きすることもできます。
(全ての権限検査が行われないスーパーユーザを除き)ロールに明示的にすべての行単位セキュリティ(RLS)ポリシーをバイパスするための権限を指定しておかねばなりません。
そのようなロールを作るためには、スーパーユーザでCREATE ROLE
を使用してください。
name
BYPASSRLS
接続制限では、ロールが作成できる同時接続数を指定できます。
-1(デフォルト)は制限なしを意味します。
CREATE ROLE
でロール作成時に接続制限を指定します。
name
CONNECTION LIMIT 'integer
'
ロール属性は、ロールを作成した後でもALTER ROLE
コマンドで変更できます。
詳細はCREATE ROLEとALTER ROLEのマニュアルページを参照してください。
ロールは、第20章で説明されている実行時の設定の多くをロールごとのデフォルトに設定することもできます。 例えば何らかの理由で、自分が接続する時は常にインデックススキャンを無効にしたい場合(注:お勧めしません)、次のようにします。
ALTER ROLE myname SET enable_indexscan TO off;
このようにして設定を保存します(ただし、すぐに反映はされません)。
以降のこのロールによる接続においては、セッションの開始の直前にSET enable_indexscan TO off;
が呼び出されたのと同様になります。
これはデフォルトとする設定をするだけなので、設定をセッション途中いつでも変更できます。
ロール固有のデフォルト設定を削除するには、ALTER ROLE
を使用してください。
呼び出されることがありませんので、rolename
RESET varname
LOGIN
権限を持たないロールにロール固有のデフォルトを持たせることに意味がないことに注意してください。
非スーパーユーザがCREATEROLE
権限を使用してロールを作成すると、作成されたロールは自動的に作成元のユーザに再度付与されます。これは、ブートストラップスーパーユーザがコマンドGRANT created_user TO creating_user WITH ADMIN OPTION, SET FALSE, INHERIT FALSE
を実行した場合と同じです。
CREATEROLE
ユーザが、既存のロールに関して特別な権限を行使できるのは、そのロールに対するADMIN OPTION
権限がある場合のみですので、この権限は、CREATEROLE
ユーザが作成したロールを管理するのに十分なだけです。
一方、INHERIT FALSE, SET FALSE
で作成されたため、このCREATEROLE
ユーザは作成されたロールの権限をデフォルトで継承していませんし、SET ROLE
を使ってそのロールの権限にアクセスできません。
しかし、ロールに対するADMIN OPTION
を持つユーザは、そのロールのメンバシップを他のユーザに付与できるため、CREATEROLE
ユーザは、そのロールを自分自身にINHERIT
またはSET
オプションで付与するだけで、作成したロールへのアクセス権を獲得できます。
したがって、権限がデフォルトで継承されないこと、またはデフォルトでSET ROLE
が付与されないことは、事故に対する安全策であり、セキュリティ機能ではありません。
また、この自動的な付与はブートストラップユーザによって与えられるため、CREATEROLE
ユーザによって削除または変更することはできないことに注意してください。しかし、スーパーユーザはそれを取り消したり、修正したり、他のCREATEROLE
ユーザに対してそのようなグラントを追加したりすることができます。
どのCREATEROLE
ユーザも、ある時点でロールに対してADMIN OPTION
を持っているかどうかに関係なく、それを管理できます。