OpenLDAP 向け PassSync Agent

UCIDM は社内で管理している OpenLDAP サーバーからパスワード変更を検知して UCIDM API に連携します。

前提条件

OSSTech 社 OpenLDAP の次のパッケージがインストールされ、正しく設定されていることを前提として説明します。

  • osstech-openldap
  • osstech-openldap-servers

システム概要

OpenLDAP の Overlays という仕組みを使ってパスワード変更をフックします。ucidmpsync というカスタム Overlay モジュールを slapd に設定します。次に OpenLDAP 向け PassSync Agent の概要を示します。

flowchart TB

subgraph slapd[OpenLDAP slapd]
  subgraph ucidmpsync
    ユーザー名\nパスワード
  end
end

subgraph sender[Sender]
  stdin
  pusher[ZeroMQ\nPush]
end

subgraph zmq [ZeroMQ]
  queue[Queue]
end

subgraph passsync [PassSync Agent]
  puller[ZeroMQ\nPull]
  ucidm-client[UCIDM\nクライアント]
  recovery-handler[リカバリ\nハンドラー]
  recovery-dir[リカバリ\nディレクトリ]
end

subgraph server [UCIDM API サーバー]
  upd-passwd[PUT password]
end

ucidmpsync -- pipe --> stdin
stdin -- encode --> pusher
sender -- キューイング失敗 --> recovery-dir
pusher -- ipc://socket --> queue
queue -- ipc://socket --> puller
puller -- decode --> ucidm-client
ucidm-client -- http --> upd-passwd
ucidm-client -- 送信失敗 --> recovery-dir
recovery-handler -- 再送信 --> ucidm-client
recovery-dir -- 監視 --> recovery-handler

Sender や PassSync Agent で送信に失敗したときもリカバリディレクトリにメッセージが一時保存されて定期的に再処理されます。一時保存されるメッセージは難読化されて保存されます。システム管理者が容易にパスワードの文字列を確認することはできません。

パスワード変更のリカバリの注意事項

UCIDM ではセキュリティ強化の観点から一般ユーザーのパスワードを原則として保存しません。しかし、システムの一時的な障害のために一般ユーザーにパスワード変更をやり直してもらうのも実運用においてコストがかかります。リカバリ機能は難読化した上で再処理する機能になりますが、リカバリデータを削除しない限り、無限にリカバリを繰り返します。一時的な検証ユーザーや誤った設定などにより、パスワード変更のデータが生成され、そのリカバリは絶対に成功しない場合、システム管理者が手動でリカバリデータを削除する必要があります。

リカバリデータでは後述する UCIDM_RECOVERY_PATH で指定されたディレクトリ配下に格納されます。不要なパスワード変更のデータがある場合はシステム管理者が直接、このディレクトリ配下にあるファイルを削除してください。

設定

systemd のサービスから PassSync Agent が使う環境変数を設定します。主には接続する UCIDM API サーバーの設定をすればデフォルト設定でも構いません。

# vi /opt/osstech/etc/openldap/service/ucidm/agent.env

agent.env の環境変数

接続する UCIDM API サーバーの設定をします。

環境変数規定値説明
API_SCHEMEhttpshttpUCIDM API サーバーのプロトコル
API_HOST任意localhostUCIDM API サーバー名
API_PORT任意18080UCIDM API サーバーの
ポート番号
API_BASIC_AUTH_USER任意unico接続する UCIDM API の
Basic 認証ユーザー
API_BASIC_AUTH_PASSWORD任意接続する UCIDM API の
Basic 認証パスワード
API_ACCOUNT_AUTH_USER任意接続する UCIDM API の
アカウント認証ユーザー
API_ACCOUNT_AUTH_PASSWORD任意接続する UCIDM API の
アカウント認証パスワード

UCIDM API サーバーへのリクエストに失敗 (ステータスコードが 500 以上を返す) したときのリトライの設定をします。

環境変数規定値説明
CLIENT_RETRY_WAIT_MIN任意1s1回目のリトライの待ち時間
CLIENT_RETRY_WAIT_MAX任意30sリトライの最大の待ち時間
CLIENT_RETRY_MAX任意4リトライの最大回数

agent プロセスがメッセージキューを使うときの設定をします。

環境変数規定値説明
UCIDM_SOCKET_PATH/var/opt/
osstech/lib/
ucidm/agent.sock
my-ipc-socketUnix ドメインソケット
のパス
UCIDM_SEND_HWM任意0メッセージキュー
のバッファサイズ
UCIDM_BYTE_ORDER任意LittleEndianメッセージエンコーディング
のバイトオーダー

sender/agent プロセスが送信処理に失敗したときにデータを一時保存するリカバリ設定をします。

環境変数規定値説明
UCIDM_RECOVERY_PATH/var/opt/
osstech/lib/
ucidm/.recovery
.recoveryリカバリのための
メッセージが一時保存
される場所へのパス
UCIDM_RECOVERY_INTERVAL任意10mリカバリの実行間隔
UCIDM_REQUESTER任意PassSync Agentベーシック認証時の実施者名

サービスの起動設定

systemd から PassSync サービスを起動します。起動後にサービスがアクティブになっていることを確認します。

# systemctl start ucidm-passsync.service
# systemctl status ucidm-passsync.service

PassSync サービスのログを監視するには次のように実行します。

# journalctl -u ucidm-passsync.service -n 10 -f

osstech-openldap の slapd.conf を次のように設定します。

bdb セクションの一番最後に overlay ucidmpsync の設定を追加するようにしてください。

# vi /opt/osstech/etc/openldap/slapd.conf
...
# Load dynamic backend modules:
...
moduleload ucidmpsync.la
...
## PassSync
## ----------------------------------------------------------------------
overlay ucidmpsync
ucidmpsync-sender  "/opt/osstech/lib64/osstech-ucidm-agent-ldap-passsync/sender"
...

osstech-openldap の osstech-slapd.service に sender が PassSync の環境変数を参照できるように設定を追加します。systemctl edit を使って次の内容を設定してください。

# systemctl edit osstech-slapd.service
[Service]
EnvironmentFile=/opt/osstech/etc/openldap/service/ucidm/agent.env

設定を完了すると次のファイルが作成されます。

/etc/systemd/system/osstech-slapd.service.d/override.conf

systemctl cat で次の内容を確認できれば正しい設定になります。

# systemctl cat osstech-slapd.service
...
# /etc/systemd/system/osstech-slapd.service.d/override.conf
[Service]
EnvironmentFile=/opt/osstech/etc/openldap/service/ucidm/agent.env

設定を完了したら次のように osstech-slapd.service を再起動します。

# systemctl restart osstech-slapd.service

あるユーザーでパスワード変更を行い、slapd のログから sender が agent にメッセージを送ったログを確認します。

# tail -f /var/log/osstech/ldap.log

sender や agent で ucidm へリクエストして 500 以上のステータスコードが返されたときはリカバリ用ディレクトリにデータが一時保存されます。そして UCIDM_RECOVERY_INTERVAL の環境変数で指定した期間で再度リクエストします。成功しない限り、無限にリクエストされるので失敗することがわかっているデータの場合は手動で削除してください。

# ls -l /var/opt/osstech/lib/ucidm/.recovery/
合計 4
-rw-------. 1 ldap ldap 188  4月 14 10:34 2023-04-14-103417.011.data

PassSync Agent の動作を確認できたら OS 再起動時のサービス起動設定を確認します。基本的には OS 起動時に自動起動するとよいです。

# systemctl enable ucidm-passsync.service
# systemctl is-enabled ucidm-passsync.service
enabled

PassSync Agent サービスは osstech-slapd.service に依存するため、運用上の都合で osstech-slapd.service を自動起動していない場合はその設定にあわせて運用していただいても構いません。osstech-slapd.service を自動起動しているかどうかは次のコマンドで調べられます。

# systemctl is-enabled osstech-slapd.service