ページの先頭行へ戻る
Enterprise Postgres 16 導入ガイド(クライアント編)

Linux4.2.2 ldap2pg

PostgreSQLは、LDAP認証に対応しており、LinuxとWindowsのいずれも利用できます。LDAPサーバでユーザー認証できますが、利用する際はあらかじめデータベースサーバに対応するロールを作成しておく必要があります。

ldap2pgを利用すると、LDAPサーバに登録されているユーザーとFujitsu Enterprise Postgresのロールを同期することができるため、上記のデータベースサーバのロール作成を自動的に行うことができます。これにより、LDAPサーバでロールを一元管理することができます。なお、ldap2pgはLinuxのみ対応しています。

LDAPサーバに登録しているユーザーとFujitsu Enterprise Postgresのロールは、これらのマッピングを定義したldap2pg.ymlに基づいて、ldap2pgコマンド実行時に同期されます。ldap2pg.ymlに定義されたロールがFujitsu Enterprise Postgresに存在しない場合には作成され、ldap2pg.ymlに定義されていないロールは削除されます。LDAPサーバと連動しないデータベース管理者のロールのように、更新または削除されると困るロールは、そのことをldap2pg.ymlに設定することで、同期対象から除外することができます。

以下に運用のポイントを説明します。

同期の契機

LDAPサーバのユーザーが変更されたタイミングで同期をとり、データベースサーバが常に最新の状態になるように運用します。そのため、定期的に同期をとりLDAPサーバの情報を自動で反映させるか、LDAPサーバの変更に合わせて手動で反映させる必要があります。

定期的に同期する場合、LDAPサーバの変更をデータベースサーバに反映するまでの許容可能なタイムラグを同期の間隔にしてください。完全に同期された状態であっても、ldap2pgはLDAPサーバとデータベースにアクセスして変更の有無を確認するからです。例えば、5分間隔程度で定期的にldap2pgのコマンドを実行してください。

cronなどを使用して定期的に自動で実行するようにした場合、cronなどの設定やリダイレクトを用いてldap2pgの標準出力と標準エラー出力をログに出力するようにしてください。そのログをもとにldap2pgの中断や想定外のロールの削除を確認することができます。

即時同期させたい場合や自分で同期のタイミングを制御したい場合は、手動で同期させてください。

機密管理支援機能との組み合わせによるセキュリティの強化

ldap2pgはデータベースの権限も管理することができますが、テーブルや行セットなどの細かい単位を管理できません。そのような設定が可能で、権限設定の監査ができる機密管理支援機能と組み合わせることで、強固なセキュリティ対策を行えます。

4.2.2.1 ldap2pgのセットアップ

  1. ldap2pgをインストールします。
    “クライアントプログラム”のDVDを利用して、ldap2pgをインストールしてください。

  2. ldap2pgの環境変数PATHを設定します。

    $ export PATH=/opt/fsepv<x>ldap2pg/bin:$PATH
  3. ldap2pgの実行ユーザーとして、スーパーユーザー権限を持つデータベースロールをデータベースサーバに定義します。ロールの定義の詳細については、“PostgreSQL Documentation”の“Reference”の“CREATE ROLE”を参照してください。

  4. ldap2pgのセットアップを実施します。
    詳細はldap2pgのドキュメント(https://ldap2pg.readthedocs.io/en/latest/)にアクセスし、ConfigurationまたはCookbookを参照してください。

  5. LDAPサーバで管理しないデータベース管理者などデータベースのみで定義して利用するロールや、以下に示すFujitsu Enterprise Postgresが独自で定義している、同期を除外するロールを設定します。
    設定は、ldap2pg.ymlファイルのroles_blacklist_queryに追記してください。

    追記するFujitsu Enterprise Postgres独自のロール
    • pgx_update_profile_status、および、pgx_update_profile_statusを継承したロール (プロファイルによる運用ポリシーの設定機能のストリーミングレプリケーション用のロール)

    • pgx_cgroup_role_* (機密管理支援機能の機密管理ロール)

データベースサーバを冗長化している場合

データベースを冗長化している環境では、target_session_attrsパラメータに“primary”を指定してください。“read-write”を指定することもできます。

4.2.2.2 ldap2pgのアンセットアップ

  1. ldap2pgを定期的に実行する設定をしていた場合は、設定を解除します。

  2. ldap2pgをアンインストールしてください。詳細は、“3.3 アンインストール”を参照してください。

  3. ldap2pgの実行専用のロールをデータベースサーバに定義していた場合は、そのロールを削除してください。

4.2.2.3 ldap2pgを使用したデータベースロールの同期方法

ldap2pgを使用してLDAPサーバのユーザーをデータベースロールとしてデータベースサーバに同期するための手順を説明します。

  1. LDAPユーザーと同期するロールにアクセス権限を付与したい場合などは、ldap2pg.ymlファイルを編集してください。ldap2pg.ymlに記載する内容は以下のドキュメントを参考にしてください。
    https://ldap2pg.readthedocs.io/en/latest/config/

  2. LDAPサーバやデータベースへの接続先情報を環境変数で指定します。
    https://ldap2pg.readthedocs.io/en/latest/cli/#environment-variables
    データベースサーバへの接続ユーザーは、セットアップ手順で作成したユーザーにします。LDAPサーバへの接続はLDAPから始まる環境変数とldaprcファイルをサポートしており、データベースへのアクセスは、libpqで利用可能なPGから始まる環境変数をサポートしています。これらの環境変数を利用して接続の設定を行います。

  3. ldap2pgにcheckオプションを指定して実行し、変更対象のロールと変更予定のロールが一致していることを確認します。

  4. ldap2pgに--realオプションを指定して実行し、データベースサーバにロールを同期します。

  5. 初回の同期以降は、LDAPサーバのユーザーとデータベースロールを定期的に同期するように設定します。
    手順2と手順4で実施した内容を記載した“環境変数を設定するスクリプト”と“ロールを同期するスクリプト”を用意し、ロールを同期するスクリプトが環境変数を参照してロールを同期するように、スクリプトをcronジョブに登録してください。

[cronの設定例]
SHELL=/bin/bash
*/5 * * * * source /home/postgres/env.sh && . /home/postgres/sample.sh >> /home/postgres/sample.log 2>&1

4.2.2.4 機密管理支援機能との組み合わせた場合の設定

ldap2pgと機密管理支援機能を組み合わせることで、詳細なアクセス制御ができるようにします。そのために、ロールの属性や権限は機密管理支援機能に振り分けます。

機能

ロール管理の振り分け

ldap2pg

ロールの追加、削除、および、ロールのメンバ資格の管理

機密管理支援機能

ロールの属性の設定、権限の付与と剥奪、これらの監査

このとき、ldap2pgはldap2pg.ymlの情報でロールの属性や親子関係を上書きするため、機密管理支援機能に設定したロールの属性や権限が、ldap2pgの実行により更新されないように設定します。

機密管理支援機能とldap2pgの設定の流れは以下のとおりです。

導入

以下の手順を参照し、ldap2pgを実行するために必要な設定をします。

  1. LDAPサーバ上のユーザとロールのマッピングを設計して、機密管理支援機能で管理すべきロールのリストを作成します。

  2. 以下の手順でymlファイルを作成します。

    1. LDAPサーバからリストアップした対象を取得し同期するための設定を記述します。

    2. pgx_cgroup_role_から始まる機密管理ロールをroles_blacklist_queryに記述します。

    3. 権限の付与と剥奪の設定がymlファイルに記載されていないことを確認します。

  3. 既にldap2pgを使って同期を実行している場合にはそれを停止します。

  4. 4.2.2.3 ldap2pgを使用したデータベースロールの同期方法”を参照して、ロールを作成します。

  5. “セキュリティ運用ガイド”の“機密管理支援機能”を参照し、必要な作業をすべて実施してください。
    このとき、ロールのリストにあるすべてのロールを機密管理支援機能に登録します。

  6. ldap2pgによって機密管理支援機能の動作を阻害しないようにymlファイルを修正します。“機密グループのロールの属性や権限を変更した場合の設定”にymlファイルを出力するサンプルスクリプトを記載しているので、参照してください。

  7. 既にldap2pgを使った同期を定期実行していた場合は、それを再実行します。

運用

以下の手順を参照し、状況に応じてロールを操作します。

機密グループへのldap2pgのロールの追加
  1. 機密管理支援機能の機密グループを作成します。

  2. ldap2pgに-Pオプションをつけて実行し、LDAPサーバのユーザーをデータベースロールとして作成します。

  3. 機密グループに上記で追加したロールを追加します。

  4. ロール属性の反映例”を参考に、機密管理支援機能の設定をldap2pg.ymlに反映します。

    ロール属性の反映例
    1. 以下の例を参考にSQLを実行し、各ロールの設定を取り出します。
      この例では、すべてのロールに対して、LOGIN属性と機密管理支援機能のロールの属性、および機密管理ロールのメンバ資格を取り出します。環境に合わせて設定内容を変更する場合は、SQL実行例の'LOGIN'部分を修正するなどSQLを書き換えるか、実行結果を直接修正してください。

      [SQL実行例]
      SELECT '- name: ' ||pgxgr.name || chr(10) || '  options: ' || pgxgr.opt || chr(10) ||  '  parent: ' || chr(10) || '    - '  || string_agg(pgxgr.cgrorolename, chr(10) || '    - ') 
      FROM  (SELECT pgxg.cgrorolename,  
              concat_ws(' ',  
              'LOGIN', 
              CASE pgxg.cgrosuperuser WHEN true THEN 'SUPERUSER' END, 
              CASE pgxg.cgrocreatedb WHEN true THEN 'CREATEDB' END, 
              CASE pgxg.cgrocreaterole WHEN true THEN 'CREATEROLE' END, 
              CASE pgxg.cgroreplication WHEN true THEN 'REPLICATION' END, 
              CASE pgxg.cgrobypassrls WHEN true THEN 'BYPASSRLS' END) AS opt, 
              pgxroles.name 
            FROM pgx_confidential_group pgxg,  
            (SELECT pgxr.crolmatid as matid, pgxr.crolgroid as groid,  pgxr.crolname AS name FROM pgx_confidential_role pgxr ) as pgxroles 
            WHERE pgxg.cgromatid = pgxroles.matid and pgxg.cgroid = pgxroles.groid) pgxgr 
      GROUP BY pgxgr.name, pgxgr.opt;

      [実行結果の例]
      - name: alice 
          options: LOGIN CREATEDB 
         parent:  
          - pgx_cgroup_role_000000000000000001 
      - name: bob 
         options: LOGIN CREATEDB 
         parent:  
          -pgx_cgroup_role_000000000000000001 
      - name: charlie 
         options: LOGIN CREATEDB CREATEROLE 
         parent:  
          - pgx_cgroup_role_000000000000000002 
      - name: dave 
         options: LOGIN CREATEDB CREATEROLE 
         parent:  
          - pgx_cgroup_role_000000000000000002
    2. 上記の設定の情報を元にldap2pg.ymlのrulesの先頭にrolesの設定として記載してください。
      先頭以外に記載すると、LDAPサーバと同期する設定の情報が有効になり、機密管理支援機能の設定が有効になりません。

機密グループのロールの属性や権限を変更した場合の設定
  1. 機密管理支援機能でロールの属性や権限の情報を変更します。

  2. 変更された情報が、自動でymlファイルに反映されるように、機密管理支援機能の設定を取得するスクリプトを作成し、cronジョブに登録します。
    以下は、シェルスクリプトの例です。
    このサンプルスクリプトは、機密管理支援機能の動作を阻害しないように、機密グループの情報をymlファイルに反映するためのスクリプトです。
    以下に、シェルスクリプトの例を示します。環境に合わせて設定を変更してください。
    ここで示すシェルスクリプトは、ldap2pg_pre.ymlとldap2pg_after.ymlの2つの設定ファイルと、ymlに反映する機密管理支援機能の設定情報(サンプルではconfidential_roles.ymlに出力)で構成されます。この3つのファイルを結合して、ldap2pg.ymlファイルを作成します。
    ldap2pg_pre.ymlは、ldap2pg.ymlの機密管理支援機能の設定情報より前に配置する情報で、postgresセクションとrulesセクションの“roles:”までを記載します。ldap2pg_after.ymlは、ldap2pg.ymlの機密管理支援機能の設定情報より後ろに配置する情報で、機密管理支援機能で管理しないロールの情報を記載します。

    [シェルスクリプトの例]

    ldap2pg_pre.yml : postgresセクションに関する情報を記載

    version: 6
    
    #
    #       1.   P O S T G R E S   I N S P E C T I O N
    #
    #  See https://ldap2pg.readthedocs.io/en/latest/postgres/
    #
    postgres:
    # PostgreSQLが内部で使用するpostgres, pgから始まるロールも除外する
      roles_blacklist_query: [postgres, pg_*, pgx_update_profile_status, pgx_cgroup_role* ]
      databases_query: [postgres]
    (省略)
    rules:
    - description: "Setup static roles and grants."
      roles:

    ldap2pg_after.yml : 機密グループに含まないロールの情報を記載

      - names:
        - readers
        options: NOLOGIN
      - name: writers
        # Grant reading to writers
        parent: [readers]
        options: NOLOGIN
    (省略)

    sample.sh : 機密グループの情報をconfidential_roles.ymlに出力し、結合して1つのymlファイルとして出力するスクリプト

    #!/bin/bash
    
    psql -h localhost -p 27500 -d postgres -U postgres -A -t <<EOF > /home/postgres/confidential_roles.yml
    SELECT '  - name: ' ||pgxgr.name || chr(10) || '    options: ' || pgxgr.opt || chr(10) ||  '    parent: ' || chr(10) || '    - '  || string_agg(pgxgr.cgrorolename, chr(10) || '    - ')
    FROM  (SELECT pgxg.cgrorolename,
            concat_ws(' ',
            'LOGIN',
            CASE pgxg.cgrosuperuser WHEN true THEN 'SUPERUSER' END,
            CASE pgxg.cgrocreatedb WHEN true THEN 'CREATEDB' END,
            CASE pgxg.cgrocreaterole WHEN true THEN 'CREATEROLE' END,
            CASE pgxg.cgroreplication WHEN true THEN 'REPLICATION' END,
            CASE pgxg.cgrobypassrls WHEN true THEN 'BYPASSRLS' END) AS opt,
            pgxroles.name
          FROM pgx_confidential_group pgxg,
          (SELECT pgxr.crolmatid as matid, pgxr.crolgroid as groid,  pgxr.crolname AS name FROM
    pgx_confidential_role pgxr ) as pgxroles
          WHERE pgxg.cgromatid = pgxroles.matid and pgxg.cgroid = pgxroles.groid) pgxgr
    GROUP BY pgxgr.name, pgxgr.opt;
    EOF
    cat /home/postgres/ldap2pg_pre.yml /home/postgres/confidential_roles.yml /home/postgres/ldap2pg_after.yml > /home/postgres/ldap2pg.yml
    
    # ldap2pg -P -c ldap2pg.ymlを実行し、取得したロールの情報を更新する

    参考

    機密管理支援機能で変更したロールの属性や権限情報を、手動でldap2pg.ymlに反映する場合は、“ロール属性の反映例”を参考に、変更情報を取得しldap2pg.ymlに反映してください。


ldap2pgで作成したロールの機密グループへの追加
  1. ldap2pgで機密グループに追加するロールを作成します。

  2. 手順1で作成したデータベースロールを既存の機密グループに追加します。

  3. ロール属性の反映例”を参考に、新たに追加したロールの機密管理支援機能の設定をldap2pg.ymlに反映します。

    参考

    機密グループの変更をcronで自動的にldap2pg.ymlに反映している場合、cronを停止して新たに追加したデータベースロールを機密グループに追加してください。


ldap2pgで追加したロールの機密グループからの削除
  1. 機密グループから削除するロールを取り除きます。

  2. ロール属性の反映例”を参考に、機密管理支援機能への変更をldap2pg.ymlに反映します。

  3. ldap2pgに-Pオプションをつけて実行し反映します。


    ポイント

    機密マトリクスと機密グループを削除した場合は、上記の手順2、手順3を実施します。

    参照

    • 機密管理支援機能で管理しているロールをldap2pgで誤って削除してしまった場合、“セキュリティ運用ガイド”の“機密オブジェクトやロールを確認する方法”を参照して、機密管理支援機能で管理しているロールを復旧してください。

    • 機密管理ロールをldap2pgで誤って削除してしまった場合は、“セキュリティ運用ガイド”の“機密管理ロールを作成する”を参照して復旧してください。

4.2.2.5 ldap2pgが接続可能なサーバ

ldap2pgが接続可能なサーバは以下の表のとおりです。

表4.2 接続可能なサーバ

OS

製品名

Linux

  • Fujitsu Enterprise Postgres Advanced Edition 16

  • Fujitsu Enterprise Postgres Standard Edition 16