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_SCHEME | https | http | UCIDM API サーバーのプロトコル |
API_HOST | 任意 | localhost | UCIDM API サーバー名 |
API_PORT | 任意 | 18080 | UCIDM API サーバーの ポート番号 |
API_SECURE_SKIP | 任意 | false | UCIDM 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 | 任意 | 1s | 1回目のリトライの待ち時間 |
CLIENT_RETRY_WAIT_MAX | 任意 | 30s | リトライの最大の待ち時間 |
CLIENT_RETRY_MAX | 任意 | 4 | リトライの最大回数 |
agent プロセスがメッセージキューを使うときの設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
UCIDM_SOCKET_PATH | /var/opt/ osstech/lib/ ucidm-passsync/ agent.sock | my-ipc-socket | Unix ドメインソケット のパス |
UCIDM_SEND_HWM | 任意 | 0 | メッセージキュー のバッファサイズ |
UCIDM_BYTE_ORDER | 任意 | LittleEndian | メッセージエンコーディング のバイトオーダー |
sender/agent プロセスが送信処理に失敗したときにデータを一時保存するリカバリ設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
UCIDM_RECOVERY_PATH | /var/opt/ osstech/lib/ ucidm-passsync/ .recovery | .recovery | リカバリのための メッセージが一時保存 される場所へのパス |
UCIDM_RECOVERY_INTERVAL | 任意 | 10m | リカバリの実行間隔 |
サービスの起動設定
systemd から PassSync サービスを起動します。起動後にサービスがアクティブになっていることを確認します。
# systemctl start osstech-ucidm-passsync.service
# systemctl status osstech-ucidm-passsync.service
PassSync サービスのログを監視するには次のように実行します。
# journalctl -u osstech-ucidm-passsync.service -n 10 -f
osstech-openldap の slapd.conf を次のように設定します。
mdb セクションの一番最後に 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/slapd.service.d/override.conf
systemctl cat で次の内容を確認できれば正しい設定になります。
# systemctl cat osstech-slapd.service
...
# /etc/systemd/system/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 にメッセージを送ったログを確認します。
# journalctl -u slapd.service -n 10 -f
sender や agent で ucidm へリクエストして 500 以上のステータスコードが返されたときはリカバリ用ディレクトリにデータが一時保存されます。そして UCIDM_RECOVERY_INTERVAL
の環境変数で指定した期間で再度リクエストします。成功しない限り、無限にリクエストされるので失敗することがわかっているデータの場合は手動で削除してください。
# ls -l /var/opt/osstech/lib/ucidm-passsync/.recovery/
合計 4
-rw-------. 1 ldap ldap 188 4月 14 10:34 2023-04-14-103417.011.data
PassSync Agent の動作を確認できたら OS 再起動時のサービス起動設定を確認します。基本的には OS 起動時に自動起動するとよいです。
# systemctl enable osstech-ucidm-passsync.service
# systemctl is-enabled osstech-ucidm-passsync.service
enabled
PassSync Agent サービスは osstech-slapd.service に依存するため、運用上の都合で osstech-slapd.service を自動起動していない場合はその設定にあわせて運用していただいても構いません。osstech-slapd.service を自動起動しているかどうかは次のコマンドで調べられます。
# systemctl is-enabled osstech-slapd.service