sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLでのロールとロール属性の管理


    はじめに

    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も必要です。 属性。
    • PASSWORDpasswordで使用される役割にパスワードを割り当てます または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を管理する方法を理解する必要があります。




    1. 別のテーブルに行を挿入するようにMySQLトリガーをプログラムするにはどうすればよいですか?

    2. 新しいRailsプロジェクトでSQLiteからPostgreSQLに変更する

    3. SQL Serverトリガー:DMLトリガー

    4. Oracleプロシージャでグローバル一時テーブルを使用する方法は?