> For AI agents: the complete documentation index is available at /resource/ucidm/docs/on-premise/1.8.0/llms.txt, the full documentation bundle is available at /resource/ucidm/docs/on-premise/1.8.0/llms-full.txt.

# OpenLDAP 向け PassSync Agent

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

## 前提条件

[OSSTech 社 OpenLDAP](https://www.osstech.co.jp/product/openldap/) の次のパッケージがインストールされ、正しく設定されていることを前提として説明します。

- osstech-openldap
- osstech-openldap-servers

## システム概要

OpenLDAP の [Overlays](https://www.openldap.org/doc/admin24/overlays.html) という仕組みを使ってパスワード変更をフックします。`ucidmpsync` というカスタム Overlay モジュールを slapd に設定します。次に OpenLDAP 向け PassSync Agent の概要を示します。

```mermaid
flowchart TB

subgraph slapd[OpenLDAP slapd]
  subgraph ucidmpsync
    passwd[ユーザー名<br />パスワード]
  end
end

subgraph sender[Sender]
  stdin
  pusher[ZeroMQ<br />Push]
end

subgraph zmq [ZeroMQ]
  queue[Queue]
end

subgraph passsync [PassSync Agent]
  puller[ZeroMQ<br />Pull]
  ucidm-client[UCIDM<br />クライアント]
  recovery-handler[リカバリ<br />ハンドラー]
  recovery-dir[リカバリ<br />ディレクトリ]
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](https://www.freedesktop.org/wiki/Software/systemd/) のサービスから PassSync Agent が使う環境変数を設定します。主には接続する UCIDM API サーバーの設定をすればデフォルト設定でも構いません。

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

### agent.env の環境変数

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

- [アカウント認証は agent アカウントの利用を推奨](/resource/ucidm/docs/on-premise/1.8.0/configuration/agent/account.md)

| 環境変数                      |   値   |    既定値    | 説明                           |
| :------------------------ | :---: | :-------: | :--------------------------- |
| API_SCHEME                | https |    http   | UCIDM API サーバーのプロトコル         |
| API_HOST                  |   任意  | localhost | UCIDM API サーバー名              |
| API_PORT                  |   任意  |   18080   | UCIDM API サーバーのポート番号         |
| API_SECURE_SKIP           |   任意  |   false   | UCIDM API サーバーの任意の証明書を許可     |
| 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 プロセスがメッセージキューを使うときの設定をします。

| 環境変数              |                           値                          |      既定値      | 説明                    |
| :---------------- | :--------------------------------------------------: | :-----------: | :-------------------- |
| TZ                |                          任意                          |       --      | タイムゾーン情報              |
| UCIDM_SOCKET_PATH | /var/opt/osstech/lib/<br />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/<br />ucidm-passsync/.recovery | .recovery | リカバリのためのメッセージが<br />一時保存される場所へのパス |
| UCIDM_RECOVERY_INTERVAL |                          任意                         |    10m    | リカバリの実行間隔                         |
| UCIDM_RECOVERY_DURATION |                          任意                         |    72h    | リカバリを行う期間                         |

### サービスの起動設定

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

```bash
# 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` の設定を追加するようにしてください。

```bash
# 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 の slapd.service に sender が PassSync の環境変数を参照できるように設定を追加します。systemctl edit を使って次の内容を設定してください。

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

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

```
/etc/systemd/system/slapd.service.d/override.conf
```

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

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

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

```bash
# systemctl restart slapd.service
```

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

```bash
# journalctl -u slapd.service -n 10 -f
```

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

```bash
# 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 起動時に自動起動するとよいです。

```bash
# systemctl enable osstech-ucidm-passsync.service
# systemctl is-enabled osstech-ucidm-passsync.service
enabled
```

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

```bash
# systemctl is-enabled slapd.service
```
