はじめに
PostgreSQLはさまざまなメカニズムを使用して、データベースクラスタ内に認証、承認、およびオブジェクトの所有権を実装します。これらの中核となるのは役割の概念です。
PostgreSQLの役割は、ユーザーとグループのアイデアを1つの柔軟なエンティティに組み合わせたものです。これらは、データベースシステム内でユーザーが採用するペルソナであり、認証システムが接続を承認または拒否するエンティティであり、すべてのスコープの特権管理ルールの対象です。
このガイドでは、PostgreSQLデータベースクラスター内での役割とその管理方法について説明します。より具体的には、このガイドでは、役割の属性に関連する役割の管理について説明します。役割が全体像にどのように適合するかについてのより広範な概要については、認証および承認ガイドの概要を参照してください。特定のデータベースオブジェクトに対する役割の権限を変更する方法については、役割の付与に関するガイドをご覧ください。
役割とは何ですか?
PostgreSQLでは、ロールは特定の機能セット、権限、および「所有」エンティティのグループです。 PostgreSQLは、「ユーザー」と「グループ」という明確な概念を持つ代わりに、役割を使用してこれらの両方のアイデアを表現します。役割は、現実の世界の個々の人に対応することも、他の役割がメンバーになることができる特定のアクセス権を持つグループとして機能することもできます。
ロールは、認証および承認ポリシーを誰に適用するかを決定するPostgreSQL内のアンカーポイントです。普遍的に適用されないポリシーでは、誰を制限し、誰を許可するかを定義するためにIDの概念が必要です。 PostgreSQLでは、このIDはロールによって表されます。
PostgreSQLの認証システムにはいくつかの異なるコンポーネントがあり、それぞれが役割に関連付けられています。データベースクラスターへの初期接続に使用するには、ロールに最初にLOGIN
が必要です。 属性セット。認証ルール自体は、pg_hba.conf
というホストベースの構成ファイルで定義されています。 。各ルールは、個々のロールにスコープを設定できる認証方法を定義します。パスワード認証用に構成されたロールの場合、システムが指定されたユーザーパスワードを検証できるように、パスワード属性を設定する必要があります。
承認に関しては、役割はデータベースクラスターレベルで定義されます。これは、PostgreSQLではデータベース間で共有されることを意味します。ロールはデータベースにまたがるため、承認システムは、各ロールが各データベースエンティティに対して持つアクセスのレベルを制御します。役割は人々のグループを表すことができるため、アクセスの構成方法には大きな柔軟性があります。
ロールは、PostgreSQL内のオブジェクト所有権の概念にも不可欠です。たとえば、各データベースとテーブルには、所有者として構成された役割が1つだけあります。 superusers
以外 、所有者の役割は、実際のオブジェクトを変更または削除できる唯一の役割です。
要約すると、役割は最も実用的なデータベース操作の中核です。それらの柔軟性により、ユーザー識別子とユーザークラスの両方として機能することができます。データベースクラスター内のすべてのアクションは、役割の特権に対してチェックされ、データベースクラスターへの各接続の成功は、認証先の役割によって決定されます。非常に多くのコアオペレーションで重要であるため、役割管理を適切に処理することが重要です。
役割属性
ロール属性は、データベースクラスターレベルで持つコア特権の一部を決定するロール自体のフラグです。これらは、ロールが最初に作成されたときに設定することも、適切な属性(SUPERUSER
)を持つ任意のロールによっていつでも変更することもできます。 またはCREATEROLE
この場合)。
ロールに適用できる属性は次のとおりです。
LOGIN
:ユーザーがこの役割を使用してデータベースクラスターに最初に接続できるようにします。CREATE USER
CREATE ROLE
が実行されている間、コマンドはこの属性を自動的に追加します コマンドはしません。-
SUPERUSER
:ログインする権利を除くすべての権限チェックをロールがバイパスできるようにします。他のSUPERUSER
のみ ロールは、この属性を使用してロールを作成できます。 -
CREATEDB
:ロールが新しいデータベースを作成できるようにします。 -
CREATEROLE
:ロールが他のロールを作成、変更、および削除できるようにします。この属性により、ロールはロールメンバーシップを割り当てたり変更したりすることもできます。例外は、CREATEROLE
を持つロールです。 属性はSUPERUSER
を変更できませんSUPERUSER
を持たないロール 属性。 REPLICATION
:ロールがストリーミングレプリケーションを開始できるようにします。この属性を持つロールには、LOGIN
も必要です。 属性。PASSWORD
:password
で使用される役割にパスワードを割り当てます またはmd5
認証メカニズム。この属性は、属性キーワードの直後の引数として引用符で囲まれたパスワードを取ります。INHERIT
:ロールがメンバーであるロールの特権を継承するかどうかを決定します。INHERIT
なし 、メンバーはSET ROLE
を使用する必要があります それらの排他的特権にアクセスするために他の役割に変更します。この属性は、デフォルトで新しい役割に設定されています。
役割属性に関する詳細については、役割属性に関するPostgreSQLのドキュメントとCREATE ROLE
を確認してください。 コマンド。
superusers
とは 役割?
上で簡単に述べたように、superusers
と呼ばれる特別な特権 データベースクラスターへの無制限の管理アクセスを許可します。これはroot
に似ています LinuxおよびUnixライクなオペレーティングシステムのアカウントですが、データベースレベルです。
superuser
には常に少なくとも1つの役割が必要です 各データベースクラスターの特権。最初のsuperusers
アカウントは、インストールプロセス中に作成されます。最初のsuperusers
の名前 アカウントはインストールプロセスによって異なりますが、ほとんどの場合、このアカウントはpostgres
と呼ばれます。 。
superusers
のアカウントを使用して日常業務を行うことはお勧めしません 破壊的な行動の可能性と、幅広いアクセス権を持つアカウントを危険にさらす可能性を最小限に抑えるための特権。代わりに、ほとんどの場合、ユーザーはsuperusers
のみを使用して、操作している特定の機能またはデータオブジェクト専用のアカウントを使用する必要があります。 より強力なアクセスが必要な場合のアカウント。
既存の役割属性を確認する
これで、ロール属性とは何か、およびそれらが許可する特権のタイプについて大まかに理解できたので、PostgreSQL全体でロールに適用される属性を見つける方法を学ぶ必要があります。このセクションでは、一般的な役割と具体的には自分の現在の役割に設定されている属性を見つけるのに役立ついくつかのコマンドを示します。
すべてのデータベースロールとその属性の一覧表示
システム全体の役割に適用されている属性を確認する方法はいくつかあります。
psql
を使用している場合 コマンドラインクライアントでは、クエリなしでロール属性情報を取得できる便利なメタコマンドを利用できます。
\du
meta-commandは、すべての役割とその属性を表示します:
\du
List of roles Role name | Attributes | Member of-----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
この場合、postgres
roleは、superuser
のデフォルトの役割です。 このデータベースクラスタに設定された権限。
ロールを一覧表示するための同等のSQL(-E
を渡すことで検出可能 または--echo-hidden
psql
を開始するときのフラグ )は:
SELECT r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole, r.rolcreatedb, r.rolcanlogin, r.rolconnlimit, r.rolvaliduntil, ARRAY(SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid) as memberof, r.rolreplication, r.rolbypassrlsFROM pg_catalog.pg_roles rWHERE r.rolname !~ '^pg_'ORDER BY 1;
(ロールメンバーシップコンポーネントなしで)ロール属性情報を提供する同様のクエリを以下に示します。 psql
を使用します メタコマンド\x on
ここで読みやすくするために結果を垂直方向に出力するには:
-- turn on vertical display\x onSELECT * FROM pg_roles WHERE rolname !~ '^pg_';-- turn off vertical display\x off
-[ RECORD 1 ]--+---------rolname | postgresrolsuper | trolinherit | trolcreaterole | trolcreatedb | trolcanlogin | trolreplication | trolconnlimit | -1rolpassword | ********rolvaliduntil |rolbypassrls | trolconfig |oid | 10
superusers
を持つロールを確認することだけに関心がある場合 属性の場合、リストを明示的に要求できます:
SELECT rolname FROM pg_roles WHERE rolsuper;
rolname---------- postgres(1 row)
または、すべてのユーザーとそのsuperusers
を一覧表示することもできます より完全な全体像のステータス:
SELECT usename,usesuper FROM pg_user;
usename | usesuper----------+---------- postgres | t user1 | f(2 rows)
同じ情報は、PostgreSQLの(場合によってはあいまいな)「ユーザー」オーバーレイの代わりにPostgreSQLの「役割」パラダイムを使用して取得でき、代わりにこのわずかに長いクエリを使用します。
SELECT rolname,rolsuper FROM pg_roles WHERE rolname !~ '^pg_';
rolname | rolsuper----------+---------- postgres | t user1 | f(2 rows)
自分の属性を一覧表示する
現在使用している役割の属性を見つけたい場合は、出力を簡単にフィルタリングできます。
psql
を使用する場合 メタコマンドでは、USER
を使用できます 変数。現在接続されている役割に置き換えられます。 psql
コロンを使用します(:
)変数を補間するには:
\du :USER
List of roles Role name | Attributes | Member of-----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
可能なすべてのロール属性の値を示すリストを取得するには、ロール名をCURRENT_ROLE
によって返される値と比較するクエリを使用できます。 PostgreSQL関数。繰り返しになりますが、読みやすさのために垂直出力を使用しています:
-- First, turn on vertical output\x onSELECT * FROM pg_roles WHERE rolename = CURRENT_ROLE;-- Change back to normal output\x off
-[ RECORD 1 ]--+---------rolname | postgresrolsuper | trolinherit | trolcreaterole | trolcreatedb | trolcanlogin | trolreplication | trolconnlimit | -1rolpassword | ********rolvaliduntil |rolbypassrls | trolconfig |oid | 10
現在の役割にsuperusers
があるかどうかを確認するには 特権、次のように入力できます:
SHOW is_superuser;
is_superuser-------------- on(1 row)
役割管理権限があるかどうかを確認します
ロールを作成、変更、または削除するには、superusers
が必要です。 またはCREATEROLE
特権。
システム内のどの役割に役割管理権限があるかを確認するには、次のように入力します。
SELECT rolname as "Users who can manage roles" FROM pg_roles WHERE rolsuper OR rolcreaterole;
Users who can manage roles---------------------------- postgres(1 rows)
現在の役割に役割管理権限があるかどうかを知りたいだけの場合は、代わりに次を使用できます。
SELECT 'Yes' AS "Can I manage roles?" FROM pg_roles WHERE rolname = :'USER' AND (rolsuper OR rolcreaterole);
Can I manage roles?--------------------- Yes(1 row)
ロールの作成
役割管理権限があることを確認したら、PostgreSQL内で役割の作成、変更、または削除を開始できます。
ロール属性を設定する1つのオプションは、ロールの作成時にそれらを宣言することです。これにより、ロールの初期条件を設定できますが、ロールのアクセスレベルを変更する場合は、後で変更することもできます。 CREATE ROLE
に関する詳細情報を見つけることができます 基本的な構文に慣れるために使用するコマンド。
ロールを作成する1つの方法は、コマンドラインからです。 PostgreSQLにはcreateuser
が含まれています LOGIN
を使用してデータベースクラスター内に役割を作成するコマンド 特権。
一般的な構文は次のとおりです。
createuser <options> <rolename>
たとえば、admin
という名前のロールを作成するには superusers
を使用 パスワードの入力を求めるときに特権を入力するには、次のように入力します。
createuser --superuser admin
その後、admin
を使用してログインできるようになります pg_hba.conf
で概説されている認証方法に従ってアカウントを作成します ファイル。
SQL
を使用してロールを作成するには 、一般的な構文は次のようになります:
CREATE ROLE <role>;
WITH
を使用してロール名の後に属性を指定することにより、属性を定義できます。 :
CREATE ROLE <role> WITH <options>;
たとえば、user1
という名前のロールを作成するには パスワードsecretpassword
でログインできます 、次のように入力できます:
CREATE ROLE "user1" WITH LOGIN PASSWORD 'secretpassword';
代わりに、superuser
でロールを作成します 特権(superusers
でもある必要があります このコマンドを正常に実行するには)できません ログイン(ユーザーはSET ROLE
を使用する必要があります この役割に変更するには)、次のように入力できます:
CREATE ROLE "user2" WITH SUPERUSER;
既存の役割の変更
既存の役割の属性を変更するには、ALTER ROLE
を使用できます 代わりにコマンド。ロールの作成と同様に、現在のロールにもsuperusers
が必要です。 またはCREATEROLE
特権。これらの権限を持たないユーザーは、ALTER ROLE
のみを使用できます 自分のパスワードを変更するコマンド。
ロールを変更すると、作成後にロールに割り当てられた属性を変更できます。役割の作成のセクションで説明したのと同じ属性をALTER ROLE
で使用できます 構文。 1つの違いは、NO
を追加することで、各属性タイプを無効にできることです。 プレフィックス。たとえば、ロールがデータベースクラスタにログインできるようにするには、ロールにLOGIN
を指定します。 属性。その能力を削除するには、NOLOGIN
を指定して役割を変更します 。
ALTER ROLE
コマンドは、明示的に言及されている属性のみを変更します。つまり、ALTER ROLE
コマンドは変更を指定します 新しい属性の完全なセットではなく、属性に。
user2
を許可するには データベースクラスターにログインするための役割には、次のように入力できます。
ALTER ROLE "user2" WITH LOGIN;
これによりログインが可能になりますが、許可される認証方法はpg_hba.conf
によって制御されることに注意してください。 ファイル。
user2
が必要な場合 代わりに、ログイン、ロールの作成、データベースの作成を行うために、スペースで区切って次の3つの属性を指定できます。
ALTER ROLE "user2" WITH LOGIN CREATEROLE CREATEDB;
superusers
を取り消すには ロールからのステータス(このコマンドは、別のsuperusers
を使用してのみ実行できます 役割)、タイプ:
ALTER ROLE "user2" WITH NOSUPERUSER;
ロールのパスワードを変更するには、次のように入力します(CREATEROLE
に関係なく、すべてのロールが自分のロールでこのコマンドを実行できる必要があります。 またはsuperusers
特権):
ALTER ROLE <role> WITH PASSWORD '<password>';
上記のコマンドは機能しますが、可能であれば、psql
を使用することをお勧めします。 パスワードを変更するためのメタコマンド。 psql
コマンドは自動的にパスワードの入力を求め、サーバーに送信する前にパスワードを暗号化します。これにより、ログ内の機密データの漏洩を防ぐことができます。
ロールのパスワードはpsql
で変更できます 次のように入力します
-- To change your own password\password-- To change the password for another role\password <role>
ALTER ROLE
を使用することもできます ロールの名前を変更するコマンド:
ALTER ROLE <role> RENAME TO <newrole>
現在のセッションの役割の名前を変更することはできないことに注意してください。
役割の削除
既存の役割の削除は、前のコマンドと同様のパターンに従います。繰り返しますが、CREATEROLE
が必要です またはsuperusers
これらのコマンドを実行するための特権。
複雑な要因の1つは、役割ができないということです。 データベース内のオブジェクトによって引き続き参照されている場合は削除されます。つまり、ロールが所有するオブジェクトの所有権を削除または譲渡する必要があります。その後、データベースオブジェクトに対するロールの追加の権限も取り消す必要があります。
特権を適切に再割り当ておよび削除する方法の詳細な説明は、Database AdministratorsStackExchangeサイトのErwinBrandstetterによって提供されています。これと同じプロセスが以下で使用されます。
まず、REASSIGNED OWNED
を使用して、ロールが所有するすべてのオブジェクトを再割り当てできます。 指図。たとえば、user2
を削除する準備をしている場合 ロールの場合、そのオブジェクトをpostgres
に割り当てることができます 入力による役割:
REASSIGN OWNED BY "user2" TO "postgres";
現在、オブジェクトはpostgres
によって所有されています 、DROP OWNED
を使用できます オブジェクトに対して付与されている他のすべての特権を取り消すコマンド。このコマンドは、所有しているオブジェクトもすべて削除しますが、オブジェクトをpostgres
に転送したばかりなので 役割、user2
ロールには、所有されているオブジェクトはありません。このため、コマンドはロールの追加の権限を取り消すだけです。
DROP OWNED BY "user2";
DROP OWNED
なし 上記のショートカットでは、REVOKE ALL PRIVILEGES
を実行する必要があります ロールが特権を持つすべての個々のオブジェクトまたはオブジェクトタイプ。
関連するすべての権限を取り消したら、次のように入力して役割を削除できます。
DROP ROLE "user2";
psql
を使用してログインします
新しい役割を構成し、pg_hba.conf
を使用して認証の詳細を構成したら ファイルの場合、新しい役割を使用してデータベースクラスターにログインできます。 psql
コマンドラインクライアントは、これを行う簡単な方法を提供します。
デフォルトでは、psql
オペレーティングシステムのユーザー名と一致するロールを使用して接続することを前提としています。したがって、john
としてコンピュータにログインしている場合 、psql
john
とも呼ばれる役割を使用してデータベースに接続しようとしていると想定します 。
この動作をオーバーライドするには、-U
を渡すことができます または--username=
オプション。たとえば、kerry
という役割にログインする場合 、次のように入力できます:
psql -U kerry
psql
の成功 コマンドはkerry
の存在に依存します 役割、接続しようとしているサーバーのアクセス可能性、およびサーバーで定義されている認証ルール。
セッション中に別の役割に変更する
アクセスできる別の役割の特権とIDを一時的に採用したい場合があります。たとえば、現在の役割にINHERIT
がない場合に、メンバーである役割の特権を取得する場合に必要です。 属性。
これがどのように機能するかを理解するには、PostgreSQLがアクティブな役割を分類するために使用する用語を知っている必要があります。
- セッションの役割 :セッションロールは、PostgreSQLデータベースクラスターへの最初の接続時にログインしたロールです。初期権限を設定し、システムへのアクセスを決定します。この役割には
LOGIN
が必要です 属性。 - 現在の役割 :対照的に、現在の役割はあなたが現在行動している役割です。現在の役割に関連付けられている特権は、直接設定されているか、他の役割から継承されているかに関係なく、実行できるアクションとアクセスできるオブジェクトを決定します。
次のように入力すると、セッションと現在の役割の値を表示できます。
SELECT SESSION_USER, CURRENT_USER;
current_user | session_user--------------+-------------- postgres | postgres(1 row)
セッションの役割を変更する唯一の方法は、別の役割を使用して新しい接続を開始することですが、SET ROLE
を使用して現在の役割を変更できます。 指図。 SET ROLE
コマンドは、一時的に別の役割として機能するために使用されます。このコマンドは、オプションで次の修飾子も使用します。
SESSION
:デフォルト設定。これにより、SET ROLE
が発生します データベースセッション全体に影響を与えるコマンド。LOCAL
:この修飾子を使用すると、コマンドは現在のトランザクションに対してのみ役割を変更します。
現在の役割をuser2
に変更するには 役割(セッションの残りの部分)、次のように入力します:
SET ROLE "user2";
セッションと現在の役割の値を確認すると、現在の役割の値が変更されていることがわかります。
SELECT SESSION_USER, CURRENT_USER;
current_user | session_user--------------+-------------- user2 | postgres(1 row)
すべてのアクションでuser2
が使用されるようになります コンテキストとしての役割。
以前に使用していたセッションの役割に戻すには、次のように入力します。
SET ROLE NONE;
同じ結果を達成する別の方法は次のとおりです。
RESET ROLE;
結論
PostgreSQLの役割、役割属性、付与、および認証のシステムは、管理者が権限とデータベースアクセスを効果的に管理できるようにする柔軟なシステムを作成します。このガイドでは、役割とは何か、およびそれらが幅広いユースケースをどのように網羅しているかについて説明しました。また、ロールを作成、変更、削除する方法、およびグローバル機能を決定するロール属性を管理する方法についても説明しました。データベースを保護し、正当なユーザーに使用可能なアクセスを提供するには、これらのIDを管理する方法を理解する必要があります。