Configuring EDB LDAP Sync¶
EDB LDAP Syncは、LDAPまたはActive DirectoryサーバーからEDB Postgres Advanced Serverに資格情報を同期するツールのコレクションです。次の方法でツールを構成することをお勧めします。
/usr/lib/python3.6/site-packages/ldap_sync/samples/ でサンプルのEDB
LDAP Sync構成ファイルを見つけます。
pgAgentの設定¶
pgAgentは定期的な同期タスクを設定します。
PostgresでのpgAgentセットアップのデフォルト構成としてedb-pgagent.conf_tmpl
を使用します。 PostgresでpgAgentの構成ディレクトリにコピーします。
詳細については、 pgAgent documentation を参照してください。
Postgresデータベースの権限の設定¶
PostgresがPostgres認証中にLDAPホストを照会できるように、データベースサーバーの権限設定を変更する必要があります。これを行うには、データベースサーバーの構成フォルダーにあるpg_hba.conf
を更新します。 EDB Postgres Advanced Server構成の場合、 pg_hba.conf
は/opt/postgres/data/pg_hba.conf にあります。
pg_hba.conf 設定¶
注釈
ユーザーはデータベースサービスによって異なります。 PostgreSQLには postgres ユーザーがいます。 EDB Postgres Advanced Serverには`enterprisedb` ユーザーがいます。 !!!
pg_hba.conf を構成する場合、LDAP認証文字列はenterprisedb
ユーザー認証文字列の後に置く必要があります。そうしないと、評価の順序のために、
enterprisedb
ユーザーはシステムにログインできません。たとえば、ローカル認証の代わりにLDAPサーバーが照会され、LDAPサーバーが認証の失敗を返し、認証プロセスが終了します。このため、ldap2pgセットアップの一部としてホスト認証を使用する場合は、
enterprisedb ユーザーのホスト認証を追加する必要があります。
次の認証方法を使用できます。ピア、dsn
オプションを使用したパスワード文字列を持つホスト、および.pgpass
を読み取るホスト。詳細については、 ldap2pgの設定 を参照してください。
Postgresデータベースの権限は、データベース要件に従って設定されます。以下は、LDAP認証クエリーのサンプルpg_hba.conf
スタンザです。 {} の値は、LDAPサーバーのホスト名とbasen
LDAPクエリー文字列です。
# TYPE DATABASE USER ADDRESS METHOD
local all enterprisedb peer
host all enterprisedb 127.0.0.1/32 scram-sha-256
host all enterprisedb ::1/128 scram-sha-256
host all all 0.0.0.0/0 ldap ldapserver="{{ldap host/ip}}" ldapbasedn="{{basedn}}" ldapsearchattribute=uid ldaptls=0 ldapport=389
# Other authentication strings
.
.
.
# End of the file / add ldap SSL connection here
hostssl all all 0.0.0.0/0 ldap ldapserver="{{ldap host/ip}}" ldapbasedn="dc={{basedn}}" ldapsearchattribute=uid ldaptls=0 ldapport=389
以下は、変更していないEDB Postgres Advanced
Serverのサンプルpg_hba.conf ファイルです。
# TYPE DATABASE USER ADDRESS METHOD
local all enterprisedb peer
local replication all peer
local all all peer
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
# node1
hostssl all all 10.10.0.5/32 scram-sha-256
hostssl replication all 10.10.0.5/32 scram-sha-256
# ldap
hostssl all all 0.0.0.0/0 scram-sha-256
以下は、初期構成とLDAP認証を使用したサンプルpg_hba.conf です。
# TYPE DATABASE USER ADDRESS METHOD
local all enterprisedb peer
host all enterprisedb 127.0.0.1/32 scram-sha-256
host all enterprisedb ::1/128 scram-sha-256
host all all 0.0.0.0/0 ldap ldapserver="ldap" ldapbasedn="dc=planetexpress,dc=com" ldapsearchattribute=uid ldaptls=0 ldapport=10389
local replication all peer
local all all peer
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
# node1
hostssl all all 172.17.0.2/32 scram-sha-256
hostssl replication all 172.17.0.2/32 scram-sha-256
# ldap
hostssl all all 0.0.0.0/0 ldap ldapserver="ldap" ldapbasedn="dc=planetexpress,dc=com" ldapsearchattribute=uid ldaptls=0 ldapport=10389
pg_hab.conf
を設定した後、構成をリロードして、Postgresシェルまたはsystemctl
で変更を適用します。
SELECT pg_reload_conf();
systemctl restart postgres
ldap2pgの設定¶
ldap2pgは、PostgreSQLのロールとアクセス制御リスト(ACL)の管理ツールです。
/etc/ フォルダーのデフォルトの場所でldap2pg.yml を見つけます。
ldap2pgの詳細については、 ldpa2pg documentation を参照してください。
次のコマンドを使用してldap2pgツールをインストールします。
yum install python3-ldap2pg
同期を機能させるには、構成ファイルに次のセクションを設定する必要があります。
ldappostgressync_map
LDAPサーバー接続を確認する¶
ldap2pgを構成する前に、接続文字列が機能することを確認します。
LDAPサーバーの場合、 openldap-clients
パッケージをインストールして、データベースサーバーがLDAPサーバーと通信できるかどうかを確認できます。
$ yum install -y openldap-clients
ldapsearch
コマンドを使用して、データベースサーバーからLDAPサーバーへの接続をテストします。
$ ldapsearch -H ldap://ldap_server:389 -x -b "<ldap query string>" \
-D "<admin query string>" -w <admin password> \
uid=alphanum_user_id
サンプルの検索文字列は次のようになります。
$ ldapsearch -H ldap://ldap:10389 -x -b "ou=people,dc=planetexpress,dc=com" \
-D "cn=admin,dc=planetexpress,dc=com" -w GoodNewsEveryone \
uid=professor
要求が成功すると、次のようなプレーンテキストの応答としてLDAPオブジェクト定義が返されます。
# extended LDIF
#
# LDAPv3
# base <ou=people,dc=planetexpress,dc=com> with scope subtree
# filter: uid=professor
# requesting: ALL
#
# Hubert J. Farnsworth, people, planetexpress.com
dn: cn=Hubert J. Farnsworth,ou=people,dc=planetexpress,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Hubert J. Farnsworth
ldap¶
LDAP構成には、サーバーポートとurlが含まれています。サーバーの種類とその構成によっては、資格情報の提供が必要になる場合があります。
OpenLDAPの設定¶
匿名接続を許可するサーバーの場合、LDAP構成にはLDAPサーバーのURLとポートが必要です。認証が必要なサーバーの場合、
password および binddn
クエリを提供する必要があります。これを行うには、 binddn
にユーザー検索を実行する権限が必要です。
LDAPのデフォルトポートは389です。
ldap:
uri: ldap://ldap:389
Active Directory構成¶
Active
Directoryのセットアップには、ユーザー情報の読み取り権限を持つbinddn
、password 、およびuri が必要です。
ldap:
binddn: cn=ldap2pg,ou=postgresql,dc=edb,dc=com
password: EDBad32
uri: ldap://10.100.20.21:389
postgres¶
Postgres構成には、認証、スキーマとクエリの詳細など、ユーザー情報を入力するPostgreSQLデータベース設定が含まれています。
libpqで使用可能な認証方法をサポートするdsn
文字列を使用して、データベース認証を実行できます。
ピア認証¶
EDB Postgres Advanced Serverのピア認証を使用するには、 dbanme
の下にデータベース名のみをリストする必要があります。次の文字列を入力します。
dsn: dbname=postgres
EDB Postgres Advanced Serverのデフォルトのピアユーザーとして ldap2pg
の同期を実行するには、 /etc/ldap2pg.yml
のファイル権限をローカルデータベースユーザーに設定します。例:
$ chown enterprisedb:enterprisedb /etc/ldap2pg.yml
-v
パラメーターを渡して、データベースサーバーでldap2pgのユーザー同期プロセスが実行されていることを確認します。
$ ldap2pg -v
Pgpassの使用¶
EDB Postgres Advanced Serverは、デフォルトユーザーenterprisedb
で/var/lib/edb/ に.pgpass 認証ファイルを作成します。
enterprisedb
ユーザーとして同期ジョブを実行する予定がある場合は、ピア認証を使用する方が簡単です。
このケースでは、 EDB Postgres Advanced Server認証はenterprisedb
ユーザーで実行されますが、ldap2pgの同期ジョブは別のユーザーとして実行されます。
enterprisedb ユーザーのホームディレクトリから.pgpass
をコピーします。
$ sudo cp /var/lib/edb/.pgpass ~/
/etc/ldap2pg.yaml のpostgres セクションのdsn
変数を変更します。
dsn: host=localhost user=enterprisedb dbname=postgres
OpenLDAPの設定¶
これは、PostgreSQLユーザーアカウントをOpenLDAPと同期するためのサンプル構成です。
dsn — username:password認証方法を使用するPostgres URI文字列。
databases_query
—ユーザーレコードを含むPostgresデータベースを指定します。
schemas_query —
ldap2pgで使用できるようにpg_catalog内のすべてのスキーマを返します。
roles_blacklist_query —同期操作からテーブル、特にEDB Postgres
Advanced Serverまたは内部Postgresテーブルに関連するものを除外します。
postgres:
dsn: postgres://enterprisedb:LOCALPASS@localhost:5444/postgres
databases_query: [postgres]
schemas_query: "SELECT nspname FROM pg_catalog"
roles_blacklist_query: [aq_administrator_role, pg_*]
Active Directory構成¶
これは、PostgreSQLユーザーアカウントをActive Directoryと同期するためのサンプル構成です。
dsn — username:password認証方法を使用するPostgres URI文字列。
managed_roles_query
—ロールの削除と特権の編集を特定のロールに制限するためのクエリ。
owners_query
—すべてのデータベースとスキーマに共通の所有者のグローバルリストを指定します。
schemas_query —
ldap2pgが各データベースのスキーマを認識できるように、スキーマの所有者を指定します。
postgres:
dsn: postgres://enterprisedb:LOCALPASS@localhost:5444/postgres
managed_roles_query: |
SELECT public
UNION
SELECT DISTINCT role.rolname
FROM pg_roles AS role
LEFT OUTER JOIN pg_auth_members AS ms ON ms.member = role.oid
LEFT OUTER JOIN pg_roles AS ldap_roles
ON ldap_roles.rolname = ldap_roles AND ldap_roles.oid = ms.roleid
WHERE role.rolname IN (ldap_roles, readers, writers, owners)
OR ldap_roles.oid IS NOT NULL
ORDER BY 1;
owners_query: |
SELECT DISTINCT role.rolname
FROM pg_catalog.pg_roles AS role
JOIN pg_catalog.pg_auth_members AS ms ON ms.member = role.oid
JOIN pg_catalog.pg_roles AS owners
ON owners.rolname = owners AND owners.oid = ms.roleid
ORDER BY 1;
schemas_query: |
SELECT nspname FROM pg_catalog.pg_namespace
WHERE nspname NOT LIKE pg_% AND nspname <> information_schema
ORDER BY 1;
sync_map¶
各 sync_map アイテムはマッピングと呼ばれます。マッピングは、
description フィールドと、 ldapsearch 、role
、およびgrant subsection のいずれかを持つYAML辞書です。
ロール¶
PostgreSQL クラスターをターゲットとする 1 つ以上のロールを定義します。インポートされる選択したLDAPアカウントの下のロールと、それらが使用する権限を指定します。
値は単一のロールまたはリストです。この例は、 sync_map
の下のロールの定義のサンプルです。
roles:
- names:
- ldap_roles
- readers
options: NOLOGIN
- name: writers
# Grant reading to writers
parent: readers
options: NOLOGIN
- name: owners
# Grant read/write to owners
parent: writers
options: NOLOGIN
この例は、LDAPで認証されるすべてのユーザーに適用されるLOGIN
およびSUPERUSER 特権を持つ単一のロールの単純な定義です。
role:
name: {uid}
options: LOGIN SUPERUSER
付与¶
grant
セクションは、対応するパラメーターを使用してロールへの付与特権を定義します。言い換えれば、このセクションは、
roles セクションで定義されたロールに付与される特権を決定します。
grant:
- privilege: ro
role: readers
schemas: __all__
- privilege: rw
role: writers
schema: __all__
- privilege: ddl
role: owners
schema: __all__
ldapsearchクエリとフィルター¶
ldapsearch
セクションは、PostgreSQLと同期できるLDAPアカウントを識別するために必要な検索クエリを指定します。例:
ldapsearch:
base: ou=people,dc=planetexpress,dc=com
binddn: ou=people,dc=planetexpress,dc=com
filter: "(objectClass=inetOrgPerson)"
ロールステートメント¶
role
セクションは、PostgreSQLデータベースにマッピングできるユーザーアカウントとオプションを定義します。各ユーザレコードのデフォルトのnameパラメーターは、アカウントのフルネームです。代わりに、短いユーザー名であるuid
名が指定されます。
role:
name: {uid}
options: LOGIN SUPERUSER
同期スケジュールを設定する¶
schedule_pgagent
は、ldap2pgの同期スケジュールを設定します。このユーティリティは、cronに似た構文を使用して、データベースにロードされるSQLコマンド
pgagent.sql を生成します。
この例では、毎時実行されるスケジュールを作成します。
schedule_pgagent "0 * * * *"
このコマンドは、 pgagent.sql ファイルを生成します。これは、
enterprisedb ユーザー資格情報でデータベースにロードされます。
psql < pgagent.sql