システム概要
Unicorn Cloud ID Manager (以下 UCIDM) は、クラウドまたは社内で管理している内部ディレクトリサービス (OpenLDAP や Active Directory 1 といったサービス) の ID 情報を外部サービスへ ID 連携するためのシステムです。ユーザーやグループの追加・更新・削除、またユーザーのパスワードを変更したときなど、それらの変更を検知して自動的に外部サービスへ ID 連携します。
UCIDM は管理者の運用コストを削減すべく、可能な限り、既存システムを変更することなく、追加で UCIDM サーバーを構築すればすぐ稼働するように設計されています。次のシステム構成図は、お客様のシステムと UCIDM のモジュールがどのように ID 連携されるかのデータフローを簡潔に 2 示したものです。
お客様のシステムにオンプレミス版を導入するとき、UCIDM サーバーを新規に構築して ID 連携します。パスワードを同期するための PassSync Agent のみ、内部ディレクトリサービスを提供するサーバーにインストールする必要があります 3。
flowchart TB
direction TB
subgraph cloud-service [クラウドサービス]
cloud-server[Microsoft Entra ID]
end
subgraph in-directory-service [内部向けディレクトリサービス]
in-server[OpenLDAP/Active Directory]
passsync-agent[PassSync Agent]
end
subgraph server [UCIDM サーバー]
subgraph docker[Docker]
agent[Agent]
web-ui[管理画面]
api[APIサーバー]
client[外部連携モジュール]
end
end
subgraph ext-directory-service [外部向けサービス]
ext-server[OpenLDAP/AD/Google/Microsoft Entra ID/SCIM]
end
cloud-server -- https --> agent
in-server -- event --> passsync-agent
passsync-agent -- https --> api
in-server -- ldaps --> agent
agent -- http --> api
web-ui -- http --> api
api -- messaging --> client
admin[管理者] -- http --> web-ui
client -- ldaps --> ext-directory-service
client -- https --> ext-directory-service
-
オンプレミスの Active Directory のこと ↩
-
厳密なシステム構成は UCIDM サーバー を参照してください ↩
-
現時点ではクラウドサービスからパスワード連携することはできません ↩
インストール
お客様の環境に UCIDM オンプレミス版をインストールする方法を説明します。
UCIDM サーバー をインストールするマシンに関して、マシンスペックやサポート OS などについて インストール要件 をご確認ください。
インストール作業は大きく分けて次の手順になります。それぞれのモジュールのインストールドキュメントをご確認ください。
インストール要件
マシンスペック要件
UCIDM サーバーは複数のアプリケーションを同時に実行するため、ある程度の CPU とメモリサイズを要求します。次のマシンスペックを最低限としつつ、余裕をもったマシンスペックを推奨します。
- CPU のコア数: 4以上を推奨
- メモリ: 8GiB 以上を推奨
- ディスク: 200GiB 程度
また適切なマシンスペックは実運用でID 連携に想定されるピーク時のトラフィック量やリクエストの同時接続数などによっても変わります。運用要件として大きなトラフィック量が想定される場合は弊社のサポート担当者にご相談ください。
アーキテクチャ
現時点では x86_64 のみをサポートします。将来的に arm64 を検討します。
x86_64
サポート OS
- Red Hat Enterprise Linux 9 / 互換OS
- Red Hat Enterprise Linux 10 / 互換OS
ネットワーク要件
UCIDM サーバーを構築するには、インターネット上にあるコンテナレジストリにアクセスしてコンテナイメージを取得します。サーバーマシンから外向けにインターネットアクセスできる必要があります。
さらに UCIDM サーバーから内部ディレクトリサービスのサーバーに変更検知のためにポーリングします。UCIDM サーバーから内部ディレクトリサービスのサーバーへアクセスできる必要があります。
Compose パッケージ
UCIDM は Docker Compose を使って複数のアプリケーションやミドルウェアを管理します。そのため、UCIDM をインストールするには Docker と Docker Compose もインストールする必要があります。またセキュリティ強化の観点から rootless モードの導入を推奨します。
Docker 社のドキュメントをベースにインストールの手順を説明します。
Docker 社のパッケージはバージョンによって変わる可能性があります。適切なパッケージがみつからない、または意図しないエラーが発生する場合は Docker 社のドキュメントを参考にしてください。
初回インストールするとき
Docker 社が提供するリポジトリ設定を取得します。
# dnf install -y dnf-plugins-core
# dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
Docker 関連のパッケージをインストールします。
# dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
アップグレードするとき
通常の dnf コマンドのアップグレードを実行してください。
# dnf upgrade -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
UCIDM パッケージ
UCIDM は RPM パッケージで提供します。RPM パッケージの入手方法は弊社のサポート担当者にご確認ください。
実際には install.sh などを同梱した tar.gz ファイルになります。
- 初回インストールするとき
- rsyslog の umask の設定
- nf_tables モジュールのロード
- ucidm ユーザーの設定
- ucidm ユーザーのログイン確認と docker サービスの初期設定
- パッケージのアップグレード
- パッケージのダウングレード
初回インストールするとき
ここでは RHEL9 の 1.0.0-1 というバージョンを例にインストール作業の説明をしますが、適宜お手持ちの OS, 最新のバージョンに置き換えて作業してください。
# tar xf osstech-ucidm-1.0.0-1.el9.x86_64.tar.gz
# ls -p
osstech-ucidm-1.0.0-1.el9.x86_64/ osstech-ucidm-1.0.0-1.el9.x86_64.tar.gz
# cd osstech-ucidm-1.0.0-1.el9.x86_64/
# ls -p
install.sh x86_64/
# ./install.sh
基本的には /opt/osstech 配下に各種ファイルがインストールされます。次のコマンドでインストールされた内容を確認できます。
# rpm -ql osstech-ucidm
インストールされるものの主な構成について説明します。
- /opt/osstech/bin: コマンドラインで使う運用ツール
- /opt/osstech/etc: ミドルウェアの設定ファイルなど
- /opt/osstech/share/ucidm:
compose.ymlを始め、アプリケーションやミドルウェアのサンプルファイルなど - /opt/osstech/var/backup/ucidm: ucidm のバックアップディレクトリ
- /var/log/osstech/ucidm: ucidm のログディレクトリ
- /var/opt/osstech/lib/ucidm: compose サービスを管理するホームディレクトリ
rsyslog の umask の設定
rsyslog サービスでは umask が 0066 (0600 でログファイル生成) と設定されています。
# systemctl cat rsyslog | grep -i umask
UMask=0066
systemd から起動される rsyslog サービスの umask 設定を変更するために /etc/rsyslog.conf に設定を追加します。次のように $Umask と $FileCreateMode をグローバル設定として追加します。
# vi /etc/rsyslog.conf
...
#### GLOBAL DIRECTIVES ####
$Umask 0006
$FileCreateMode 0600
$FileCreateMode を 0600 に設定することで他に特別な設定をしないときは変更前と同じ権限でログファイルが生成されます。
rsyslog サービスを再起動します。
# systemctl restart rsyslog
nf_tables モジュールのロード
nf_tables モジュールがロードされているかどうかを確認します。以下 lsmod のコマンドで以下例のような出力があればロードされています。
# lsmod | grep nf_tables
nf_tables 356352 0
nfnetlink 20480 1 nf_tables
libcrc32c 12288 2 nf_tables,xfs
上記 lsmod のコマンドで出力がない場合は、以下コマンドで nf_tables モジュールのロードを行ってください。
# modprobe nf_tables
ucidm ユーザーの設定
osstech-ucidm をインストールすると ucidm ユーザーが作成されます。docker グループが設定されていることを確認します。
# id ucidm
uid=992(ucidm) gid=992(ucidm) groups=992(ucidm),993(docker)
UCIDM は Docker Compose を使ってコンテナアプリケーションとして動作します。
セキュリティ強化の観点から、コンテナを root ユーザーではなく、非特権ユーザーで実行することが推奨されています。このことを rootless モード と呼び、非特権ユーザがコンテナを作成、実行、管理できます。
ここでは非特権ユーザーとして ucidm というユーザー/グループを作成します。お客様の環境ですでに適切なユーザーが存在するときは任意のユーザー/グループを使ってもかまいません。
インストール直後はパスワードが未設定になります。任意のパスワードを設定します。
# passwd ucidm
ユーザー ucidm のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
ucidm ユーザーのログイン確認と docker サービスの初期設定
別の端末を起動し、先ほど設定したパスワードで ucidm でログインできることを確認します。
もし ucidm ユーザーで直接ログインしないときは machinectl コマンドでユーザーを切り替える ようにしてください。
Docker 社のドキュメントをベースに ucidm ユーザーが docker サービスを起動できるように初期設定します。
dockerd-rootless-setuptool.sh という setup スクリプトが用意されているので実行します。
dockerd-rootless-setuptool.sh install
もし事前条件を満たしていないエラーメッセージが表示されたらその内容を設定してから再度 setup スクリプトを実行します。
正常にインストールされた場合、実行結果ログに表示されている DOCKER_HOST と次の rootless の DOCKER ENDPOINT が一致していることを確認します。
$ docker context ls
NAME DESCRIPTION DOCKER ENDPOINT ERROR
default Current DOCKER_HOST ... unix:///var/run/docker.sock
rootless * Rootless mode unix:///run/user/992/docker.sock
systemd をユーザー権限で実行して docker サービスが起動していることを確認します。
$ systemctl --user status docker
...
Active: active (running) since Tue 2023-10-03 19:02:33 JST; 4min 35s ago
...
docker コマンドで hello-world コンテナを実行できれば成功です。
$ docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
OS の再起動時に docker サービスが起動する設定になっていることを確認します。
$ systemctl --user is-enabled docker
enabled
パッケージのアップグレード
アップグレード前に一度バックアップを取得することを推奨します。 バックアップの取得方法は バックアップ の項を参照してください。
アップグレード前に既存サービスを停止させます。
docker compose --file /var/opt/osstech/lib/ucidm/compose.yml down
新しいバージョンの install.sh を実行してください。
# tar xf osstech-ucidm-1.0.0-2.el9.x86_64.tar.gz
# ls -p
osstech-ucidm-1.0.0-2.el9.x86_64/ osstech-ucidm-1.0.0-2.el9.x86_64.tar.gz
# cd osstech-ucidm-1.0.0-2.el9.x86_64/
# ./install.sh
バージョンが上がったことを確認してください。
# rpm -q osstech-ucidm
osstech-ucidm-1.0.0-2.el9.x86_64
パッケージのダウングレード
コンテナが起動中の場合は一度停止してください。
docker compose --file /var/opt/osstech/lib/ucidm/compose.yml down
古いバージョンの tar.gz ファイル内に含まれるrpmファイルを直接指定してダウングレードします。
# tar xf osstech-ucidm-1.0.0-1.el9.x86_64.tar.gz
# ls -p
osstech-ucidm-1.0.0-1.el9.x86_64/ osstech-ucidm-1.0.0-1.el9.x86_64.tar.gz
# cd osstech-ucidm-1.0.0-1.el9.x86_64/x86_64/
# dnf downgrade osstech-ucidm-1.0.0-1.el9.x86_64.rpm
ダウングレード出来たことを確認してください。
# rpm -q osstech-ucidm
osstech-ucidm-1.0.0-1.el9.x86_64
PassSync Agent パッケージ
PassSync パッケージは、既存の内部ディレクトリサービスを提供するサーバーにインストールします。RPM パッケージや Windows インストーラーの入手方法は弊社のサポート担当者にご確認ください。バージョンについては、適宜お手持ちの最新のバージョンに置き換えて作業してください。
Linux サーバー向け
前提条件
OSSTech 社 OpenLDAP サーバーを使っていただく必要があります。osstech-ucidm-agent-ldap-passsync はそこに含まれている osstech-base パッケージに依存します。ここでは RHEL9 の 1.0.0-1 というバージョンを例にインストール作業の説明をしますが、適宜お手持ちの OS, 最新のバージョンに置き換えて作業してください。
初回インストールするとき
# dnf install -y osstech-ucidm-agent-ldap-passsync-1.0.0-1.el9.x86_64.rpm
インストール後の設定は OpenLDAP 向け PassSync Agent をご確認ください。
アップグレードするとき
アップグレード前に既存サービスを停止させます。
# systemctl stop slapd
# systemctl stop osstech-ucidm-passsync
通常の rpm パッケージのアップグレードを実行してください。
# rpm -Uvh osstech-ucidm-agent-ldap-passsync-1.0.0-2.el9.x86_64.rpm
アップグレードを完了したらサービスを開始します。
# systemctl start osstech-ucidm-passsync
# systemctl start slapd
Windows サーバー向け
UCIDM-ADPassHook-Setup.msi と UCIDM-ADPassSync-Setup.msi を使用してインストール/アップグレード/アンインストールを行います。 Microsoft Visual C++ 再頒布可能パッケージを事前にインストールしておく必要があります。
UCIDM-ADPassHook
初回インストールするとき
- UCIDM-ADPassHook-Setup.msi を右クリックして
インストールを選択します(アップグレード/アンインストール時にもインストーラーを使用します)。 - インストール後、OS を再起動します。
インストール後の設定は Active Directory 向け PassSync Agent をご確認ください。
アップグレードするとき
- UCIDM-ADPassHook-Setup.msi を右クリックして
アンインストールを選択します。 - アンインストール後、OS を再起動します。
- 新しいバージョンの UCIDM-ADPassHook-Setup.msi を右クリックして
インストールを選択します。 - インストール後、OS を再起動します。
アンインストールするとき(インストーラーを使用する方法)推奨
- UCIDM-ADPassHook-Setup.msi を右クリックして
アンインストールを選択します。 - アンインストール後、OS を再起動します。
- System32 にある UCIDM_ADPassHook.dll と UCIDM_PasswordHook_EventMessages.dll を削除します。
アンインストールするとき(インストーラーを使用しない方法)
- Windows の「設定」-「アプリ」-「アプリと機能」から「UCIDM-ADPassHook」を選択してアンインストールを行います。
- アンインストール後、OS を再起動します。
- System32 にある UCIDM_ADPassHook.dll と UCIDM_PasswordHook_EventMessages.dll を削除します。
UCIDM-ADPassSync
初回インストールするとき
- UCIDM-ADPassSync-Setup.msi を右クリックして
インストールを選択します(アップグレード/アンインストール時にもインストーラーを使用します)。 - インストール完了後、OS を再起動することでサービス UCIDM-ADPassSync が起動します。UCIDM-ADPassSync が起動しているかどうかは、
コンピュータの管理からサービスとアプリケーション->サービス一覧にある UCIDM-ADPassSync の状態で確認できます。
インストール後の設定は Active Directory 向け PassSync Agent をご確認ください。
アップグレードするとき
アップグレードする時はサービス UCIDM-ADPassSync が停止している必要があります。
- サービスが起動している場合は、
コンピュータの管理からサービスとアプリケーション->サービス一覧にある UCIDM-ADPassSync を右クリックしてプロパティ-> スタートアップの種類無効を選択をして適用します。 - 適用後、OS を再起動します。
C:\OSSTechディレクトリを削除し、新しいバージョンの UCIDM-ADPassSync-Setup.msi を右クリックしてインストールを行います。 - インストール後、OS を再起動することでサービス UCIDM-ADPassSync が起動します。UCIDM-ADPassSync が起動しているかどうかは、
コンピュータの管理からサービスとアプリケーション->サービス一覧にある UCIDM-ADPassSync の状態で確認できます。
アンインストールするとき(インストーラーを使用する方法)推奨
アンインストールする時はサービス UCIDM-ADPassSync が停止している必要があります。
- サービスが起動している場合は、
コンピュータの管理からサービスとアプリケーション->サービス一覧にある UCIDM-ADPassSync を右クリックして停止を選択をすると停止します。 - 停止後、UCIDM-ADPassSync-Setup.msi を右クリックして
アンインストールを選択してアンインストールします。サービス UCIDM-ADPassSync を停止せずにアンインストールした場合は、OS を再起動することでサービス UCIDM-ADPassSync は削除されます。アンインストール時に EventLog サービスなどの警告が表示された場合は「OK」を選択します。 C:\OSSTech\UCIDM-ADPassSyncディレクトリを削除します。
アンインストールするとき(インストーラーを使用しない方法)
アンインストールする時はサービス UCIDM-ADPassSync が停止している必要があります。
- サービスが起動している場合は、
コンピュータの管理からサービスとアプリケーション->サービス一覧にある UCIDM-ADPassSync を右クリックして停止を選択をすると停止します。 - 停止後、Windows の「設定」-「アプリ」-「アプリと機能」から「UCIDM-ADPassSync」を選択してアンインストールを行います。
C:\OSSTech\UCIDM-ADPassSyncディレクトリを削除します。
設定
パッケージのインストール 後に個々のモジュール設定を行ってサービスを起動します。
モジュールがインストールされているサーバー別に設定を説明します。
基本的に UCIDM と PassSync Agent を同じマシンで運用することはないと考えられますが、テスト用途など1台のマシンで動作させることはできます。
UCIDM サーバー
UCIDM サーバーにおけるアプリケーションやミドルウェアの詳細なシステム概要を次に示します。
UCIDM サーバーとコンテナレジストリ
アプリケーションのコンテナは Docker Compose で管理しています。コンテナを作成するにはインターネット上のコンテナレジストリからコンテナイメージを取得しておく必要があります。
flowchart LR subgraph cr [コンテナレジストリ] repo[リポジトリ] end subgraph server [UCIDM サーバー] subgraph compose[Docker Compose] end end compose -- "docker pull" --> repo repo -- image --> compose
UCIDM サーバー内部のサービス詳細
Docker Compose 内部で複数のサービスが協調してシステムを構成しています。
内部ディレクトリサービス/クラウドサービスと Agent モジュールのデータフロー
flowchart TB
subgraph cloud-service [クラウドサービス]
cloud-server[Microsoft Entra ID]
end
subgraph in-directory-service [内部向けディレクトリサービス]
subgraph windows [Windows サーバー]
adserver[Active Directory]
passsync-agent-ad[Agent PassSync<br />For AD]
end
subgraph linux [Linux サーバー]
in-ldapserver[OSSTech OpenLDAP<br />サーバー]
passsync-agent-ldap[Agent PassSync<br />For OpenLDAP]
end
end
subgraph server [UCIDM サーバー]
proxy["リバースプロキシ<br />(TLS 終端)"]
subgraph compose[Docker Compose]
agent[Agent]
api[UCIDM API]
end
end
cloud-server -- https --> agent
adserver -- event --> passsync-agent-ad
passsync-agent-ad -- https --> proxy
in-ldapserver -- event --> passsync-agent-ldap
passsync-agent-ldap -- https --> proxy
adserver -- ldaps --> agent
in-ldapserver -- ldaps --> agent
agent -- http --> api
proxy -- http --> api
UCIDM サーバーと外部サービスのデータフロー
flowchart TB
subgraph server [UCIDM サーバー]
proxy["リバースプロキシ<br />(TLS 終端)"]
subgraph compose[Docker Compose]
agent[Agent]
admin-ui-bff[Admin UI BFF]
ucidm-ui-bff[UCIDM UI BFF]
api[UCIDM<br />API]
client[外部連携<br />モジュール]
client o--o mongodb
api o--o mongodb(MongoDB)
api -- publish --> rabbitmq(RabbitMQ)
end
end
subgraph cloud-service [クラウドサービス]
subgraph cloud-server [クラウドサーバー]
end
end
subgraph in-directory-service [内部向けディレクトリサービス]
subgraph ldap-server [LDAP サーバー]
end
end
subgraph ext-directory-service [外部向けサービス]
ext-openldap[OpenLDAP]
ext-ad[Active Directory]
ext-google[Google Workspace]
ext-me-id[Microsoft Entra ID]
ext-scim[SCIM]
end
cloud-service -- https --> agent
in-directory-service -- ldaps/https --> agent
api -- ldaps --> ldap-server
proxy -- http --> admin-ui-bff
proxy -- http --> ucidm-ui-bff
agent -- http --> api
admin-ui-bff -- http --> api
ucidm-ui-bff -- http --> api
proxy -- http --> api
rabbitmq -- subcribe --> client
admin-ui(Admin UI) o--o sysadmin(システム<br />管理者)
admin-ui -- https --> proxy
ucidm-ui(UCIDM UI) o--o user(一般<br />ユーザー)
ucidm-ui -- https --> proxy
client -- ldaps/https --> ext-directory-service
UCIDM サーバーと周辺サービス全体
前節の図を1つに統合したデータフローです。
%%{init: {"flowchart": {"defaultRenderer": "elk"}} }%%
flowchart TB
subgraph server [UCIDM サーバー]
proxy["リバースプロキシ<br />(TLS 終端)"]
subgraph compose[Docker Compose]
agent[Agent]
admin-ui-bff[Admin UI BFF]
ucidm-ui-bff[UCIDM UI BFF]
api[UCIDM API]
client[外部連携モジュール]
api o--o mongodb(MongoDB)
api -- publish --> rabbitmq(RabbitMQ)
client o--o mongodb
end
end
subgraph cloud-service [クラウドサービス]
subgraph cloud-server [クラウドサーバー]
meid[Microsoft Entra ID]
end
end
subgraph in-directory-service [内部向けディレクトリサービス]
subgraph windows [Windows サーバー]
adserver[Active Directory]
passsync-agent-ad[Agent PassSync<br />For AD]
end
subgraph linux [Linux サーバー]
in-ldapserver[OSSTech OpenLDAP<br />サーバー]
passsync-agent-ldap[Agent PassSync<br />For OpenLDAP]
end
end
subgraph ext-directory-service [外部向けサービス]
ext-openldap[OpenLDAP]
ext-ad[Active Directory]
ext-google[Google Workspace]
ext-me-id[Microsoft Entra ID]
ext-scim[SCIM]
end
adserver -- event --> passsync-agent-ad
in-ldapserver -- event --> passsync-agent-ldap
passsync-agent-ad -- https --> proxy
passsync-agent-ldap -- https --> proxy
meid -- https --> agent
adserver -- ldaps --> agent
in-ldapserver -- ldaps --> agent
api -- ldaps --> in-directory-service
agent -- http --> api
proxy -- http --> api
proxy -- http --> admin-ui-bff
proxy -- http --> ucidm-ui-bff
admin-ui-bff -- http --> api
ucidm-ui-bff -- http --> api
rabbitmq -- subcribe --> client
admin-ui(Admin UI) o--o sysadmin(システム管理者)
admin-ui -- https --> proxy
ucidm-ui(UCIDM UI) o--o user(一般ユーザー)
ucidm-ui -- https --> proxy
client -- ldaps/https --> ext-directory-service
Compose サービスの準備
UCIDM は Docker Compose を使い、複数のアプリケーションやミドルウェアのコンテナを起動して、それぞれのサービスが協調してシステムを構成しています。
これらはすべて compose.yml に設定します。また compose.yml はデフォルトの動作として環境変数を同じディレクトリ内の .env から読み込みます。
.env ファイルはパスワードなどの機密情報を含むため、ファイルを保管するマシンへのアクセス権限に注意してください。ここでは ucidm ユーザーがアクセス権限をもつと仮定して設定作業を行います。
コンテナレジストリへのアクセス設定
OSSTech 社のコンテナレジストリ にアクセスするには Docker Hub へ ログイン する必要があります。作業するユーザーの初回設定時のみ、次のようにしてログインしてください。実際に設定するパスワードは弊社のサポート担当者にご確認ください。
$ docker login --username osstech
Password: # パスワードを入力
...
Login Succeeded
ログインに成功すると、ホームディレクトリの .docker ディレクトリ配下に config.json というファイルが作成されて認証情報が保存されます。すでに config.json が存在するのであれば今回の設定が追加されます。
$ cat $HOME/.docker/config.json
設定後、次のように実行してください。認証情報が正しければコンテナイメージを取得してコンテナを実行できます。
$ docker run docker.io/osstech/test-myrepo
...
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
Docker Compose の設定ファイル
ucidm ユーザーのホームディレクトリである /var/opt/osstech/lib/ucidm に compose.yml を配置します。
$ cd
Docker Compose の設定のサンプルファイルを /var/opt/osstech/lib/ucidm ディレクトリにコピーします。compose.yml で扱う変数はデフォルトで .env ファイルで解決されます。この .env ファイルを直接使うデメリットとして次があります。
-aオプションなしの ls コマンドで表示されないために.envファイルを探しにくい- シェルのワイルドカード展開で対象から除外されるために grep コマンドなどでフィルターされない
.env ファイル以外のファイル名で使う場合、docker コマンドへのオプション指定や環境変数設定が必要になります。これらのデメリットを解消した上で追加設定を不要にするため、ucidm.env を参照するシンボリックリンクとして .env を作成します。
$ cp /opt/osstech/share/ucidm/compose.yml .
$ cp /opt/osstech/share/ucidm/ucidm.env.example ucidm.env
$ ln -s "$(pwd)/ucidm.env" "$(pwd)/.env"
Docker Compose 上でコンテナとして稼働するアプリケーションやミドルウェアの設定のサンプルファイルも一緒にコピーします。これらのディレクトリはコンテナのサービスごとに永続化データ、設定情報やスクリプト等のファイルを配置しています。コンテナを起動したときに、さらにディレクトリを作る場合もあります。
$ cp -a /opt/osstech/share/ucidm/{mongodb,rabbitmq,agent-data,server-data,ucidm-ui} .
$ ls -p # 次のファイルやディレクトリがあることを確認
agent-data/ compose.yml mongodb/ rabbitmq/ server-data/ ucidm-ui/ ucidm.env
compose.yml の構文チェックを行います。次のように実行してワーニングやエラーが出力されないことを確認します。
$ docker compose config 1>/dev/null
$ echo $?
0
コンテナイメージの取得
compose.yml を配置できました。この後にいくつか環境変数を設定していきますが、先にコンテナイメージをローカルに取得しておきます。すでにコンテナイメージを取得済みであっても、より新しいイメージがあれば最新のイメージを取得します。
$ docker compose pull
ローカルに取得したコンテナイメージを確認します。
$ docker image ls
Docker Compose 上で稼働させるアプリケーションやミドルウェアの設定の詳細は次のページでみていきます。
- MongoDB
- RabbitMQ
- UCIDM API
- ID 連携管理画面
- ユーザープロファイル画面
- 外部連携 のそれぞれのサービス
- サンプルの
compose.ymlから必要なサービス定義以外は削除してください
- サンプルの
- Agent モジュール のそれぞれのサービス
- サンプルの
compose.ymlから必要なサービス定義以外は削除してください
- サンプルの
MongoDB
UCIDM はデータベースとして MongoDB を使ってユーザやグループの情報、外部連携のために必要な情報、ID 連携の履歴情報、アカウント管理の情報などを格納します。
Docker Compose の設定
MongoDB はコンテナとして稼働させます。次のように compose.yml に設定します。任意で設定している項目の値はサンプルです。お客様の環境にあわせて値を変更してください。
mongo:
container_name: mongo
user: root
image: docker.io/bitnamilegacy/mongodb:8.0.3
logging: *default-logging
volumes:
- type: bind
source: ./mongodb
target: /bitnami/mongodb
bind:
create_host_path: true
environment:
TZ: "${TZ}"
MONGODB_ROOT_USER: "${MONGO_USER}"
MONGODB_ROOT_PASSWORD: "${MONGO_PASSWORD}"
MONGODB_PORT_NUMBER: "27017"
MONGODB_INITIAL_PRIMARY_PORT_NUMBER: "27017"
MONGODB_ADVERTISED_HOSTNAME: "${MONGO_HOSTNAME}"
MONGODB_REPLICA_SET_NAME: "${MONGO_REPLICA_SET}"
MONGODB_REPLICA_SET_MODE: "primary"
MONGODB_REPLICA_SET_KEY: "my/replication/common/key123"
MONGODB_SYSTEM_LOG_VERBOSITY: 0
hostname: "${MONGO_HOSTNAME}"
restart: "always"
healthcheck:
test: mongosh "mongodb://localhost:27017/test?directConnection=false&replicaSet=${MONGO_REPLICA_SET}" --eval 'db.runCommand("ping").ok' --quiet
interval: 60s
timeout: 5s
retries: 3
start_period: 30s
start_interval: 3s
ここで参照する環境変数は .env に設定します。
環境変数の設定
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| TZ | 任意 | – | タイムゾーン情報 |
| MONGODB_ROOT_USER | 任意 | root | MongoDB の root ユーザー名 |
| MONGODB_ROOT_PASSWORD | 任意 | – | MongoDB の root ユーザーのパスワード |
| MONGODB_PORT_NUMBER | 任意 | 27017 | MongoDB に接続するポート番号 |
| MONGODB_INITIAL_PRIMARY_PORT_NUMBER | 任意 | 27017 | レプリカセットのプライマリーノードのポート番号 |
| MONGODB_ADVERTISED_HOSTNAME | 任意 | – | レプリカセットが使うホスト名 |
| MONGODB_REPLICA_SET_NAME | 任意 | – | レプリカセットの名前 |
| MONGODB_REPLICA_SET_MODE | primary | – | レプリケーションモード (primary, secondary, arbiter) |
| MONGODB_REPLICA_SET_KEY | 任意 | – | レプリカセットの認証のための共通鍵 |
| MONGODB_SYSTEM_LOG_VERBOSITY | 0 | 0 | ログレベル (0-5) |
詳細については MongoDB® packaged by Bitnami を参照してください。
RabbitMQ
UCIDM は API サーバーで受け取った ID 連携の情報を RabbitMQ を経由して複数の外部連携先に送ります。
Docker Compose の設定
RabbitMQ はコンテナとして稼働させます。次のように compose.yml に設定します。
rabbitmq:
container_name: rabbitmq
hostname: rabbitmq
image: docker.io/library/rabbitmq:4.0.3-management
logging: *default-logging
environment:
RABBITMQ_DEFAULT_USER: "${RABBITMQ_USER}"
RABBITMQ_DEFAULT_PASS: "${RABBITMQ_PASSWORD}"
ports:
- 127.0.0.1:15672:15672
volumes:
- type: bind
source: ./rabbitmq/rabbitmq.conf
target: /etc/rabbitmq/rabbitmq.conf
read_only: true
bind:
create_host_path: false
- type: bind
source: ./rabbitmq-data
target: /var/lib/rabbitmq
bind:
create_host_path: true
restart: "always"
healthcheck:
test: rabbitmq-diagnostics -q ping
interval: 60s
timeout: 5s
retries: 3
start_period: 30s
start_interval: 5s
ここで参照する環境変数は .env に設定します。
環境変数の設定
| 環境変数 | 値 | 説明 |
|---|---|---|
| RABBITMQ_DEFAULT_USER | 任意 | 初期化時に作成する RabbitMQ のユーザ名 |
| RABBITMQ_DEFAULT_PASS | 任意 | 初期化時に作成する RabbitMQ のパスワード |
RabbitMQ の管理
RabbitMQ サービスを起動した後の Exchange や Queue を管理するための機能を紹介します。UCIDM API サーバーが起動するときに自動的に初期設定は行うため、とくに管理のための設定を行う必要はありません。しかし、メッセージング機能のカスタマイズやトラブルシューティングのときにこれらの管理機能を使うと便利です。
mqadmin を使う
環境変数を誤って書き換えてしまわないよう、Docker Compose を操作している端末とは別の端末で作業することをお奨めします。環境変数を設定するサンプルファイルをコピーして編集します。
$ cp /opt/osstech/share/ucidm/exports-mqadmin.sh .
$ vi exports-mqadmin.sh
RabbitMQ に接続するための環境変数を設定します。
# rabbitmq の接続設定
export RABBITMQ_USER="${ユーザー}"
export RABBITMQ_PASSWORD="${パスワード}"
export RABBITMQ_HOST="localhost:5672"
# rabbitmq の management plugin のポート番号
export MQADMIN_PORT=15672
設定した環境変数を source コマンドで読み込みます。
$ source exports-mqadmin.sh
Exchange の情報を取得してみましょう。次のように表示されれば成功です。
$ /opt/osstech/bin/mqadmin get-exchange -name ucidm
time=2023-04-22T06:31:47.693Z level=INFO msg="got the given exchange" name=ucidm
{
"name": "ucidm",
"vhost": "/",
"type": "direct",
"durable": true,
"auto_delete": false,
"internal": false,
"arguments": {},
"incoming": [],
"outgoing": [],
"message_stats": {},
"bindings": [
{
"source": "ucidm",
"vhost": "/",
"destination": "local-001",
"destination_type": "queue",
"routing_key": "local-001",
"arguments": {},
"properties_key": "local-001"
}
]
}
これらの環境変数を削除するには次のように実行します。
$ unset RABBITMQ_USER RABBITMQ_PASSWORD RABBITMQ_HOST MQADMIN_PORT
RabbitMQ の管理画面を使う
localhost:15672 にアクセスします (ここでは接続先を localhost として説明しますが、適宜、お客様の環境にあわせてください) 。次のように管理画面へのログインページが表示されます。

前節の環境変数で設定したユーザー名とパスワードを使ってログインします。
UCIDM API
UCIDM は ID 連携のための Web API を提供します。
さまざまな機能を提供します。
- ユーザ・グループ操作
- 外部連携先設定操作
- 履歴情報一覧
- ID 連携ジョブ管理
- LDAP サーバー管理
- アカウント管理
- システム設定
UCIDM API はコンテナとして稼働させます。次のように compose.yml に設定します。
api:
depends_on:
mongo:
condition: service_healthy
rabbitmq:
condition: service_healthy
container_name: api
hostname: api
image: docker.io/osstech/ucidm-api:latest
logging: *default-logging
volumes:
- type: bind
source: ./server-data
target: /ucidm
bind:
create_host_path: false
- type: bind
source: ./server-data/files
target: /files
bind:
create_host_path: true
#- type: bind
# source: ./certs/chainCA.crt
# target: ${SSL_CERT_FILE}
# read_only: true
# bind:
# create_host_path: false
entrypoint:
- ./bin/entrypoint.sh
- -port
- ${API_PORT}
- -jsonl
environment:
TZ: "${TZ}"
# SSL_CERT_FILE: "${SSL_CERT_FILE}"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
RABBITMQ_USER: "${RABBITMQ_USER}"
RABBITMQ_PASSWORD: "${RABBITMQ_PASSWORD}"
RABBITMQ_HOST: "${RABBITMQ_HOST}"
ports:
- 127.0.0.1:${API_PORT}:${API_PORT}
restart: "always"
ここで参照する環境変数は .env に設定します。
環境変数の設定
API サーバー
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| TZ | 任意 | – | タイムゾーン情報 |
| API_PORT | 18080 | – | 接続を受け付けるポート番号 |
| SSL_CERT_FILE | 任意 | – | LDAP サーバーとの接続において 信頼する CA 証明書を指定 |
ミドルウェア
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| MONGO_USER | 任意 | – | 接続する MongoDB のユーザ名 |
| MONGO_PASSWORD | 任意 | – | 接続する MongoDB のパスワード |
| MONGO_HOSTS | 任意 | – | 接続する MongoDB のホスト |
| MONGO_REPLICA_SET | 任意 | – | 接続する MongoDB のレプリカセットの名前 |
| RABBITMQ_USER | 任意 | – | 接続する RabbitMQ のユーザ名 |
| RABBITMQ_PASSWORD | 任意 | – | 接続する RabbitMQ のパスワード |
| RABBITMQ_HOST | 任意 | – | 接続する RabbitMQ のホスト |
| MAX_PRODUCER_SESSIONS | 任意 | 512 | RabbitMQ Procuder の最大セッション数 |
ホスト名を名前解決できないとき
コンテナ内からホスト OS の /etc/hosts を参照することはできません。コンテナ内からアクセスするホスト名を DNS で解決できない場合、コンテナ内に /etc/hosts を配置するのに相当する設定が extra_hosts になります。
api:
...
ports:
- 127.0.0.1:${API_PORT}:${API_PORT}
extra_hosts:
- "host1.example.com:10.0.100.1"
- "host2.example.com:10.0.100.2"
- "host3.example.com:10.0.100.3"
ID 連携管理画面
UCIDM は ID 連携の管理者向けの管理画面を提供します。
画面の操作については こちら を参照ください。
管理画面のアプリケーションはコンテナとして稼働させます。次のように compose.yml に設定します。
admin-ui:
container_name: admin-ui
image: docker.io/osstech/ucidm-admin-ui:latest
logging: *default-logging
environment:
PORT: "${ADMIN_NODE_PORT}"
PUBLIC_UCIDM_API_SERVER: "http://${API_HOST}:${API_PORT}"
JWT_ACCESS_SECRET: "${JWT_ACCESS_SECRET}"
SESSION_MAX_AGE: "${SESSION_MAX_AGE}"
ports:
- ${ADMIN_NODE_PORT}:${ADMIN_NODE_PORT}
restart: "always"
ここで参照する環境変数は .env に設定します。
環境変数の設定
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| PORT | 3030 | – | 接続を受け付けるポート番号 |
| PUBLIC_UCIDM_API_SERVER | http://api:18080 | – | 接続する UCIDM API のベース URL |
| PUBLIC_HTTP_REQUEST_TIMEOUT | 任意 | 10000 | Server API に対する HTTP リクエストの timeout 時間 (ミリ秒) (実行中ジョブ取得、認証系など一部例外あり) (0 で無制限) |
| JWT_ACCESS_SECRET | 任意 | – | JWT の署名に使う文字列 |
| SESSION_MAX_AGE | 任意 | 3600 | 管理画面のログインセッションの最大時間(秒) |
ユーザープロファイル画面
UCIDM はユーザープロファイル画面を提供します。
画面の操作については次のドキュメントを参照ください。
ユーザープロファイル画面のアプリケーションはコンテナとして稼働させます。次のように compose.yml に設定します。
ucidm-ui:
container_name: ucidm-ui
image: docker.io/osstech/ucidm-ui:latest
user: root
logging: *default-logging
volumes:
- type: bind
source: ./ucidm-ui/designs
target: /designs
bind:
create_host_path: false
- type: bind
source: ./ucidm-ui/images
target: /images
bind:
create_host_path: false
environment:
PORT: "${UCIDM_NODE_PORT}"
PUBLIC_UCIDM_API_SERVER: "http://${API_HOST}:${API_PORT}"
PUBLIC_ADMIN_UI_URL: "${ADMIN_UI_URL}"
# PUBLIC_ENABLE_SAML_LOGIN: "${ENABLE_SAML_LOGIN}"
# PUBLIC_ENABLE_SP_INIT_SLO: "${ENABLE_SP_INIT_SLO}"
# PUBLIC_TOTP_REGISTER_URL: "${TOTP_REGISTER_URL}"
# PUBLIC_PASSKEY_REGISTER_URL: "${PASSKEY_REGISTER_URL}"
JWT_ACCESS_SECRET: "${JWT_ACCESS_SECRET}"
SESSION_MAX_AGE: "${SESSION_MAX_AGE}"
DISABLE_HEADER_TEMPLATE: "${DISABLE_HEADER_TEMPLATE}"
DISABLE_FOOTER_TEMPLATE: "${DISABLE_FOOTER_TEMPLATE}"
DEFAULT_LANGUAGE: "${DEFAULT_LANGUAGE}"
BODY_SIZE_LIMIT: "Infinity"
ports:
- ${UCIDM_NODE_PORT}:${UCIDM_NODE_PORT}
restart: "always"
ここで参照する環境変数は .env に設定します。
環境変数の設定
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| PORT | 3030 | – | 接続を受け付けるポート番号 |
| PUBLIC_UCIDM_API_SERVER | http://api:18080 | – | 接続する UCIDM API のベース URL |
| PUBLIC_ADMIN_UI_URL | https://localhost/sys | – | ID 連携管理画面の URL |
| PUBLIC_ENABLE_SAML_LOGIN | true または false | false | ユーザープロファイル画面で SAML でのログインを行うことの可否 |
| PUBLIC_ENABLE_SP_INIT_SLO | true または false | false | ユーザープロファイル画面で SAML シングルログアウトを行うことの可否 |
| PUBLIC_TOTP_REGISTER_URL | 任意 | – | TOTP の登録を行う URL |
| PUBLIC_PASSKEY_REGISTER_URL | 任意 | – | Passkey の登録を行う URL |
| PUBLIC_HTTP_REQUEST_TIMEOUT | 任意 | 10000 | Server API に対する HTTP リクエストの timeout 時間 (ミリ秒) (実行中ジョブ取得、認証系など一部例外あり) (0 で無制限) |
| JWT_ACCESS_SECRET | 任意 | – | JWT の署名に使う文字列 |
| SESSION_MAX_AGE | 任意 | 3600 | 管理画面のログインセッションの最大時間(秒) |
| DISABLE_HEADER_TEMPLATE | true または false | false | ヘッダーカスタマイズの有無 |
| DISABLE_FOOTER_TEMPLATE | true または false | false | フッターカスタマイズの有無 |
| DEFAULT_LANGUAGE | ja または en | en | ユーザープロファイル画面でのデフォルト言語 |
| BODY_SIZE_LIMIT | 任意 | Infinity | BFF へのリクエストボディサイズの上限 |
外部連携
UCIDM は次の外部連携先への ID 連携に対応しています。
- OpenLDAP
- Microsoft Entra ID
- Google Workspace
- Windows AD
- SCIM
- SCIM は次の連携先での動作を確認しています。
- Salesforce
- SCIM は次の連携先での動作を確認しています。
複数の連携先がある場合、個々の連携先単位に 1 つのプロセスが割り当てられます。
例えば、3 つの連携先がある場合は 3 つのプロセスが起動します。設定がやや冗長となるデメリットはありますが、ある連携先サービスで障害が発生しても他の連携先には影響しないというメリットがあります。
外部サービスや連携先のプロトコル単位にモジュールを実装して拡張できる設計になっています。もしお客様の環境に必要なモジュールがない場合は弊社のサポート担当者にご相談ください。
UCIDM では、連携されてきたエントリのデータを外部連携先のデータにマッピングして外部連携を実施しています。このマッピングは各外部連携先ごとに複数定義することもできます。設定の詳細については、以下 ID 連携管理画面の「外部連携設定画面」および「ルート設定画面」の項をご参照ください。
OpenLDAP 外部連携モジュール
UCIDM は OpenLDAP に対して ID 連携できます。
OpenLDAP 外部連携モジュールはコンテナとして稼働させます。次のように compose.yml に設定します。
consumer-ldap:
depends_on:
rabbitmq:
condition: service_healthy
container_name: consumer-ldap
image: docker.io/osstech/ucidm-consumer:latest
logging: *default-logging
ports:
- 7099:7099
volumes:
- type: bind
source: ./server-data
target: /ucidm
bind:
create_host_path: false
entrypoint:
- ./bin/app-main
- -jsonl
environment:
TZ: "${TZ}"
DESTINATION_ID: "ldap-001"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
RABBITMQ_USER: "${RABBITMQ_USER}"
RABBITMQ_PASSWORD: "${RABBITMQ_PASSWORD}"
RABBITMQ_HOST: "${RABBITMQ_HOST}"
LDAP_URL: "${LDAP1_URL}"
LDAP_BIND_DN: "${LDAP1_BIND_DN}"
LDAP_BIND_PASSWORD: "${LDAP1_BIND_PASSWORD}"
restart: "always"
ここで参照する環境変数は .env に設定します。
起動時のオプション設定
entrypoint では次の設定ができます。
-verbose: デバッグログを出力-jsonl: JSON 形式でログを出力
環境変数の設定
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| TZ | 任意 | – | タイムゾーン情報 |
| DESTINATION_ID | 任意 | – | 外部連携先 ID 管理画面で作成した外部連携先 ID を指定 |
| MONGO_USER | 任意 | – | 接続する MongoDB のユーザ名 |
| MONGO_PASSWORD | 任意 | – | 接続する MongoDB のパスワード |
| MONGO_HOSTS | 任意 | – | 接続する MongoDB のホスト |
| MONGO_REPLICA_SET | 任意 | – | 接続する MongoDB のレプリカセットの名前 |
| RABBITMQ_USER | 任意 | – | 接続する RabbitMQ のユーザ名 |
| RABBITMQ_PASSWORD | 任意 | – | 接続する RabbitMQ のパスワード |
| RABBITMQ_HOST | 任意 | – | 接続する RabbitMQ のホスト |
| LDAP_URL | 任意 | – | 接続する LDAP の URL (例: ldaps:// |
| LDAP_BIND_DN | 任意 | – | LDAP の Bind DN |
| LDAP_BIND_PASSWORD | 任意 | – | LDAP の Bind DN のパスワード |
| ENABLE_SCRIPT_PASSWORD | true または false | false | ユーザーパスワード更新時に外部連携の 前処理/後処理スクリプトにパスワードの値を連携するかどうか |
OpenLDAP 動作設定
管理画面にて OpenLDAP の動作設定をすることができます。
設定項目と内容は次になります。
- TLS の検証をスキップ
- TLS の検証をスキップするかを指定します
- 有効無効設定情報を使用する
- ユーザープロファイルのステータス設定画面で指定した有効無効設定の情報を利用して、ユーザーのステータスの値を取得する場合は は on にします
- ステータス用属性名
- 有効無効設定情報を使用しない場合にこちらの設定が使われます
- OpenLDAP ではユーザのステータス用の属性がなく、OpenLDAP 外部連携モジュールでは、ユーザエントリのパスワードの値を書き換えることで、有効化/無効化の制御をしています
- マッピング後の属性について、true/false のステータスとして使いたい属性を指定します(有効化の場合は true、無効化の場合は false が割り当てられる必要があります)
- ステータス用属性に指定した属性については、LDAP のユーザ送信データにそのまま含まれるということはありません
- 値が未設定の場合は、連携先 LDAP へのステータス情報の反映は行われません
- ドライランモード
- 接続の取得やエントリの検索は行いますが、実際にエントリの追加/変更/削除は行わないモードとなります
- 主にテスト時の動作確認等に使うことを想定しています
- ユーザー追加/更新を行わない
- OpenLDAP に対してユーザー追加/更新を行わない場合は、この項目をオン(true)にしてください
- ユーザー削除を行わない
- OpenLDAP に対してユーザー削除を行わない場合は、この項目をオン(true)にしてください
- ユーザーパスワード更新を行わない
- OpenLDAP に対してユーザーパスワード更新を行わない場合は、この項目をオン(true)にしてください
- グループ追加/更新を行わない
- OpenLDAP に対してグループ追加/更新を行わない場合は、この項目をオン(true)にしてください
- グループ削除を行わない
- OpenLDAP に対してグループ削除を行わない場合は、この項目をオン(true)にしてください
- グループメンバー追加を行わない
- OpenLDAP に対してグループメンバー追加を行わない場合は、この項目をオン(true)にしてください
- グループメンバー削除を行わない
- OpenLDAP に対してグループメンバー削除を行わない場合は、この項目をオン(true)にしてください
OpenLDAP マッピング設定
OpenLDAP は次のマッピング設定をすることができます。
- DN マッピング
- ObjectClass マッピング
- 属性マッピング
それぞれのマッピング設定について説明します。
DN マッピング
UCIDM で保持するエントリは DN がキーとなり連携されてきます。
この DN の値を、OpenLDAP の DN の値にマッピングする設定をすることができます。
- DN の変換元部分
- 変換前の DN にて、変換したい箇所を指定します
- DN の変換先部分
- 上記変換したい箇所に、変換したい値を指定します
- DN 変換先の RDN 属性名
- 変換後の DN において、最初の要素の属性名を指定します
例えば、uid=test01,dc=srcldap,dc=com を cn=test01,dc=example,dc=com にマッピングしたい場合は、次のように指定します。
- DN の変換元部分
- dc=srcldap,dc=com
- DN の変換先部分
- dc=example,dc=com
- DN 変換先の RDN 属性名
- cn
ObjectClass マッピング
連携元からくる ObjectClass のデータを、連携先の OpenLDAP に連携するための ObjectClass にマッピングする設定をすることができます。
- 連携先に追加で連携する ObjectClass
- 連携先 LDAP に追加で連携する ObjectClass を指定します
- 複数値を指定することができます
- 連携先に連携しない ObjectClass
- 連携元からくる ObjectClass のデータにて、連携先 LDAP に連携しない ObjectClass を指定します
- 複数値を指定することができます
例えば、連携元から、["top", "inetOrgPerson", "organizationalPerson"] のデータが来た際に、連携先に送信する ObjectClass として、["top", "inetOrgPerson", "posixAccount"] を指定したい場合は、次のように設定します。
- 連携先に追加で連携する ObjectClass
- posixAccount
- 連携先に連携しない ObjectClass
- organizationalPerson
属性マッピング
次の 属性マッピング設定 を参考にしてください。
ユーザーステータスの有効化/無効化の制御をしたい場合は、ステータス用の属性のマッピングも指定してください。
前処理・後処理スクリプト設定
UCIDM では、外部連携処理の前後で任意のシェルスクリプトを実行することができます。
次の 外部連携の前処理/後処理で実行するスクリプトの配置 を参考に、スクリプトファイルを配置後、外部連携の前処理/後処理で実行するスクリプトの設定 を参考に、実行したいスクリプトファイルを指定してください。
OpenLDAP 外部連携モジュールの留意事項
ユーザステータスの有効化/無効化は、OpenLDAP の userPassword 属性の値を変更することで制御しており、次のような形で値が入ります。
- ハッシュ化されたパスワードの場合
- 有効の場合
- {CRYPT}xxxxxxxx
- 無効の場合
- {CRYPT}!xxxxxxxx
- 有効の場合
- 平文パスワードの場合
- 有効の場合
- xxxxxxxx
- 無効の場合
- {DISABLED}xxxxxxxx
- 有効の場合
Microsoft Entra ID 外部連携モジュール
UCIDM では Microsoft Entra ID に対して ID 連携できます。
Microsoft Entra ID 外部連携モジュールはコンテナとして稼働させます。次のように compose.yml に設定します。
consumer-meid:
depends_on:
rabbitmq:
condition: service_healthy
container_name: consumer-meid
image: docker.io/osstech/ucidm-consumer:latest
logging: *default-logging
ports:
- 7099:7099
volumes:
- type: bind
source: ./server-data
target: /ucidm
bind:
create_host_path: false
entrypoint:
- ./bin/app-main
- -jsonl
environment:
TZ: "${TZ}"
DESTINATION_ID: "meid-001"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
RABBITMQ_USER: "${RABBITMQ_USER}"
RABBITMQ_PASSWORD: "${RABBITMQ_PASSWORD}"
RABBITMQ_HOST: "${RABBITMQ_HOST}"
MEID_CLIENT_ID: "${MEID_CLIENT_ID}"
MEID_CLIENT_SECRET: "${MEID_CLIENT_SECRET}"
MEID_TENANT_ID: "${MEID_TENANT_ID}"
restart: "always"
ここで参照する環境変数は .env に設定します。
起動時のオプション設定
entrypoint にて、次の設定をすることができます。
entrypoint では次の設定ができます。
-verbose: デバッグログを出力-jsonl: JSON 形式でログを出力
環境変数の設定
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| TZ | 任意 | – | タイムゾーン情報 |
| DESTINATION_ID | 任意 | – | 外部連携先 ID 管理画面で作成した外部連携先 ID を指定 |
| MONGO_USER | 任意 | – | 接続する MongoDB のユーザ名 |
| MONGO_PASSWORD | 任意 | – | 接続する MongoDB のパスワード |
| MONGO_HOSTS | 任意 | – | 接続する MongoDB のホスト |
| MONGO_REPLICA_SET | 任意 | – | 接続する MongoDB のレプリカセットの名前 |
| RABBITMQ_USER | 任意 | – | 接続する RabbitMQ のユーザ名 |
| RABBITMQ_PASSWORD | 任意 | – | 接続する RabbitMQ のパスワード |
| RABBITMQ_HOST | 任意 | – | 接続する RabbitMQ のホスト |
| MEID_CLIENT_ID | 任意 | – | Microsoft Entra ID の Client ID |
| MEID_CLIENT_SECRET | 任意 | – | Microsoft Entra ID の Client ID のパスワード |
| MEID_TENANT_ID | 任意 | – | Microsoft Entra ID の Tenant ID |
| ENABLE_SCRIPT_PASSWORD | true または false | false | ユーザーパスワード更新時に外部連携の 前処理/後処理スクリプトにパスワードの値を連携するかどうか |
Microsoft Entra ID 動作設定
管理画面にて Microsoft Entra ID の動作設定をすることができます。
設定項目と内容は次になります。
- ドメイン名
- Microsoft Entra ID のドメイン名を指定します
- Immutable ID を自動生成
- Immutable ID を自動生成するかどうかを指定します
- true の場合、onPremisesImmutableId に UCIDM で発行された値がセットされます
- ドライランモード
- 接続の取得やエントリの検索は行いますが、実際にエントリの追加/変更/削除は行わないモードとなります
- 主にテスト時の動作確認等に使うことを想定しています
- ユーザー追加/更新を行わない
- Microsoft Entra ID に対してユーザー追加/更新を行わない場合は、この項目をオン(true)にしてください
- ユーザー削除を行わない
- Microsoft Entra ID に対してユーザー削除を行わない場合は、この項目をオン(true)にしてください
- ユーザーパスワード更新を行わない
- Microsoft Entra ID に対してユーザーパスワード更新を行わない場合は、この項目をオン(true)にしてください
- グループ追加/更新を行わない
- Microsoft Entra ID に対してグループ追加/更新を行わない場合は、この項目をオン(true)にしてください
- グループ削除を行わない
- Microsoft Entra ID に対してグループ削除を行わない場合は、この項目をオン(true)にしてください
- グループメンバー追加を行わない
- Microsoft Entra ID に対してグループメンバー追加を行わない場合は、この項目をオン(true)にしてください
- グループメンバー削除を行わない
- Microsoft Entra ID に対してグループメンバー削除を行わない場合は、この項目をオン(true)にしてください
Microsoft Entra ID マッピング設定
Microsoft Entra ID 外部連携モジュールでは次のマッピング設定をすることができます。
- 属性マッピング
次でマッピング設定について説明します。
属性マッピング
次の 属性マッピング設定 を参考にしてください。
Microsoft Entra ID では階層構造を持つ属性があります。 例えば、passwordProfile 内の forceChangePasswordNextSignIn に対して属性値をマッピングする場合は、「passwordProfile.forceChangePasswordNextSignIn」に対してマッピングをする必要があります。
また、以下の属性は Microsoft Entra ID 外部連携モジュール独自のマッピングになるため、合わせてご参照ください。
ユーザ・グループ共通の属性
assignedLicenses 属性
- Microsoft Entra ID では、ひとつのライセンスに複数のプランが紐付いています - 例えば STREAM と TEAMS_EXPLORATORY のライセンスを利用し、TEAMS_EXPLORATORY ライセンスにて MCO_TEAMS_IW と YAMMER_ENTERPRISE のプランを利用しない場合は、assignedLicenses 属性へのマッ
ピングが次になるように設定します。(一部のプランを無効にする場合は、
<ライセンス名>/<プラン名>:<プラン名>:...の形で指定します。) -['STREAM', 'TEAMS_EXPLORATORY/MCO_TEAMS_IW:YAMMER_ENTERPRISE']
ユーザ属性
userPrincipalName 属性
本属性については、連携されてきた primaryID の値を使用し、${primaryID}@${ドメイン} の値が自動でセットされるので、マッピング設定は必要ありません。
accountEnabled 属性
ユーザの有効化/無効化を制御するための属性となります。この属性に対して、true/false が設定されるようマッピングを行うことで、ユーザの有効化/無効化のステータスを 制御することができます。(有効化の場合は true、無効化の場合は false が割り当てられる必要があります)
グループ属性
displayName 属性
本属性については、連携されてきた primaryID の値が自動でセットされるので、マッピング設定は必要ありません。
前処理・後処理スクリプト設定
UCIDM では、外部連携処理の前後で任意のシェルスクリプトを実行することができます。
次の 外部連携の前処理/後処理で実行するスクリプトの配置 を参考に、スクリプトファイルを配置後、外部連携の前処理/後処理で実行するスクリプトの設定 を参考に、実行したいスクリプトファイルを指定してください。
Google Workspace 外部連携モジュール
UCIDM では Google Workspace に対して ID 連携できます。
Google Workspace 外部連携モジュールはコンテナとして稼働させます。次のように compose.yml に設定します。
consumer-google:
depends_on:
rabbitmq:
condition: service_healthy
container_name: consumer-google
image: docker.io/osstech/ucidm-consumer:latest
logging: *default-logging
ports:
- 7099:7099
volumes:
- type: bind
source: ./server-data
target: /ucidm
bind:
create_host_path: false
entrypoint:
- ./bin/app-main
- -jsonl
environment:
TZ: "${TZ}"
DESTINATION_ID: "google-001"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
RABBITMQ_USER: "${RABBITMQ_USER}"
RABBITMQ_PASSWORD: "${RABBITMQ_PASSWORD}"
RABBITMQ_HOST: "${RABBITMQ_HOST}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
GOOGLE_CLIENT_EMAIL: "${GOOGLE_CLIENT_EMAIL}"
GOOGLE_PRIVATE_KEY: "${GOOGLE_PRIVATE_KEY}"
GOOGLE_SUBJECT: "${GOOGLE_SUBJECT}"
restart: "always"
ここで参照する環境変数は .env に設定します。
起動時のオプション設定
entrypoint では次の設定ができます。
-verbose: デバッグログを出力-jsonl: JSON 形式でログを出力
環境変数の設定
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| TZ | 任意 | – | タイムゾーン情報 |
| DESTINATION_ID | 任意 | – | 外部連携先 ID 管理画面で作成した外部連携先 ID を指定 |
| MONGO_USER | 任意 | – | 接続する MongoDB のユーザ名 |
| MONGO_PASSWORD | 任意 | – | 接続する MongoDB のパスワード |
| MONGO_HOSTS | 任意 | – | 接続する MongoDB のホスト |
| MONGO_REPLICA_SET | 任意 | – | 接続する MongoDB のレプリカセットの名前 |
| RABBITMQ_USER | 任意 | – | 接続する RabbitMQ のユーザ名 |
| RABBITMQ_PASSWORD | 任意 | – | 接続する RabbitMQ のパスワード |
| RABBITMQ_HOST | 任意 | – | 接続する RabbitMQ のホスト |
| GOOGLE_CLIENT_EMAIL | 任意 | – | Google の Client Email |
| GOOGLE_PRIVATE_KEY | 任意 | – | Google の秘密鍵 |
| GOOGLE_SUBJECT | 任意 | – | Google の Subject (主に管理者のメールアドレスを指定) |
| ENABLE_SCRIPT_PASSWORD | true または false | false | ユーザーパスワード更新時に外部連携の 前処理/後処理スクリプトにパスワードの値を連携するかどうか |
Google 動作設定
管理画面にて Google の動作設定をすることができます。
設定項目と内容は次になります。
- ドメイン名
- Google のドメイン名を指定します
- ドライランモード
- 接続の取得やエントリの検索は行いますが、実際にエントリの追加/変更/削除は行わないモードとなります
- 主にテスト時の動作確認等に使うことを想定しています
- ユーザー追加/更新を行わない
- Google に対してユーザー追加/更新を行わない場合は、この項目をオン(true)にしてください
- ユーザー削除を行わない
- Google に対してユーザー削除を行わない場合は、この項目をオン(true)にしてください
- ユーザーパスワード更新を行わない
- Google に対してユーザーパスワード更新を行わない場合は、この項目をオン(true)にしてください
- グループ追加/更新を行わない
- Google に対してグループ追加/更新を行わない場合は、この項目をオン(true)にしてください
- グループ削除を行わない
- Google に対してグループ削除を行わない場合は、この項目をオン(true)にしてください
- グループメンバー追加を行わない
- Google に対してグループメンバー追加を行わない場合は、この項目をオン(true)にしてください
- グループメンバー削除を行わない
- Google に対してグループメンバー削除を行わない場合は、この項目をオン(true)にしてください
Google マッピング設定
Google は次のマッピング設定をすることができます。
- 属性マッピング
次でマッピング設定について説明します。
属性マッピング
次の 属性マッピング設定 を参考にしてください。
- Google では階層構造を持つ属性があります。
- 例えば、name 内の givenName に対して属性値をマッピングする場合は、「name.givenName」に対してマッピングをする必要があります。
- また、Google では階層構造に加えて、配列を持つ属性があります。
- 例えば、emails 内の 最初の配列要素における、address に対して属性値をマッピングする場合は、「emails.0.address」に対してマッピングをする必要があります。
- 配列の要素番号は、0, 1, 2, … の形で 0 から始める番号で指定する必要があります。
また、以下の属性は Google 外部連携モジュール独自のマッピングになるため、合わせてご参照ください。
ユーザ属性
primaryEmail 属性
本属性については、連携されてきた primaryID の値を使用し、${primaryID}@${ドメイン} の値が自動でセットされるので、マッピング設定は必要ありません。
hashFunction 属性
本属性のマッピング設定をする場合は、以下のいずれかの値が連携されるよう設定してください。
- crypt
- SHA-1
- MD5
suspended 属性
ユーザの有効化/無効化を制御するための属性となります。この属性に対して、true/false が設定されるようマッピングを行うことで、ユーザの有効化/無効化のステータスを制御することができます。
ここで、有効化の場合は false、無効化の場合は true が割り当てられる必要があることにご注意ください。必要に応じて、マッピング設定の 事前定義済みのビルトイン関数 の invertBooleanValue をご使用ください。
グループ属性
email 属性
本属性については、連携されてきた primaryID の値を使用し、${primaryID}@${ドメイン} の値が自動でセットされるので、マッピング設定は必要ありません。
前処理・後処理スクリプト設定
UCIDM では、外部連携処理の前後で任意のシェルスクリプトを実行することができます。
次の 外部連携の前処理/後処理で実行するスクリプトの配置 を参考に、スクリプトファイルを配置後、外部連携の前処理/後処理で実行するスクリプトの設定 を参考に、実行したいスクリプトファイルを指定してください。
Google Workspace 外部連携モジュールの留意事項
- 更新操作直後に Google 管理コンソールにてユーザー/グループを閲覧すると更新前の状態が表示される場合があります
Windows AD 外部連携モジュール
UCIDM は Windows AD に対して ID 連携できます。
Windows AD 外部連携モジュールはコンテナとして稼働させます。次のように compose.yml に設定します。
consumer-ad:
depends_on:
rabbitmq:
condition: service_healthy
container_name: consumer-ad
image: docker.io/osstech/ucidm-consumer:latest
logging: *default-logging
ports:
- 7099:7099
volumes:
- type: bind
source: ./server-data
target: /ucidm
bind:
create_host_path: false
entrypoint:
- ./bin/app-main
- -jsonl
environment:
TZ: "${TZ}"
DESTINATION_ID: "ad-001"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
RABBITMQ_USER: "${RABBITMQ_USER}"
RABBITMQ_PASSWORD: "${RABBITMQ_PASSWORD}"
RABBITMQ_HOST: "${RABBITMQ_HOST}"
LDAP_URL: "${AD_URL}"
LDAP_BIND_DN: "${AD_BIND_DN}"
LDAP_BIND_PASSWORD: "${AD_BIND_PASSWORD}"
restart: "always"
ここで参照する環境変数は .env に設定します。
起動時のオプション設定
entrypoint では次の設定ができます。
-verbose: デバッグログを出力-jsonl: JSON 形式でログを出力
環境変数の設定
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| TZ | 任意 | – | タイムゾーン情報 |
| DESTINATION_ID | 任意 | – | 外部連携先 ID 管理画面で作成した外部連携先 ID を指定 |
| MONGO_USER | 任意 | – | 接続する MongoDB のユーザ名 |
| MONGO_PASSWORD | 任意 | – | 接続する MongoDB のパスワード |
| MONGO_HOSTS | 任意 | – | 接続する MongoDB のホスト |
| MONGO_REPLICA_SET | 任意 | – | 接続する MongoDB のレプリカセットの名前 |
| RABBITMQ_USER | 任意 | – | 接続する RabbitMQ のユーザ名 |
| RABBITMQ_PASSWORD | 任意 | – | 接続する RabbitMQ のパスワード |
| RABBITMQ_HOST | 任意 | – | 接続する RabbitMQ のホスト |
| LDAP_URL | 任意 | – | 接続する AD の URL (例: ldaps:// |
| LDAP_BIND_DN | 任意 | – | AD の Bind DN |
| LDAP_BIND_PASSWORD | 任意 | – | AD の Bind DN のパスワード |
| ENABLE_SCRIPT_PASSWORD | true または false | false | ユーザーパスワード更新時に 外部連携の前処理/後処理スクリプトに パスワードの値を連携するかどうか |
AD 動作設定
管理画面にて AD の動作設定をすることができます。
設定項目と内容は次になります。
- TLS の検証をスキップ
- TLS の検証をスキップするかを指定します
- 有効無効設定情報を使用する
- ユーザープロファイルのステータス設定画面で指定した有効無効設定の情報を利用して、ユーザーのステータスの値を取得する場合は は on にします
- ステータス用属性名
- 有効無効設定情報を使用しない場合にこちらの設定が使われます
- マッピング後の属性について、AD のユーザーステータスして反映させたい属性を指定します
- 本属性には true/false の真偽値が連携されてくる必要があります(有効化の場合は true、無効化の場合は false が割り当てられる必要があります)
- ステータス用属性に指定した属性については、AD のユーザ送信データにそのまま含まれるということはありません
- 値が未設定の場合は、連携先 AD へのステータス情報の反映は行われません
- ドライランモード
- 接続の取得やエントリの検索は行いますが、実際にエントリの追加/変更/削除は行わないモードとなります
- 主にテスト時の動作確認等に使うことを想定しています
- ドメイン
- AD のドメイン名を指定します(例:destad.com)
- 主に userPrincipalName の値の自動生成に使われます
- ベース DN
- AD のベース DN を指定します
- 主に sAMAccountName をキーにしてユーザ/グループ検索を行う際の検索基点として使われます
- プライマリグループ用属性名
- ユーザのリクエストにおいて、primaryGroupID に設定したいグループの sAMAccountName の値を入れる属性を指定します
- プライマリグループ用属性に指定した属性については、AD のユーザ送信データにそのまま含まれるということはありません
- ユーザー追加/更新を行わない
- AD に対してユーザー追加/更新を行わない場合は、この項目をオン(true)にしてください
- ユーザー削除を行わない
- AD に対してユーザー削除を行わない場合は、この項目をオン(true)にしてください
- ユーザーパスワード更新を行わない
- AD に対してユーザーパスワード更新を行わない場合は、この項目をオン(true)にしてください
- グループ追加/更新を行わない
- AD に対してグループ追加/更新を行わない場合は、この項目をオン(true)にしてください
- グループ削除を行わない
- AD に対してグループ削除を行わない場合は、この項目をオン(true)にしてください
- グループメンバー追加を行わない
- AD に対してグループメンバー追加を行わない場合は、この項目をオン(true)にしてください
- グループメンバー削除を行わない
- AD に対してグループメンバー削除を行わない場合は、この項目をオン(true)にしてください
AD マッピング設定
AD は次のマッピング設定をすることができます。
- DN マッピング
- ObjectClass マッピング
- 属性マッピング
それぞれのマッピング設定について説明します。
DN マッピング
UCIDM で保持するエントリは DN がキーとなり連携されてきます。
この DN の値を、AD の DN の値にマッピングする設定をすることができます。
- DN の変換元部分
- 変換前の DN にて、変換したい箇所を指定します
- DN の変換先部分
- 上記変換したい箇所に、変換したい値を指定します
- DN 変換先の RDN 属性名
- 変換後の DN において、最初の要素の属性名を指定します(CN を指定してください)
例えば、uid=test01,dc=srcldap,dc=com を cn=test01,dc=example,dc=com にマッピングしたい場合は、次のように指定します。
- DN の変換元部分
- dc=srcldap,dc=com
- DN の変換先部分
- dc=example,dc=com
- DN 変換先の RDN 属性名
- cn
ObjectClass マッピング
連携元からくる ObjectClass のデータを、連携先の AD に連携するための ObjectClass にマッピングする設定をすることができます。
- 連携先に追加で連携する ObjectClass
- 連携先 AD に追加で連携する ObjectClass を指定します
- 複数値を指定することができます
- 連携先に連携しない ObjectClass
- 連携元からくる ObjectClass のデータにて、連携先 AD に連携しない ObjectClass を指定します
- 複数値を指定することができます
例えば、連携元から、["top", "inetOrgPerson", "organizationalPerson", "posixAccount"] のデータが来た際に、連携先に送信する ObjectClass として、["top", "person", "organizationalPerson", "user"] を指定したい場合は、次のように設定します。
- 連携先に追加で連携する ObjectClass
- person
- user
- 連携先に連携しない ObjectClass
- inetOrgPerson
- posixAccount
属性マッピング
次の 属性マッピング設定 を参考にしてください。
ユーザステータスの有効化/無効化の制御をしたい場合は、ステータス用の属性のマッピングも指定してください。
また、以下の属性は Windows AD 外部連携モジュール独自のマッピングになるため、合わせてご参照ください。
ユーザー・グループ共通の属性
cn 属性
本属性については、連携されてきた DN (例:cn=test1,ou=people,dc=example,dc=com)の RDN (例:test1)の値が自動でセットされるので、マッピング設定は必要ありません。
sAMAccountName 属性
本属性については、連携されてきた primaryID の値が自動でセットされるので、マッピング設定は必要ありません。
この属性の値は 20 文字以下としなければいけない制限がございます。
- https://learn.microsoft.com/ja-jp/windows/win32/adschema/a-samaccountname
ユーザー属性
accountExpires 属性
accountExpires 属性は AD ユーザーのアカウント有効期限をセットするために利用されます。 この属性に値をセットする際は、以下のいずれかの形式で値をセットしてください。
- RFC 3339 の形式(2023-08-28T00:00:00+00:00)
- タイムゾーンを自由に指定するにはこの形式にて値をセットしてください
- “2023-08-28 10:00:00” の形式
- 本形式で値がセットされると、例として上記値であれば、UTC の “2023-08-28 10:00:00” として有効期限が設定されます
- “2023-08-28” の形式
- 本形式で値がセットされると、例として上記値であれば、UTC の “2023-08-28 00:00:00” として有効期限が設定されます
- “NEVER_EXPIRES” の形式
- “NEVER_EXPIRES” という文字列をセットすることで、アカウントの有効期限を無期限に設定できます
前処理・後処理スクリプト設定
UCIDM では、外部連携処理の前後で任意のシェルスクリプトを実行することができます。
次の 外部連携の前処理/後処理で実行するスクリプトの配置 を参考に、スクリプトファイルを配置後、外部連携の前処理/後処理で実行するスクリプトの設定 を参考に、実行したいスクリプトファイルを指定してください。
AD 外部連携モジュールの留意事項
ユーザーステータスの変更
UCIDM では、上記「ステータス用属性名」の属性に連携されてきた値(true/false)をみて、AD のユーザーステータスの変更します。
ユーザーの primaryGroupID の変更
UCIDM では、上記「プライマリグループ用属性名」の属性に連携されてきた値(グループの sAMAccountName)をみて、AD のユーザーの primaryGrouoID の値をセットします。 プライマリグループに設定したいグループのメンバーに、そのユーザーが所属していない場合には、エラーになります。(グループに対象のユーザーをメンバーとして追加後、再度 primaryGroupID の連携を行う必要がございます。)
SCIM 外部連携モジュール
UCIDM は SCIM 対応のサービスに対して ID 連携できます。
現状は以下のサービスに対して動作を確認できています。
- Salesforce
また、SCIM 対応サービスとの認証・認可においては以下に対応しています。
- OAuth 2.0
SCIM 外部連携モジュールはコンテナとして稼働させます。次のように compose.yml に設定します。
consumer-scim:
depends_on:
rabbitmq:
condition: service_healthy
container_name: consumer-scim
image: docker.io/osstech/ucidm-consumer:latest
logging: *default-logging
ports:
- 7099:7099
volumes:
- type: bind
source: ./server-data
target: /ucidm
bind:
create_host_path: false
entrypoint:
- ./bin/app-main
- -verbose
- -jsonl
environment:
TZ: "${TZ}"
DESTINATION_ID: "scim-001"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
RABBITMQ_USER: "${RABBITMQ_USER}"
RABBITMQ_PASSWORD: "${RABBITMQ_PASSWORD}"
RABBITMQ_HOST: "${RABBITMQ_HOST}"
SCIM_AUTH_TYPE: "client_credentials"
SCIM_OAUTH2_CLIENT_ID: "${SCIM_OAUTH2_CLIENT_ID}"
SCIM_OAUTH2_CLIENT_SECRET: "${SCIM_OAUTH2_CLIENT_SECRET}"
restart: "always"
ここで参照する環境変数は .env に設定します。
起動時のオプション設定
entrypoint では次の設定ができます。
-verbose: デバッグログを出力-jsonl: JSON 形式でログを出力
環境変数の設定
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| TZ | 任意 | – | タイムゾーン情報 |
| DESTINATION_ID | 任意 | – | 外部連携先 ID 管理画面で作成した外部連携先 ID を指定 |
| MONGO_USER | 任意 | – | 接続する MongoDB のユーザ名 |
| MONGO_PASSWORD | 任意 | – | 接続する MongoDB のパスワード |
| MONGO_HOSTS | 任意 | – | 接続する MongoDB のホスト |
| MONGO_REPLICA_SET | 任意 | – | 接続する MongoDB のレプリカセットの名前 |
| RABBITMQ_USER | 任意 | – | 接続する RabbitMQ のユーザ名 |
| RABBITMQ_PASSWORD | 任意 | – | 接続する RabbitMQ のパスワード |
| RABBITMQ_HOST | 任意 | – | 接続する RabbitMQ のホスト |
| SCIM_AUTH_TYPE | 任意 | – | OAuth2 の認証・認可の方式を指定します。 指定できる値は以下になります。 - client_credentials (クライアントクレデンシャルズフロー)- access_token (アクセストークン直接指定) |
| SCIM_ACCESS_TOKEN | 任意 | – | SCIM API にアクセスする際に利用するアクセストークンを指定します。SCIM_AUTH_TYPE が access_token の場合、この値は必須です。 |
| SCIM_OAUTH2_CLIENT_ID | 任意 | – | SCIM 対応サービスとの認証・認可で使用する OAuth2 クライアント IDSCIM_AUTH_TYPE が client_credentials の場合、この値は必須です。 |
| SCIM_OAUTH2_CLIENT_SECRET | 任意 | – | SCIM 対応サービスとの認証・認可で使用する OAuth2 クライアントシークレットSCIM_AUTH_TYPE が client_credentials の場合、この値は必須です。 |
| SCIMServiceType | 任意 | – | 外部連携先のサービスを指定します |
| ENABLE_SCRIPT_PASSWORD | true または false | false | ユーザーパスワード更新時に外部連携の 前処理/後処理スクリプトにパスワードの値を連携するかどうか |
SCIM 動作設定
管理画面にて SCIM の動作設定をすることができます。
設定項目と内容は次になります。
- OAuth2 トークンエンドポイント URL
- OAuth2 トークンエンドポイントの URL を指定します。
- OAuth2 スコープ
- OAuth2 のスコープの値を指定したい場合には、ここで設定を行います。
- SCIM スキーマ URL
- SCIM 対応サービスの Schema の URL を指定します。
- SCIM ユーザスキーマ
- SCIM のユーザのスキーマを指定します(例:urn:ietf:params:scim:schemas:core:2.0:User)。複数指定可能です。
- SCIM グループスキーマ
- SCIM のグループのスキーマを指定します(例:urn:ietf:params:scim:schemas:core:2.0:Group)。複数指定可能です。
- SCIM Users URL
- SCIM 対応サービスの Users の URL を指定します。
- SCIM Groups URL
- SCIM 対応サービスの Groups の URL を指定します。
- userName 属性の前につける固定値
- 本 SCIM 外部連携モジュールにおいては、LDAP/AD から連携されてきた DN の RDN の値が userName として使われます。
- userName の値を SCIM 対応サービスに送信するにあたり、RDN の値よりも前に付加したい文字列があれば指定します。
- userName 属性の後につける固定値
- 本 SCIM 外部連携モジュールにおいては、LDAP/AD から連携されてきた DN の RDN の値が userName として使われます。
- userName の値を SCIM 対応サービスに送信するにあたり、RDN の値よりも後に付加したい文字列があれば指定します。
- 連携先サービス
- 外部連携先のサービスを指定します。指定できる値は以下になります。
- Salesforce
- Others
- 外部連携先のサービスを指定します。指定できる値は以下になります。
- ドライランモード
- 接続の取得やエントリの検索は行いますが、実際にエントリの追加/変更/削除は行わないモードとなります。
- 主にテスト時の動作確認等に使うことを想定しています。
- ユーザー追加/更新を行わない
- SCIM 対応サービスに対してユーザー追加/更新を行わない場合は、この項目をオン(true)にしてください
- ユーザー削除を行わない
- SCIM 対応サービスに対してユーザー削除を行わない場合は、この項目をオン(true)にしてください
- ユーザーパスワード更新を行わない
- SCIM 対応サービスに対してユーザーパスワード更新を行わない場合は、この項目をオン(true)にしてください
- グループ追加/更新を行わない
- SCIM 対応サービスに対してグループ追加/更新を行わない場合は、この項目をオン(true)にしてください
- グループ削除を行わない
- SCIM 対応サービスに対してグループ削除を行わない場合は、この項目をオン(true)にしてください
- グループメンバー追加を行わない
- SCIM 対応サービスに対してグループメンバー追加を行わない場合は、この項目をオン(true)にしてください
- グループメンバー削除を行わない
- SCIM 対応サービスに対してグループメンバー削除を行わない場合は、この項目をオン(true)にしてください
SCIM マッピング設定
SCIM は次のマッピング設定をすることができます。
- 属性マッピング
それぞれのマッピング設定について説明します。
属性マッピング
次の 属性マッピング設定 を参考にしてください。
また、以下の属性は SCIM 外部連携モジュール独自のマッピングになるため、合わせてご参照ください。
- SCIM では階層構造を持つ属性があります。
- 例えば、name 内の givenName に対して属性値をマッピングする場合は、「name.givenName」に対してマッピングをする必要があります。
- また、SCIM では階層構造に加えて、配列を持つ属性があります。
- 例えば、emails 内の 最初の配列要素における、value に対して属性値をマッピングする場合は、「emails.0.value」に対してマッピングをする必要があります。
- 配列の要素番号は、0, 1, 2, … の形で 0 から始める番号で指定する必要があります。
ユーザ属性
userName 属性
本 SCIM 外部連携モジュールにおいては、primaryID の値が userName として使われます。
primaryID の値の前や後に何か文字列を付加して userName の属性値としたい場合は、前述の「userName 属性の前につける固定値」や「userName 属性の後につける固定値」の設定をしてください。
active 属性
ユーザの有効化/無効化を制御するために主に使われる属性となります。(詳しくは SCIM 各連携先の公式マニュアル等をご参照ください。)
SCIM 連携先がこの属性を有効化/無効化のフラグとして使っている場合には、本属性に対して true/false が設定されるようマッピングを行うことで、ユーザの有効化/無効化 のステータスを制御することができます。
グループ属性
displayName 属性
本 SCIM 外部連携モジュールにおいては、primaryID の値が displayName として使われます。
前処理・後処理スクリプト設定
UCIDM では、外部連携処理の前後で任意のシェルスクリプトを実行することができます。
次の 外部連携の前処理/後処理で実行するスクリプトの配置 を参考に、スクリプトファイルを配置後、外部連携の前処理/後処理で実行するスクリプトの設定 を参考に、実行したいスクリプトファイルを指定してください。
SCIM 外部連携モジュールの留意事項
Salesforce に対してユーザーパスワード更新を行っても、その値は反映されません
外部連携の前処理/後処理で実行するスクリプトの配置
各外部連携処理の前後で任意のシェルスクリプトを実行することができます。
シェルスクリプトには、第一引数に以下の情報が渡されます。
{
"DN":"uid=ucidmldaptest1,ou=users,dc=srcldap,dc=com",
"Attributes":{
"cn":["UCIDMTest1"],
"givenname":["Taro"],
"mail":["ucidmtest1@example.com"],
...
},
"Password": "password",
"Member": {
"primaryID": "ucidm-5-csvtestuser101",
"entry": {
"dn": "uid=csvtestuser101,ou=users,dc=srcldap2,dc=example,dc=com",
"attributes": {
"cn": ["test101-cn"],
"description": ["test101-desc"],
"givenname": ["test101-given"],
...
},
},
},
"EntryDiff":[
{
"sourceNames":["sn"],
"destinationName":"surname",
"sourceValue":["test1sn"],
"previousValue":["test1"],
"currentValue":["test1"]
},
...
]
}
- DN : UCIDM に連携されてきたエントリの DN 情報
- Attributes : UCIDM に連携されてきたエントリの属性名と属性値の情報
- Password : ユーザーパスワード更新時に、ENABLE_SCRIPT_PASSWORD の環境変数が true に設定されている場合のみシェルスクリプトにて取得可能で、更新されたパスワードの情報が入っている
- Member : グループメンバー追加/削除時にのみシェルスクリプトのみで取得可能で、グループのメンバーエントリの情報が入っている
- EntryDiff: 外部連携処理の後に呼ばれるシェルスクリプトのみで取得可能で、連携における差分の情報が入っている
シェルスクリプトにおける終了コード 0 以外はエラーとして UCIDM で処理されます。
シェルスクリプトは、各処理種別ごとに、以下のディレクトリ上に格納する必要があります。また、スクリプトファイルには実行権限をつける必要があります。
- ユーザ追加
- /var/opt/osstech/lib/ucidm/server-data/destination/
{DESTINATION_ID}/scripts/UserAdded/
- /var/opt/osstech/lib/ucidm/server-data/destination/
- ユーザ更新
- /var/opt/osstech/lib/ucidm/server-data/destination/
{DESTINATION_ID}/scripts/UserModified/
- /var/opt/osstech/lib/ucidm/server-data/destination/
- ユーザ削除
- /var/opt/osstech/lib/ucidm/server-data/destination/
{DESTINATION_ID}/scripts/UserDeleted/
- /var/opt/osstech/lib/ucidm/server-data/destination/
- ユーザパスワード更新
- /var/opt/osstech/lib/ucidm/server-data/destination/
{DESTINATION_ID}/scripts/UserPasswordModified/
- /var/opt/osstech/lib/ucidm/server-data/destination/
- グループ追加
- /var/opt/osstech/lib/ucidm/server-data/destination/
{DESTINATION_ID}/scripts/GroupAdded/
- /var/opt/osstech/lib/ucidm/server-data/destination/
- グループ更新
- /var/opt/osstech/lib/ucidm/server-data/destination/
{DESTINATION_ID}/scripts/GroupModified/
- /var/opt/osstech/lib/ucidm/server-data/destination/
- グループ削除
- /var/opt/osstech/lib/ucidm/server-data/destination/
{DESTINATION_ID}/scripts/GroupDeleted/
- /var/opt/osstech/lib/ucidm/server-data/destination/
- グループメンバー追加
- /var/opt/osstech/lib/ucidm/server-data/destination/
{DESTINATION_ID}/scripts/GroupMemberAdded/
- /var/opt/osstech/lib/ucidm/server-data/destination/
- グループメンバー削除
- /var/opt/osstech/lib/ucidm/server-data/destination/
{DESTINATION_ID}/scripts/GroupMemberDeleted/
- /var/opt/osstech/lib/ucidm/server-data/destination/
上記ディレクトリ上にシェルスクリプトを配置することで、外部連携設定画面にて、シェルスクリプトの指定が可能になります。
外部連携設定画面での設定については、以下のページをご参照ください。
更新差分の確認
本機能は実験的な機能であるため、必ず 既知の制約事項・不具合 をご確認の上、参考情報として扱うようにしてください。属性によって差分情報を取得できないもの、差分情報のフォーマット上の問題で差分として検出されてしまうもの、複雑なオブジェクトを扱うときに意図しない値の差分を取得してしまう場合があります。
履歴一覧画面の履歴から更新差分の画面へ遷移できます。外部サービスへ ID 連携したとき、更新前後の値において差分が検出された場合、その連携先の属性に対してそれぞれの値を確認できます。
ドライランモードを有効にして、実際に ID 連携を行う前にどの属性の値が更新されるのか、現時点で内部ディレクトリサービスと外部サービスで適切な同期を取れているかといった点を確認することもできます。
次に本機能の概要をまとめます。
- ID 連携に失敗したときは差分情報を作成しません
- 検証用途で差分比較したいときはドライランモードを有効にしてください
- ID 連携に成功しても、差分がまったくないときは差分情報を作成しません
- パスワードや機密情報に相当する値の差分情報は作成しません
- 基本的にはエントリーの追加・更新の ID 連携に対して差分情報が作成されます
- 削除に対しても差分情報が作成されることもありますが、実運用においては削除データなのでとくに意味はありません
- パスワード追加・更新は基本的に差分を生成しないはずですが、外部サービスによっては通常の更新リクエストとして扱う処理の都合上、他の属性で差分があった場合にその値を更新した差分として表示される可能性があります
- 差分情報は外部連携の後処理スクリプトへも連携されます
既知の制約事項・不具合
本機能は実験的な機能であるため、いくつか制約事項や正常に差分を取得できない属性があります。ここに記載されていないことで意図しない振る舞いがあれば、弊社までご連絡いただけると助かります。
意図した差分情報が検出されなかったり、不要な差分情報を検出されているいったことが起こったとしても、ID 連携の処理に影響を与えることはありません。
すべての連携先サービス共通
- boolean 値をとる属性において文字列比較の都合により、例えば
TRUEとtrueを差分とみなしてしまう場合があります
連携元の値: TRUE
連携先の更新前の値: true
連携先の更新後の値: TRUE
- 日時のタイムゾーンの違いを差分とみなしてしまう場合があります
連携元の値: 2023-10-28T23:59:59+09:00
連携先の更新前の値: 2023-10-28T14:59:59Z
連携先の更新後の値: 2023-10-28T23:59:59+09:00
OpenLDAP/Windows AD
-
グループのメンバー情報に関する次の属性の差分情報は取得できません
- memberUid
- member
- uniqueMember
- memberOf
- members
-
ステータス用属性として設定した属性の差分情報は取得できません
Microsoft Entra ID
-
グループのメンバー情報に関する次の属性の差分情報は取得できません
- members
-
userPrincipalName
- マッピング設定で管理していないため、差分情報を取得できません
-
passwordPolicies 属性の値
- 文字列として複数の値を連携するため、設定した値によってスペース有無の違いにより、差分とみなされる場合があります
連携元の値: DisablePasswordExpiration,DisableStrongPassword
連携先の更新前の値: DisablePasswordExpiration, DisableStrongPassword
連携先の更新後の値: DisablePasswordExpiration,DisableStrongPassword
- passwordProfile オブジェクトのメンバー属性の値
- たとえば forceChangePasswordNextSignIn などになります
- ユーザーによって正常に差分情報を取得できない場合があります
- 権限設定のせいか、取得できる場合とできない場合があります
Google Workspace
-
グループのメンバー情報に関する次の属性の差分情報は取得できません
- members
-
primaryEmail
- マッピング設定で管理していないため、差分情報を取得できません
-
hashFunction
- リクエスト時のみに使う値であるため、差分情報はありません
-
emails
- 内部的にはオブジェクトで複数の属性を管理しているため、マッピング設定していない値をデフォルト値と比較して複数の属性の差分情報を取得する場合があります
- address
- customType
- primary
- type
- 内部的にはオブジェクトで複数の属性を管理しているため、マッピング設定していない値をデフォルト値と比較して複数の属性の差分情報を取得する場合があります
SCIM
-
グループのメンバー情報に関する次の属性の差分情報は取得できません
- members
-
実際に連携する外部サービスの振る舞いによって意図しない差分が表示される場合があります
- 問題がある場合は、実際に連携されている外部サービスとその属性を弊社までご連絡いただけると助かります
Agent モジュール
UCIDM は社内で管理している内部ディレクトリサービス (OpenLDAP や Active Directory といったサービス) やクラウドサービス (Microsoft Entra ID など) から ID 情報を取得するための Agent モジュールを使います。お客様の環境にあわせて Agent モジュールを設定します。
agent アカウント
Agent モジュール (PassSync Agent モジュール) が UCIDM API サーバーにアクセスするために アカウント認証 を使います。
Agent モジュール (PassSync Agent モジュール) に必要なアクセス権限を設定した system-agent ロール をもつ agent アカウントが用意されています。インストール直後はパスワードが未設定であるため、利用できません。後ほど ID 連携管理画面でパスワード設定しますが、そのときに設定する agent アカウントのパスワードをあらかじめ設定しておきます。
初期状態では .env (ucidm.env) ファイルに次のように設定されています。
API_ACCOUNT_AUTH_USER="agent"
API_ACCOUNT_AUTH_PASSWORD="TO_BE_UPDATED"
環境変数 API_ACCOUNT_AUTH_PASSWORD に任意の値を設定してください。
OpenLDAP 向け Agent
UCIDM は社内で管理している OpenLDAP サーバーから ID 情報を取得して UCIDM API に連携します。
OpenLDAP 向け Agent はコンテナとして稼働させます。次のように compose.yml に設定します。
agent-ldap:
depends_on:
- api
container_name: agent-ldap
image: docker.io/osstech/ucidm-agent:latest
logging: *default-logging
volumes:
- type: bind
source: ./agent-data/openldap
target: ${AGENT_PAGE_KEY_PATH}
bind:
create_host_path: true
#- type: bind
# source: ./certs/chainCA.crt
# target: ${SSL_CERT_FILE}
# read_only: true
# bind:
# create_host_path: false
entrypoint:
- ./bin/agent
- -verbose
- -jsonl
environment:
TZ: "${TZ}"
# SSL_CERT_FILE: "${SSL_CERT_FILE}"
PROTOCOL: "syncrepl"
PAGE_KEY_PATH: "${AGENT_PAGE_KEY_PATH}"
RELOAD_INTERVAL: "${AGENT_RELOAD_INTERVAL}"
API_HOST: "${API_HOST}"
API_PORT: "${API_PORT}"
API_ACCOUNT_AUTH_USER: "${API_ACCOUNT_AUTH_USER}"
API_ACCOUNT_AUTH_PASSWORD: "${API_ACCOUNT_AUTH_PASSWORD}"
restart: "always"
Agent の永続化ディレクトリ
永続化が必要なファイルなどは volumes/agent-data/openldap 配下に配置されます。
$ ls volumes/agent-data/openldap
ここで参照する環境変数は .env に設定します。
環境変数の設定
接続する OpenLDAP サーバーに関する設定は UCIDM API サーバーのシステム設定 で行います。
Agent モジュール
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| TZ | 任意 | – | タイムゾーン情報 |
| SSL_CERT_FILE | 任意 | – | LDAP サーバーとの接続において 信頼する CA 証明書を指定 |
| PROTOCOL | syncrepl | – | LDAP 通信のプロトコル |
| RELOAD_INTERVAL | 任意 | 1m | システム設定の更新を定期的に問い合わせる間隔 |
| PAGE_KEY_PATH | 任意 | – | 同期状況の保存先ディレクトリ |
- OpenLDAP サーバーから正常にエントリを取得して UCIDM API サーバーへの連携に失敗 (リトライしても失敗) したときは自動で復旧しません
- 別途ツールで運用対応する 必要があります
次の属性は対象外として連携されません。
- userPassword
API サーバー
接続する UCIDM API サーバーの設定をします。
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| API_SCHEME | https | http | UCIDM API サーバーのプロトコル |
| API_HOST | 任意 | localhost | UCIDM API サーバー名 |
| API_PORT | 任意 | 18080 | 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 | リトライの最大回数 |
Active Directory 向け Agent
UCIDM は社内で管理している Active Directory サーバーから ID 情報を取得して UCIDM API に連携します。
Active Directory 向け Agent はコンテナとして稼働させます。次のように compose.yml に設定します。
agent-ad:
depends_on:
- api
container_name: agent-ad
image: docker.io/osstech/ucidm-agent:latest
logging: *default-logging
volumes:
- type: bind
source: ./agent-data/ad
target: ${AGENT_PAGE_KEY_PATH}
bind:
create_host_path: true
#- type: bind
# source: ./certs/chainCA.crt
# target: ${SSL_CERT_FILE}
# read_only: true
# bind:
# create_host_path: false
entrypoint:
- ./bin/agent
- -verbose
- -jsonl
environment:
TZ: "${TZ}"
# SSL_CERT_FILE: "${SSL_CERT_FILE}"
PROTOCOL: "dirsync"
PAGE_KEY_PATH: "${AGENT_PAGE_KEY_PATH}"
RELOAD_INTERVAL: "${AGENT_RELOAD_INTERVAL}"
API_HOST: "${API_HOST}"
API_PORT: "${API_PORT}"
API_ACCOUNT_AUTH_USER: "${API_ACCOUNT_AUTH_USER}"
API_ACCOUNT_AUTH_PASSWORD: "${API_ACCOUNT_AUTH_PASSWORD}"
restart: "always"
Agent の永続化ディレクトリ
永続化が必要なファイルなどは volumes/agent-data/ad 配下に配置されます。
$ ls volumes/agent-data/ad
ここで参照する環境変数は .env に設定します。
環境変数の設定
Agent モジュール
接続する Active Directory サーバーに関する設定は UCIDM API サーバーのシステム設定 で行います。
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| TZ | 任意 | – | タイムゾーン情報 |
| SSL_CERT_FILE | 任意 | – | LDAP サーバーとの接続において 信頼する CA 証明書を指定 |
| PROTOCOL | dirsync | – | LDAP 通信のプロトコル |
| PAGE_KEY_PATH | 任意 | – | 同期状況の保存先ディレクトリ |
| RELOAD_INTERVAL | 任意 | 1m | システム設定の更新を定期的に問い合わせる間隔 |
- AD から正常にエントリを取得して UCIDM API サーバーへの連携に失敗 (リトライしても失敗) したときは自動で復旧しません
- 別途ツールで運用対応する 必要があります
次の属性は Windows サーバーでのみ必要なシステム関連の属性なので連携されません。
- lmPwdHistory
- ntPwdHistory
- supplementalCredentials
- nTSecurityDescriptor
- pwdLastSet
- parentGUID
- objectSid
- memberOf
- unicodePwd
- dBCSPwd
- codePage
- countryCode
- instanceType
- sAMAccountType
- objectCategory
- badPwdCount
- badPasswordTime
- dSCorePropagationData
1回の検索リクエストで取得できるエントリー数の設定
1回の検索リクエストで取得できるエントリー数はデフォルトで MaxPageSize=1000 に設定されています。あるグループに所属するメンバー数が1000件よりも多い場合、この設定値をメンバー数よりも大きい値に設定する必要があります。MaxPageSize の値は次のようにして設定を変更します。
c:\>ntdsutil
ntdsutil: ldap policies
ldap policy: connections
server connections: connect to server localhost
server connections: quit
ldap policy: show values
現在の設定を確認
ldap policy: set maxpagesize to 10000
ldap policy: commit changes
ldap policy: show values
変更した設定を確認
ldap policy: quit
ntdsutil: quit
詳細については Microsoft 社のドキュメントを参照してください。
API サーバー
接続する UCIDM API サーバーの設定をします。
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| API_SCHEME | https | http | UCIDM API サーバーのプロトコル |
| API_HOST | 任意 | localhost | UCIDM API サーバー名 |
| API_PORT | 任意 | 18080 | 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 | リトライの最大回数 |
Microsoft Entra ID 向け Agent
UCIDM はクラウドの Microsoft Entra ID から ID 情報を取得して UCIDM API に連携します。
Microsoft Entra ID 向け Agent はコンテナとして稼働させます。次のように compose.yml に設定します。
agent-meid:
depends_on:
- api
container_name: agent-meid
image: docker.io/osstech/ucidm-agent:latest
logging: *default-logging
volumes:
- type: bind
source: ./agent-data/meid
target: ${AGENT_PAGE_KEY_PATH}
bind:
create_host_path: true
entrypoint:
- ./bin/agent
- -verbose
- -jsonl
environment:
TZ: "${TZ}"
PROTOCOL: "msgraph"
PAGE_KEY_PATH: "${AGENT_PAGE_KEY_PATH}"
RELOAD_INTERVAL: "${AGENT_RELOAD_INTERVAL}"
API_HOST: "${API_HOST}"
API_PORT: "${API_PORT}"
API_ACCOUNT_AUTH_USER: "${API_ACCOUNT_AUTH_USER}"
API_ACCOUNT_AUTH_PASSWORD: "${API_ACCOUNT_AUTH_PASSWORD}"
restart: "always"
前提条件
Microsoft Graph の デルタクエリを使用して変更を追跡 します。Agent モジュールからこれらの機能を使うための Microsoft Graph アプリケーションを登録する必要があります。登録した Microsoft Graph アプリケーションに適切な API のアクセス許可を設定してください。
- アクセス許可の種類
- 「アプリケーションの許可」
- Microsoft Graph API の権限
- CrossTenantInformation.ReadBasic.All
- User.Read.All
- Group.Read.All
Microsoft Graph アプリケーションの登録については Microsoft ID プラットフォームにアプリケーションを登録する などのドキュメントを参照してください。
Agent の永続化ディレクトリ
永続化が必要なファイルなどは volumes/agent-data/meid 配下に配置されます。
$ ls volumes/agent-data/meid
ここで参照する環境変数は .env に設定します。
環境変数の設定
接続する Microsoft Entra ID サーバーに関する設定は UCIDM API サーバーのシステム設定 で行います。
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| TZ | 任意 | – | タイムゾーン情報 |
| PROTOCOL | msgraph | – | Microsoft Graph |
| PAGE_KEY_PATH | 任意 | – | 同期状況の保存先ディレクトリ |
| RELOAD_INTERVAL | 任意 | 1m | システム設定の更新を定期的に問い合わせる間隔 |
- Microsoft Entra ID から正常にエントリを取得して UCIDM API サーバーへの連携に失敗 (リトライしても失敗) したときは自動で復旧しません
- 別途ツールで運用対応する 必要があります
API サーバー
接続する UCIDM API サーバーの設定をします。
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| API_SCHEME | https | http | UCIDM API サーバーのプロトコル |
| API_HOST | 任意 | localhost | UCIDM API サーバー名 |
| API_PORT | 任意 | 18080 | 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 | リトライの最大回数 |
Compose サービスの実行
UCIDM は Docker Compose を使い、複数のアプリケーションやミドルウェアのコンテナを起動して、それぞれのサービスが協調してシステムを構成しています。
これまで compose.yml と .env の設定を行ってきました。実際にコンテナイメージを取得してサービスを起動してみましょう。
- (初回起動時のみ) MongoDB と RabbitMQ の起動および初期設定
- Docker Compose の起動と終了
- コンテナのログ確認
- コンテナサービスとの疎通確認
- 初期設定をやり直したいとき
(初回起動時のみ) MongoDB と RabbitMQ の起動および初期設定
MongoDB と RabbitMQ の起動および初回セットアップに少し時間がかかるので次のように起動させます。初めてセットアップするときに実行すれば、2回目以降は行う必要はありません。
$ docker compose up -d mongo rabbitmq
起動して 1 〜 2 分 /var/log/osstech/ucidm/ucidm-mongo.log の MongoDB のコンテナログを監視して出力が停止したのを確認します。RabbitMQ の初回起動処理は通常 MongoDB よりも前に完了します。
Docker Compose の起動と終了
サービスを起動するときは up サブコマンドを実行します。
$ docker compose up -d
それぞれのサービスが正常に起動しているかどうかは ps サブコマンドで確認します。
$ docker compose ps
サービスを停止するときは stop サブコマンドを実行します。
$ docker compose stop
コンテナのログ確認
ログファイルは rsyslog で管理 しているため、docker logs (docker compose logs) コマンドで確認できません。
ログディレクトリは /var/log/osstech/ucidm になります。その配下のログファイルを参照してください。正常にサービスが起動しないときはログを確認してください。
$ ls -p /var/log/osstech/ucidm
old/ ucidm-admin-ui.log ucidm-agent-ldap.log ucidm-api.log
ucidm-consumer-local-001.log ucidm-mongo.log ucidm-passsync.log
ucidm-rabbitmq.log ucidm-ucidm-ui.log
コンテナサービスとの疎通確認
次のように疎通確認をします。
$ curl http://localhost:18080/status/version
{"ucidmVersion":"1.8.0","serverVersion":"fb42590","idFederationClientVersion":"871bd9f","mongoDBVersion":"8.0.3","rabbitMQVersion":"4.0.3"}
$ curl --head http://localhost:3030/sys/
HTTP/1.1 200 OK
$ curl --head http://localhost:5030/ui/
HTTP/1.1 200 OK
初期設定をやり直したいとき
Docker Compose で起動するサービスのいくつかは初回起動時に初期設定を行います。これらの設定は初回に実行されたときしか適用されません。
パスワードなどを誤ってしまったり、再設定したいときに 運用開始前 であればデータを削除することで初期設定をやり直すことができます。 運用開始後は ID 連携のデータが格納されているので絶対に削除しないでください。
たとえば MongoDB の初期設定をやり直すときは mongodb ディレクトリを削除して作成し直します。
$ docker compose down
$ rootlesskit rm -rf mongodb/*
compose.yml で volumes に設定されているデータを削除すると、再度 .env から初期設定を行います。
$ docker compose up -V mongo
Ctrl+C を入力して停止
$ docker compose up -d
Reverse Proxy
UCIDM API や管理画面にアクセスするときに HTTPS で通信するためのリバースプロキシを設定します。プロキシサーバーには Apache を使います。
あらかじめ、お客様のドメイン向けの SSL/TLS サーバー証明書をご用意ください。
インストール
# dnf install -y httpd mod_ssl
SELinux の設定
SELinux が有効な場合はリバースプロキシの振る舞いを許可する必要があります。
SELinux が有効かどうかは次のコマンドで調べられます。
# getenforce
Enforcing # SELinux 有効
httpd_can_network_connect を有効にします。
# setsebool -P httpd_can_network_connect on
# getsebool httpd_can_network_connect
httpd_can_network_connect --> on
SELinux を有効にした状態で通信できないときは /var/log/audit/audit.log にログがでていないかをチェックしてください。
SELinux で許可されているポート番号一覧を調べる
特定のポート番号で通信できないときは許可されているポート番号を試してみてください。
# dnf install -y policycoreutils-python-utils
# semanage port -l | grep http
apache の設定
# cd /etc/httpd
# cp -a /opt/osstech/share/ucidm/httpd/* .
サンプルの httpd.conf を使ってお客様の環境にあわせた内容に更新します。
VirtualHost の設定
VirtualHost ディレクティブ でコンテナサービスのポート番号へプロキシする設定を行います。
- ID 連携管理画面やユーザープロファイル画面といった Web UI のプロキシ
- UCIDM API のプロキシ
また Location ディレクティブ 単位にアクセス制限の設定を行います。
Web UI のプロキシ
<VirtualHost *:443>
ServerName serverName.example.com
<Location "/ui/user">
ProxyPass http://localhost:5030/ui/user retry=10
ProxyPassReverse http://localhost:5030/ui/user
Require all granted
</Location>
<Location "/ui/admin">
ProxyPass http://localhost:5030/ui/admin retry=10
ProxyPassReverse http://localhost:5030/ui/admin
Require all granted
</Location>
<Location "/ui">
ProxyPass http://localhost:5030/ui retry=10
ProxyPassReverse http://localhost:5030/ui
Require all granted
</Location>
<Location "/sys">
ProxyPass http://localhost:3030/sys retry=10
ProxyPassReverse http://localhost:3030/sys
Require all granted
</Location>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/ui
RewriteRule ^/$ /ui [R=301,L]
</VirtualHost>
API サーバーのプロキシ
<VirtualHost *:8443>
ServerName serverName.example.com
<Location "/">
ProxyPass http://localhost:18080/ retry=10
ProxyPassReverse http://localhost:18080/
Require all granted
</Location>
</VirtualHost>
SSL/TLS サーバー証明書の設定
動作確認テストのために sample-ca.crt, sample-server.crt, sample.key という自己証明書を使った設定をしています。お客様でご用意いただいた SSL/TLS サーバー証明書を配置してください。
# ls certs/ private/
certs/:
sample-ca.crt sample-server.crt
private/:
sample.key
VirtualHost ディレクティブで次の設定を変更します。
SSLCertificateKeyFile /etc/httpd/private/sample.key
SSLCertificateFile /etc/httpd/certs/sample-server.crt
httpd.conf の設定内容が正しいかをチェックします。
# apachectl configtest
Syntax OK
httpd サービスを起動します。
# systemctl start httpd
OS の再起動時に httpd サービスを自動起動するように設定します。
# systemctl enable httpd
# systemctl is-enabled httpd
enabled
リバースプロキシの疎通確認
httpd の設定完了後、サービスを起動してローカルホストからの HTTPS の疎通確認を行います。
$ curl --head https://localhost/sys/
HTTP/1.1 200 OK
$ curl --head https://localhost/ui/
HTTP/1.1 200 OK
$ curl https://localhost:8443/status/version
{"serverVersion":"2730fd8","idFederationClientVersion":"ef562e7","mongoDBVersion":"8.0.3","rabbitMQVersion":"4.0.3"}
リモートホストからの疎通確認
Web ブラウザで https://${ホスト名}/sys/ へアクセスしてログイン画面が表示されることを確認します。
疎通できない場合はファイアウォールの設定などを確認してください。
# systemctl status firewalld
システム設定
事前に HTTPS で疎通確認 ができることを確認します。そして Web ブラウザから ID 連携管理画面 (https://${ホスト名}/sys/) に admin ユーザーでログインしてシステム設定を進めてください。
- ログイン後のパスワード変更
- agent アカウントのパスワード設定
- インストール後のシステム設定
ログイン後のパスワード変更
admin ユーザーの初期パスワードでログインすると、パスワード変更を求められます。任意のパスワードに変更してください。

agent アカウントのパスワード設定
Agent モジュールで設定した agent アカウントのパスワード をアカウント一覧画面から agent アカウントに対して設定します。パスワード変更しない限り、Agent モジュールから UCIDM API サーバーにアクセスできません。

インストール後のシステム設定
システム設定を行うには system-superadmin ロールのアカウントでログインしてシステム設定を行います。admin ユーザーは初期状態で system-superadmin ロールが設定されています。
システム設定一覧画面に遷移すると、セクションごとの設定項目を確認できます。
セクションの設定によっては、設定内容を反映させるために UCIDM API サーバーの再起動が必要になります。またシステム設定一覧画面から再起動できます。通常、再起動は数秒から十数秒で完了します。
(共通) 特別な設定値のフォーマット
基準日からの期間を設定する
有効期間を設定する XXX_TIME という設定項目があります。次の記法で設定します。
- 5 秒に設定する場合 “5s” を設定する
- 5 分に設定する場合 “5m” を設定する
- 5 時間に設定する場合 “5h” を設定する
- 日数は時間に変換する。たとえば 5 日の場合 “120h” とする
auth (再起動が必要)
認証・認可に関する設定をします。デフォルト設定の状態で進めて必要に応じて後から設定しても構いません。
お客様の組織のセキュリティポリシーにあわせて設定してください。
idFederation
外部サービスへの ID 連携に関する設定をします。 外部連携前であれば、デフォルト設定の状態で進めて必要に応じて後から設定しても構いません。
clientHost
バージョン情報を取得するために外部連携モジュールのコンテナのアクセス先を指定します。
- 複数の外部連携モジュールのコンテナを利用していたとしても、どれか1つのコンテナに対するホスト名とポート番号を指定する
- バージョン情報は 1 時間キャッシュされる。外部連携モジュールのコンテナを更新したとき、最大 1 時間はバージョン情報が更新されない可能性がある
primaryID
UCIDM では、各ユーザー/グループを一意に識別するための ID として primaryID を使用します。
primaryID はデフォルトでは DN 文字列の RDN0 の値が割り当てられます。
例) cn=test1,ou=people,dc=example,dc=com という DN であれば test1 が primaryID になる
ここで primaryID は必ず一意となるように設定する必要があります。仮に DN 文字列の RDN0 の値のみだと競合してしまうような場合は userPrimaryIDTemplate と groupPrimaryIDTemplate のテンプレート文字列を使って一意になるような値を割り当ててください。
例) “%{cn}-%{uid}” と設定した場合、属性の cn=test1, uid=101 ならば test1-101 が primaryID になる
primaryID は、Microsoft Entra ID、Google Workspace、AD、SCIM の外部サービスへの連携において主要なキー情報として連携されます。仕様上の制約 もご確認ください。
loginLockout
連続して認証が失敗した回数が一定数を超えた場合に一定時間ログイン不可の状態にする機能の設定をします。デフォルト設定の状態で進めて必要に応じて後から設定しても構いません。
次の認証方法に対して同じ設定が適用されます。
- アカウント認証
- LDAP 認証
連携元データソースの接続設定
連携元となる内部ディレクトリサービスとの接続情報を設定します。
複数の内部ディレクトリサービスに対応していますが、連携元の設定は次のうちから1つしか有効にできません。
- metaActiveDirectory
- metaOpenLDAP
- metaMicrosoftEntraID
この設定は UCIDM API と Agent モジュール の両方で利用されます。設定を更新して UCIDM API サーバーを再起動したときに Agent モジュールもその変更を検知して反映します。
metaActiveDirectory (再起動が必要)
metaOpenLDAP の設定とほとんど同じですが、Active Directory サービスに特化した設定を追加できます。
hosts
指定された複数のホストに対して接続を試みます。接続に失敗した場合はリトライせず、次のホストへ接続を試みます。
bindDN
通常は接続するユーザーを DN で指定します。
Windows Server 2003 以降のドメイン コントローラーで Active Directory への匿名 LDAP 操作が無効になっている ため、Active Directory 向け Agent は anonymous bind をサポートしません。適切な bind ユーザーのアカウントをご用意ください。
userSearchBase/groupSearchBase
searchBase と同じ値を設定してください。
groupMemberAttribute
グループにおいて、メンバーの値が入る属性の属性名を設定します (例:memberUid) 。
- この設定をした属性の情報はグループのメンバーの情報としてグループとは別に UCIDM API に連携されます
ucidm-not-divide-memberの値を設定すると、メンバーの情報をグループから分離されず、そのままグループエントリとして連携されます- この設定をした際は userGroupLinkAttribute を設定しないようにしてください
userGroupLinkAttribute
ユーザーとグループにおいて、紐づけたい属性を設定できます (例:gidNumber) 。
- この設定をした場合、例えば gidNumber を設定した場合は、ユーザーの gidNumber と同じ gidNumber を持つグループのメンバーに該当ユーザーが割り当てられて UCIDM API に連携されます
- 設定値がない場合は、この属性によるユーザーとグループの紐づけは行われません
excludeLoggingAttributes
Active Directory サービスに対する登録・更新リクエストのログ出力を除外する属性を指定できます。unicodePwd は必ず除外されます。
metaOpenLDAP (再起動が必要)
metaActiveDirectory の設定とほとんど同じですが、OpenLDAP サービスに特化した設定を追加できます。
hosts
指定された複数のホストに対して接続を試みます。接続に失敗した場合はリトライせず、次のホストへ接続を試みます。
bindDN
通常は接続するユーザーを DN で指定します。Anonymous bind で接続するときは未設定または空文字を設定します。
groupMemberAttribute
グループにおいて、メンバーの値が入る属性の属性名を設定します (例:memberUid) 。
- この設定をした属性の情報はグループのメンバーの情報としてグループとは別に UCIDM API に連携されます
ucidm-not-divide-memberの値を設定すると、メンバーの情報をグループから分離されず、そのままグループエントリとして連携されます- この設定をした際は userGroupLinkAttribute を設定しないようにしてください
userGroupLinkAttribute
ユーザーとグループにおいて、紐づけたい属性を設定できます (例:gidNumber) 。
- この設定をした場合、例えば gidNumber を設定した場合は、ユーザーの gidNumber と同じ gidNumber を持つグループのメンバーに該当ユーザーが割り当てられて UCIDM API に連携されます
- 設定値がない場合は、この属性によるユーザーとグループの紐づけは行われません
excludeLoggingAttributes
OpenLDAP サービスに対する登録・更新リクエストのログ出力を除外する属性を指定できます。userPassword は必ず除外されます。
metaMicrosoftEntraID (再起動が必要)
scopes
Microsoft Graph アプリケーションにあらかじめ必要なアクセス権限を設定します。通常は https://graph.microsoft.com/.default を設定する。
userProperties
ユーザーにおいて指定したプロパティに対する変更のみが ID 連携されます。
groupProperties
グループにおいて指定したプロパティに対する変更のみが ID 連携されます。
passwordReset
パスワードリセットに関する設定をします。デフォルト設定の状態で進めて必要に応じて後から設定しても構いません。
requestMailTemplate
パスワードリセット向けメールのテンプレートを設定します。
アカウントのパスワードを忘れたときにメールを送信してパスワードリセットできます。メールのテンプレートファイルを使ってパスワードリセットメールをカスタマイズできます。
メールのテンプレートファイルでは、次のフィールドに対してテンプレート変数を使ってカスタマイズします。
| フィールド名 | 説明 |
|---|---|
| From | パスワードリセットメールの送信元メールアドレス |
| To | パスワードリセットメールの送信先メールアドレス |
| Reply-To | パスワードリセットメールの返信先メールアドレス |
| Subject | パスワードリセットメールの件名 |
次の変数をテンプレートファイルに記述することで、値が入ったメール送信が可能になります。
| テンプレート変数 | 説明 |
|---|---|
| {{.SenderMailAddress}} | mailSender に設定した値 |
| {{.UserName}} | パスワードリセットを行うユーザー名 |
| {{.UserMailAddress}} | パスワードリセットメールの送信先メールアドレス |
| {{.TemporaryToken}} | パスワードリセットで使用する一時トークン |
一時トークンを送付するメールテンプレート
テンプレートのサンプル設定は次になります。メールヘッダーと本文の間には空行を入れてください。
From: <{{.SenderMailAddress}}>
To: {{.UserName}} <{{.UserMailAddress}}>
Reply-To: 返信しないで <no-reply@osstech.co.jp>
Subject: パスワードリセット
パスワードをリセットするための一時トークンを送ります。
このトークンを使って管理画面からパスワードリセットしてください。
一時トークン: {{.TemporaryToken}}
一定時間経過するとパスワードリセットができなくなります。
successMailTemplate
パスワードリセット完了を連絡するメールテンプレートを設定します。
パスワードリセット完了を連絡するメールテンプレート
From: <{{.SenderMailAddress}}>
To: {{.UserName}} <{{.UserMailAddress}}>
Subject: パスワードリセット成功
新しいパスワードに更新されました。
saml (再起動が必要)
SAML 認証に関する設定をします。SAML 認証 を行うときのみ設定してください。
spRootURL
SAML 関連のエンドポイントが定義され、メタデータに反映されます。この値はユーザープロファイルのアクセスホスト名:ポート番号を使って、次のように設定してください。
<プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/ui/user/api/
idpMetadataURL/idpMetadata
SAML IdP のメタデータは次のどちらか一方で設定します。
idpMetadataURL- 指定した URL から取得する
- IdP にて自己証明書を使っている場合は
spTLSSkipVerifyFetchIdPMetadataを true に設定する
idpMetadata- IdP のメタデータを事前にダウンロードしている場合はその内容 (XML) を設定する
spAuthType
SAML 認証時に UCIDM で管理している認証種別を関連付けるための設定になります。次の認証方法に対応しています。
- LDAP 認証
spRoleName
SAML 認証時に UCIDM で管理しているロールを関連付けるための設定となります。デフォルトでは ldap-user ロールを設定します。
serverInfra (再起動が必要)
デフォルト設定の状態で進めて必要に応じて後から設定しても構いません。
xffTrustIPRanges
UCIDM API サーバーは X-Forwarded-For (以下 XFF) ヘッダーを参照してリクエスト元 IP アドレスを履歴に記録します。IP アドレスを詐称できないよう、信頼するネットワークを設定します。
- 信頼できるネットワークはカンマ区切りで複数指定する
- 設定例) 192.168.0.1/24,172.16.0.0/12,2001:db8::/64
- 指定しないときはコンテナネットワークのゲートウェイ (172.18.0.1) がリクエスト元 IP アドレスとなる
メールサーバー設定
パスワードリセットなど、メールを送信するときに利用するメールサーバーの設定をします。パスワードリセット 運用を行う前に設定してください。
smtp
特別な認証を必要としない、多くのメールサーバーはこの設定のみでメール送信ができます。
xoauth2
SMTP サーバーと OAuth 2.0 認証するときのみ、必要な設定になります。
Google Workspace では SMTP サーバーと OAuth 2.0 認証 を行うことが推奨されています。次のツールを使ってクライアントシークレットと認証コードからリフレッシュトークンを取得できます。リフレッシュトークンがないと、アクセストークンの有効期限が切れたときに再取得できません。ツールを実行すると、クライアントシークレットと認証コードが求められるので入力します(入力時、文字は表示されません)。
./bin/oauth -clientID <OAuth 2.0 認証で使用するクライアントID> -redirectURL <OAuth 2.0 認証で設定したリダイレクトURL> -authURL <OAuth 2.0 認証の認証エンドポイント> -tokenURL <OAuth 2.0 認証のトークンエンドポイント> -scope <OAuth 2.0 認証で設定したスコープ>
出力
access token: xxxxa0AfB_byAY5...
refresh token: yyyy0elQbS2Fscsi5...
PassSync Agent モジュール
UCIDM は社内で管理している内部ディレクトリサービス (OpenLDAP や Active Directory といったサービス) からパスワード変更を検知して連携するために PassSync Agent モジュールを使います。
PassSync モジュールはパスワードという機密情報を扱うため、内部ディレクトリサービスを実行しているサーバーと同じサーバーにインストールする必要があります。お客様の環境にあわせて PassSync Agent モジュールを設定します。
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
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 のサービスから 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_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/ 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 | リカバリの実行間隔 |
| UCIDM_RECOVERY_DURATION | 任意 | 72h | リカバリを行う期間 |
サービスの起動設定
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 の slapd.service に sender が PassSync の環境変数を参照できるように設定を追加します。systemctl edit を使って次の内容を設定してください。
# systemctl edit slapd.service
[Service]
EnvironmentFile=/opt/osstech/etc/openldap/service/ucidm/agent.env
設定を完了すると次のファイルが作成されます。
/etc/systemd/system/slapd.service.d/override.conf
systemctl cat で次の内容を確認できれば正しい設定になります。
# systemctl cat slapd.service
...
# /etc/systemd/system/slapd.service.d/override.conf
[Service]
EnvironmentFile=/opt/osstech/etc/openldap/service/ucidm/agent.env
設定を完了したら次のように slapd.service を再起動します。
# systemctl restart 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 サービスは slapd.service に依存するため、運用上の都合で slapd.service を自動起動していない場合はその設定にあわせて運用していただいても構いません。slapd.service を自動起動しているかどうかは次のコマンドで調べられます。
# systemctl is-enabled slapd.service
Active Directory 向け PassSync Agent
UCIDM は社内で管理している Active Directory サーバーからパスワード変更を検知して UCIDM API に連携します。
システム概要
Windows サーバーの LSASS (Local Security Authority Server Service) の仕組みを使ってパスワード変更をフックします。次に Active Directory 向け PassSync Agent の概要を示します。
flowchart TB
subgraph windows[Windows サーバー]
subgraph lsass[Local Security Authority<br />Server Service]
passwd[ユーザー名<br />パスワード]
subgraph passhook[PassHook]
pusher[ZeroMQ<br />Push]
end
end
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
passwd --> pusher
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
PassSync Agent で送信に失敗したときもリカバリディレクトリにメッセージが一時保存されて定期的に再処理されます。一時保存されるメッセージは難読化されて保存されます。システム管理者が容易にパスワードそのものを確認することはできません。
パスワード変更のリカバリの注意事項
UCIDM ではセキュリティ強化の観点から一般ユーザーのパスワードを原則として保存しません。しかし、システムの一時的な障害のために一般ユーザーにパスワード変更をやり直してもらうのも実運用においてコストがかかります。リカバリ機能は難読化した上で再処理する機能になりますが、リカバリデータを削除しない限り、無限にリカバリを繰り返します。一時的な検証ユーザーや誤った設定などにより、パスワード変更のデータが生成され、そのリカバリは絶対に成功しない場合、システム管理者が手動でリカバリデータを削除する必要があります。
リカバリデータでは後述する UCIDM_RECOVERY_PATH で指定されたディレクトリ配下に格納されます。不要なパスワード変更のデータがある場合はシステム管理者が直接、このディレクトリ配下にあるファイルを削除してください。
設定
システム環境変数をセットします。システム環境変数はコントロールパネル->システムとセキュリティ->システム->システムの詳細設定->環境変数->システム環境変数で編集します。変更後は OS を再起動します。パスワード変更時のイベントログに UCIDM_SOCKET_PATH と UCIDM_SEND_HWM の値が出力されますが、負荷が高い場合イベントログが出力されない可能性があります。
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| AD_SCHEME | 任意 | ldaps | AD 接続のプロトコル |
| AD_SECURE_SKIP | 任意 | false | AD 接続で任意の証明書を許可 |
| AD_BIND_DN | 任意 | bind-dn | AD 接続の BIND DN |
| AD_BIND_PASSWORD | 任意 | bind-password | AD 接続の BIND パスワード |
| AD_PORT | 任意 | 636 | AD 接続のポート番号 |
| AD_SEARCH_BASE | 任意 | dc=ad,dc=example,dc=com | AD 接続の search base |
| 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 | C:\OSSTech\UCIDM-ADPassSync\socket\adpsync | my-ipc-socket | Unix ドメインソケットのパス |
| UCIDM_SEND_HWM | 任意 | 0 | メッセージキューのバッファサイズ |
| UCIDM_BYTE_ORDER | 任意 | LittleEndian | メッセージエンコーディングのバイトオーダー |
sender/agent プロセスが送信処理に失敗したときにデータを一時保存するリカバリ設定をします。
| 環境変数 | 値 | 既定値 | 説明 |
|---|---|---|---|
| UCIDM_RECOVERY_PATH | C:\OSSTech\UCIDM-ADPassSync\.recovery | .recovery | リカバリのためのメッセージが 一時保存される場所へのパス |
| UCIDM_RECOVERY_INTERVAL | 任意 | 10m | リカバリの実行間隔 |
| UCIDM_RECOVERY_DURATION | 任意 | 72h | リカバリを行う期間 |
システム管理
インストール後の設定 を完了したら UCIDM システムの管理を行います。
ここでは UCIDM システム上のアプリケーションの操作や設定について説明します。
UCIDM API
UCIDM は ID 連携のための Web API を提供します。
サンプル設定 ではリモートホストから直接 Web API に通信することはできません。お客様の組織のセキュリティポリシーにあわせて設定してください。
認証を必要としない Web API
例えば、API サーバーとの疎通確認のために使う ping API は次のように実行します。
$ curl http://localhost:18080/status/ping
{
"message":"pong",
"remoteAddr":"172.18.0.1:49766",
"realIP":"172.18.0.1",
"updatedAt":"2025-10-15T03:55:40.107265791Z",
}
他にも UCIDM のバージョン情報を取得もできます。
$ curl http://localhost:18080/status/version
{
"ucidmVersion":"1.8.0",
"serverVersion":"fb42590",
"idFederationClientVersion":"871bd9f",
"mongoDBVersion":"8.0.3",
"rabbitMQVersion":"4.0.3"
}
認証を必要とする Web API
UCIDM の大半の Web API を呼び出すには認証を必要とします。UCIDM は次の認証に対応しています。
- ベーシック認証
- アカウント認証
- LDAP 認証
- SAML 認証
アカウント認証により、アクセストークンを取得して Web API を呼び出すには ucidm-cli コマンドを使うと便利です。
$ cp /opt/osstech/share/ucidm/exports-ucidm-cli.sh .
$ vi exports-ucidm-cli.sh # 接続先の設定に変更します
export API_SCHEME="http"
export API_HOST="localhost"
export API_PORT="18080"
export API_ACCOUNT_AUTH_USER="${任意のアカウント}"
export API_ACCOUNT_AUTH_PASSWORD="${アカウントのパスワード}"
$ source exports-ucidm-cli.sh
ucidm-cli の token サブコマンドでアクセストークンを取得できます。次のように実行すると AT という環境変数にアクセストークンがセットされます。
$ eval $(/opt/osstech/bin/ucidm-cli token)
$ echo $AT # アクセストークンの値を確認
eyJhbGc...
ヘッダーにアクセストークンを指定して Web API を呼び出します。
$ curl --header "Authorization: Bearer ${AT}" \
"http://localhost:18080/p/ping"
{
"message": "pong",
"remoteAddr": "172.18.0.1:44582",
"realIP": "172.18.0.1",
"updatedAt":"2025-10-15T04:04:47.220276229Z"
}
認証を行わない場合は 401 エラーが返ります。
$ curl -i http://localhost:18080/p/ping
HTTP/1.1 401 Unauthorized
Content-Type: application/json
Www-Authenticate: basic realm=Restricted
Date: Wed, 15 Oct 2025 04:05:55 GMT
Content-Length: 27
{"message":"Unauthorized"}
UCIDM API ドキュメント
Web API の仕様については UCIDM API にドキュメントを同梱しています。リモートホストからブラウザでアクセスするには Reverse Proxy を設定してください。
- Web API の仕様は将来のバージョンで変更する可能性があります
http://localhost:18080/docs
ID 連携管理画面
UCIDM では ID 連携管理画面があり、主に以下の画面を提供しています。
- ID 連携管理画面へのアクセス
- トップ画面
- ログイン画面
- パスワードリセット申請画面
- パスワードリセット画面
- ログイン後トップ画面
- ユーザー画面
- ユーザー詳細画面
- グループ画面
- グループ詳細画面
- 対象外ユーザー画面
- 対象外グループ画面
- ジョブ進捗概要
- 履歴一覧画面
- 実行中ジョブ画面
- 外部連携設定画面
- ルート設定画面
- 管理者アカウント画面
- システムロール一覧画面
- システムロール画面表示設定画面
- カスタムロール一覧画面
- カスタムロール新規作成画面
- カスタムロール詳細画面
- カスタムロール画面表示設定画面
- 管理者アカウント新規作成画面
- 管理者アカウント詳細画面
- 管理者アカウントパスワード変更画面
- システム設定一覧画面
- システム設定詳細画面
- 設定のエクスポート画面
- 設定のインポート画面
ID 連携管理画面へのアクセス
ID 連携管理画面へのアクセス URL は環境によって異なるので、compose.yml の admin-ui の設定および nginx の設定を参照の上、アクセスを行ってください。
トップ画面
ID 連携管理画面にアクセスするとトップ画面が表示されます。
「ログイン」ボタンを押下するとログイン画面に遷移します。
ログイン画面
ユーザー名/パスワードを入力し、「ログイン」ボタンを押下してログインを行います。「パスワードが不明な場合」を押下することで、パスワードリセット申請画面に遷移します。
パスワードリセット申請画面
パスワードリセットを行う管理者名とメールアドレスを入力します。メールアドレスが設定されていない場合、パスワードリセットを行うことはできません。入力情報が正しい場合、入力されたメールアドレスに一時トークンが送信され、パスワードリセット画面に遷移します。
パスワードリセット画面
送られてきたメールに記述された一時トークン、新しいパスワード、新しいパスワード(確認)を入力し、「再設定」ボタンを押下することで、パスワードをリセットできます。
ログイン後トップ画面
以下の画面に遷移するボタンが表示されます。
- ユーザー
- グループ
- 対象外ユーザー
- 対象外グループ
- ジョブ進捗概要
- 履歴一覧
- 実行中ジョブ
- 外部連携設定
- ルート設定
- 管理者アカウント
- システム設定
- 設定のエクスポート
- 設定のインポート
画面左上にハンバーガーボタンがあり、このボタンを押下することで、上記画面に遷移できるサイドバーが現れます。
画面右上にはログイン名が表示されたボタンがあり、このボタンを押下することで以下の各種メニューが表示されます。
- アカウント情報
- 管理者アカウント詳細画面に遷移します。
- パスワード変更
- 管理者アカウントパスワード変更画面に遷移します。
- ログアウト
- このリンクをクリックすることで、ログアウトが行われます。
ユーザー画面
- UCIDM の MongoDB に登録されていて、連携対象となっているユーザーを一覧表示します。
- 連携対象となっているユーザの検索が行えます。
- 各ユーザーについて、「対象から外す」ボタンを押下することで、そのユーザーを連携対象から外すことができます。
- 各ユーザーの DN を押下すると、ユーザー詳細画面が表示されます。
ユーザー詳細画面
- UCIDM の MongoDB に登録されているユーザーの詳細情報を表示します。
- そのユーザーが所属しているグループの一覧情報も確認できます。
グループ画面
- UCIDM の MongoDB に登録されていて、連携対象となっているグループを一覧表示します。
- 連携対象となっているグループの検索が行えます。
- 各グループについて、「対象から外す」ボタンを押下することで、そのグループを連携対象から外すことができます。
- 各グループの DN を押下すると、グループ詳細画面が表示されます。
グループ詳細画面
- UCIDM の MongoDB に登録されているグループの詳細情報を表示します。
- そのグループに所属しているユーザーの一覧情報も確認できます。
対象外ユーザー画面
- UCIDM の MongoDB に登録されていて、連携対象外となっているユーザを一覧表示します。
- 連携対象外となっているユーザの検索が行えます。
- 各ユーザについて、「対象にする」ボタンを押下することで、そのユーザを連携対象にできます。
- 新規対象外のユーザー(UCIDM に連携済みでないユーザー)を追加できます。
- entryUUID には以下の情報を入力してください
- 連携元システムが LDAP の場合
- LDAP における対象ユーザーの entryUUID の値
- 連携元システムが AD の場合
- AD における対象ユーザーの objectGUID の値
- 連携元システムが ME-ID の場合
- ME-ID における対象ユーザーの Object ID の値
- 連携元システムが LDAP の場合
- entryUUID には以下の情報を入力してください
対象外グループ画面
- UCIDM の MongoDB に登録されていて、連携対象外となっているグループを一覧表示します。
- 連携対象外となっているグループの検索が行えます。
- 各グループについて、「対象にする」ボタンを押下することで、そのグループを連携対象にできます。
- 新規対象外のグループ(UCIDM に連携済みでないグループ)を追加できます。
- entryUUID には以下の情報を入力してください
- 連携元システムが LDAP の場合
- LDAP における対象グループの entryUUID の値
- 連携元システムが AD の場合
- AD における対象グループの objectGUID の値
- 連携元システムが ME-ID の場合
- ME-ID における対象グループの Object ID の値
- 連携元システムが LDAP の場合
- entryUUID には以下の情報を入力してください
ジョブ進捗概要
- 一括連携時など進捗状況の概要を確認したいといった際に視覚的に ID 連携の状況を確認できる画面です。
- 棒グラフ形式で 完了/失敗/進捗中 の状況を期間を絞って確認できます。
履歴一覧画面
- 以下の履歴タイプごとのボタンが表示されます。ボタンを押下することで、それぞれの履歴が一覧表示されます。
- ID 連携履歴
- 外部サービスへの連携履歴の確認が行えます -連携時に更新されたデータの差分を確認できます。
- 認証履歴
- 認証の履歴を確認すできます。
- LDAP 操作履歴
- LDAP に対する操作の履歴を確認できます。
- UCIDM 内部履歴
- UCIDM 内部のサーバーログの履歴を確認できます。
- 全ての履歴
- 上記 4 つの履歴の主要情報をまとめて確認できます。
- マイグレーション履歴
- UCIDM のバージョンアップなどの際に必要なデータ移行のマイグレーション履歴を確認できます。
- ID 連携履歴
実行中ジョブ画面
- 実行中ジョブを一覧表示します。
- 実行中のジョブの検索が行えます。
外部連携設定画面
- 外部連携設定を一覧表示します。
- 一覧表示された画面にて、「作成」画面を押下すると、新規外部連携設定画面に遷移します。
- ここでは、対象の外部連携先や、マッピングを指定できます。
- 新規外部連携設定画面で設定内容を入力し、画面下部の「作成」を押下すると新規外部連携設定が作成されます。また、外部連携先に対応する Queue が存在していない場合は、この Queue が新規で作られます。(コンテナは作られないので、別途 compose.yml 等を編集し、コンテナを作成する必要があります。)
- 一覧表示された画面にて、鉛筆マークの「編集」アイコンを押下すると、外部連携詳細画面に遷移します。
- 外部連携詳細画面では、既存の外部連携設定を確認できます。また、内容を編集し、「更新」ボタンを押下すると、外部連携の設定内容を更新できます。
- 外部連携詳細画面下部の「削除」ボタンを押下すると、連携設定が削除されます。また、対象の外部連携先に対する連携設定が他にない場合は、対象の外部連携先設定および対応する Queue が削除されます。(コンテナは削除されないので、別途 compose.yml 等を編集し、コンテナを削除する必要があります。)
- 一覧表示された画面にて、ゴミ箱マークの「削除」アイコンを押下すると、連携設定が削除されます。また、対象の外部連携先に対する連携設定が他にない場合は、対象の外部連携設定および対応する Queue が削除されます。(コンテナは削除されないので、別途 compose.yml 等を編集し、コンテナを削除する必要があります。)
- 1 つの外部連携先においてマッピングをエントリの内容に応じて切り替えたい場合は、対象の外部連携先における複数の連携設定を作成する必要があります。(外部連携先 ID を同じにして、マッピングの内容をそれぞれ設定してください。)
ルート設定画面
- 上記外部連携設定で作成した連携設定を、どのエントリに対して適用するかを設定します。(UCIDM ではこれをルート設定と呼びます。)
- ルート設定一覧画面においては、ルートの設定が一覧表示されます。
- 一覧表示された画面にて、「追加」画面を押下すると、ルート設定新規作成画面に遷移します。
- ルーティングの情報を入力し、「作成」ボタンを押下すると、ルート設定が追加されます。
- 一覧表示された画面にて、鉛筆マークの「編集」アイコンを押下すると、ルート設定詳細画面に遷移します。
- ルート設定詳細画面では、既存のルート設定を確認できます。また、内容を編集し、「更新」ボタンを押下すると、ルート設定の内容を更新できます。
- 一覧表示された画面にて、ゴミ箱マークの「削除」アイコンを押下すると、対象のルート設定が削除されます。
- ルート設定においては、以下の情報を指定する必要があります。
- ルート ID
- 新規ルート作成画面においては、一意のルート ID を指定する必要があります。
- 連携 ID
- 対象のエントリをどの連携にルーティングさせるかを指定します。
- 連携条件
- ユーザー用とグループ用のそれぞれの連携条件を指定できます
- 条件に合致するレコードのみが指定された外部連携設定に則って連携されます
- グループメンバー追加/削除の連携については、グループとメンバーとなるユーザーのそれぞれの連携条件を見て連携の可否が判定されます
- 「常に連携」を選んだ場合は、すべてのエントリが連携 ID で指定された連携設定に則って連携されます
- 「条件を指定」を選んだ場合は、連携対象のエントリを絞り込むことができます。この時、条件設定欄が下部に表示されます。
- 条件設定欄では、条件エディタででグラフィカルに対象のエントリを指定できます。JSON のタグを開くことで生データを確認することもでき、JSON を直接編集することもできますが、JSON の構造が複雑なため、出来る限り条件エディタでの編集をお勧めいたします。
- 条件エディタでは、AND 条件、OR 条件での条件指定が可能です。
- 条件エディタでは、DN、PrimaryID を始め、エントリの作成/更新日時や、属性値でのフィルタを指定できます。
- 比較値が数値(number)、時刻(time)の場合は大小関係を指定できます。また、複数の大小関係を指定できます。
- 属性値でのフィルタの場合、比較値の型を指定できます。(string, number, boolean, time)
- ユーザー用とグループ用のそれぞれの連携条件を指定できます
- ルート ID
管理者アカウント画面
- UCIDM の管理画面へログインできる管理者アカウントを一覧表示します。
- 一覧表示された画面にて、「作成」画面を押下すると、管理者アカウント新規作成画面に遷移します。
- 一覧表示された画面にて、鉛筆マークの「編集」アイコンを押下すると、管理者アカウント詳細画面に遷移します。
- 編集はログインしているアカウント自身のみ行えます。
- system-superadmin などアカウント編集権限のあるロールでログインしている場合は、すべてのアカウントの編集を行えます。
- 一覧表示された画面にて、鍵マークの「編集」アイコンを押下すると、管理者アカウントパスワード変更画面に遷移します。
- パスワード変更はログインしているアカウント自身のみ行えます。
- system-superadmin などアカウント編集権限のあるロールでログインしている場合は、すべてのアカウントの編集を行えます。
- 一覧表示された画面にて、ゴミ箱マークの「削除」アイコンを押下すると、管理者アカウントが削除されます。
- system-superadmin などアカウント編集権限のあるロールでログインしている場合は、他のアカウントの削除をを行えます。
- 自分自身のアカウントは削除できません。
- system-superadmin などアカウント編集権限のあるロールでログインしている場合は、他のアカウントの削除をを行えます。
- 「ロール」ボタンを押下し、システムロールまたはカスタムロールを選択することで、システムロール管理画面、カスタムロール管理画面にそれぞれ遷移します。
システムロール一覧画面
- 設定されているシステムロールを一覧表示します。
- system-agent 以外のシステムロールでは画面表示の設定を行えます。
- 「画面表示」アイコンを押下することで画面表示の詳細画面に遷移します。
システムロール画面表示設定画面
- ユーザープロファイルでの画面表示の設定を行えます。
- system-superadmin などアカウント編集権限のあるロールでログインしている場合は、設定内容の編集を行えます。
カスタムロール一覧画面
- 設定されているカスタムロールを一覧表示します。
- system-superadmin などアカウント編集権限のあるロールでログインしている場合は、カスタムロールの追加を行えます。
- 一覧テーブル右上の追加ボタンを押下することで、カスタムロール新規作成画面に遷移します。
- system-superadmin などアカウント編集権限のあるロールでログインしている場合は、カスタムロールの削除を行えます。
- 「画面表示」アイコンを押下することで画面表示の詳細画面に遷移します。
カスタムロール新規作成画面
- カスタムロールの新規作成が行えます。
- カスタムロール名は必ず設定する必要があります。
- 説明は任意項目となります。
- 継承ロールは以下ページのシステムロールから継承元にしたいロールを選択してください。追加で付与する権限については以下ページの権限から必要となる権限を選択してください。
カスタムロール詳細画面
- system-superadmin などアカウント編集権限のあるロールでログインしている場合は、カスタムロールの確認・編集が行えます。
- 管理者アカウント新規作成画面と同様に、以下の各種設定も行えます。
- 説明
- 継承ロール
- 追加で付与する権限
カスタムロール画面表示設定画面
- ユーザープロファイルでの画面表示の設定を行えます。
- system-superadmin などアカウント編集権限のあるロールでログインしている場合は、設定内容の編集を行えます。
- 継承ロールの画面表示設定を使用するか、独自に画面表示設定を定義するかを選べます。
管理者アカウント新規作成画面
- 新規作成画面で設定内容を入力し、画面下部の「作成」を押下すると新規管理者アカウントが作成されます。ユーザー名とパスワードは必ず入力する必要があります。
- ユーザー名はアルファベット文字、数字、ハイフン、アンダースコアが使えます。
- アカウント作成時は以下ページのシステムロール/カスタムロールから適切なロールを指定してください。
- 以下の各種設定も行うことができます。
- 言語
- ID 連携管理画面の表示言語を設定します。
- タイムゾーン
- ID 連携管理画面上で表示したい時刻のタイムゾーンを設定します。
- ページ当たりの表示件数
- ID 連携管理画面の履歴一覧画面等のページで 1 ページあたりに表示されるデフォルトの件数を設定します。
- 表示項目
- ID 連携管理画面の履歴一覧画面や実行中ジョブ一覧画面等のページでデフォルトで表示したい項目を設定します。
- 言語
管理者アカウント詳細画面
- 管理者アカウント情報の確認・編集が行えます。
- 管理者アカウント新規作成画面と同様に、以下の各種設定も行えます。
- 言語
- タイムゾーン
- ページ当たりの表示件数
- 表示項目
管理者アカウントパスワード変更画面
- 管理者アカウントのパスワード変更が行えます。
システム設定一覧画面
- システム設定セクションの一覧が表示されます。
- 各セクションの詳細ボタンを押下することで、設定詳細画面に遷移します。
- system-superadmin のロールでログインしている場合は、UCIDM API の再起動を行えます。
システム設定詳細画面
- システム設定各セクションの設定名、設定値が表示されます。
- system-superadmin のロールでログインしている場合は、設定内容の編集を行えます。
設定のエクスポート画面
- ID 連携管理画面の以下設定をエクスポートできます。
- 外部連携設定
- ルート設定
- 対象外ユーザー
- 対象外グループ
- システムロール
- 画面設定
- カスタムロール
- ロール設定
- 画面設定
- システム設定
- システム設定の閲覧権限がある管理者のみエクスポートを行えます
- エクスポートファイルは JSON 形式となります。
- エクスポートする対象のデータを指定できます。
設定のインポート画面
- ID 連携管理画面の以下設定を JSON ファイルからインポートできます。
- 外部連携設定
- ルート設定
- 対象外ユーザー
- 対象外グループ
- システムロール
- 画面設定
- カスタムロール
- ロール設定
- 画面設定
- システム設定
- システム設定の編集権限がある管理者のみインポートを行えます
- インポートするファイルを指定し、プレビューボタンを押下後、インポート対象のデータを指定してからインポートボタンを押下してください。
- 外部連携設定のインポート時に「ドライランモードでインポートする」の値を on にしておくことで、インポートされる外部連携設定のドライランモードがすべて on になります。
- 外部連携設定およびルート設定において同名の設定が存在する場合は、「すでに同名の設定が存在します。チェックをつけてインポートを行うと設定が更新されます。」のメッセージが表示されます。
- この設定においてチェックをつけてインポートを行うと、インポートファイルに含まれるデータの内容で、外部連携設定およびルート設定の対象レコードが更新されます。
マッピング設定
ここでは、UCIDM に連携されてきたデータから外部連携先モジュールに渡すデータにマッピングするための設定について記載します。
OpenLDAP, Microsoft Entra ID, Google への細かいマッピングの注意事項については、各外部連携の説明ページをご参照ください。
マッピング設定画面
ID 連携管理画面の外部連携設定画面にて、各外部連携先に向けたマッピングの設定ができます。
マッピングの設定項目は、1 属性ごとに以下を設定することができます。
原則として UCIDM では連携されるエントリにおける属性名の大文字小文字を区別しません (case-insensitive) 。例えば、連携元の属性名が givenName であっても givenname, GIVENNAME, givenNAME のいずれでも一致します。
但し、カスタムスクリプトのスクリプト内部で属性名を参照するときはすべて小文字の属性名 (givenname) として参照するようにスクリプトを書いてください。カスタムスクリプトのデバッグ機能があるので意図したマッピング結果になることを確認してください。
- 連携先の属性名
- 外部連携先の属性名を指定します
- 連携元の属性名
- UCIDM に連携されてきたデータに対応する属性名を指定します
- ビルトイン関数名
- 連携元の属性名に対応する属性値について、事前定義済みのビルトイン関数を適用してマッピング結果とすることができます
- 事前定義済みのビルトイン関数については、本ページ下部の
事前定義済みのビルトイン関数の項を参照してください
- テンプレート文字列
- UCIDM に連携されてきたデータに対応する属性値を組み合わせて、文字列を生成できます
- UCIDM に連携されてきたデータに対応する属性名を
%{xxx}の形で%{}で囲むことで、属性値を文字列に入れ込むことが出来ます - 例えば、
%{cn}-%{sn}とすると UCIDM に連携されてきたデータの cn と sn の値を-でつないだ文字列がマッピング結果として使用されます
- 固定値
- 固定値をマッピングしたい場合に使用します。マルチバリューについても指定することができます。
- カスタムスクリプトを利用
- カスタムのスクリプト(後述)を使用してマッピングをしたい場合に on (true)にします。
- 関数名
- 上記で「カスタムスクリプトを利用」が true の場合に使われます
- 使用したいスクリプトの関数名を指定します
- 引数
- 上記で「カスタムスクリプトを利用」が true の場合に使われます
- 使用したいスクリプトに渡す引数を指定します
カスタムスクリプト
UCIDM のマッピング処理においては、カスタムスクリプトを用いて、任意の関数の処理を実行した結果をマッピング結果に設定することができます。
カスタムスクリプトは javascript で記述します。
以下はカスタムスクリプトスクリプトの一例です。
function addPrefix(prefix) {
return [prefix + cn];
}
上記で prefix には、任意の引数の値を渡すことができます。(上記マッピング設定の、「引数」で指定します。)
cn の部分は環境値となり、マッピング元のデータの cn の値が参照されます。
カスタムスクリプトはユーザ、グループにおいてそれぞれ定義することができます。また、複数の関数を定義することができます。(マッピングで使用したい関数を、上記マッピング設定の「関数名」で指定する必要があります。)
関数呼び出し確認では、関数の引数を「引数値リスト」、cn のような環境値を「環境値リスト」に設定し、「関数呼び出し確認」ボタンをクリックすることで、呼び出し結果が表示されます。
このカスタムスクリプトにて undefined または null を返すと、連携先の属性名で指定した属性に対するマッピングは無視されます。
カスタムスクリプトには以下の環境値で情報が渡されます。
UCIDM_OPERATION_TYPE
以下の操作種別が渡されます。
- create
- ユーザー追加・グループ追加の時にこの値が設定されます。
- update
- ユーザー更新・グループ更新の時にこの値が設定されます。
- password
- ユーザーパスワード更新の時にこの値が設定されます。
- none
- 上記以外の操作種別の際のこの値が設定されます。
マッピングの動き
全体として以下の順に処理が行われます。外部連携先に連携したい属性は、必ずここで定義を入れる必要があります。マッピング定義がない属性はマッピング結果に反映されません。
- 連携元の属性名
- テンプレート文字列
- 固定値
- カスタムスクリプト
以下で上記マッピング処理の詳細な動きについて説明します。
- 連携元の属性名
- 連携元の属性名 の値がある場合
- ビルトイン関数名 の値がある場合
- 連携元の属性名に対応する属性値をビルトイン関数に引数として渡し、その結果をマッピングの結果とします
- ビルトイン関数名 の値がない場合
- 連携元の属性名に対応する属性値を取得して、マッピング結果とします
- ビルトイン関数名 の値がある場合
- 連携元の属性名 の値がない、連携元の属性名 の属性値が取得できない場合は、後続の処理に進みます
- 連携元の属性名 の値がある場合
- テンプレート文字列
- テンプレート文字列 の値がある場合は、属性値をつかって、テンプレート文字列 の文字列を置換して、マッピング結果とします
- 属性名に対応する属性値がマルチバリューの場合は、その部分にはマルチバリューの 0 番目の要素がセットされます
- 属性名に対応する属性値がない場合は、その部分には空文字(“”)がセットされます
- テンプレート文字列 の値がない場合は、後続の処理に進みます
- 固定値
- 固定値 の値がある場合は、その値をマッピング結果とします
- 固定値 の値がない場合は、後続の処理に進みます
- カスタムスクリプト
- useScript が true の場合はカスタムスクリプトによる関数実行を行い、その実行結果の返り値をマッピング結果とします
- カスタムスクリプトは実行時エラーが発生する可能性があるため、ここでエラーが返る可能性があります
- useScript が false の場合は、後続の処理に進みます
- useScript が true の場合はカスタムスクリプトによる関数実行を行い、その実行結果の返り値をマッピング結果とします
- ここまで値がセットされない場合は、空配列をマッピング結果とします
事前定義済みのビルトイン関数
invertBooleanValue
- 引数として受け取った boolean の値を、その真偽値を反転させてマッピング結果とします
- true として読み込める値は以下となります
- true(大文字/小文字を区別しない), t(大文字/小文字を区別しない), 1
- false として読み込める値は以下となります
- false(大文字/小文字を区別しない), f(大文字/小文字を区別しない), 0
- true として読み込める値は以下となります
- 引数の値が存在しない場合、boolean でない場合はマッピングエラーとなります
- 引数の値が複数存在する場合は、その 1 つめの要素について真偽値の反転処理をおこないます
マッピング設定のインポート・エクスポート
ID 連携管理画面では、マッピング設定のインポートおよびエクスポートをすることができます。
マッピング設定のインポート
- 外部連携設定詳細のマッピング設定欄の「インポート」ボタンを押すことで、UTF-8 形式の json ファイルをインポートすることができます。
- 「参照」ボタンでインポートしたい json ファイルを指定してから、「インポート」を押下しください。
- インポート後、画面上のマッピング設定の内容が json ファイルの内容で上書きされます。内容が正しいことを確認してから外部連携設定の更新を行ってください。
マッピング設定のエクスポート
- 外部連携設定詳細のマッピング設定欄の「エクスポート」ボタンを押すことで、UTF-8 形式の json ファイルがダウンロードできます。
外部連携の前処理/後処理で実行するスクリプトの設定
UCIDM では、外部連携処理の前後で任意のシェルスクリプトを実行することができます。
ここでは、外部連携設定画面において、実行する任意のシェルスクリプトを指定する方法について記載します。
事前準備
次の 外部連携の前処理/後処理で実行するスクリプトの配置 を参考に、スクリプトファイルを配置してください。
Windowsサーバーへのコマンド連携手順は Windowsサーバーコマンド連携 を参照してください。
設定手順
- 前処理・後処理スクリプト設定フォームにて、実行したいスクリプトを指定します。
- スクリプトファイルは、外部連携の前処理と後処理でそれぞれ指定することができます。
- スクリプトファイルは、ユーザ追加、ユーザ更新等の処理種別ごとに指定することができます。
- 上記の事前準備で配置したスクリプトファイルをプルダウン値として選ぶことができます。
- 「+」ボタンで対象のスクリプトを追加後、「↑」ボタン、「↓」ボタンを押下してスクリプトの実行順序を入れ替えることができます
ロールとアクセス制御
アカウント認証と LDAP 認証 (SAML 認証) を用いてログインすると、ログインしたユーザーに対してロールが1つだけ割り当てられます。
ロールは次の機能をもちます。
- UCIDM API に対するアクセス制御
- ID 連携管理画面やセルフメンテナンス機能の Web UI の制御
ロールには2つの種別があります。
システムロール
UCIDM 組み込みのロールになります。システム管理者がカスタマイズすることはできません。
システムロールは次になります。
アカウント認証向けロール
system-superadmin
UCIDM 全般のシステム管理権限をもつロールです。
- ID 連携システムに対する、すべての操作のアクセス権限をもつ
- 内部ディレクトリサービス (LDAP サーバー) に対する、すべての操作のアクセス権限をもつ
system-admin
system-superadmin と同様に UCIDM 全般のシステム管理権限をもつロールです。
- ID 連携管理に対する、システム系の設定以外のすべての操作のアクセス権限をもつ
- 内部ディレクトリサービス (LDAP サーバー) に対する、システム系の設定以外のすべての操作のアクセス権限をもつ
system-user
UCIDM 全般のシステム参照権限をもつロールです。
- ID 連携管理に対する、すべての操作の参照(更新はできません)権限をもつ
- 内部ディレクトリサービス (LDAP サーバー) に対する、すべての操作の参照(更新はできません)権限をもつ
ldap-admin
内部ディレクトリサービス (LDAP サーバー) に対する管理権限をもつロールです。
- ID 連携管理に対する、すべての操作の参照(更新はできません)権限をもつ
- 内部ディレクトリサービス (LDAP サーバー) に対する、システム系の設定以外のすべての操作のアクセス権限をもつ
ldap-maintainer
内部ディレクトリサービス (LDAP サーバー) に対するユーザーおよびグループ更新管理者用のロールです。
- ID 連携システムに対する権限はない
- 内部ディレクトリサービス (LDAP サーバー) に対する、設定権限はない
- 内部ディレクトリサービス (LDAP サーバー) に対する、ユーザーおよびグループ管理のすべての操作のアクセス権限をもつ
ldap-password-updater
内部ディレクトリサービス (LDAP サーバー) に対するユーザー更新管理者用のロールです。
- ID 連携システムに対する権限はない
- 内部ディレクトリサービス (LDAP サーバー) に対する、設定権限はない
- 内部ディレクトリサービス (LDAP サーバー) に対する、ユーザーのパスワード更新および TOTP/Passkey デバイス削除のみの権限をもつ
ldap-minimum
カスタマイズ向け内部ディレクトリサービス (LDAP サーバー) 管理者向けのロールです。
- ロールのカスタマイズを前提とした、最低限の権限が付与されているロールです。
- ID 連携システムに対する権限はない
- 内部ディレクトリサービス (LDAP サーバー) に対する、設定権限はない
- 必要に応じて後述するアクセス権を任意に付与する
- 内部ディレクトリサービス (LDAP サーバー) に対する、ユーザーおよびグループ管理の権限はない
- 必要に応じて後述するアクセス権を任意に付与する
system-agent
Agent モジュール および PassSync Agent モジュール が認証するときに使うアカウント向けのロールです。システム管理者向けには使いません。
- Agent および PassSync Agent に必要な UCIDM API を操作するためのアクセス権限をもつ
デフォルトで agent というアカウントが作成されています。初期状態はパスワードが未設定で利用できません。利用するときは admin アカウントでログインして管理者アカウント画面から agent アカウントのパスワードを設定してください。
LDAP 認証 (SAML 認証) 向けロール
ldap-user
UCIDM が接続する内部ディレクトリサービス (LDAP サーバー) に登録されているエントリー情報を用いてログインしたユーザーの操作権限をもつロールです。一般ユーザー向けのデフォルトのシステムロールになります。
- LDAP 認証 (SAML 認証) で使う
- 自身の情報のみを操作するアクセス権限をもつ
カスタムロール
システム管理者が任意の名前で作成できるロールになります。カスタムロールを使うときには次の制約があります。
- ロール名に
system-とldap-という接頭辞は使えない - アクセス権限はシステムロールの設定を引き継ぎ、後述するアクセス権を追加で付与する
- システムロールとカスタムロール両方を同時に併用できない
カスタムロールは利用する Web UI や管理画面によって用途が異なります。
アカウント認証向けロール
システム管理者が Web UI の管理画面の操作を任意に制限するためにカスタムロールを設定できます。アクセス権を付与しやすいよう、関連のある一連の操作をまとめて付与できるよう調整されています。
ID 連携管理画面でカスタムロールを作成するときに次のアクセス権を選択して組み合わせて付与できます。
view-bundled-ldap-entry
- LDAP サーバー上のユーザーおよびグループの参照権限
view-bundled-ldap-setting
- LDAP サーバーに対する管理設定の参照権限
view-ldap-auth-scoped-role
- LDAP サーバーに対する管理設定に必要な LDAP 認証 (SAML 認証) 向けロールの参照権限
- bundled-ldap-setting の権限を付与するときに一緒に付与する
edit-bundled-ldap-entry
- LDAP サーバー上のユーザーおよびグループの参照/更新権限
edit-bundled-ldap-entry-by-csv
- LDAP サーバー上のユーザーおよびグループを CSV 取込で一括登録するための権限
edit-bundled-ldap-setting
- LDAP サーバーに対する管理設定の参照/更新権限
delete-bundled-ldap-entry
- LDAP サーバー上のユーザーおよびグループの参照/削除権限
delete-bundled-ldap-setting
- LDAP サーバーに対する管理設定の参照/削除権限
LDAP 認証 (SAML 認証) 向けロール
LDAP サーバーに登録されているエントリーの属性情報を用いてカスタムロールを設定できます。画面などの Web UI 制御を行うための設定を切り替えたりできます。主な用途は次にあげます。
- ログインするユーザーの特性に応じた画面を表示する
- エントリー情報を更新するときのスクリプトでロールごとに処理を変える
管理画面の操作を行うわけではないため、アクセス権を付与することはできません。
ユーザープロファイル画面
一般ユーザーが自身の情報を管理します。
ユーザープロファイル画面(管理者用)
ユーザープロファイル画面(管理者用)では、主に以下の画面を提供しています。
- 管理者用画面へのアクセス
- ログイン画面
- ログイン後トップ画面
- ユーザー管理画面
- グループ管理画面
- CSV 一括処理画面
- 履歴一覧画面
- ロール設定画面
- 表示・属性値設定
- デザイン設定画面
- パスワードポリシー設定画面
- 初期値設定
- ユーザーステータス設定画面
- 設定のエクスポート
- 設定のインポート
管理者用画面へのアクセス
https://<ホスト名>/ui/admin/login にアクセスします。
ユーザープロファイル画面へのアクセス URL は環境によって異なります。
ログイン画面
ユーザー名/パスワードを入力し、「ログイン」ボタンを押下してログインを行います。パスワードリセットについては、ID 連携管理画面で行います。
ログイン後トップ画面
以下の画面に遷移するボタンが表示されます。
- ユーザー管理
- グループ管理
- 履歴一覧
- CSV 一括処理
- CSV 一括取込
- CSV 処理結果
- 各種設定
- ロール設定
- 表示・属性値設定
- デザイン設定
- パスワードポリシー設定
- 初期値設定
- ユーザーステータス設定
- 設定のエクスポート
- 設定のインポート
画面左側に以下の各種メニューが表示されます。
- ユーザー管理
- ユーザー管理画面に遷移します。
- グループ管理
- グループ管理画面に遷移します。
- CSV 一括処理
- CSV 一括取込
- CSV 一括取込画面に遷移します。
- CSV 処理結果
- CSV 処理結果画面に遷移します。
- CSV 一括取込
- 履歴一覧
- 履歴一覧画面に遷移します。
- 各種設定
- ロール設定
- ロール設定画面に遷移します。
- 表示・属性値設定
- 表示・属性値設定画面に遷移します。
- デザイン設定
- デザイン設定画面に遷移します。
- パスワードポリシー設定
- パスワードポリシー設定画面に遷移します。
- 初期値設定
- 初期値設定画面に遷移します。
- ユーザーステータス設定
- ユーザーステータス設定画面に遷移します。
- 設定のエクスポート
- 設定のエクスポート画面に遷移します。
- 設定のインポート
- 設定のインポート画面に遷移します。
- ロール設定
画面右上にユーザー名があり、このユーザー名を押下することで、以下の各種メニューが表示されます。
- アカウント情報
- 押下することで、ID 連携管理画面のアカウント情報変更画面に遷移します。
- パスワード変更
- 押下することで、ID 連携管理画面のパスワード変更画面に遷移します。
- ログアウト
- このリンクをクリックすることで、ログアウトが行われます。
- UCIDM について
- 押下することで、UCIDM についての画面に遷移します。
ユーザー管理画面
- ユーザーの管理が行えます。
- キーワード検索では、検索ボックスに検索ワードを入れ検索ボタンを押下すると、表示・属性値設定画面で設定されている「検索対象」属性に対して検索ワードを含むユーザーを検索し、画面上に表示します。
- 詳細検索では、表示・属性値設定画面で設定されている「検索対象」属性の項目が表示されます。オプションを設定している属性に対してはチェックボックスが表示されます。検索ボタンを押下することで絞り込み検索が行えます。「その他」の検索では、オプション値以外で検索を行いますが、値が設定されていないユーザーを検索することはできません。
- 検索結果の表示列は、表示・属性値設定画面で設定されている「表示」属性の項目がデフォルトになります。
- 「CSV エクスポート」ボタンを押下することで、表示されているユーザーの一覧を CSV ファイルとしてエクスポートできます。表示・属性値設定画面で設定している属性が使用されます。「参照のみ」の属性は対象外となります。
- ハンバーガーボタンを押すことで表示項目の一覧が表示されます。チェックボックスを操作することで画面上に表示する項目の on/off を切り替えられます。
- 行内一番左側のアイコンはユーザーのステータスを表します。緑色のユーザーアイコンは有効状態であることを表し、グレーのユーザーアイコンに赤いバツ印のついたアイコンはユーザーが無効状態であることを表します。
- 対象ユーザーの詳細画面に遷移するボタンと削除ボタンとユーザーのステータス切り替えボタンとパスワード変更ボタンと認証デバイスの設定を行うボタンが表示されます。
- 登録ボタンを押下すると、ユーザー登録画面に遷移します。
- 認証デバイス設定を行うボタンは、TOTP と Passkey の登録を行う URL が何も設定されていない場合は表示されません。
- 「仮パスワード発行中ユーザー」ボタンを押下すると、仮パスワード発行中ユーザー画面に遷移します。
ユーザー詳細
- ユーザーの属性を更新します。
- 画面上部の削除ボタンからユーザーの削除が行えます。
- 画面上部の無効化ボタンからユーザーの無効化が行えます。またすでに無効状態のユーザーの場合は有効化ボタンになり、ユーザーの有効化が行えます。無効になったユーザーはユーザープロファイル画面にログインできなくなります。
- 編集したい属性の値を書き換えて更新ボタンを押すと、ユーザーの属性を更新出来ます。
- テキストボックス下部のプラスボタンを押すと、テキストボックスが 1 つ追加されます。また、テキストボックス右側のマイナスボタンを押すと、テキストボックスが 1 つ削除されます。
- 更新ボタン上部のプラスボタンを押すと編集属性を追加出来ます。表示・属性値設定に存在する属性が不足している場合は、ドロップダウンが表示されます。不足していない場合は自由入力フォームのみになります。
- 属性名左側のゴミ箱ボタンを押すと編集属性を削除出来ます。
- テキストボックス内が空の場合は更新時には値なしとして無視されます。
- 画面下部の所属グループのテーブルにて、現在所属しているグループの一覧を確認できます。
- 所属グループ名を選択すると、選択した所属グループのグループ詳細画面に遷移します。
- 所属グループのテーブル上部の「所属グループ登録」から、任意のグループへの所属処理が行えます。所属したいグループにチェックを入れて「所属グループ登録」ボタンを押してください。
- 所属グループのテーブル上部の「所属グループ削除」から、任意のグループへの所属解除処理が行えます。所属解除したいグループにチェックを入れて「所属グループ削除」ボタンを押してください。
ユーザーパスワード変更
- ユーザーのパスワードを管理者が設定します。
- このときのパスワードルールとして、パスワードの長さと禁止文字が適用されます。
- ポリシーを満たすパスワードを入力し、更新ボタンを押すことでパスワードを更新出来ます。
- AD に存在するユーザーのパスワード変更の場合、LDAPS 接続である必要があります。
- パスワードを変更した場合、パスワード確認の画面表示になります。再表示できないので、画面を閉じずに必要な操作を行う必要があります。
- ランダムパスワードを使用する場合、パスワードポリシーを満たすパスワードが生成され、手入力のパスワードは無効になります。
- 「次回ログイン時にパスワード変更を要求する」ボタンを押下することで、仮パスワードが発行されます。発行中であるかどうかは仮パスワード発行中ユーザー画面で確認します。パスワードリセットが行われるまで一般ユーザーのステータスは無効のままになります。
- 入力した平文パスワードを UCIDM がハッシュ化することはありません。ハッシュ化したいときは、連携元が OpenLDAP であれば ppolicy_hash_cleartext を使ってください。
- 連携元が OpenLDAP で仮パスワードを発行する場合、ucidmUserEnabled をステータス属性としたときの OpenLDAP 側の設定例は以下になります。
access to filter="(ucidmUserEnabled=False)" attrs=userPassword
by * none
access to attrs=userPassword
by anonymous auth
by self =wx
by * none
ユーザー登録
- ユーザーの登録が行えます。ユーザー登録、所属グループ設定、パスワード確認の順番で画面が切り替わります。
- 値のテキストボックスに設定する値を入力し、画面下部の登録ボタンを押して登録してください。
- マルチバリューのテキストボックス下部のプラスボタンを押すと、テキストボックスが 1 つ追加されます。また、テキストボックス右側のマイナスボタンを押すと、テキストボックスが 1 つ削除されます。
- 登録ボタン上部のプラスボタンを押すと属性を追加出来ます。
- テキストボックス内が空の場合、登録時にはその属性は無視されます。また、更新時には値なしとして無視されます。
- parentDN という属性は特殊な属性になります。ユーザーを登録する OU を指定出来ます。ベースの suffix が
dc=example,dc=comの場合、parentDN にou=Userと指定するとou=User,dc=example,dc=comにユーザーを登録します。parentDN を入力しない場合はデフォルト通りdc=example,dc=comに登録します。 - すべての属性で複数値を設定出来ますが、サーバー側で
SINGLE-VALUE制約をかけていた場合、登録に失敗する場合があります。 - 任意の属性名の属性を設定できますが、サーバー側で未定義の属性は登録に失敗する場合があります。
- パスワード属性(
userPassword)は常にデフォルトのパスワードポリシーでチェックが行われます。このときのルールとして、パスワードの長さと禁止文字のみ適用されます。ポリシーを満たさない場合は登録ボタンが無効化されます。 - 該当するパスワードポリシーは各属性や
parentDNを入力するたびに、適切なパスワードポリシーを検索します。 - パスワードを含めて登録した場合、パスワード確認の画面表示になります。再表示できないので、画面を閉じずに必要な操作を行う必要があります。
- ランダムパスワードを使用する場合、パスワードポリシーを満たすパスワードが生成され、手入力のパスワードは無効になります。
- 所属グループ設定では、グループ一覧から追加・解除を行います。
- uidNumber 属性(表示・属性値設定で単値属性オプションなし)では「自動割当」ボタンを押すことで割り当て可能な番号が自動でセットされます。
- ユーザー更新などで割り当て可能な番号を再取得したい場合は「最新情報取得後に割当」ボタンを使用します。
認証デバイス設定画面
- TOTP と Passkey の設定を行う画面が表示されます。
- 認証デバイス設定画面では、認証デバイスの削除のみ行えます。
- TOTP の設定では、デバイス情報が見つかる場合は現在のデバイス情報が表示されます(リカバリーコードは表示されません)。
- Passkey の設定では、デバイス情報が見つかる場合は現在のデバイス情報の一覧が表示されます。
仮パスワード発行中ユーザー画面
- 仮パスワードを発行中のユーザーの一覧が表示されます。
- 「取消」ボタンを押下することで、仮パスワードの発行を取り消すことができます。
- 一般ユーザーが仮パスワードから新しいパスワードに変更した場合、表示されません。
グループ管理画面
- グループの管理が行えます。
- キーワード検索では、検索ボックスに検索ワードを入れ検索ボタンを押下すると、表示・属性値設定画面で設定されている「検索対象」属性に対して検索ワードを含むグループを検索し、画面上に表示します。
- 詳細検索では、表示・属性値設定画面で設定されている「検索対象」属性の項目が表示されます。オプションを設定している属性に対してはチェックボックスが表示されます。検索ボタンを押下することで絞り込み検索が行えます。「その他」の検索では、オプション値以外で検索を行いますが、値が設定されていないグループを検索することはできません。
- 検索結果の表示列は、表示・属性値設定画面で設定されている「表示」属性の項目がデフォルトになります。
- 「CSV エクスポート」ボタンを押下することで、表示されているグループの一覧を CSV ファイルとしてエクスポートできます。表示・属性値設定画面で設定している属性が使用されます。「参照のみ」の属性は対象外となります。
- ハンバーガーボタンを押すことで表示項目の一覧が表示されます。チェックボックスを操作することで画面上に表示する項目の on/off を切り替えられます。
- 対象グループの詳細画面に遷移するボタンと削除ボタンが表示されます。
- 登録ボタンを押下すると、グループ登録画面に遷移します。
グループ詳細
- グループの属性を更新します。
- 画面上部の削除ボタンからグループの削除が行えます。
- 編集したい属性の値を書き換えて更新ボタンを押すと、グループの属性を更新出来ます。
- テキストボックス下部のプラスボタンを押すと、テキストボックスが 1 つ追加されます。また、テキストボックス右側のマイナスボタンを押すと、テキストボックスが 1 つ削除されます。
- 更新ボタン上部のプラスボタンを押すと編集属性を追加出来ます。表示・属性値設定に存在する属性が不足している場合は、ドロップダウンが表示されます。不足していない場合は自由入力フォームのみになります。
- 属性名左側のゴミ箱ボタンを押すと編集属性を削除出来ます。
- テキストボックス内が空の場合は更新時には値なしとして無視されます。
- 所属メンバーのテーブル上部の「メンバー登録」から、任意のメンバーの登録処理が行えます。登録したいメンバーにチェックを入れて「メンバー登録」ボタンを押してください。
- 所属メンバーのテーブル上部の「メンバー削除」から、任意のメンバーの削除処理が行えます。削除したいメンバーにチェックを入れて「メンバー削除」ボタンを押してください。
グループ登録
- グループの登録が行えます。グループ登録、メンバー設定の順番で画面が切り替わります。
- 値のテキストボックスに設定する値を入力し、画面下部の登録ボタンを押して登録してください。
- マルチバリューのテキストボックス下部のプラスボタンを押すと、テキストボックスが 1 つ追加されます。また、テキストボックス右側のマイナスボタンを押すと、テキストボックスが 1 つ削除されます。
- 登録ボタン上部のプラスボタンを押すと属性を追加出来ます。
- テキストボックス内が空の場合、登録時にはその属性は無視されます。また、更新時には値なしとして無視されます。
- parentDN という属性は特殊な属性になります。グループを登録する OU を指定出来ます。ベースの suffix が
dc=example,dc=comの場合、parentDN にou=Groupと指定するとou=Gropu,dc=example,dc=comにグループを登録します。parentDN を入力しない場合はデフォルト通りdc=example,dc=comに登録します。 - すべての属性で複数値を設定出来ますが、サーバー側で
SINGLE-VALUE制約をかけていた場合、登録に失敗する場合があります。 - 任意の属性名の属性を設定できますが、サーバー側で未定義の属性は登録に失敗する場合があります。
- 画面下部の所属メンバーのテーブルにて、現在所属しているメンバーの一覧を確認できます。
- メンバー名を選択すると、選択したメンバーのユーザー詳細画面に遷移します。
- メンバー設定では、ユーザー一覧から登録・削除を行います。
- gidNumber 属性(表示・属性値設定で単値属性オプションなし)では「自動割当」ボタンを押すことで割り当て可能な番号が自動でセットされます。
- グループ更新などで割り当て可能な番号を再取得したい場合は「最新情報取得後に割当」ボタンを使用します。
CSV 一括処理画面
- CSV 一括取込画面で、CSV 一括処理を行えます。
- CSV ファイル、リソースタイプ、操作種別を選択後、CSV 一括取込ボタンを押下することで、CSV データの内容が送信されます。
- CSV ファイルを選択後、プレビューボタンを押下することで、CSV の内容(最初の 1000 件が表示されます。)
- password に
%{random}と指定すると、ランダムパスワードが生成され、利用されます。 - 属性値に「,」を使用する場合は、CSV ファイル内で
%{comma}と指定することで「,」として処理が行われます。 - uidNumber または gidNumber が空の値になっている場合、自動的に割り当てられます。
- CSV の一括処理が完了した後、CSV 処理結果画面でその結果を確認できます。
- 失敗のレコードがある場合、失敗のレコード数右のダウンロードアイコンを押下することで、一括処理に失敗したレコードだけが抽出された CSV ファイルをダウンロードできます。
- テーブル一番右のアイコンを押下することで、CSV ID に対応する一括処理の履歴の詳細を確認できます。
- 「エクスポート」ボタンを押下することで、エクスポートの画面表示になります。再表示できないので、画面を閉じずに CSV エクスポートや PDF エクスポートを行う必要があります。
履歴一覧画面
- ログイン関係の認証履歴と LDAP の操作履歴の確認が行えます。
- 履歴の検索が行えます。
- エクスポート機能を使うことで特定の期間の全てのログを1つのファイルにまとめられます。
ロール設定画面
- ロールとタイプの権限設定が表示されます。
- 設定したい項目の鉛筆マークを押下することで、その詳細画面に遷移します。
- カスタムロール機能を有効にすると、一般ユーザー画面ではカスタムロール、無効にすると UCIDM のシステムロール
ldap-userが使用されます。 - カスタムロールの設定では、カスタムロールの登録・削除、スクリプトの設定が行えます。
- カスタムロールの登録では、ロール名とそのロールの説明を入力することで登録します。
- 一般ユーザーがログインするときにカスタムロールを使うときの属性名やスクリプトを設定します。
- 「カスタムロール属性のスクリプトを利用する」がオンになっている場合、カスタムロールを取得するときにスクリプトが呼び出されるようになります。オフになっている場合は、スクリプトは呼び出されません。
- 「関数呼び出し確認」ボタンを押下することで、指定した関数の動作を確認することができます。
カスタムロール有効設定のスクリプト例
- ユーザーステータス設定のスクリプトとは仕様が異なります。
- カスタムロール名を返す
getRoleName()という名前で関数を設定します。 - 必ず関数の戻り値を返す必要があります。
- 関数の戻り値として null または undefined を返した場合は一般ログイン時のときはデフォルトロールが使われます。
例えば、カスタムロール属性の値の 2 番目の要素をカスタムロール名とするときは次のようになります。
function getRoleName(values) {
// カスタムロールを取得するときにこの関数が呼ばれる
// 第1引数の values にはカスタムロール属性の値が文字列の配列として渡される
// 関数の戻り値はカスタムロールの名前を表す string 値を返す
return values[1];
}
ロール設定詳細画面
- メニュー設定では、ユーザーのホーム画面で表示する画面を設定します。カスタムロールを使用することで、一部のユーザーには表示しないようにすることが可能になります。
- 属性名は、ユーザーの表示・属性値設定がセットされます。使用しない場合は、全ての権限をオフにします。属性を追加したい場合は、ユーザーの表示・属性値設定で属性を追加する必要があります。
- 属性に対して、「参照」、「編集」、「削除」を設定し、「更新」ボタンを押下することで、更新できます。
- 参照権限が与えられていない属性は、ユーザー属性変更画面に表示されません。
- 参照権限は、一般ユーザーは更新できず、表示のみになります。
- 編集権限は、一般ユーザーが変更できるようになります。
- 削除権限は、一般ユーザーが何も入力しない状態で更新を行うと、その属性が削除されます。
- 「編集」ボタンを押下してオンにすると、自動で「参照」ボタンがオンになります。
- 「削除」ボタンを押下してオンにすると、自動で「編集」ボタンがオンになります。
- 通知設定は、一般ユーザーのホーム画面にメッセージを表示する設定を行います。
- 日本語と英語のメッセージを両方設定する必要があります。
- メッセージで HTML を使用する場合は、
<div>で囲む必要があります。 - 多値属性の場合は 1 つでも条件を満たす値が含まれているとメッセージが表示されます。
- 条件は、変数
valueを使用しており、valueに設定している属性の値が入ります。 - 存在条件の記述方法は
value == ""またはvalue != ""になります。 - 一致条件の記述方法は
value == 値またはvalue != 値になります。
表示・属性値設定
表示・属性値設定とは、主にシステム管理者が LDAP サーバーに対してユーザーやグループエントリーを管理するとき、エントリーの属性に対してセットする値の並び替え・入力補助・バリデーション・実行時における動的な値の生成などのために使います。
ここでマッピング設定は 初期値設定 とは用途が異なります。他属性の値の変更に連動して値をセットするなど、より柔軟な要件に対応できます。
- 主な用途
- 画面上で任意の値を設定したい
- 他属性の値を参照して動的に値をセットしたい
- 他属性の値が更新されたときに連動して自動更新したい
- 実行タイミング
- エントリーに値が未設定のときのみ実行される
- 登録時 (初期値設定で値がセットされるときは実行されない)
- 更新時
- 設定値
- 他属性を参照して動的に値を生成
表示・属性値設定画面
- 一般とユーザーとグループと OpenAM の日本語/英語の表示設定が表示されます。
- 設定したい項目の鉛筆マークを押下することで、その詳細画面に遷移します。
表示・属性値設定詳細画面
- 属性に対して以下の設定が可能です。
- 表示名
- 注意事項
- 注意事項においては、HTML 形式での記述が可能となります。
- 表示順(ユーザーとグループのみ)
- 表示(ユーザーとグループのみ)
- 検索対象(ユーザーとグループのみ)
- 必須(ユーザーとグループのみ)
- 多値(ユーザーとグループのみ)
- 参照のみ(ユーザーとグループのみ)
- この設定を on にした場合、対応する属性値の参照のみが許可されます。属性値を更新することはできなくなります。
- 値のバリデーション(ユーザーとグループのみ)
- オプション値(ユーザーとグループのみ)
- マッピング設定(ユーザーとグループのみ)
- ユーザー/グループ登録時に
parentDNを使用したい場合は、属性名にucidmParentDNを入力して設定を行う必要があります。 - 属性順は、各属性の ↑↓ ボタンで入れ替えることができます。
- 表示権限は、ユーザーとグループの検索結果の表示項目として使用されます。
- 検索対象権限は、ユーザーとグループの検索時に使用する属性の対象になります。
- 必須権限は、必須属性になります。対象属性が入力されていないと更新できません。
- 多値権限は、対象属性に対して複数の値を入力できるようになります。
- 表示名と注意事項とオプション値について設定したい場合は、「詳細設定」ボタンを押下することで、設定できます。表示名と注意事項については日本語と英語両方設定する必要があります。オプション値の表示名について設定されていないものは値がそのまま表示されます。
- 値のバリデーションを設定した場合、一般ユーザーのユーザー属性変更画面にて、バリデーションで設定した内容により更新の可否が判断されます。
- バリデーションの値には正規表現を記述できます。
- 入力された値が構文エラーになる場合には本設定画面にてエラーメッセージが表示され、更新ボタンが押せなくなります。
- 細かい設定の仕様については以下になります。
- 一般と OpenAM
- 表示名と注意事項の日本語/英語については必ず入力する必要があります。
- 日本語と英語のどちらかのみの設定はできません。
- 一般の注意事項においては、HTML 形式での記述が可能となります。
- HTML 形式で記述をする際は、div タグがトップの要素となる(
<div>で始まり、</div>で終わる)よう記述をする必要があります。
- HTML 形式で記述をする際は、div タグがトップの要素となる(
- ユーザー/グループ
- 表示名の日本語/英語については必ず入力する必要があります。
- 注意事項については何も入力しない状態で設定できます。
- 日本語と英語のどちらかのみの設定はできません。
- 一般と OpenAM
- 属性値についてマッピングを設定できます。
- スクリプト内で「使用する属性」とスクリプトを入力します。
- リクエストデータに「使用する属性」が存在するときのみ、スクリプトが実行されます。
- 「使用する属性」の値が変更されるときに連動して別属性の値を変更したいときに使います。
- スクリプトはエントリ登録時に add 関数、エントリ更新時に modify 関数が呼び出されます。
- 「関数呼び出し確認」ボタンを押下することで、指定した関数の動作を確認することができます。
- 入力されたスクリプトが構文エラーになる場合には本設定画面にてエラーメッセージが表示され、更新ボタンが押せなくなります。
マッピング設定のスクリプト例
- ステータス設定のスクリプトとは仕様が異なります。
- エントリーに対する処理種別に対応する関数名を設定します。
- 一部の処理種別 (たとえば更新なら modify) のスクリプトのみ定義できます。
- 処理種別に対応する関数が定義されていない場合はスクリプトを実行しません。
- エントリーを変更するときに更新/削除のリクエストデータにセットされている属性のスクリプトは実行しません。
- 一般ユーザーまたは管理者が指定した属性の値はそのまま使います。
- 引数から渡されるオブジェクトのキー (属性名) は全て小文字に変換されます。
- キー (属性名) に対応する値は文字列の配列になります。
- 引数のロール名 (roleName) は取得できない状況があることを考慮する必要があります。
- ユーザーエントリー以外のエントリーを扱うときは空文字になります。
- カスタムロールを使うときにロール属性をリクエストデータから参照できないときは空文字になります。
- 関数の戻り値は文字列の配列を返します。
- 戻り値として空の配列を返した場合はその属性を削除します。
- 戻り値として null または undefined を返した場合は値をセットしません。
function add(req, roleName) {
// エントリーを登録するときにこの関数が呼ばれる
// 第1引数の req にはリクエストデータの属性がセットされる
// 参照例) req.givenname[0], req.uidnumber[0]
// 第2引数の roleName にはユーザー登録のみ、ロール名がセットされる (それ以外は空文字)
return ["value1", "value2"];
}
function modify(attr, reqUpd, reqDel, roleName) {
// エントリーを更新するときにこの関数が呼ばれる
// 第1引数の attr には変更前エントリーの属性がセットされる
// 参照例) attr.givenname[0]
// 第2引数の reqUpd にはリクエストデータの更新属性がセットされる
// 参照例) reqUpd.uidnumber[0]
// 第3引数の reqDel にはリクエストデータの削除属性がセットされる
// 参照例) reqDel.description[0], Object.hasOwn(reqDel, 'displayname')
// 第4引数の roleName にはユーザー更新のみ、ロール名がセットされる (それ以外は空文字)
return ["value3"];
}
function passwordModify(attr, roleName) {
// パスワードを更新するときにこの関数が呼ばれる
// 第1引数の attr には変更前エントリーの属性がセットされる
// 参照例) attr.givenname[0]
// 第2引数の roleName にはユーザー登録のみ、ロール名がセットされる (それ以外は空文字)
return ["value4"];
}
以下に実際のスクリプト設定例をいくつか記載します。
- homeDirectory 属性に対してレコード登録時に
/home/<uid>をセットしたい場合- スクリプトで使用する属性:uid
function add(req, roleName) {
return [`/home/${req.uid[0]}`];
}
- mail 属性に対してレコード登録時に
<uid>@example.comをセットしたい場合- スクリプトで使用する属性:uid
function add(req, roleName) {
return [`${req.uid[0]}@example.com`];
}
- displayName 属性に対してレコード登録時に
<sn> <givenName>をセットしたい場合- スクリプトで使用する属性:sn, givenname
function add(req, roleName) {
return [`${req.sn[0]} ${req.givenname[0]}`];
}
デザイン設定画面
- ヘッダーとフッターとパスワードポリシーの日本語/英語の設定が表示されます。
- 設定したい項目の鉛筆マークを押下することで、その詳細画面に遷移します。
デザイン設定詳細画面
- ヘッダーとフッターとパスワードポリシーデザインとパスワードの印刷デザインをカスタマイズする画面が表示されます。
- 編集項目を選択し、コード編集欄に HTML を記述します(背景色は選択しない場合、transparent になります)。
- 編集後、「プレビュー」ボタンを押下することで、どのような画面になるかを確認できます。ロールが system-superadmin のときのみ確認が行えます。
- 「保存」ボタンを押下することで、編集内容を保存できます。ロールが system-superadmin のときのみ更新が行えます。
- ヘッダーのロゴ画像については、images/header ディレクトリにロゴ画像を置くことで設定できます。ファイル名は logo.xxx(xxx は拡張子)にする必要があります。
- ファビコンの画像については、images/favicon ディレクトリに画像を置くことで設定できます。ファイル名は favicon.xxx(xxx は拡張子)にする必要があります。
- その他の画像については、images ディレクトリに配置することで、サンプルファイルのように画像を表示することが可能になります(パスワードポリシーでは対応していません)。
- パスワードポリシーデザインの内容は、ユーザー登録画面、パスワード変更画面、パスワードリセット画面に表示されます。
- パスワードの印刷デザインの内容は、ユーザー登録、パスワード変更時に表示されるパスワード印刷画面に表示されます。印刷設定によって、デザイン設定内容と異なる場合があります。
パスワードポリシーデザインの埋め込み変数
パスワードポリシーで設定されている値を表示するために埋め込み変数が用意してあります。デザイン設定のプレビュー画面では、デフォルトパスワードポリシーの値が表示されます。
| 埋め込み変数 | 説明 |
|---|---|
| .PwdMaxLength | パスワードの最大長 |
| .PwdMinLength | パスワードの最小長 |
| .PwdAlphabetCount | アルファベットの文字数 |
| .PwdUpperCount | 大文字の文字数 |
| .PwdLowerCount | 小文字の文字数 |
| .PwdSymbolCount | 記号の文字数 |
| .PwdDigitCount | 数字の文字数 |
| .PwdComplexityCount | パスワードの複雑性 |
| .PwdProhibitedString | パスワードの禁止文字 |
| .PwdNotContainName | ユーザー名を含めない |
| .PwdNotSameOldPassword | パスワードが 1 つ前と異なる |
パスワード印刷デザインの埋め込み変数
ユーザー登録、パスワード変更、CSV 一括処理でのパスワード印刷を行うために埋め込み変数が用意してあります。1 人のユーザーに対して複数のパスワードが存在する場合、.PrintPassword が順番に置き換わります。
| 埋め込み変数 | 説明 |
|---|---|
| .PrintUsername | パスワード確認時のユーザー名 |
| .PrintPassword | パスワード確認時のパスワード |
| .PrintIssuedAt | パスワード発行日時 |
サンプルのカスタムファイル
用意しているカスタムファイルの中身は以下になります。
ヘッダーとフッターの html ファイル
<div>
<h1>UCIDM</h1>
<img src="/images/osstech-logo-s.png" alt="サンプルロゴ" width="188" height="64" />
</div>
ヘッダーとフッターの css ファイル
body { background-color: transparent; }
パスワードポリシーデザインの html ファイル
<div style="padding: 1rem">
<table
style="
min-width: 100%;
background-color: rgb(255 255 255);
border-width: 1px;
border-color: rgb(209 213 219);
"
>
<thead>
<tr style="background-color: rgb(229 231 235)">
<th class="tableContents">ルール</th>
<th class="tableContents">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableContents">最大文字数</td>
<td class="tableContents">.PwdMaxLength</td>
</tr>
<tr>
<td class="tableContents">最小文字数</td>
<td class="tableContents">.PwdMinLength</td>
</tr>
<tr>
<td class="tableContents">パスワードに含めるアルファベットの文字数</td>
<td class="tableContents">.PwdAlphabetCount</td>
</tr>
<tr>
<td class="tableContents">パスワードに含める大文字の数</td>
<td class="tableContents">.PwdUpperCount</td>
</tr>
<tr>
<td class="tableContents">パスワードに含める小文字の数</td>
<td class="tableContents">.PwdLowerCount</td>
</tr>
<tr>
<td class="tableContents">パスワードに含める記号の数</td>
<td class="tableContents">.PwdSymbolCount</td>
</tr>
<tr>
<td class="tableContents">パスワードに含める数字の数</td>
<td class="tableContents">.PwdDigitCount</td>
</tr>
<tr>
<td class="tableContents">パスワードの複雑度</td>
<td class="tableContents">
英大文字、英小文字、数字、記号という4つのカテゴリから、.PwdComplexityCountつのカテゴリをパスワードに含める必要があります。
</td>
</tr>
<tr>
<td class="tableContents">禁止文字</td>
<td class="tableContents">
これらの文字(例: .PwdProhibitedString)を含めてはいけません。
</td>
</tr>
<tr>
<td class="tableContents">ユーザー名を含めない</td>
<td class="tableContents">.PwdNotContainName</td>
</tr>
<tr>
<td class="tableContents">1つ前のパスワードと異なる</td>
<td class="tableContents">.PwdNotSameOldPassword</td>
</tr>
</tbody>
</table>
<style>
.tableContents {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
padding-left: 1rem;
padding-right: 1rem;
border-width: 1px;
border-color: rgb(209 213 219);
}
</style>
</div>
パスワードポリシーデザインの css ファイル
body { background-color: transparent; }
パスワード印刷デザインの html ファイル(css ファイルはありません)
<div style="padding: 2rem; max-width: 800px; margin: 0 auto">
<div
style="
text-align: center;
margin-bottom: 2rem;
border-bottom: 2px solid rgb(55 65 81);
padding-bottom: 1rem;
"
>
<h1 style="font-size: 1.875rem; font-weight: bold; color: rgb(55 65 81); margin: 0">
アカウント通知書
</h1>
<p style="font-size: 0.875rem; color: rgb(107 114 128); margin: 0.5rem 0 0 0">
Account Notification
</p>
</div>
<table
style="
width: 100%;
background-color: rgb(255 255 255);
border-width: 1px;
border-color: rgb(209 213 219);
border-collapse: collapse;
margin-bottom: 2rem;
"
>
<thead>
<tr style="background-color: rgb(55 65 81)">
<th class="tableHeader">項目 / Item</th>
<th class="tableHeader">内容 / Content</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableContents tableLabel">ユーザー名 / Username</td>
<td class="tableContents tableValue">.PrintUsername</td>
</tr>
<tr style="background-color: rgb(249 250 251)">
<td class="tableContents tableLabel">パスワード / Password</td>
<td class="tableContents tableValue">.PrintPassword</td>
</tr>
<tr>
<td class="tableContents tableLabel">発行日時 / Issued At</td>
<td class="tableContents tableValue">.PrintIssuedAt</td>
</tr>
</tbody>
</table>
<div
style="
background-color: rgb(254 249 195);
border: 1px solid rgb(251 191 36);
border-radius: 0.375rem;
padding: 1rem;
margin-bottom: 2rem;
"
>
<h3 style="font-size: 1rem; font-weight: bold; color: rgb(146 64 14); margin: 0 0 0.5rem 0">
重要事項 / Important Notes
</h3>
<ul style="margin: 0; padding-left: 1.5rem; color: rgb(146 64 14); font-size: 0.875rem">
<li>
このアカウント情報は機密情報です。第三者との共有は禁止されています。<br />This account
information is confidential. Sharing with third parties is prohibited.
</li>
<li>
不正アクセスを防ぐため、使用後は必ずログアウトしてください。<br />Always log out after use
to prevent unauthorized access.
</li>
<li>
アカウントに関する問題が発生した場合は、システム管理者にお問い合わせください。<br />Contact
the system administrator if you experience any account-related issues.
</li>
</ul>
</div>
<div
style="
text-align: center;
border-top: 1px solid rgb(209 213 219);
padding-top: 1rem;
font-size: 0.75rem;
color: rgb(107 114 128);
"
>
<p style="margin: 0">
本書は機密文書です。適切に管理し、不要になった場合は安全に廃棄してください。<br />This
document is confidential. Please manage it appropriately and dispose of it securely when no
longer needed.
</p>
<p style="margin: 0.25rem 0 0 0">
発行者: システム管理部 / Issued by: System Administration Department
</p>
</div>
</div>
<style>
.tableHeader {
padding: 0.75rem 1rem;
text-align: left;
font-weight: bold;
color: rgb(255 255 255);
border: 1px solid rgb(209 213 219);
font-size: 0.875rem;
}
.tableContents {
padding: 0.75rem 1rem;
border: 1px solid rgb(209 213 219);
font-size: 0.875rem;
}
.tableLabel {
font-weight: bold;
background-color: rgb(243 244 246);
color: rgb(55 65 81);
width: 30%;
}
.tableValue {
color: rgb(17 24 39);
}
@media print {
body {
font-family: 'MS Gothic', monospace;
}
.tableContents {
font-size: 12px;
}
.tableHeader {
font-size: 12px;
}
h1 {
font-size: 18px !important;
}
p,
li {
font-size: 11px !important;
}
}
</style>
パスワードポリシー設定画面
- パスワードポリシーの一覧が表示されます。
- ユーザー登録時はデフォルトパスワードポリシー、パスワード変更、パスワードリセットについては各ユーザーのパスワードポリシーが適用されます
- 管理者による操作については、パスワードの長さと禁止文字のルールのみが適用されます。
- 一般ユーザーによるパスワードリセットでは、1 つ前のパスワードと異なるルールは無視されます。
- 「検索」ボタンを押下することで、設定名と対象ベース DN で検索が行えます。
- 「登録」ボタンを押下することで、パスワードポリシー登録画面に遷移します。
- 鉛筆マークを押下することで詳細画面に遷移します。
- ゴミ箱を押下することで、パスワードポリシーを削除できます。デフォルトポリシーを削除することはできません。
- 選択されたパスワードポリシーを JSON ファイルとして保存できます。
パスワードポリシー設定登録
- パスワードポリシーの設定とランダムパスワードの設定の登録を行います。「登録」ボタンを押下することで、設定内容が登録されます。
- 「インポート」ボタンを押下することで、選択された JSON ファイルの情報をそのままセットできます。「登録」ボタンを押下しないと登録されません。
パスワードポリシー適用条件
パスワードポリシー登録時・更新時にパスワードポリシーを適用するユーザーの条件を設定できます。 ある程度複雑な条件も設定できますので、いくつかの例を以下に示します。
シンプルな例
{"attributes.gidNumber": "10000"}
attributes.<属性名> と値をキーバリューとした JSON 形式で記述します。
属性名のキーは attributes. を付与する必要があり attributes. で始まらない場合は構文エラーになります。
値は文字列で指定する必要があり 10000 (数字)としたり、 [10000, 20000] (配列)とすると構文エラーになります。
and 条件
{"attributes.gidNumber": "10000", "attributes.employeeType": "staff"}
複数の条件を列挙することで and 条件を利用できます。 この場合 gidNumber が 10000 かつ、employeeType が staff のユーザーにのみ適用されるポリシーになります。
or 条件
{"or": [{"attributes.gidNumber": "10000"}, {"attributes.gidNumber": "20000"}]}
or というキーワードを指定し、値に条件のリストを指定することで、
リスト内の条件のいずれかを満たす、or 条件を利用できます。
この場合 gidNumber が 10000 または、gidNumber が 20000 のユーザーにのみ適用されるポリシーになります。
複雑な条件
{
"or": [
{"attributes.gidNumber": "10000"},
{"attributes.gidNumber": "20000"}
],
"attributes.employeeType": "staff"
}
みやすさのために改行入れています。 実際に入力する際は改行は不要です。 前述した and 条件と or 条件を組み合わせた複雑な条件になります。 この場合、gidNumber が 10000 か 20000 かつ、employeeType が staff のユーザーにのみ適用されるポリシーになります。
利用不可能な条件
現在の仕様上利用できない条件をいくつか提示します。
- 否定
- employeeType が student 以外、のような否定条件分は利用出来ません。
- 不等号
- gidNumber が 1000 以上や、uidNumber が 3000 未満のような条件は設定できません。
- 正規表現
- 正規表現を用いたパターンマッチングは利用できません。
条件エディタ
パスワードポリシーの適用条件を作成できる UI です。 属性名と値を設定すると該当するエントリにのみパスワードポリシーが適用されるようになります。 条件の追加には条件エディタ中央下部にあるプラスボタンを押してください。
条件には AND 条件と OR 条件を設定出来ます。 AND 条件に含まれている条件はすべて満たす必要があり、 OR 条件に含まれている条件はいずれかを満たす必要があります。
- AND 条件の中には属性の条件か OR 条件を含めることが出来ます
- OR 条件の中には AND 条件を含めることが出来ます
- AND 条件、OR 条件、属性条件ともに外枠右上のバツボタンを押すと条件が削除されます
パスワードポリシー設定詳細画面
- パスワードポリシーの設定とランダムパスワードの設定を編集します。「更新」ボタンを押下して更新を行います。
- 対象ベース DN と条件に一致したユーザーにそのパスワードポリシーが適用されます。何も一致するパスワードポリシーが存在しない場合はデフォルトポリシーが適用されます。
- 「削除」ボタンを押下することで、表示されているパスワードポリシーは削除されます。デフォルトポリシーを削除することはできません。
パスワードポリシー
- パスワードポリシーでは以下のルールを設定できます。
- 最大文字数
- パスワードの最大文字数を設定します。
- 最小文字数
- パスワードの最小文字数を設定します。
- アルファベットの文字数
- パスワードに含めなければならないアルファベットの最小文字数を設定します。
- 大文字の文字数
- パスワードに含めなければならない大文字アルファベットの最小文字数を設定します。
- 小文字の文字数
- パスワードに含めなければならない小文字アルファベットの最小文字数を設定します。
- 記号の文字数
- パスワードに含めなければならない記号の最小文字数を設定します。
- 数字の文字数
- パスワードに含めなければならない数字の最小文字数を設定します。
- 複雑度
- 英大文字、英小文字、数字、記号という 4 つのカテゴリから、いくつのカテゴリをパスワードに含めるかを設定します。
- 禁止文字
- パスワードに含めてはいけない禁止文字を設定します。
- ユーザー名を含めない
- ユーザー名をパスワードに含めるかどうかを設定します。有効でパスワードにユーザー名を含めてはならないになります。
- 1 つ前のパスワードと異なる
- 1 つ前のパスワードと同じパスワード更新を許可するかどうかを設定します。有効で 1 つ前のパスワードと異なる必要があるになります。
- 最大文字数
ランダムパスワード
- ランダムパスワードの設定では以下のルールを設定できます。
- 文字数
- 生成するランダムパスワードの文字数を設定します。
- 禁止文字
- 生成するランダムパスワードに含めていはいけない禁止文字を設定します。
- 文字数
初期値設定
初期値設定とは、LDAP サーバーに対してユーザーやグループエントリーを新規登録するとき、任意の属性に固定の値をセットするために使います。表示・属性値設定 のマッピング設定とは用途が異なります。
- 主な用途
- 画面で管理する必要のない属性を省略できる
- CSV 一括処理 で同じ値をセットする属性の列を省略できる
- 実行タイミング
- エントリーに値が未設定のときのみ実行される
- 登録時のみ (マッピング設定よりも先に実行される)
- 設定値
- 固定の値のみ
初期値設定画面
- ユーザーとグループの初期値設定が表示されます。
- 「登録」ボタンを押下して必要な情報を入力することで、新しく設定を登録できます。
- 編集したい設定の鉛筆マークを押下することで、詳細画面に遷移します。
- 削除したい設定のゴミ箱マークを押下することで、設定が削除されます。
初期値設定詳細画面
- 設定を編集します。
- objectClass 設定では、ユーザー/グループ登録時に付与される objectClass を設定します。
- その他の属性設定では、各属性の初期値を設定します。
ユーザーステータス設定画面
- ユーザーのステータス変更時に使用される属性名やスクリプトを設定します。
- 「ステータス機能を有効にする」がオンになっている場合、ステータス変更時に設定内容が使用されます。オフになっている場合は、この画面の設定内容は使用されず、ステータス操作を行うことができません。
- ステータス属性に入力した属性の値は、ユーザーのステータス変更時に更新されます。
- 「ステータス属性のスクリプトを利用する」がオンになっている場合、スクリプトがステータス変更時に呼び出されるようになります。オフになっている場合は、スクリプトは呼び出されません。
- 「関数呼び出し確認」ボタンを押下することで、指定した関数の動作を確認することができます。
ユーザーステータス設定のスクリプト例
- 属性マッピング設定のスクリプトとは仕様が異なります。
- ユーザーエントリーに対する処理種別に対応する関数名を設定します。
- 必ず関数の戻り値を返す必要があります。
- 関数の戻り値として null または undefined を返した場合はエラーになります。
例えば Active Directory の userAccountControl 属性を変換するときは次のようになります。
function view(values) {
// ユーザーエントリーが有効か無効かを判別するときにこの関数が呼ばれる
// 第1引数の values にはステータス属性の値が文字列の配列として渡される
// 関数の戻り値は有効・無効を表す boolean 値を返す
return (Number(values[0]) & 2) != 2;
}
function modify(values, enabled) {
// ユーザーエントリーの有効・無効を切り替えるときにこの関数が呼ばれる
// 第1引数の values にはステータス属性の値が文字列の配列として渡される
// 第2引数の enabled には有効・無効を表す boolean 値が渡される
// 関数の戻り値は文字列の配列を返す
return [
enabled ? String(Number(values[0]) & ~2) : String(Number(values[0]) | 2),
];
}
設定のエクスポート
- エクスポートしたい設定を選択します。チェックされている設定内容を JSON ファイルとしてエクスポートします。チェックが外されたものは JSON ファイルに含まれません。
- エクスポートしたファイルは、「設定のインポート」画面で使用できます。
設定のインポート
- 「設定のエクスポート」でエクスポートした JSON ファイルを選択します。ファイル選択後、インポートする設定を選択できます。チェックが外された設定の内容はインポートされません。
ユーザープロファイル画面(一般ユーザー用)
ユーザープロファイル画面(一般ユーザー用)では、主に以下の画面を提供しています。
- 一般ユーザー用画面へのアクセス
- トップ画面
- ログイン画面
- パスワードリセット申請画面
- パスワードリセット画面
- ログイン後トップ画面
- ユーザー属性変更画面
- パスワード変更画面
- 認証デバイス設定画面
- 履歴一覧画面
一般ユーザー用画面へのアクセス
https://<ホスト名>/ui にアクセスします。
ユーザープロファイル画面へのアクセス URL は環境によって異なります。
トップ画面
ユーザープロファイル画面にアクセスするとトップ画面が表示されます。画面中央に「ログイン」ボタンがあり、このボタンを押下するとログイン画面に遷移します。
SAML でのログインを有効化している場合は SAML 用のログインボタンが表示されます。
ログイン画面
ユーザー名/パスワードを入力し、「ログイン」ボタンを押下してログインを行います。「パスワードが不明な場合」を押下することで、パスワードリセット申請画面に遷移します。 仮パスワード発行中のユーザーでログインを行うと、パスワードリセット画面に切り替わります。
パスワードリセット申請画面
パスワードリセットを行う一般ユーザー名とメールアドレスを入力します。メールアドレスが設定されていない場合、パスワードリセットを行うことはできません。入力情報が正しい場合、入力されたメールアドレスに一時トークンが送信され、パスワードリセット画面に遷移します。
パスワードリセット画面
送られてきたメールに記述された一時トークン、新しいパスワード、新しいパスワード(確認)を入力し、「再設定」ボタンを押下することで、パスワードをリセットできます。 このとき、ユーザーの該当するパスワードポリシーにてポリシーチェックが行われます。 パスワードポリシーを満たさない場合はパスワードリセットに失敗します。
ログイン後トップ画面
以下の画面に遷移するボタンが表示されます。
- ユーザー属性変更
- パスワード変更
- 認証デバイス設定
- 履歴一覧
画面右上にユーザー名があり、このユーザー名を押下することで、以下の各種メニューが表示されます。
- 言語設定
- 日本語または英語に切り替えられます。
- ログアウト
- このリンクをクリックすることで、ログアウトが行われます。
- SAML 認証でログインしていて、シングルログアウトの設定が有効な場合、このリンクをクリックすることで、シングルログアウトの処理が行われます。
ユーザー属性変更画面
- ユーザーの属性情報が表示されます。
- 更新したい属性があれば、入力を行い「更新」ボタンを押下することで更新できます。
- 管理者の権限設定によって、表示されないまたは編集できない場合があります。
パスワード変更画面
- パスワードを変更する画面が表示されます。
- 現在のパスワードと新しいパスワードを入力します。
- 現在のパスワードが誤っている場合、パスワードを更新することはできません。
- ユーザーの該当するパスワードポリシーにてポリシーチェックが行われます。
- ポリシーを満たさない場合はパスワード変更に失敗します。
認証デバイス設定画面
- TOTP と Passkey の設定を行う画面が表示されます。
- TOTP の操作を許可するためには、管理者のロール設定で TOTP に参照と編集と削除権限が許可されている必要があります。
- TOTP の設定では、デバイス情報が見つからなければ「登録」ボタンが表示され、見つかる場合は現在のデバイス情報が表示されます。
- TOTP の再登録を行う場合は、一度削除する必要があります。
- Passkey の操作を許可するためには、管理者のロール設定で Passkey に参照と編集と削除権限が許可されている必要があります。
- Passkey の設定では、「登録」ボタンは常に表示され、デバイス情報が見つかる場合は現在のデバイス情報の一覧が表示されます。
履歴一覧画面
- 自身の操作履歴の一覧が表示されます。
- 表示される履歴の操作は、属性変更とパスワード変更になります。
システム運用
システムを運用する上で必要となる UCIDM 以外の一般的な機能や設定について紹介します。
- コンテナイメージのバージョンアップ
- Compose サービスの運用
- ログ管理
- バックアップ
- リストア
- ID 情報の再同期
- データ移行コマンドの操作
- SAML 認証
- OpenAM との連携
- データソースのシステム移行
- アップデート時の移行作業
コンテナイメージのバージョンアップ
UCIDM は Docker Compose を使ってコンテナイメージとしてパッケージングされています。そのため、コンテナイメージを更新することで新しいバージョンにアップグレードできます。
但し、オンプレ版の UCIDM は1台のサーバーで運用することを前提に設計されているため、サービスを停止せずに稼働したままバージョンアップすることはできません。アップグレードによる移行や設定変更がなかったとしても、必ず再起動のタイミングで十数秒程度のダウンタイムが発生します。またバージョンアップするときに移行作業を必要とする場合もあります。バージョンアップするときはサポート担当者にご相談ください。アップグレード作業をするときはサービス停止のアナウンスを行い、ID 連携を行っていない時間帯に実施してください。
UCIDM の一部のサービスのみをバージョンアップする場合とすべてのサービスをバージョンアップする場合で作業手順が異なります。
deploy コマンド
一部のサービスのみをバージョンアップするための運用ツールとして deploy というコマンドがあります。
バージョン情報を確認します。
$ /opt/osstech/bin/deploy -version
revision: c47dd3a
稼働しているコンテナの情報を表示します。
$ /opt/osstech/bin/deploy info
次のようなエラーが発生するときは DOCKER_HOST の環境変数が適切に設定されているかを確認してください。
$ echo $DOCKER_HOST
time=2025-01-09T09:42:27.578+09:00
level=ERROR
msg="failed to get informations"
err="failed to get container list: Cannot connect to the Docker daemon
at unix:///var/run/docker.sock. Is the docker daemon running?"
適切に設定されていない場合は次のようにユーザー情報にあわせて設定します。
$ export DOCKER_HOST="unix:///run/user/$(id -u)/docker.sock"
コンテナイメージのアップグレード
特定のコンテナイメージを使うすべてのサービスをアップグレードします。最新バージョンに更新するときは latest タグを指定します。
$ /opt/osstech/bin/deploy upgrade \
-path /var/opt/osstech/lib/ucidm/compose.yml \
-image docker.io/osstech/ucidm-consumer:latest
特定バージョンに更新するときはそのハッシュ値のタグを指定します。
$ /opt/osstech/bin/deploy upgrade \
-path /var/opt/osstech/lib/ucidm/compose.yml \
-image docker.io/osstech/ucidm-consumer:aa92eb33
コンテナイメージのロールバック
アップグレードしたときに問題が発生した場合など、それまで使っていたコンテナイメージにロールバックできます。
$ /opt/osstech/bin/deploy rollback \
-path /var/opt/osstech/lib/ucidm/compose.yml \
-image docker.io/osstech/ucidm-consumer
ロールバックはローカルリポジトリから、いま使っているコンテナイメージの1つ前のバージョンを使います。従ってロールバックを実行すると1つずつ過去のバージョンに戻り続けます。
docker compose を使う
すべてのサービスをアップグレードするときは次のように docker compose コマンドを使って次のように実行します。
$ cd /var/opt/osstech/lib/ucidm
$ docker compose pull
$ docker compose down
$ docker compose up -d
アップグレードして正常にサービスが起動しているかを ps コマンドで確認します。
$ docker compose ps
Compose サービスの運用
UCIDM は Docker Compose を使い、複数のアプリケーションやミドルウェアのコンテナを起動して、それぞれのサービスが協調してシステムを構成しています。
- ucidm ユーザーでログインしないときのユーザーの切り替え
- コンテナとアプリケーションを実行するユーザー/グループ
- 安全な停止手順
- Compose サービスのコンテナや環境の再作成
- 環境変数の設定変更
- Compose サービスの起動
ucidm ユーザーでログインしないときのユーザーの切り替え
systemd のユーザーモード、ならびに docker の rootless モードを使うには ucidm ユーザーでログインしたときに設定される環境変数が必要になります。直接 ucidm ユーザーでログインできないときは machinectl を使ってユーザーを切り替えるようにしてください。
machinectl コマンドを使うには systemd-container パッケージをインストールする必要があります。
$ sudo dnf install -y systemd-container
sudo の実行権限をもつユーザーで次のように machinectl コマンドを実行してください。 
$ sudo machinectl shell ucidm@
ucidm ユーザーにスイッチした後に次の環境変数が適切に設定されていることを確認します。
$ env | egrep "(DBUS_|XDG_)"
...
XDG_RUNTIME_DIR=/run/user/992
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/992/bus
コンテナとアプリケーションを実行するユーザー/グループ
コンテナ内のアプリケーションは non-root ユーザーで実行されます。これはコンテナのセキュリティを向上させることに寄与します。
このときそれぞれのコンテナがマウントする volume ディレクトリ配下に作成されるディレクトリやファイルのオーナー/権限は次のようになります。
| コンテナ | コンテナ内 UID:GID | ホスト上 UID:GID |
|---|---|---|
| rabbitmq | 999:999 | 100998:100998 |
| admin-ui | 1000:0 | 100999:ucidm |
| ucidm-ui | 1000:0 | 100999:ucidm |
| mongo | 1001:0 | 101000:ucidm |
| api | 1001:0 | 101000:ucidm |
| agent | 1001:0 | 101000:ucidm |
| consumer | 1001:0 | 101000:ucidm |
ホスト上から作成したファイルに対して適切な UID:GID をマッピングするには rootlesskit コマンドを使って操作します。
例えば、(rabbitmq を除く) ホスト上で作成したファイルにコンテナからアクセスできるオーナー/権限を設定するには次のコマンドを実行します。
$ rootlesskit chown -R ${UID}:0 path/to/dir
- ${UID} はコンテナ内の UID にあわせて 1000, 1001 を設定する
実際にホスト上で作成した ucidm:ucidm オーナーのディレクトリとファイルをコンテナ内から UID=1001 で作成したようにオーナー/権限を設定するコマンド例を次に示します。
$ mkdir mydir
$ ls -ld mydir
drwxr-xr-x. 2 ucidm ucidm 20 Apr 4 17:51 mydir
$ touch mydir/sample
$ ls -l mydir/sample
-rw-r--r--. 1 ucidm ucidm 0 Apr 4 17:51 mydir/sample
$ rootlesskit chown -R 1001:root mydir
$ ls -ld mydir
drwxr-xr-x. 2 101000 ucidm 20 Apr 4 17:51 mydir
$ ls -l mydir/sample
-rw-r--r--. 1 101000 ucidm 0 Apr 4 17:51 mydir/sample
ホスト上にあるファイルを volume ディレクトリ配下に移動する
ユーザープロファイル画面で使うロゴ画像を管理するコマンド例を次に示します。
ucidm-ui は UID=1000 で作成したようにオーナー/権限を設定します。
$ rootlesskit mv ~/mylogo.png ucidm-ui/images/
$ rootlesskit chown 1000:root ucidm-ui/images/mylogo.png
$ ls -l ucidm-ui/images/
合計 24
-rw-rw-r--. 1 100999 ucidm 4409 4月 8 14:17 mylogo.png
安全な停止手順
オンプレミス版 UCIDM は冗長構成をサポートしない ため、原則としてメンテナンスなどで Compose サービスを停止するときは LDAP サーバーに対して更新を行わない、また ID 連携処理の途中段階で停止しないように運用してください。
次の手順で Compose サービスを停止してください。
- LDAP サーバーに更新を行わないようアクセスを遮断する
- 「ジョブ進捗概要」や「実行中ジョブ」画面で処理中のエントリーが大量にないかを確認する
- compose サービスを停止する
$ docker compose stop
作業にあわせて各種ドキュメントを確認してください。
LDAP サーバーから ID 連携の処理が途中の状態で Compose サービスを停止するとエラーが発生します。エラーが発生しても、なるべく起動後に再処理するように振る舞います。どのような状況であっても完全に再処理できることは保証できませんが、多くのケースで自動的に再処理されます。起動後に少し待って履歴をご確認ください。
もし履歴から再処理できていなければ ID 情報の再同期 を行ってください。
LDAP サーバー -> Agent モジュール -> UCIDM API の処理
- ユーザー/グループエントリーの追加・更新
- 停止時にエラーは発生するが、エラーが発生したところから再処理する
- グループメンバーの追加/削除
- 同じグループへのメンバー追加/削除の順序は入れ替わるが、再処理する
- ユーザー/グループエントリーの削除
- Agent モジュールの停止中に削除されたエントリーは再処理できない
- 運用ツールにより不整合ユーザーを削除してください
UCIDM API -> 外部連携モジュールの処理
- エントリーの追加・更新・削除
- 正常にメッセージキューサービスを停止できていれば未処理のメッセージは永続化される
- 起動後に永続化されているメッセージを再処理する
Compose サービスのコンテナや環境の再作成
Compose サービスのコンテナや環境をクリーンに再作成する (永続化されているデータは消えません) ときは前節で安全に停止させた後に削除します。
$ docker compose down
down を実行したときにもしネットワークを削除できない状態になる場合があります。
✘ Network ucidm_default Error
そのときは docker サービスを再起動してから down を実行してください。
$ systemctl --user restart docker
$ docker compose down
次のようなエラーが発生するときは DBUS_SESSION_BUS_ADDRESS の環境変数が適切に設定されているかを確認してください。
$ echo $DBUS_SESSION_BUS_ADDRESS
Failed to connect to bus: No medium found
適切に設定されていない場合は次のようにユーザー情報にあわせて設定します。
$ export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus"
環境変数の設定変更
デフォルトでは .env ファイルに Compose サービスが参照する環境変数を設定します。サービス稼働後に環境変数を変更したい場合は .env ファイルを更新した後にコンテナを再作成する必要があります。
たとえば、次の手順で api サービスの環境変数を変更します。
$ vi .env
# 環境変数の値を変更して保存する
$ docker compose stop api
$ docker compose rm api
$ docker compose up -d api
複数サービスの環境変数を変更するときは Compose サービスを停止 させた後に Compose サービスの環境を再作成 すると確実に反映できます。
Compose サービスの起動
次の手順で Compose サービスを起動してください。
$ docker compose up -d
ログ管理
各コンテナのログをログファイルに出力する際の設定変更手順を示します。 各種デフォルトファイルは弊社RPMパッケージを使ってインストールする際にすべてインストールされます。
Dockerのログ設定に関するドキュメント もあわせてご確認ください。
デフォルト設定
ログ管理に関するデフォルト設定は以下になります。
| 項目 | 値 |
|---|---|
| ログ保存先 | /var/log/osstech/ucidm/*.log |
| 過去ログ保存先 | /var/log/osstech/ucidm/old |
| ログ保存間隔 | logrotateのデフォルト設定を利用 |
| ログ保存数 | logrotateのデフォルト設定を利用 |
ログはコンテナごとに保存され、 ucidm-<コンテナ名>.log というファイル名で出力されます。
例えば server-api というコンテナのログは ucidm-server-api.log というファイルに出力されます。
カスタム設定
ログ出力に関する設定は以下のファイルに記載されています。
/opt/osstech/etc/rsyslog.d/ucidm.conf
template(name="UCIDMDynaFile" type="list") {
constant(value="/var/log/osstech/ucidm/")
property(name="syslogtag"
regex.type="ERE"
regex.match="0"
regex.submatch="1"
regex.expression="(.+)\\[[0-9]+\\]:"
regex.nomatchmode="ZERO"
securepath="replace"
)
constant(value=".log")
}
if ($syslogtag startswith 'ucidm-') then {
action(type="omfile" DynaFile="UCIDMDynaFile")
stop
}
これは /etc/rsyslog.d/osstech.conf 内でロードされており、rsyslogd設定ファイルとなっております。
ログ出力設定を変更する場合は本ファイル、もしくは /etc/rsyslog.conf を編集してください。
ログ保存に関する設定は以下のファイルに記載されています。
/opt/osstech/etc/logrotate.d/ucidm
compresscmd zstd
uncompresscmd unzstd
/var/log/osstech/ucidm/*.log
{
olddir old
notifempty
missingok
sharedscripts
postrotate
/usr/bin/systemctl -s HUP kill rsyslog.service >/dev/null 2>&1 || true
endscript
}
これは /etc/logrotate.d/osstech 内でロードされており、logrotate設定ファイルとなっております。
ログ保存設定を変更する場合は本ファイル、もしくは /etc/logrotate.conf を編集してください。
設定例
いくつかのパラメータの設定変更手順を示します。
ログ保存間隔変更手順
ログ保存間隔は /etc/logrotate.conf で定義されたデフォルト設定をそのまま利用します。
システム全体のデフォルト設定を変更する場合は /etc/logrotate.conf を編集してください。
UCIDMのログ保存間隔のみ変更したい場合は /opt/osstech/etc/logrotate.d/ucidm を編集してください。
例えばログ保存間隔を1日に1回にする場合は、daily を設定に追加してください。
compresscmd zstd
uncompresscmd unzstd
/var/log/osstech/ucidm/*.log
{
daily
olddir old
notifempty
missingok
sharedscripts
postrotate
/usr/bin/systemctl -s HUP kill rsyslog.service >/dev/null 2>&1 || true
endscript
}
他には次のパラメータが設定可能です。
weekly1週間に1度monthly1ヶ月に1度
より詳細な設定項目はlogrotateのドキュメントを参照してください。
ログ保存数変更手順
ログ保存数は /etc/logrotate.conf で定義されたデフォルト設定をそのまま利用します。
システム全体のデフォルト設定を変更する場合は /etc/logrotate.conf を編集してください。
UCIDMのログ保存数のみ変更したい場合は /opt/osstech/etc/logrotate.d/ucidm を編集してください。
例えばログ保存数を30世代にする場合は、rotate 30 を設定に追加してください。
compresscmd zstd
uncompresscmd unzstd
/var/log/osstech/ucidm/*.log
{
rotate 30
olddir old
notifempty
missingok
sharedscripts
postrotate
/usr/bin/systemctl -s HUP kill rsyslog.service >/dev/null 2>&1 || true
endscript
}
より詳細な設定項目はlogrotateのドキュメントを参照してください。
バックアップ
バックアップの設定
次の3つのデータをバックアップします。
- mongodb のドキュメントデータ
- rabbitmq の queue 一覧
- ucidm ホームディレクトリ配下のファイル群
バックアップスクリプトは以下に存在します。
$ /opt/osstech/bin/ucidm-backup
必要に応じてバックアップスクリプトの動作に関係する設定を変更します。
$ vi /opt/osstech/etc/ucidm/ucidm-backup.conf
backup_dir="/opt/osstech/var/backup/ucidm"- バックアップのアーカイブを格納するディレクトリ
backup_maxage="3"- バックアップのアーカイブを保持する世代数
フォーマットは systemd.exec の EnvironmentFile= を前提としています。
例として = の前後にスペースが含まれていた場合は読み込みに失敗します。
バックアップ手順
バックアップスクリプトを実行します。
バックアップスクリプト内で docker コマンドを実行します。
環境に応じて docker コマンドが実行可能なユーザーで作業してください。
$ /opt/osstech/bin/ucidm-backup
正常にバックアップ処理が終了すると、backup_home で指定したディレクトリ配下に tar.zst ファイルとして作成されます。
$ ls -l /opt/osstech/var/backup/ucidm/
total 591492
-rw-r--r--. 1 ucidm ucidm 605686941 Nov 27 17:33 ucidm-backup-20241127173235.tar.zst
バックアップの内容が適切かどうか、アーカイブのファイル一覧を確認します。
$ tar tvf /opt/osstech/var/backup/ucidm/ucidm-backup-20241127173235.tar.zst
定期的なバックアップ実行の設定
/opt/osstech/bin/ucidm-backup に設定したバックアップスクリプトを使って定期実行する設定を行います。
osstech-ucidm の rpm をインストールしたときに /etc/cron.d/ucidm-backup というcronの設定ファイルが配置されます。
デフォルト設定では毎日 4:30 に実行されます。
$ cat /etc/cron.d/ucidm-backup
30 4 * * * ucidm /opt/osstech/bin/ucidm-backup
バックアップ取得時刻を変更する際は、本ファイルの設定を変更してください。
リストア
/opt/osstech/bin/ucidm-backup にて取得したバックアップファイルをもとに、リストアする手順を示します。
リストア手順
リストアスクリプト内で docker コマンドを実行します。
環境に応じて docker コマンドが実行可能なユーザーで作業してください。
バックアップファイルに含まれる以下のデータをリストアします。
- mongodb のドキュメントデータ
- rabbitmq の queue 一覧
- ucidm ホームディレクトリ配下のファイル群
Apache の設定ファイルはリストアされませんので、別途再配置を行ってください。
事前準備
リストアコマンドを実行する前にいくつかの事前作業を行う必要があります。
ucidmパッケージのインストール
リストアコマンドを行う際は osstech-ucidm パッケージがインストール済みである必要があります。
インストール の項を参照して、パッケージをインストールしてください。
コンテナレジストリへアクセス設定 の項を参照して、 アクセス設定を行ってください。
コマンド実行
/opt/osstech/bin/ucidm-restore コマンドを実行し、リストアを行ってください。
$ /opt/osstech/bin/ucidm-restore ucidm-backup-20241127173235.tar.zst
done restore at <実行日時情報> という出力があれば、
リストアは正常に完了しています。
コンテナ起動
リストア後コンテナを起動し、リストアが正常に行われたことを確認してください。
$ docker compose --file /var/opt/osstech/lib/ucidm/compose.yml up -d
migrate コマンド操作
データ移行処理を行う migrate コマンドの操作を紹介します。
api コンテナのアップグレード時に自動実行されるため、特別な理由がない限り、手動実行する必要はありません。
アップグレード
バージョンを指定しない場合は api コンテナの ucidm バージョンを使ってマイグレーション処理が実行される。
$ docker compose exec -it api /bin/migrate db -type up
-version で任意のバージョンを指定してアップグレードする。
$ docker compose exec -it api /bin/migrate db -type up -version 1.7.1
-funcName で特定のマイグレーション処理のみに限定してアップグレードする。
$ docker compose exec -it api /bin/migrate db -type up -version 1.7.1 -funcName Session
ダウングレード
アップグレードによって変更した内容を元に戻したいときに実行する。データ構造上の変更であれば元に戻せる。但し、アップグレードによって一部のデータを削除してしまうような変更に対しては元の値に戻すことはできません。
1.7.1 のアップグレードによるマイグレーション処理を元に戻したいときは -version に 1.7.1 を指定する。
$ docker compose exec -it api /bin/migrate db -type down -version 1.7.1
-funcName で特定のマイグレーション処理のみに限定してダウングレードする。
$ docker compose exec -it api /bin/migrate db -type down -version 1.7.1 -funcName Session
ID 情報の再同期
なんらかの理由で LDAP サーバーのエントリが UCIDM API サーバーに ID 連携されていないときに運用対応する方法について説明します。
Agent モジュール のコンテナ内に再同期のための運用ツールが同梱されており、Docker Compose の Agent モジュールの設定内容を再利用できます。
デフォルトでは Docker Compose を /var/opt/osstech/lib/ucidm に配置します。ここではデフォルトの位置にインストールされている前提で作業を進めていきます。
compose.yml を配置したディレクトリへ移動します。
$ cd /var/opt/osstech/lib/ucidm
次のように実行してヘルプが表示されることを確認してください。-it の後にサービス名を指定します。agent-ldap, agent-ad, agent-meid というサービス名になります。
$ docker compose exec -it agent-ad /bin/resync help
Usage: resync <flags> <subcommand> <subcommand args>
Subcommands:
commands list all command names
delete delete entries in the ucidm server
entry resync an entry
flags describe all known top-level flags
help describe subcommands and their syntax
pass pass changes to get the latest cookie or deltatoken
update update entries in the ucidm server
Use "resync flags" for a list of top-level flags
個別エントリの再同期
種別 (ユーザー, グループまたは組織単位) と DN または ID を指定して個別エントリーを再同期します。
DN とユーザーエントリのとき
$ docker compose exec -it agent-ldap \
/bin/resync -verbose entry -dn uid=user1,ou=users,dc=example,dc=com -type user
DN とグループエントリのとき
$ docker compose exec -it agent-ad \
/bin/resync -verbose entry -dn cn=group1,ou=groups,dc=example,dc=com -type group
DN と組織単位エントリのとき
$ docker compose exec -it agent-ad \
/bin/resync -verbose entry -dn ou=groups,dc=example,dc=com -type ou
ID とユーザーエントリのとき
$ docker compose exec -it agent-meid \
/bin/resync -verbose entry -id a8d67d70-f83b-453d-9666-1f280a609bf6 -type user
すべてのエントリの再同期
LDAP サーバーまたはクラウドサーバーのすべてのエントリーを UCIDM API サーバーに再同期します。それぞれのサーバーに実行時時点で存在しているエントリーを取得します。
デフォルトではドライランモードで実行されて実際にエントリーは更新しません。またデータソースのエントリが UCIDM API サーバーに存在していない場合はコンソールにその情報を表示します。
ユーザーエントリのとき (ドライラン有効)
$ docker compose exec -it agent-ldap /bin/resync update -type user
グループエントリのとき (ドライラン有効)
$ docker compose exec -it agent-ad /bin/resync update -type group
組織単位エントリのとき (ドライラン有効)
$ docker compose exec -it agent-ad /bin/resync update -type ou
ドライランモードを解除して実際に更新するには次のように実行します。
ユーザーエントリのとき (ドライラン無効)
$ docker compose exec -it agent-ldap /bin/resync update -type user -dryrun=false
グループエントリのとき (ドライラン無効)
$ docker compose exec -it agent-ad /bin/resync update -type group -dryrun=false
組織単位エントリのとき (ドライラン無効)
$ docker compose exec -it agent-ad /bin/resync update -type ou -dryrun=false
UCIDM API サーバーから不整合なユーザーの削除
UCIDM API サーバーに存在して LDAP サーバーまたはクラウドサーバーに存在しないエントリを UCIDM API サーバーから削除します。
デフォルトではドライランモードで実行されて実際にエントリーは削除しません。UCIDM API サーバーで削除対象となるエントリをチェックして一覧表示します。
ユーザーエントリのとき (ドライラン有効)
$ docker compose exec -it agent-ldap /bin/resync delete -type user
グループエントリのとき (ドライラン有効)
$ docker compose exec -it agent-ad /bin/resync delete -type group
組織単位エントリのとき (ドライラン有効)
$ docker compose exec -it agent-ad /bin/resync delete -type ou
ドライランモードを解除して実際に更新するには次のように実行します。
ユーザーエントリのとき (ドライラン無効)
$ docker compose exec -it agent-ldap /bin/resync delete -type user -dryrun=false
グループエントリのとき (ドライラン無効)
$ docker compose exec -it agent-ad /bin/resync delete -type group -dryrun=false
組織単位エントリのとき (ドライラン無効)
$ docker compose exec -it agent-ad /bin/resync delete -type ou -dryrun=false
UCIDM 導入時の初回連携の効率化
LDAP サーバーまたはクラウドサーバーから ID 情報を初回同期するとき、それらのサーバーが長年に渡って運用され、過去の履歴が多い場合、すべての履歴を順番に適用するため、初回同期に数時間や数日といった時間がかかる可能性があります。
Agent モジュールが扱う同期情報と競合しないよう、一時的に Docker Compose の Agent モジュールを停止させてから初回同期を行います。次のようにして初回同期ならびに最新の同期情報を生成します。ここでは agent-meid という Microsoft Entra ID 向けサービスの設定例として紹介します。
$ docker compose stop agent-meid
$ docker compose run --rm --entrypoint "/bin/resync update -type user -dryrun=false" agent-meid
$ docker compose run --rm --entrypoint "/bin/resync update -type group -dryrun=false" agent-meid
$ docker compose run --rm --entrypoint "/bin/resync pass" agent-meid
正常に終了すると volumes/agent-data 配下に保存される同期情報が更新されます。
$ ls -l volumes/agent-data/meid/
total 8
-rw-r--r--. 1 ucidm ucidm 2750 Jul 18 09:54 msgraph-group.deltatoken
-rw-r--r--. 1 ucidm ucidm 2471 Jul 18 09:54 msgraph-user.deltatoken
同期情報が更新されていることを確認したら Agent モジュールを再開させます。
$ docker compose up -d agent-meid
pass サブコマンドを実行したタイミング以降の変更差分のみを検出できるようになります。
SAML 認証
UCIDM における SAML 認証について記載します。
UCIDM API は SAML 認証に対応しており、以下の SAML IdP に対して動作を確認できています。
また、UCIDM API を利用しているユーザープロファイル画面においても SAML でのログイン・ログアウトが可能となります。
対応フロー
UCIDM の SAML 認証は以下のフローに対応しています。
- SP 起点のログイン
- IdP 起点のログイン
- SP 起点のログアウト
- IdP 起点のログアウト
バインディング方式
UCIDM の SAML 認証のログインにおいては、以下のバインディング方式に対応しています。
- HTTP POST Binding
UCIDM の SAML 認証のログアウトにおいては、以下のバインディング方式に対応しています。
- HTTP Redirect Binding
NameID フォーマット
UCIDM の SAML 認証は以下の NameID フォーマットに対応しています。
- urn:oasis:names:tc:SAML:2.0:nameid-format:persistent
この urn:oasis:names:tc:SAML:2.0:nameid-format:persistent に、UCIDM API にて定義されている LDAP_USER_UNIQUE_ATTRIBUTE の属性(デフォルト uid)に対応する値を連携させることで、その属性値を持つユーザーでログインされます。
エンドポイント
UCIDM の SAML 認証においては、以下のエンドポイントを提供しています。(SAML 認証有効時)
API から直接レスポンスを受け取ることも可能ですが、ユーザープロファイル画面を介してのアクセスを想定しています。
SAML SP メタデータの取得
以下にアクセスすることで、SAML SP のメタデータが取得できます。メタデータにはアクセス時点から 2 日後の有効期限 (validUntil) がセットされます。
- <プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/ui/user/api/saml/metadata
アサーションコンシューマサービス
以下のアサーションコンシューマサービスのエンドポイントを提供しています。
- <プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/ui/user/api/saml/acs
シングルログアウト
以下のシングルログアウト用のエンドポイントを提供しています。
- <プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/ui/user/api/saml/slo
SAML ログイン開始ポイント
以下にアクセスすることで、SAML SP 起点のログインフローが開始されます。
- <プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/ui/user/api/saml/login
OpenAM との連携
OpenAM との連携機能について説明します。
SAML 連携
UCIDM では OpenAM と SAML 連携をすることができます。この際、UCIDM は SAML SP、OpenAM は SAML IdP として動作します。
OpenAM を SAML IdP として構築した際、UCIDM を SAML SP として設定する手順は以下になります。
- OpenAM の SAML IdP の設定を行います。OpenAM の SAML 設定については OpenAM のドキュメントをご参照ください。
- UCIDM の SAML SP の設定を行います。設定については UCIDM API のページをご参照ください。
- OpenAM の SAML IdP メタデータを UCIDM SAML SP の設定にて指定する必要があります。
- UCIDM の SAML SP メタデータを OpenAM にリモートサービスプロバイダーとして登録します。
- UCIDM の SAML SP メタデータは以下 URL にアクセスすることで取得可能です。
- <プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/ui/user/api/saml/metadata
- UCIDM の SAML SP メタデータは以下 URL にアクセスすることで取得可能です。
- OpenAM の UCIDM SAML SP 設定画面の「NameID 値マップ」で以下を設定します。
- urn:oasis:names:tc:SAML:2.0:nameid-format:persistent=<UCIDM のユーザーの一意な識別子の値>
- 例として uid の値を連携したい場合は以下のようになります。
- urn:oasis:names:tc:SAML:2.0:nameid-format:persistent=uid
ステータス属性の設定
UCIDM ではユーザーの有効/無効のステータスでログイン可否などを制御する機能があります。
UCIDM のユーザーの有効/無効の判定設定はユーザープロファイルのユーザーステータス設定画面で行うことができます。
OpenAM ではデフォルトで UCIDM とは別の属性が有効/無効の判定として使われる設定になっています。
UCIDM でのユーザーの有効/無効と OpenAM でのユーザーの有効/無効設定を統一したい場合は、UCIDM または OpenAM においてステータスの設定を行う必要があります。
以下は UCIDM にて OpenAM にて利用される inetUserStatus の属性の値(Active/Inactive)をそのまま UCIDM の有効/無効の設定として使うユーザーステータス設定例となります。
- ステータス機能を有効にする:on
- ステータス属性名:inetUserStatus
- ステータス属性のスクリプトを利用する:on
- スクリプト:以下を設定
function view(values) {
return values[0] === "Active";
}
function modify(values, enabled) {
return [enabled ? "Active" : "Inactive"];
}
デバイス管理設定
TOTP デバイス情報の管理
UCIDM では OpenAM のログインで利用される TOTP デバイス情報を閲覧、削除することができます。TOTP デバイスの登録は OpenAM の画面にて行う必要があります。
TOTP の操作を許可するためには、ユーザープロファイル(管理者用)の属性権限設定詳細画面で oathDeviceProfiles 属性に参照と編集と削除権限が許可されている必要があります。
TOTP デバイス管理画面は PUBLIC_TOTP_REGISTER_URL において URL を指定している場合のみ表示されます。
デバイス設定画面の登録ボタンを押下すると、上記 PUBLIC_TOTP_REGISTER_URL で指定した URL に遷移します。この URL には OpenAM の TOTP デバイス登録 URL を指定してください。
Passkey デバイス情報の管理
UCIDM では OpenAM のログインで利用される Passkey デバイス情報を閲覧、削除することができます。Passkey デバイスの登録は OpenAM の画面にて行う必要があります。
Passkey の操作を許可するためには、ユーザープロファイル(管理者用)の属性権限設定詳細で fido2Credential 属性に参照と編集と削除権限が許可されている必要があります。
Passkey デバイス管理画面は PUBLIC_PASSKEY_REGISTER_URL において URL を指定している場合のみ表示されます。
デバイス設定画面の登録ボタンを押下すると、上記 PUBLIC_PASSKEY_REGISTER_URL で指定した URL に遷移します。この URL には OpenAM の Passkey デバイス登録 URL を指定してください。
認証用 LDAP のパスワードを忘れた場合の対応
OpenAM 認証用 LDAP のパスワードを忘れてしまった際のパスワードリセットは UCIDM のユーザープロファイルにて行うことができます。OpenAM のログイン画面に、UCIDM のパスワードリセット用の URL へのリンクを用意しておきたい場合は、以下 URL をリンクとして指定してください。OpenAM のログイン画面のカスタマイズ方法については OpenAM のドキュメントをご参照ください。
- <プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/ui/user/unknownpassword
データソースのシステム移行
UCIDM ではエントリー (ユーザーやグループなど) を識別する一意、且つ不可変な ID として entryUUID を使います。
内部ディレクトリサービス (OpenLDAP や Active Directory といったサービス) やクラウドサービス (Microsoft Entra ID など) といった、UCIDM からみてデータソースとなるシステムを移行する場合、それぞれのシステムにおいて entryUUID として管理されている ID の値が変わらないように移行する必要があります。
アップデート時の移行作業
UCIDM 各種コンテナイメージやパッケージのアップデート時の移行作業について紹介します。
UCIDM アプリケーション アップデート時の移行作業
UCIDM アプリケーション のアップデート時に必要となる作業について記載しています。
1.6.0 (2025-02-18) から 1.7.0 (2025-05-02) へアップデートするときに必要となる作業
Agent にて使用している cookie 情報の設定 (Agent モジュール)
連携元として OpenLDAP を使っている場合、Agent のコンテナ再起動前に compose.yml の volumes に指定したディレクトリ (./agent-data/openldap) 配下に syncrepl.entrycsn を作成して作業する日時情報を entryCSN として書き込みしておく必要があります。(設定例は以下)
20250227013556.214103Z#000000#000#000000
属性マッピング設定の更新 (UCIDM API、ユーザープロファイル画面)
すでにユーザープロファイルの表示・属性値設定画面にて属性のマッピング設定が定義されている場合、マッピング設定内容の書き換えが必要があります。(リクエストパラメーターに対象属性が存在しないときにマッピングを行う動きになったことを考慮する必要があります。)
管理者アカウントのページにアクセスする設定 (ユーザープロファイル画面)
ucidm-ui コンテナの environment に以下を追加します。
PUBLIC_ADMIN_UI_URL: "${ADMIN_UI_URL}"
環境変数の env ファイルについては以下の追加が必要になります。
ADMIN_UI_URL="https://{ホスト名}/sys"
通知メッセージを設定 (UCIDM API、ユーザープロファイル画面)
mongosh で、name コレクションに userAttributesNotify のレコードを追加する必要があります。
$ docker compose exec mongo bash
mongo コンテナ内
mongosh -u ユーザー名 -p パスワード "mongodb://localhost:37017"
use ucidm
userAttributesNotifyのレコードが存在しないことを確認
db["name"].find()
db["name"].insertOne({_id: "userAttributesNotify", t: {}})
userAttributesNotifyのレコードが存在することを確認
db["name"].find()
オプション値の表示名を設定 (UCIDM API、ユーザープロファイル画面)
mongosh で、name コレクションに userAttributesOptions と groupAttributesOptions のレコードを追加する必要があります。
$ docker compose exec mongo bash
mongo コンテナ内
mongosh -u ユーザー名 -p パスワード "mongodb://localhost:37017"
use ucidm
userAttributesOptions と groupAttributesOptions のレコードが存在しないことを確認
db["name"].find()
db["name"].insertOne({_id: "userAttributesOptions", t: {}})
db["name"].insertOne({_id: "groupAttributesOptions", t: {}})
userAttributesOptions と groupAttributesOptions のレコードが存在することを確認
db["name"].find()
ルート設定の更新 (UCIDM API、ID 連携管理画面)
ルート設定の内容を更新する必要があります。
ID 連携管理画面の各ルート設定画面にて、ユーザー用とグループ用の連携条件を設定し、更新を行って下さい。
元々連携条件が設定されていないルート設定については、ルート設定詳細画面を開いてそのまま「更新」ボタンを押してください。
UCIDM パッケージ アップデート時の移行作業
UCIDM パッケージ のアップデート時に必要となる作業について記載しています。
- 1.7.0 (2025-05-02) から 1.8.0 (2025-10-14) へアップデートするときに必要となる作業
- 1.5.0 (2025-01-10) から 1.7.0 (2025-05-02) へアップデートするときに必要となる作業
1.7.0 (2025-05-02) から 1.8.0 (2025-10-14) へアップデートするときに必要となる作業
コンテナの環境変数からデータベースのシステム設定への移行
UCIDM API と Agent モジュール のサービス設定の環境変数をシステム設定へ移行する必要があります。
詳細は弊社のサポート担当者にご確認ください。
RabbitMQ 接続設定の変更
コンテナをアップグレードするときに compose サービスが停止した状態で compose.yml (ucidm.env) の環境変数を移行します。
UCIDM API と 外部連携モジュール のサービス設定の環境変数を次のように変更する必要があります。
environment:
- AMQP_URL: "${AMQP_URL}"
+ RABBITMQ_USER: "${RABBITMQ_USER}"
+ RABBITMQ_PASSWORD: "${RABBITMQ_PASSWORD}"
+ RABBITMQ_HOST: "${RABBITMQ_HOST}"
MongoDB コンテナイメージのリポジトリ変更
Upcoming changes to the Bitnami catalog (effective August 28th, 2025) により、MongoDB のコンテナイメージを取得するリポジトリを bitnamilegacy/mongodb へ変更する必要があります。
mongo:
- image: docker.io/bitnami/mongodb:8.0.3
+ image: docker.io/bitnamilegacy/mongodb:8.0.3
1.5.0 (2025-01-10) から 1.7.0 (2025-05-02) へアップデートするときに必要となる作業
bind mounts volume ディレクトリ配下の owner/permission の変更
compose サービスを停止します。
$ docker compose down
compose.yml の mongo サービスから user: root を削除する。
mongo:
container_name: mongo
- user: root
image: docker.io/bitnamilegacy/mongodb:8.0.3
コンテナ内のアプリケーションを uid=1001 のユーザーが実行するように変更されたため、そのホスト上でのディレクトリやファイルの owner/permission を変更する必要があります。
subuid の設定を確認します。
$ cat /etc/subuid
ucidm:100000:65536
subuid が 100000 からマッピングする設定の場合はホスト上では uid=101000 (100000 + 1001 - 1) としてマッピングされます。compose.yml を配置している次の3つのディレクトリの owner/permission を変更します。
- mongodb
- agent-data
- server-data
$ rootlesskit chown -R 1001:0 mongodb server-data agent-data
compose サービスを開始して正常に動作することを確認します。
$ docker compose up -d
LDAP PassSync Agent アップデート時の移行作業
LDAP PassSync Agent のアップデート時に必要となる作業について記載しています。
1.1.1-7 (2025-02-13) から 1.1.1-13 (2025-10-14) へアップデートするときに必要となる作業
パスワード連携に失敗したときのリカバリ処理に有効期限を設定する
リカバリ処理の有効期限として環境変数 UCIDM_RECOVERY_DURATION を設定できます。未設定の場合、デフォルト設定として3日 (72時間) になります。
AD PassSync Agent アップデート時の移行作業
AD PassSync Agent のアップデート時に必要となる作業について記載しています。
1.1.9 (2024-01-26) からアップデートするときに必要となる作業
FAQ
システム
- システム全般やシステム構成に関する質問
トラブルシューティング
- 一般的なトラブルシューティング
システム
システム全般やシステム構成などに関する内容を記載します。
- UCIDM をアップデートするときに変更内容や移行作業を確認するドキュメントはどれですか?
- 複数台のマシンを使って冗長構成をサポートしていますか?
- OpenLDAP と Active Directory の両方を同時に使って ID 連携できますか?
- UCIDM の認証・認可はどのような仕組みですか?
UCIDM をアップデートするときに変更内容や移行作業を確認するドキュメントはどれですか?
ID 連携管理画面、またはユーザープロファイル画面(管理者用)で運用中の UCIDM バージョンを確認できます。現在のバージョンからアップデート対象バージョンに関する リリースノート や アップデート時の移行作業 を確認するようにしてください。
複数台のマシンを使って冗長構成をサポートしていますか?
オンプレミス版 UCIDM は冗長構成をサポートしません。
冗長構成をとることで可用性を向上させられますが、導入や運用に対していくらか複雑さもあがります。オンプレミス版ではシンプルな構成でシステム管理者の運用コストを削減することを狙いとしています。
OpenLDAP と Active Directory の両方を同時に使って ID 連携できますか?
内部ディレクトリサービスはどちらか1つであることを前提としています。ID 連携をするときに外部連携先ごとにマッピング設定が必要になります。複数のデータソースに対して制御する機能はありません。
UCIDM の認証・認可はどのような仕組みですか?
ベーシック認証とアカウント認証に対応しています。また ユーザープロファイル画面 では OpenLDAP または Active Directory との LDAP 認証に対応しています。お客様の要件にあわせて対応を検討しますので弊社のサポート担当者にご確認ください。
トラブルシューティング
一般的なトラブルシューティングについて記載します。
UCIDM が意図した動作をしていないようにみえる
ご迷惑をおかけして申し訳ありません。
UCIDM の内部処理でなんらかの不具合が発生している可能性があります。
次のように詳細ログを収集する運用ツールを実行して作成したログアーカイブを添付して弊社のサポート担当者にご連絡ください。
$ /opt/osstech/bin/containerlog archive -path /var/opt/osstech/lib/ucidm/compose.yml
2023/04/26 15:22:23 INFO archive container log finished file=container-log-20230426152222.tar.gz
コンテナのログを収集できているかどうかは tar コマンドで確認できます。
$ tar tvf container-log-20230426152222.tar.gz
内部ディレクトリサービスのエントリデータが外部連携先に反映されていない
Agent モジュールから UCIDM API サーバーへの連携を確認
- Agent モジュールのログを確認してください
- UCIDM API サーバーからエラーが返っていないか
- Agent モジュールが UCIDM API サーバーに対してエントリを送信しているか
- OpenLDAP や AD の操作を行い、Agent のログからそのエントリの受信が確認できない場合は Agent の設定を確認してください
- 個別またはすべてのエントリの再同期については ID 情報の再同期 を参照してください
- 履歴一覧画面に失敗のレコードがないか確認してください
- 画面にて、DN 情報等を元にレコードの絞り込みを行うことができます
- もし失敗のレコードがあった際は、そのエラー内容を確認してください
- 必要に応じて compose サービスの api のログを確認してください
- 進捗中ジョブ一覧画面にて実行中のレコードがないか確認してください
- 画面にて、DN 情報等を元にレコードの絞り込みを行うことができます
- ここに表示されているジョブは現在実行中ですので、処理が終わるまでお待ちください
UCIDM API サーバーから外部連携先への連携を確認
外部連携先 (Google Workspace, Microsoft Entra ID など) の管理コンソールにログインして確認します。
- コンテナの環境変数が正しく反映されていないときはコンテナを削除して consumer サービスを再作成してください
- 履歴一覧画面に失敗のレコードがないか確認してください
- 画面にて、DN 情報等を元にレコードの絞り込みを行うことができます
- もし失敗のレコードがあった際は、そのエラー内容を確認してください
- 必要に応じて compose サービスの consumer のログを確認してください
仕様上の制約
ID 連携全般
primaryID は変更不可
primaryID は外部サービスへも主要なキー情報として連携されます。そのため、既存の primaryID を変更すると外部サービスにも影響があります。UCIDM ではユーザー/グループのエントリ情報が初めて連携されてきたときに primaryID を生成します。ユーザー/グループエントリを更新して primaryID を変更することはできません。例えば、デフォルトでは LDAP の DN 文字列の RDN0 の値を割り当てます。DN の値は後から変更できますが、初期の RDN0 の値を使って割り当てた primaryID の値は変更されません。そのため、DN 文字列を変更すると外部サービスで使っている primaryID の命名規則においてズレてしまう可能性があります。
Agent モジュール
ユーザーやグループの変更を検知して ID 連携するモジュールの制約になります。
共通
search base として設定した OU (Organizational Unit) エントリーを別の内容に変更すると変更を検知できなくなり、ID 連携できません。
例えば、次のようにユーザーやグループの search base を設定しているとします。
LDAP_USER_SEARCH_BASE="ou=users,dc=example,dc=com"
LDAP_GROUP_SEARCH_BASE="ou=groups,dc=example,dc=com"
このとき、例えば、内部ディレクトリサービスのユーザーの ou=users,dc=example,dc=com から ou=new-users-group,dc=example,dc=com のように変更した場合、Agent モジュールの設定変更を行い、プロセスを再起動しないと以降の LDAP エントリーの変更を検知できません。
Active Directory 向け Agent
- 古いエントリが複数ある場合は直接削除する必要があります。
- 次の属性は同期されません。
- nTSecurityDescriptor
- pwdLastSet
- objectSid
- parentGUID
- memberOf
PassSync Agent モジュール
パスワード変更を検知してパスワード連携するモジュールの制約になります。
OpenLDAP 向け
- 連携対象のパスワードに改行文字を含めることはできません
Active Directory 向け
- ユーザーを追加すると、同時にパスワード変更を検出します。しかし、ユーザーが連携される前にパスワードを連携すると失敗します。その際は再度パスワードを変更する必要があります
- ログオン名変更後はパスワードをユーザー自身が更新する必要があります
- 高負荷のときにイベントログにログが出力されない場合があります
- 一方で UCIDM の管理画面ではすべてのリクエストの履歴を確認できます
外部連携モジュール
外部サービスへ ID 連携するモジュールの制約になります。
SCIM
SCIM 外部連携モジュール は起動後の最初の ID 連携リクエストのタイミングで必要なスキーマ情報を取得します。そして、そのスキーマ情報はプロセスは起動している最中ずっとキャッシュされます。実運用において共通でよく使われるスキーマが変更されることは滅多にないと考えています。キャッシュしているため、スキーマ情報に変更があった場合は外部連携モジュールのプロセスを再起動する必要があります。
管理画面
ID 連携管理画面 および ユーザープロファイル画面の制約になります。
共通
ID 連携管理画面 および ユーザープロファイル画面(管理者用)において、それぞれの画面にて同名のアカウントでログインを行って同時に各種操作をした場合、主にログアウト操作をした際に上手く動かない事象が確認できています。
認証
認証関係の制約になります。
連携元を AD としている場合の認証デバイス設定
OpenAM の認証デバイス設定で使用するスキーマを使用して AD の属性を拡張する必要があります。現在の UCIDM は OpenAM と連携しているときのみ認証デバイス設定を使用できます。
UCIDM 用語集
experimental: 実験的な機能
まだ開発中の実験段階の機能であることを表しています。実際のデータを使ってシステム管理者の方にご利用いただき、弊社へのフィードバックを頂けることを目的としています。機能をより良くするための改善点や不具合報告を歓迎します。
experimentalとして提供している機能は今後の開発において提供範囲の変更が発生したり、正常に動作しない条件が含まれるなど安定的に機能を提供できない可能性があります。また原則として弊社のサポートは行っておりません。experimentalの機能を使って、お客様の運用環境で問題が生じたとしても弊社から完全なサポートは提供できないことをご理解いただいたうえでご利用ください。
外部連携モジュール
UCIDM サーバー内で外部の連携先に ID 連携のための通信を行うモジュールのことです。
サポートしている外部サービスや連携プロトコルの詳細については 外部連携 を参照してください。
Agent モジュール
内部ディレクトリサービスのサーバーまたはクラウドシステムから変更された ID 情報を検出して UCIDM サーバーへそれらの情報を連携するモジュールのことです。連携元データソースのシステムによっては定期的な問い合わせ (ポーリングと呼ぶ) を行います。
詳細については Agent モジュール を参照してください。
PassSync Agent
パスワードを扱う特別な Agent モジュールのことです。
一般的にパスワードは暗号化して保存されるため、パスワードを連携するには暗号化される前の文字列 (平文パスワードまたは生パスワードと呼ばれる) を取得する必要があります。そのための特別な処理を行うモジュールが PassSync Agent になります。
PassSync Agent は内部ディレクトリサービスが稼働するサーバーにインストールする必要があります。詳細については PassSync Agent モジュール を参照してください。
ディレクトリサービス
ネットワーク上のリソースに対して ID と名前を管理するサービスの総称です。
- ユーザー/グループ管理などに X.500 ベースの LDAP プロトコルがよく使われる
- LDAP プロトコルの実装には様々なプロダクトがある
- Active Directory: Windows 向けのマイクロソフト社のディレクトリサービスの実装
- OpenLDAP: ミシガン大学のオリジナルの LDAP 実装から派生したもので OpenLDAP Project が開発している
内部ディレクトリサービス
ID 連携の連携元になる内部のサービスを指します。
外部サービス
ID 連携の連携先になる外部のサービスを指します。
外部連携モジュール により、複数の外部のディレクトリサービスやクラウドサービスと連携できます。
ID 連携
DN (Distinguished Name)
LDAP または UCIDM で管理するエントリー (ユーザーやグループなど) を一意に識別できる ID です。RFC 4514 で提案されています。後述する entryUUID の違いは変更可能 であることです。DN の値は更新できます。
entryUUID
LDAP または UCIDM で管理するエントリー (ユーザーやグループなど) を一意に識別できる ID です。RFC 4530 で提案されています。前述した DN との違いは変更できない ことです。DN の値を更新したいときは entryUUID をエントリーを識別する一意な ID として指定します。
連携元システムの次の属性の値を UCIDM へ ID 連携する際に entryUUID として管理します。
| データソース | 連携元属性名 | UCIDM |
|---|---|---|
| OpenLDAP | entryUUID | entryUUID |
| Active Directory | objectGUID | entryUUID |
| Microsoft Entra ID | objectID | entryUUID |
primaryID
LDAP 認証のユーザー名や外部サービスへ ID 連携するときのアカウント名に相当し、UCIDM のシステム内でユーザー/グループを一意に識別できる ID です。
詳細は UCIDM API の設定 を参照してください。
primaryGroupID
Active Directory におけるデフォルトグループを定義する属性 です。ユーザーを作成したときはデフォルトで Domain Users グループ (513) に関連付けられます。UCIDM のシステム内で管理している primaryID と直接関係はありませんが、ID 連携された任意のグループを primaryGroupID に設定したい場合はそのグループの primaryID を設定します。
ID 連携のフロー種別
ID 連携のフローについて次の種別があります。
自動同期型 (provisioning, pull)
Agent モジュール を介して、社内にある ディレクトリサービス からエントリーの変更を自動的に検出して、その都度、更新内容を外部サービスへ ID 連携するフローを指します。
flowchart TB in-dir-service[内部ディレクトリサービス] -- event --> passsync-agent[PassSync Agent] passsync-agent -- https --> api[API] in-dir-service -- ldaps --> agent[Agent] agent -- polling --> in-dir-service agent -- https --> api api -- messaging --> client[外部連携モジュール] client -- ldaps/https --> ext-service[外部サービス]
配信型 (push)
利用者が管理画面を介して、エントリーの情報を更新したときに外部サービスへ ID 連携するフローを指します。
flowchart LR ui[管理画面] -- https --> api[API] api -- messaging --> client[外部連携モジュール] client -- ldaps/https --> ext-service[外部サービス]
リカバリとリトライ
リカバリ
エンドユーザーの平文パスワードは再取得できないことから一時的に PassSync Agent が稼働しているサーバー内に難読化した上で保存し、定期的にそれらを読み込んで再送を試みます。環境変数 UCIDM_RECOVERY_XXX で設定します。
リトライ
主にはネットワークエラーのような、一時的な障害に対して短い時間をあけて再リクエストすることで復旧できることを想定しています。環境変数 CLIENT_RETRY_XXX で設定します。
リリースノート
OSSTech 提供の UCIDM の修正内容について記載しています。
UCIDM アプリケーション リリースノート
UCIDM アプリケーション の修正内容について記載しています。
1.8.0 (2025-10-14)
- システム管理者向けに管理者画面の操作を制限するカスタムロール機能を追加 (UCIDM API、ID 連携管理画面、ユーザープロファイル画面)
- UCIDM 組み込みのシステムロールが追加されています。詳細は ロールとアクセス制御 を参照してください。
- ID 連携管理画面の 管理者アカウント画面 から任意のカスタムロールを設定できます。
- システムロールおよび管理者用カスタムロールにてユーザープロファイル画面の画面表示設定ができます。
- UCIDM 設定をコンテナの環境変数からデータベースの システム設定 に変更 (UCIDM API、Agent モジュール、ID 連携管理画面)
- システム設定を反映するために Web UI から UCIDM API を再起動できます。
- ユーザー無効日、ユーザー有効日、ユーザー/グループ削除日のライフサイクルチェックを実行する API を追加 (UCIDM API)
- パスワード連携するときに DN が UserSearchBase/UserSearchFilter に合致しないエントリーを除外するように変更 (UCIDM API)
- アカウント/LDAP 認証に失敗したときにロックアウトする機能を追加 (UCIDM API)
- ID 連携管理画面の Web UI を更新 (Agent モジュール、UCIDM API、ID 連携管理画面)
- 履歴画面で Agent/PassSync Agent モジュールのエラー内容を確認できます。
- マイグレーション履歴でアップグレード時のデータ移行履歴を確認できます。
- ユーザープロファイル画面の Web UI を更新 (UCIDM API、ユーザープロファイル画面)
- サイドバーのバージョン情報を別画面へ移行しました。
- ユーザーステータス設定で設定した属性を、ユーザー登録/詳細画面で確認できるように変更しました。
- 表示・属性値設定詳細のドラッグアンドドロップ操作の部分を ↑↓ ボタンに変更しました。
- ロール設定詳細において、ユーザーの表示・属性値設定の属性名が表示されるように変更しました。
- 属性変更画面の必須表示を*から「必須」/「任意」表示に変更しました。
- ユーザー/グループ詳細画面において、属性追加時に表示・属性値設定の属性が不足している場合はドロップダウンで表示するように変更しました。
- ユーザー/グループ登録画面において、登録後に所属グループ/メンバーを設定できるように変更しました。
- ユーザー/グループ登録画面において、uidNumber/gidNumber を自動割り当てできます。
- 各種設定のインポート・エクスポート機能をまとめて行えるように変更しました。
- 一般ユーザーのランダムパスワード設定機能を追加 (UCIDM API、ユーザープロファイル画面)
- ランダムパスワードのパスワードポリシーを設定できます。
- 設定したパスワードを印刷できます。
- 一般ユーザーの強制パスワードリセット機能を追加 (UCIDM API、ユーザープロファイル画面)
- 外部連携処理の変更 (外部連携モジュール)
- 前処理/後処理スクリプトで Windows Remote Management (WinRM) を利用できます。
- SCIM 連携時にアクセストークンを直接指定出来るように変更しました。
1.7.0 (2025-05-02)
- Agent 再起動時に連携元 LDAP の全てのエントリを走査してしまう問題の改修(Agent モジュール)
- 本変更に伴い、以下の手順の実施が必要となります。
- リクエストパラメーターに対象属性が存在しないときのみに LDAP マッピングを行うよう改修(UCIDM API、ユーザープロファイル画面)
- 本変更に伴い、以下の手順の実施が必要となります。
- 管理者画面における、サイドバーおよびページタイトルのレイアウト変更(ユーザープロファイル画面)
- カスタムロールを設定し、ロールごとに一般ユーザーの属性権限を指定できるよう改修(ユーザープロファイル画面)
- ID 連携管理画面の各種設定を画面上でエクスポート/インポートできる機能を追加(ID 連携管理画面)
- ユーザー/グループ詳細画面での更新リクエストにおいて、更新された属性の情報のみをリクエストに含めるよう改修(ユーザープロファイル画面)
- 属性権限設定をロール設定に変更(ユーザープロファイル画面)
- ロール設定画面で通知設定を行い、一般ユーザーのホーム画面に通知メッセージを表示できる機能を追加(UCIDM API、ユーザープロファイル画面)
- 本変更に伴い、以下の手順の実施が必要となります。
- 既にエクスポートしているファイルがあれば、再度エクスポートする必要があります。
- ロール設定画面でメニュー設定を行い、一般ユーザーのホーム画面の項目を管理する機能を追加(UCIDM API、ユーザープロファイル画面)
- 画面の表示/非表示を管理していた環境変数
PUBLIC_ENABLE_SELF_MODIFYとPUBLIC_ENABLE_SELF_HISTORYは不要になります。
- 画面の表示/非表示を管理していた環境変数
- 表示・属性値設定画面でオプション値の表示名を設定し、ユーザー/グループ登録・詳細画面、一般ユーザーの属性更新画面に反映する機能を追加(UCIDM API、ユーザープロファイル画面)
- 本変更に伴い、以下の手順の実施が必要となります。
- 既にエクスポートしているファイルがあれば、再度エクスポートする必要があります。
- ユーザープロファイル画面から ID 連携管理画面のアカウント情報/パスワード変更に直接アクセスできるよう改修(ユーザープロファイル画面、ID 連携管理画面)
- 本変更に伴い、以下の手順の実施が必要となります。
- ユーザーステータスと初期値設定のインポート/エクスポート機能を追加(ユーザープロファイル画面)
- ユーザー登録、パスワードリセット時に判定するパスワードポリシーを変更(ユーザープロファイル画面)
- ルート設定画面にてユーザー用とグループ用の連携条件をそれぞれ設定できるよう改修(UCIDM API、ID 連携管理画面)
- 本変更に伴い、以下の手順の実施が必要となります。
- ユーザー/グループ登録時に使用する
parentDNについてオプション値を設定できるように変更(ユーザープロファイル画面) - パスワードポリシー設定にて、対象ベース DN を選択して設定できるように変更(ユーザープロファイル画面)
- ユーザー/グループの登録・更新時に使用するプルダウンメニュー/チェックボックスで、必須判定が行えるように変更(ユーザープロファイル画面)
- ステータス設定が無効の場合に、使用できないステータス機能を非表示に変更(ユーザープロファイル画面)
- ID 連携対象外ユーザー/グループに登録できるのは LDAP サーバーに存在するエントリーのみという制限がありましたが、LDAP サーバーに存在しない任意の dn を指定して登録できるように変更 (UCIDM API)
1.6.0 (2025-02-18)
- 初期リリース版
UCIDM パッケージ リリースノート
UCIDM パッケージ の修正内容について記載しています。
1.8.0 (2025-10-14)
-
compose.yml に設定する環境変数 AMQP_URL (歴史的経緯) を廃止し、RABBITMQ_USER, RABBITMQ_PASSWORD, RABBITMQ_HOST に変更
- 環境変数を設定するときの一貫性を担保するために移行します
- 本変更に伴い、以下の手順の実施が必要となります
-
ucidm-cli コマンドに LDAP サーバーへの CSV 一括取込機能を追加
- バッチ処理のスクリプトなどで利用できます
1.7.0 (2025-05-02)
- deploy コマンドが DOCKER_HOST の環境変数を設定せずに実行できるよう変更
- api, consumer, agent, mongo サービスのコンテナ内で実行されるアプリケーションを non-root ユーザーで実行します。この変更により、コンテナ運用における攻撃に対する予防策になります
- 本変更に伴い、以下の手順の実施が必要となります
1.6.0 (2025-02-18)
- パッケージの変更はない
1.5.0 (2025-01-10)
- 初期リリース版
LDAP PassSync Agent リリースノート
LDAP PassSync Agent の修正内容について記載しています。
1.1.1-13 (2025-10-14)
- パスワード連携に失敗したときのリカバリ処理に有効期限を設けるように変更
1.1.1-10 (2025-07-24)
- エラーログを履歴画面で確認できるよう、エラー内容を UCIDM API に連携するように変更
1.1.1-9 (2025-05-02)
- agent コマンドの依存ライブラリの更新
- osstech-openldap 2.5.19 のサポート
1.1.1-7 (2025-02-13)
- 初期リリース版
AD PassSync Agent リリースノート
AD PassSync Agent の修正内容について記載しています。
1.1.10 (2025-07-24)
- エラーログを履歴画面で確認できるよう、エラー内容を UCIDM API に連携するよう改修
1.1.9 (2024-01-26)
- 初期リリース版
クイックスタート
この章では UCIDM のインストール、設定および起動と動作確認の一連の手順について説明します。
ここでは、連携元ディレクトリサービスとして、OpenLDAP、連携先サービスとして以下を設定する前提で手順を記載しています。
- Local
- 連携されてきたユーザー/グループの情報をコンテナログに出力するのみのデバッグ用モジュールです。
- OpenLDAP
本クイックスタートを実施することで、以下の環境が構築できます。

事前準備
UCIDM 用の RHEL9 または RHEL10 互換 OS のサーバーを 1 台用意してください。サポート OS については インストール要件 - サポート OS の各項をご参照ください。
また、連携元ディレクトリサービスの OpenLDAP、連携先サービスの OpenLDAP をそれぞれ予めご用意ください。
UCIDM クイックスタート
OpenLDAP PassSync Agent クイックスタート
属性情報に加えて、パスワード情報の連携も行いたい場合、以下の OpenLDAP PassSync Agent クイックスタートの手順も実施してください。
OpenLDAP PassSync Agent クイックスタート
UCIDM クイックスタート
ここでは、UCIDM のクイックスタートの手順について説明します。
インストール、設定の順で実施することで UCIDM 動作環境が構築できます。
UCIDM クイックスタート - インストール
UCIDM のインストール手順については以下をご参照ください。
UCIDM クイックスタート - 設定
UCIDM の設定手順については以下をご参照ください。
UCIDM クイックスタート - インストール
ここでは、UCIDM のインストール手順について説明します。
Docker と Docker Compose のインストール
以下コマンドで Docker と Docker Compose をインストールします。詳細については、Compose パッケージ - 初回インストールするとき をご参照ください。
# dnf install -y dnf-plugins-core
# dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
# dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
UCIDM パッケージのインストール
.tar.gz のファイルを展開してインストールコマンドを実行します。ここでは RHEL9 の 1.0.0-1 というバージョンを例にインストール作業の説明をしますが、適宜お手持ちの OS, 最新のバージョンに置き換えて作業してください。詳細については、UCIDM パッケージ - 初回インストールするとき をご参照ください。
# tar xf osstech-ucidm-1.0.0-1.el9.x86_64.tar.gz
# cd osstech-ucidm-1.0.0-1.el9.x86_64/
# ./install.sh
Reverse Proxy の設定
UCIDM API や管理画面にアクセスするときに HTTPS で通信するためのリバースプロキシを設定します。
パッケージのインストール
以下 dnf パッケージをインストールします。
# dnf install -y httpd mod_ssl
SELinux の設定
SELinux が有効な場合はリバースプロキシの振る舞いを許可する必要があります。httpd_can_network_connect を有効にします。詳細については、Reverse Proxy - SELinux の設定 をご参照ください。
# setsebool -P httpd_can_network_connect on
# getsebool httpd_can_network_connect
httpd_can_network_connect --> on
Apache の設定
Apache の UCIDM 用テンプレートファイルを配置します。
# cd /etc/httpd
# cp -a /opt/osstech/share/ucidm/httpd/* .
/etc/httpd/conf/httpd.conf のファイルについて、環境に合わせて VirtualHost の以下の点を編集します。詳細については、Reverse Proxy - Virtualhost の設定 をご参照ください。
- ServerName にホスト名を設定します。
- Location ディレクティブ 単位にアクセス制限の設定を行います。
- SSLCertificateKeyFile, SSLCertificateFile に証明書を設定します。
<VirtualHost *:443>
ServerName serverName.example.com
...
SSLEngine On
SSLCertificateKeyFile /etc/httpd/private/sample.key
SSLCertificateFile /etc/httpd/certs/sample-server.crt
<Location "/ui/user">
ProxyPass http://localhost:5030/ui/user retry=10
ProxyPassReverse http://localhost:5030/ui/user
Require all granted
</Location>
<Location "/ui/admin">
ProxyPass http://localhost:5030/ui/admin retry=10
ProxyPassReverse http://localhost:5030/ui/admin
Require all granted
</Location>
<Location "/ui">
ProxyPass http://localhost:5030/ui retry=10
ProxyPassReverse http://localhost:5030/ui
Require all granted
</Location>
<Location "/sys">
ProxyPass http://localhost:3030/sys retry=10
ProxyPassReverse http://localhost:3030/sys
Require all granted
</Location>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/ui
RewriteRule ^/$ /ui [R=301,L]
</VirtualHost>
<VirtualHost *:8443>
ServerName serverName.example.com
...
SSLEngine On
SSLCertificateKeyFile /etc/httpd/private/sample.key
SSLCertificateFile /etc/httpd/certs/sample-server.crt
<Location "/">
ProxyPass http://localhost:18080/ retry=10
ProxyPassReverse http://localhost:18080/
Require all granted
</Location>
</VirtualHost>
サービスの起動
起動および自動起動設定を行います。
# systemctl start httpd
# systemctl enable httpd
rsyslog の umask の設定
systemd から起動される rsyslog サービスの umask 設定を変更するために /etc/rsyslog.conf に設定を追加します。次のように $Umask と $FileCreateMode をグローバル設定として追加します。
# vi /etc/rsyslog.conf
...
#### GLOBAL DIRECTIVES ####
$Umask 0006
$FileCreateMode 0600
rsyslog サービスを再起動します。
# systemctl restart rsyslog
詳細については、UCIDM パッケージ - 初回インストールするとき をご参照ください。
nf_tables モジュールのロード
nf_tables モジュールがロードされているかどうかを確認します。以下 lsmod のコマンドで以下例のような出力があればロードされています。
# lsmod | grep nf_tables
nf_tables 356352 0
nfnetlink 20480 1 nf_tables
libcrc32c 12288 2 nf_tables,xfs
上記 lsmod のコマンドで出力がない場合は、以下コマンドで nf_tables モジュールのロードを行ってください。
# modprobe nf_tables
ucidm ユーザーの設定
ucidm パッケージインストール時に自動生成される ucidm ユーザーのパスワードを設定します。
# passwd ucidm
ユーザー ucidm のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
別端末にて ucidm ユーザーでログインしてから後続の手順を実施してください。
もし ucidm ユーザーで直接ログインしないときは machinectl コマンドでユーザーを切り替える ようにしてください。
Rootless Docker のインストール
以下コマンドで Rootless Docker をインストールします。
$ dockerd-rootless-setuptool.sh install
Docker Compose の設定
Docker Hub にログインします。実際に設定するパスワードは弊社のサポート担当者にご確認ください。詳細については、Compose サービスの準備 - コンテナレジストリへのアクセス設定 をご参照ください。
$ docker login --username osstech
Password: # パスワードを入力
...
Login Succeeded
Docker Compose の設定ファイルの配置
ucidm ユーザーのホームディレクトリである /var/opt/osstech/lib/ucidm に Docker Compose の設定ファイル群を配置します。
$ cd
$ cp /opt/osstech/share/ucidm/compose.yml .
$ cp /opt/osstech/share/ucidm/ucidm.env.example ucidm.env
$ ln -s "$(pwd)/ucidm.env" "$(pwd)/.env"
$ cp -a /opt/osstech/share/ucidm/{mongodb,rabbitmq,agent-data,server-data,ucidm-ui} .
コンテナイメージの取得
以下コマンドでコンテナイメージを取得します。
$ docker compose pull
UCIDM クイックスタート - 基本設定
compose.yml の設定
/var/opt/osstech/lib/ucidm/compose.yml の内容を以下のように編集します。設定の詳細については UCIDM サーバー の各項をご参照ください。
x-logging: &default-logging
driver: journald
options:
tag: "ucidm-{{.Name}}"
services:
admin-ui:
container_name: admin-ui
image: docker.io/osstech/ucidm-admin-ui:latest
logging: *default-logging
environment:
PORT: "${ADMIN_NODE_PORT}"
PUBLIC_UCIDM_API_SERVER: "http://${API_HOST}:${API_PORT}"
JWT_ACCESS_SECRET: "${ADMIN_UI_JWT_ACCESS_SECRET}"
SESSION_MAX_AGE: "${SESSION_MAX_AGE}"
ports:
- 127.0.0.1:${ADMIN_NODE_PORT}:${ADMIN_NODE_PORT}
restart: "always"
ucidm-ui:
container_name: ucidm-ui
image: docker.io/osstech/ucidm-ui:latest
logging: *default-logging
environment:
PORT: "${UCIDM_NODE_PORT}"
PUBLIC_UCIDM_API_SERVER: "http://${API_HOST}:${API_PORT}"
PUBLIC_ADMIN_UI_URL: "${ADMIN_UI_URL}"
JWT_ACCESS_SECRET: "${UCIDM_UI_JWT_ACCESS_SECRET}"
SESSION_MAX_AGE: "${SESSION_MAX_AGE}"
DISABLE_HEADER_TEMPLATE: "${DISABLE_HEADER_TEMPLATE}"
DISABLE_FOOTER_TEMPLATE: "${DISABLE_FOOTER_TEMPLATE}"
DEFAULT_LANGUAGE: "${DEFAULT_LANGUAGE}"
BODY_SIZE_LIMIT: "Infinity"
ports:
- 127.0.0.1:${UCIDM_NODE_PORT}:${UCIDM_NODE_PORT}
restart: "always"
volumes:
- type: bind
source: ./ucidm-ui/designs
target: /designs
bind:
create_host_path: false
- type: bind
source: ./ucidm-ui/images
target: /images
bind:
create_host_path: false
api:
depends_on:
mongo:
condition: service_healthy
rabbitmq:
condition: service_healthy
container_name: api
hostname: api
image: docker.io/osstech/ucidm-api:latest
logging: *default-logging
volumes:
- type: bind
source: ./server-data
target: /ucidm
bind:
create_host_path: false
- type: bind
source: ./server-data/files
target: /files
bind:
create_host_path: true
entrypoint:
- ./bin/entrypoint.sh
- -port
- ${API_PORT}
- -jsonl
environment:
TZ: "${TZ}"
#SSL_CERT_FILE: "${SSL_CERT_FILE}"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
RABBITMQ_USER: "${RABBITMQ_USER}"
RABBITMQ_PASSWORD: "${RABBITMQ_PASSWORD}"
RABBITMQ_HOST: "${RABBITMQ_HOST}"
ports:
- 127.0.0.1:${API_PORT}:${API_PORT}
restart: "always"
consumer-local-001:
depends_on:
mongo:
condition: service_healthy
rabbitmq:
condition: service_healthy
container_name: consumer-local-001
image: docker.io/osstech/ucidm-consumer:latest
logging: *default-logging
volumes:
- type: bind
source: ./server-data
target: /ucidm
bind:
create_host_path: false
entrypoint:
- ./bin/consumer
- -jsonl
environment:
TZ: "${TZ}"
DESTINATION_ID: "local-001"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
RABBITMQ_USER: "${RABBITMQ_USER}"
RABBITMQ_PASSWORD: "${RABBITMQ_PASSWORD}"
RABBITMQ_HOST: "${RABBITMQ_HOST}"
restart: "always"
mongo:
container_name: mongo
image: docker.io/bitnamilegacy/mongodb:8.0.3
logging: *default-logging
volumes:
- type: bind
source: ./mongodb
target: /bitnami/mongodb
bind:
create_host_path: false
environment:
TZ: "${TZ}"
MONGODB_ROOT_USER: "${MONGO_USER}"
MONGODB_ROOT_PASSWORD: "${MONGO_PASSWORD}"
MONGODB_PORT_NUMBER: "27017"
MONGODB_INITIAL_PRIMARY_PORT_NUMBER: "27017"
MONGODB_ADVERTISED_HOSTNAME: "${MONGO_HOSTNAME}"
MONGODB_REPLICA_SET_NAME: "${MONGO_REPLICA_SET}"
MONGODB_REPLICA_SET_MODE: "primary"
MONGODB_REPLICA_SET_KEY: "my/replication/common/key123"
MONGODB_SYSTEM_LOG_VERBOSITY: 0
hostname: "${MONGO_HOSTNAME}"
restart: "always"
healthcheck:
test: mongosh "mongodb://localhost:27017/test?directConnection=false&replicaSet=${MONGO_REPLICA_SET}" --eval 'db.runCommand("ping").ok' --quiet
interval: 60s
timeout: 5s
retries: 3
start_period: 30s
start_interval: 3s
rabbitmq:
container_name: rabbitmq
hostname: rabbitmq
image: docker.io/library/rabbitmq:4.0.3-management
logging: *default-logging
environment:
RABBITMQ_DEFAULT_USER: "${RABBITMQ_USER}"
RABBITMQ_DEFAULT_PASS: "${RABBITMQ_PASSWORD}"
ports:
- 127.0.0.1:15672:15672
volumes:
- type: bind
source: ./rabbitmq/rabbitmq.conf
target: /etc/rabbitmq/rabbitmq.conf
read_only: true
bind:
create_host_path: false
- type: bind
source: ./rabbitmq-data
target: /var/lib/rabbitmq
bind:
create_host_path: true
restart: "always"
healthcheck:
test: rabbitmq-diagnostics -q ping
interval: 60s
timeout: 5s
retries: 3
start_period: 30s
start_interval: 5s
agent-ldap:
depends_on:
- api
container_name: agent-ldap
image: docker.io/osstech/ucidm-agent:latest
logging: *default-logging
volumes:
- type: bind
source: ./agent-data/openldap
target: ${AGENT_PAGE_KEY_PATH}
bind:
create_host_path: false
entrypoint:
- ./bin/agent
- -verbose
- -jsonl
environment:
TZ: "${TZ}"
#SSL_CERT_FILE: "${SSL_CERT_FILE}"
PROTOCOL: "syncrepl"
PAGE_KEY_PATH: "${AGENT_PAGE_KEY_PATH}"
RELOAD_INTERVAL: "${AGENT_RELOAD_INTERVAL}"
API_HOST: "${API_HOST}"
API_PORT: "${API_PORT}"
API_ACCOUNT_AUTH_USER: "${API_ACCOUNT_AUTH_USER}"
API_ACCOUNT_AUTH_PASSWORD: "${API_ACCOUNT_AUTH_PASSWORD}"
restart: "always"
ucidm.env の設定
/var/opt/osstech/lib/ucidm/ucidm.env の内容を以下のように編集します。設定の詳細については UCIDM サーバー の各項をご参照ください。
- ADMIN_UI_URL のホスト名は環境に合わせたものを設定してください。
- 本番環境では、MongoDB や RabbitMQ のユーザー名/パスワード、アカウント認証用パスワード、JWT のアクセスシークレット等についても値を設定してください。
- API_ACCOUNT_AUTH_PASSWORD で設定したパスワードは、この後 ID 連携管理画面で設定します。
# timezone
TZ="Asia/Tokyo"
# Mongo Setting
MONGO_USER=mongo-root
MONGO_PASSWORD="mongo-passwd"
MONGO_HOSTNAME="mongo.example.com"
MONGO_HOSTS="mongo.example.com:27017"
MONGO_REPLICA_SET="ucidm-rs"
# RabbitMQ Setting
RABBITMQ_USER="mq-root"
RABBITMQ_PASSWORD="mq-passwd"
RABBITMQ_HOST="rabbitmq:5672"
# api/consumer settings
MAX_PRODUCER_SESSIONS="512"
API_HOST="api"
API_PORT="18080"
API_ACCOUNT_AUTH_USER="agent"
API_ACCOUNT_AUTH_PASSWORD="agent-pass"
# Agent
## Common
AGENT_PAGE_KEY_PATH="/opt/osstech/var/lib/agent/data"
AGENT_RELOAD_INTERVAL="1m"
# frontend settings
ADMIN_NODE_PORT="3030"
UCIDM_NODE_PORT="5030"
ADMIN_UI_JWT_ACCESS_SECRET="9313cb24e03ee4300a2cc94061143dda5f59d6e20a107ff2ffa15ffe2bx8f9cb"
UCIDM_UI_JWT_ACCESS_SECRET="ZU7BEEXncPPWet6zaz2whjEEHvKSiVU5ViWhvkAYAeaCNMnLavECdcJLZDg4lTOk"
SESSION_MAX_AGE="3600"
DISABLE_HEADER_TEMPLATE="false"
DISABLE_FOOTER_TEMPLATE="false"
DEFAULT_LANGUAGE="en"
ADMIN_UI_URL="https://serverName.example.com/sys"
Compose サービスの実行
MongoDB と RabbitMQ の初期設定を行います。起動して 1 〜 2 分 /var/log/osstech/ucidm/ucidm-mongo.log の MongoDB のコンテナログを監視して出力が停止したのを確認します。
$ docker compose up -d mongo rabbitmq
すべてのコンテナを起動します。詳細については Compose サービスの実行 の各項をご参照ください。
$ docker compose up -d
ID 連携管理画面へのアクセスおよび設定
ID 連携管理画面にアクセスし、初期アカウント(admin/password)でログインします。
- https://<サーバー HOST>/sys
アカウント設定
ホーム画面の「管理者アカウント」を選択し、管理者アカウント一覧画面に遷移します。管理者アカウント一覧画面で、agent のパスワード変更を選択します。ucidm.env の API_ACCOUNT_AUTH_PASSWORD に設定したパスワードを指定してください。

システム設定
ホーム画面の「システム設定」を選択し、システム設定一覧画面に遷移します。metaOpenLDAP セクションの「詳細」を選択します。

連携元ディレクトリサービスの OpenLDAP の環境情報を入力し、「更新」ボタンを押下して保存します。システム設定 - 連携元データソースの接続設定 についても合わせてご参照ください。接続情報に不備がある場合、「更新」ボタン押下時にエラーが表示され、設定内容の保存ができません。
システム設定一覧画面の「UCIDM API の再起動」ボタンを押下して、metaOpenLDAP セクションの設定を反映させます。

agent-ldap のコンテナ環境変数の RELOAD_INTERVAL の時間が経過すると、metaOpenLDAP セクションの設定の再取得および連携元ディレクトリサービスの OpenLDAP への再接続が行われ、連携元ディレクトリサービスの OpenLDAP のデータが UCIDM を介して外部連携されます。現状はデバッグ用の Local コンテナログ出力モジュールのみに接続されています。
RELOAD_INTERVAL の時間待機せずとも、以下で agent-ldap のコンテナを再起動することで設定を即時反映させることもできます。
$ docker compose restart agent-ldap
ホーム画面の「履歴一覧」を選択し、履歴一覧画面に遷移します。「ID 連携履歴」を選択します。

ID 連携履歴画面で連携元ディレクトリサービスの OpenLDAP のデータが Local コンテナログ出力モジュールに連携されていることを確認します。

ここまでで、連携元ディレクトリサービスの OpenLDAP から UCIDM を経由して外部サービスの Local コンテナログ出力モジュールへの疎通が完了となります。
ユーザープロファイル画面(管理者用)へのアクセスおよび設定
ユーザープロファイル画面(管理者用)にアクセスし、ID 連携管理画面と同じアカウントでログインします。
- https://<サーバー HOST>/ui/admin
表示・属性値設定
ホーム画面の「表示・属性値設定」を選択し、表示・属性値設定一覧画面に遷移します。ユーザーの「編集」を選択します。

連携元ディレクトリサービスの OpenLDAP にて参照・編集したい属性を設定し、「更新」ボタンを押下します。グループについても同様に設定を行ってください。
以下に設定の一例を示します。設定の詳細については ユーザープロファイル画面(管理者用) - 表示・属性値設定 をご参照ください。
ユーザー表示・属性値設定の例
- 属性名:uid
- 検索設定
- 表示:true
- 検索対象:true
- 入力設定
- 必須:true
- 多値:false
- 参照のみ:false
- 検索設定
- 属性名:cn
- 検索設定
- 表示:true
- 検索対象:true
- 入力設定
- 必須:true
- 多値:false
- 参照のみ:false
- 検索設定
- 属性名:sn
- 検索設定
- 表示:true
- 検索対象:true
- 入力設定
- 必須:true
- 多値:false
- 参照のみ:false
- 検索設定
- 属性名:displayName
- 検索設定
- 表示:true
- 検索対象:true
- 入力設定
- 必須:false
- 多値:false
- 参照のみ:false
- 検索設定
- 属性名:givenName
- 検索設定
- 表示:true
- 検索対象:true
- 入力設定
- 必須:false
- 多値:false
- 参照のみ:false
- 検索設定
- 属性名:mail
- 検索設定
- 表示:false
- 検索対象:true
- 入力設定
- 必須:true
- 多値:true
- 参照のみ:false
- 検索設定
- 属性名:description
- 検索設定
- 表示:false
- 検索対象:false
- 入力設定
- 必須:false
- 多値:false
- 参照のみ:false
- 検索設定
- 属性名:homeDirectory
- 検索設定
- 表示:false
- 検索対象:true
- 入力設定
- 必須:true
- 多値:false
- 参照のみ:false
- 検索設定
- 属性名:loginShell
- 検索設定
- 表示:false
- 検索対象:true
- 入力設定
- 必須:true
- 多値:false
- 参照のみ:false
- 検索設定
- 属性名:uidNumber
- 検索設定
- 表示:false
- 検索対象:true
- 入力設定
- 必須:true
- 多値:false
- 参照のみ:false
- 検索設定
- 属性名:gidNumber
- 検索設定
- 表示:false
- 検索対象:true
- 入力設定
- 必須:true
- 多値:false
- 参照のみ:false
- 検索設定
グループ表示・属性値設定の例
- 属性名:cn
- 検索設定
- 表示:true
- 検索対象:true
- 入力設定
- 必須:true
- 多値:false
- 参照のみ:false
- 検索設定
- 属性名:description
- 検索設定
- 表示:true
- 検索対象:false
- 入力設定
- 必須:false
- 多値:false
- 参照のみ:false
- 検索設定
- 属性名:gidNumber
- 検索設定
- 表示:true
- 検索対象:true
- 入力設定
- 必須:true
- 多値:false
- 参照のみ:false
- 検索設定
ロール設定
ホーム画面の「ロール設定」を選択し、ロール設定一覧画面に遷移します。ldap-user ロールの「編集」を選択します。

メニュータブで以下を on にして更新します。これによりユーザープロファイル画面(一般ユーザー用)でのユーザー属性変更とパスワード変更の操作が可能となります。
- ユーザー属性変更
- パスワード変更
続いて、同じ画面のユーザー属性タブでユーザープロファイル画面(一般ユーザー用)の画面における各属性の権限を設定します。
以下に設定の一例を示します。設定の詳細については ユーザープロファイル画面(管理者用) - ロール設定画面 をご参照ください。
ロール設定 - ユーザー属性設定の例
- 属性名:uid
- 参照:false
- 編集:false
- 削除:false
- 属性名:cn
- 参照:true
- 編集:false
- 削除:false
- 属性名:sn
- 参照:true
- 編集:false
- 削除:false
- 属性名:displayName
- 参照:true
- 編集:true
- 削除:false
- 属性名:givenName
- 参照:true
- 編集:false
- 削除:false
- 属性名:mail
- 参照:true
- 編集:true
- 削除:false
- 属性名:description
- 参照:true
- 編集:false
- 削除:false
- 属性名:homeDirectory
- 参照:true
- 編集:false
- 削除:false
- 属性名:loginShell
- 参照:true
- 編集:true
- 削除:false
- 属性名:uidNumber
- 参照:false
- 編集:false
- 削除:false
- 属性名:gidNumber
- 参照:false
- 編集:false
- 削除:false
- 認証デバイス設定
- ワンタイムパスワード用Authenticator
- 参照:false
- 編集:false
- 削除:false
- パスキー
- 参照:false
- 編集:false
- 削除:false
- ワンタイムパスワード用Authenticator
ここまでで、以下ができるようになります。
- ユーザープロファイル画面(管理者用)での連携元ディレクトリサービスの OpenLDAP の参照・編集
- ユーザープロファイル画面(一般ユーザー用)での一般ユーザーログインおよび自身の情報の参照・編集
- https://<サーバー HOST>/ui
UCIDM クイックスタート - LDAP 外部連携設定
この項では、UCIDM の設定に LDAP の外部連携設定を追加します。
compose.yml の設定
/var/opt/osstech/lib/ucidm/compose.yml の services: に以下を追記します。設定の詳細については UCIDM サーバー の各項をご参照ください。
services:
...
(以下を追記)
consumer-ldap-001:
depends_on:
mongo:
condition: service_healthy
rabbitmq:
condition: service_healthy
container_name: consumer-ldap-001
image: docker.io/osstech/ucidm-consumer:latest
logging: *default-logging
volumes:
- type: bind
source: ./server-data
target: /ucidm
bind:
create_host_path: false
entrypoint:
- ./bin/consumer
- -jsonl
environment:
TZ: "${TZ}"
DESTINATION_ID: "ldap-001"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
RABBITMQ_USER: "${RABBITMQ_USER}"
RABBITMQ_PASSWORD: "${RABBITMQ_PASSWORD}"
RABBITMQ_HOST: "${RABBITMQ_HOST}"
LDAP_URL: "${LDAP_URL}"
LDAP_BIND_DN: "${LDAP_BIND_DN}"
LDAP_BIND_PASSWORD: "${LDAP_BIND_PASSWORD}"
restart: "always"
ucidm.env の設定
/var/opt/osstech/lib/ucidm/ucidm.env に以下設定を追加します。設定の詳細については UCIDM サーバー - OpenLDAP 外部連携モジュール の各項をご参照ください。
- LDAP_URL/LDAP_BIND_DN/LDAP_BIND_PASSWORD には自身の環境の連携先 LDAP の情報を設定してください。
# destination settings
## OpenLDAP
LDAP_URL="ldap://external-ldap.example.com"
LDAP_BIND_DN="cn=admin,dc=external,dc=example,dc=com"
LDAP_BIND_PASSWORD="password"
ID 連携管理画面へのアクセスおよび設定
ID 連携管理画面にアクセスし、ログイン後に以下設定を行います。
外部連携設定
ホーム画面の「外部連携設定」を選択し、外部連携設定一覧画面に遷移します。外部連携設定一覧画面で、登録ボタンを押下します。

以下情報を入力して、登録ボタンを押下し、LDAP に対する外部連携設定を作成します。設定の詳細については UCIDM サーバー - OpenLDAP 外部連携モジュール の各項をご参照ください。
外部連携主要情報タブ
- 連携 ID
- federation-ldap-001
- 外部連携先 ID(consumer-ldap-001 の環境変数 DESTINATION_ID と同一の文字列を指定します。)
- ldap-001
- 外部連携先 タイプ
- LDAP
動作設定タブ
- TLS の検証をスキップ
- true
- 外部連携先 LDAP への接続時に TLS の検証をスキップする場合は true に設定します。
- 環境に合わせた値を設定してください。
- true
- グループメンバー用属性名
- memberUid
- 環境に合わせた値を設定してください。
- 有効無効設定情報を使用する
- false
- ステータス用属性名
- false
- ドライランモード
- false
- この設定を true にすることで、連携先にユーザー/グループの更新データが送信されなくなります。まずは接続等の検証を行いたいといった場合は、この設定を true に設定してください。
- memberUid
マッピングタブ
- ユーザーマッピング設定
- DN マッピング
- DN 変換先の RDN 属性名
- uid
- DN の変換先部分
- ou=ldappeople,dc=external,dc=example,dc=com
- 自身の環境に合わせた値を指定してください
- ou=ldappeople,dc=external,dc=example,dc=com
- DN の変換元部分
- ou=ldappeople,dc=srcldap,dc=example,dc=com
- 自身の環境に合わせた値を指定してください
- ou=ldappeople,dc=srcldap,dc=example,dc=com
- DN 変換先の RDN 属性名
- objectClass マッピング
- 設定なし
- 連携元 LDAP と連携先 LDAP において objectClass の値が異なる場合には設定が必要です
- 自身の環境に合わせた値を指定してください
- 設定なし
- 属性マッピング
- 連携先の属性名:uid
- 連携元の属性名:uid
- 連携先の属性名:cn
- 連携元の属性名:cn
- 連携先の属性名:sn
- 連携元の属性名:sn
- 連携先の属性名:givenName
- 連携元の属性名:givenName
- 連携先の属性名:mail
- 連携元の属性名:mail
- 連携先の属性名:displayName
- テンプレート文字列:%{cn} %{sn}
- 連携先の属性名:loginShell
- 固定値:/bin/bash
- 連携先の属性名:homeDirectory
- テンプレート文字列:/home/%{uid}
- 連携先の属性名:uidNumber
- 連携元の属性名:uidNumber
- 連携先の属性名:gidNumber
- 連携元の属性名:gidNumber
- 連携先の属性名:objectClass
- 連携元の属性名:objectClass
- 連携先 LDAP に連携したい属性について、自身の環境に合わせた値を指定してください
- 連携先の属性名:uid
- DN マッピング
- グループマッピング設定
- DN マッピング
- DN 変換先の RDN 属性名
- cn
- DN の変換先部分
- ou=ldapgroup,dc=external,dc=example,dc=com
- 自身の環境に合わせた値を指定してください
- ou=ldapgroup,dc=external,dc=example,dc=com
- DN の変換元部分
- ou=ldapgroup,dc=srcldap,dc=example,dc=com
- DN 変換先の RDN 属性名
- objectClass マッピング
- 設定なし
- 連携元 LDAP と連携先 LDAP において objectClass の値が異なる場合には設定が必要です
- 自身の環境に合わせた値を指定してください
- 設定なし
- 属性マッピング
- 連携先の属性名:cn
- 連携元の属性名:cn
- 連携先の属性名:description
- 連携元の属性名:description
- 連携先の属性名:gidNumber
- 連携元の属性名:gidNumber
- 連携先の属性名:objectClass
- 連携元の属性名:objectClass
- 連携先 LDAP に連携したい属性について、自身の環境に合わせた値を指定してください
- 連携先の属性名:cn
- DN マッピング
前処理・後処理スクリプトタブ
今回は設定しません。
ルート設定
ホーム画面の「ルート設定」を選択し、ルート設定一覧画面に遷移します。ルート設定一覧画面で、登録ボタンを押下します。

以下情報を入力して、登録ボタンを押下し、LDAP 外部連携設定に対するルート設定を作成します。設定の詳細については ID 連携管理画面 - ルート設定画面 の各項をご参照ください。
- ルート情報
- ルート ID
- route-for-federation-ldap-001
- 連携 ID
- federation-ldap-001
- ルート ID
- 連携条件
- 今回は設定しません。
Compose サービスの実行
LDAP 外部連携モジュールのコンテナを起動を行います。
$ docker compose up -d consumer-ldap-001
ここまでで、連携元ディレクトリサービスの OpenLDAP から UCIDM を経由して連携先 LDAP への疎通が完了となります。
連携元ディレクトリサービスの OpenLDAP のユーザー/グループの属性情報が更新されると、その情報が UCIDM を介して連携先 LDAP に自動反映されます。
連携結果については ID 連携履歴画面で確認できます。
連携元ディレクトリサービス LDAP の全データの同期
UCIDM クイックスタート - 基本設定 で行った手順により、連携元ディレクトリサービスの OpenLDAP のユーザー/グループの情報は UCIDM に対して初期連携されています。その後連携元ディレクトリサービスの OpenLDAP のユーザー/グループに対して更新された情報のみが、連携先 LDAP に伝搬されます。
連携先 LDAP を新規で構築したなど、連携元ディレクトリサービスの OpenLDAP に存在する全ユーザー/グループを連携したいといった場合は、resync update のコマンドを実行してください。
連携元ディレクトリサービスの OpenLDAP に存在する全ユーザーを再同期するコマンドは以下になります。
$ docker exec -it agent-ldap /bin/resync update -type user -dryrun=false -force
連携元ディレクトリサービスの OpenLDAP に存在する全グループを再同期するコマンドは以下になります。
$ docker exec -it agent-ldap /bin/resync update -type group -dryrun=false -force
ID 情報の再同期 のページも合わせてご参照ください。
OpenLDAP PassSync Agent クイックスタート
ここでは、OpenLDAP PassSync Agent のクイックスタートの手順について説明します。本項は UCIDM クイックスタート の作業が完了している前提での説明となります。
OpenLDAP PassSync Agent のインストール
インストールコマンドを実行します。ここでは RHEL9 の 1.0.0-1 というバージョンを例にインストール作業の説明をしますが、適宜お手持ちの OS, 最新のバージョンに置き換えて作業してください。詳細については、UCIDM パッケージ - 初回インストールするとき をご参照ください。
# dnf install -y osstech-ucidm-agent-ldap-passsync-1.0.0-1.el9.x86_64.rpm
agent.env の設定
/opt/osstech/etc/openldap/service/ucidm/agent.env の「リクエストする API サーバーの設定」内容を以下のように編集します。設定の詳細については OpenLDAP 向け PassSync Agent - agent.env の環境変数 をご参照ください。
- API_HOST には OpenLDAP からアクセス可能な UCIDM 稼働サーバーのホスト名を指定してください。
- API_ACCOUNT_AUTH_PASSWORD には ID 連携管理画面で設定した agent 管理アカウントのパスワードを指定してください。
- UCIDM API サーバーの任意の証明書を許可する場合は、API_SECURE_SKIP を true に設定する必要があります。
- 本番環境では API_SECURE_SKIP は設定しない(デフォルト値の false が使われます)など、自身の環境に合わせて設定してください。
# リクエストする API サーバーの設定
API_SCHEME="https"
API_HOST="ucidm.example.com"
API_PORT="8443"
API_ACCOUNT_AUTH_USER="agent"
API_ACCOUNT_AUTH_PASSWORD="agent-pass"
# UCIDM API サーバーの任意の証明書を許可する場合は以下を設定
# API_SECURE_SKIP="true"
サービスの起動設定
LDAP PassSync Agent のサービスの起動および自動起動の設定を行います。
# systemctl start osstech-ucidm-passsync.service
# systemctl enable osstech-ucidm-passsync.service
osstech-openldap の slapd.conf を次のように設定します。
ucidmpsync.la の moduleload の行を追加するとともに、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 の slapd.service に sender が PassSync の環境変数を参照できるように設定を追加します。systemctl edit を使って次の内容を設定してください。
# systemctl edit slapd.service
[Service]
EnvironmentFile=/opt/osstech/etc/openldap/service/ucidm/agent.env
slapd.service を再起動します。
# systemctl restart slapd.service
以上で、OpenLDAP PassSync Agent のインストールおよび設定は完了となります。
連携元ディレクトリサービスの OpenLDAP のユーザーのパスワードが更新されると、その情報が UCIDM を介して連携先 LDAP に自動反映されます。
連携結果については ID 連携履歴画面で確認できます。
その他の技術情報
MongoDB
UCIDM はデータをエントリーや設定などのデータを MongoDB で管理しています。
MongoDB の操作
運用作業などで MongoDB コンテナに同梱されているツールを直接使うときの方法を紹介します。
MongoDB Shell
mongosh を使って直接 MongoDB のデータにアクセスできます。
$ docker compose exec mongo sh -c 'mongosh "mongodb://localhost:$MONGODB_PORT_NUMBER/ucidm" \
--authenticationDatabase "admin" \
--username "$MONGODB_ROOT_USER" \
--password "$MONGODB_ROOT_PASSWORD"'
コレクションのドキュメントを数える。
myrs [direct: primary] ucidm> db.account.countDocuments()
21
検索条件に一意な値を指定してドキュメントを検索する。
myrs [direct: primary] ucidm> db.user.find({"dn":"uid=user1,ou=users,dc=example,dc=com"})
正規表現 (case-insensitve) を検索条件に指定してドキュメントを検索する。
myrs [direct: primary] ucidm> db.federation.find({"destinationID": {"$regex": "LOCAL-.*", "$options": "i"}})
ドキュメントを降順にソートして確認する。
myrs [direct: primary] ucidm> db.history.find().sort({"registeredAt": -1})
バックアップ/ダンプ
mongodump コマンドを使って1つのバイナリのダンプファイルを生成します。環境変数のユーザー名とパスワードは適宜、設定した値を指定してください。デフォルトでは ucidm というデータベースを使っています。ダンプは相対的に速く完了します。定期的に実行してフルバックアップとして保管することもできます。
$ echo ${PASSWORD} | docker compose exec --no-TTY mongo \
mongodump --authenticationDatabase admin \
--uri "mongodb://${USERNAME}@localhost:27017" \
--db ucidm --archive > $(date +%Y%m%d)-mongodb.dump
$ ls
20231002-mongodb.dump ...
リストア/インポート
mongorestore コマンドを使って mongodump で取得したダンプファイルからデータベースを復元します。ここではデータベースの名前が ucidm であるという前提で実行しています。リストアはダンプと比較して、相対的に多くの時間がかかります。
$ docker compose exec --interactive --no-TTY mongo \
mongorestore --authenticationDatabase admin \
--uri "mongodb://${USERNAME}:${PASSWORD}@localhost:27017" \
--nsInclude "ucidm.*" --archive < ./20231002-mongodb.dump
docker コマンド操作
docker コマンドを使ったコマンドラインの操作を紹介します。
ログ確認
ここではコンテナのログの確認方法について説明します。
docker logs というサブコマンドを使って確認できます。
compose.yml で定義したコンテナ名を使ってサービスのログを確認できます。基本的にはサービス名とコンテナ名を同じ名前にしています。次のような設定の場合 app サービスのコンテナ名は app になります。
services:
app:
container_name: app
例えば、UCIDM API のコンテナ名は api と設定されていて、UCIDM API のログを確認するときは次のように実行します。
$ docker logs api
ログファイルの末尾100件から監視するといったときは次のように実行します。
$ docker logs -n 100 -f api
より詳細なコマンドの使い方については Docker 社の公式ドキュメントを参照してください。
JWT
UCIDM の認証で使用する JWT について紹介します。
JWT は、JSON 形式で署名や暗号化を用いて認証や情報共有に使用されます。
JWT は、署名によって保護されているため、秘密鍵の管理には十分な注意が必要になります。
シークレットの生成方法
/dev/urandom で生成します。生成された文字を環境変数に設定します。
$ head -c 64 /dev/urandom | base64
R28sScYPNyixe5WRiR2iUpuBBwSsAD4SPGmwpLmyabcAMaKR1PI/S58uAjWP2p9zSmeZuv3A+D5L
bIsmUDazMg==
Windowsサーバーコマンド連携手順
UCIDMのconsumerコンテナにはWinRM接続を行うためのPythonライブラリ pywinrm がインストールされています。 設定を行うことで、UCIDMからWindowsサーバーへコマンド連携が可能になります。 WinRMではいくつかの認証方式で接続できますが、ここではkerberos認証を使ってWindowsサーバーへ、WinRM接続する設定手順を説明します。
前提条件
設定手順を説明するにあたって、以下の条件を前提とします。
- UCIDMがインストール・設定済みであること
- WindowsサーバーにてActiveDirectoryがインストール・設定済みであること
- UCIDMインストール済みサーバーからWindowsサーバーへ通信が可能であること
- TCP/5985 (HTTP)
設定手順概要
設定手順はおおまかに以下の手順になります。 設定には接続元になるUCIDMサーバーと、接続先になるWindowsサーバーの両方で作業が必要になります。
- kerberosの設定
- pythonスクリプトの作成
- UCIDMの設定
kerberosの設定
kerberos認証を行うために、Kerberosの設定を行います。 kerberos認証には認証情報を含めたkeytabファイルを利用します。 keytabファイルの作成はWindowsサーバー側で行います。
Windowsサーバー側の設定
Windowsサーバー側での設定手順は以下の通りです。
- 接続用アカウントの作成
- keytabファイルの作成
また以下の情報が必要になるので、事前に確認してください。
- ActiveDirectoryのドメイン名 (例: EXAMPLE.COM)
- PowerShell上
Get-ADDomain | select Forestコマンドで確認出来ます
- PowerShell上
- Windowsサーバーのホスト名 (例: WIN-SERVER)
- PowerShell上
hostnameコマンドで確認出来ます
- PowerShell上
接続用アカウントの作成
winrm接続用のアカウントをActiveDirectoryに作成します。
ユーザー名とパスワードは特に制約はありません。
ここでは winrm / password とします。
作成したユーザーは Administrators グループに所属させてください。
keytabファイルの作成
keytabファイルは ktpass というコマンドで作成します。
Windowsサーバー上でPowerShellを起動し、以下のコマンドを実行してください。
ktpass -princ <プリンシパルネーム> -mapuser <接続用ユーザー名> -pass * -crypto AES256-SHA1 -out <keytabファイル名>
ここで、各パラメータは以下の通りです。
- プリンシパルネーム:
HTTP/<Windowsサーバーのホスト名>@<Active Directoryのドメイン名>という形式になります。 - 接続用ユーザー名: 先ほど作成した接続用アカウントのユーザー名
- keytabファイル名: 作成するkeytabファイルの名前を指定します。ここでは
winrm-<ドメイン名>.keytabとします。
例として、ドメイン名が EXAMPLE.COM、Windowsサーバーのホスト名が WIN-SERVER、接続用アカウントが winrm の場合、以下のようになります。
ktpass -princ HTTP/WIN-SERVER@EXAMPLE.COM -mapuser winrm -pass * -crypto AES256-SHA1 -out winrm-example.com.keytab
コマンドを実行するとパスワードの入力を求められるので、接続用アカウントのパスワードを入力してください。
コマンド実行後keytabファイルが作成されるので、UCIDMサーバーに転送します。 機密情報を含むので、慎重に取り扱ってください。
UCIDMサーバー側の設定
UCIDMサーバー側での設定手順は以下の通りです。
- kerberosの設定ファイルの作成・配置
- keytabファイルの配置
- composeファイルの編集
kerberosの設定ファイルの作成・配置
kerberosの設定ファイルを作成します。
winrmに関連するファイルをまとめるために、/opt/osstech/var/lib/ucidm/krb5/ というディレクトリを作成します。
kerberosの設定ファイルは /opt/osstech/var/lib/ucidm/krb5/winrm.conf というパスに作成します。
以下は設定ファイルの例です。
[libdefaults]
default_client_keytab_name = /etc/winrm.keytab
[realms]
EXAMPLE.COM = {
kdc = win-server.example.com
admin_server = win-server.example.com
}
[realms] セクションの値は環境に合わせて変更してください。
<ドメイン名> = {
kdc = <WindowsサーバーのFQDN>
admin_server = <WindowsサーバーのFQDN>
}
ファイル作成後パーミッションを調整します。
chmod 644 /opt/osstech/var/lib/ucidm/krb5/winrm.conf
keytabファイルの配置
前章で作成したディレクトリにkeytabファイルを配置します。
/opt/osstech/var/lib/ucidm/krb5/winrm-<ドメイン名>.keytab というパスに配置します。
配置後パーミッションを調整します。
chmod 640 /opt/osstech/var/lib/ucidm/krb5/winrm-<ドメイン名>.keytab
rootlesskit chown 1001:root /opt/osstech/var/lib/ucidm/krb5/winrm-<ドメイン名>.keytab
composeファイルの編集
composeファイルを編集して、作成したファイルをコンテナにバインドマウントします。
/opt/osstech/var/lib/ucidm/compose.yml ファイルを編集します。
winrmによるコマンド連携を行うconsumerコンテナの記述がされている箇所に、volumesの設定を追加します。
volumes:
- type: bind
source: ./krb5/winrm.conf
target: /etc/krb5.conf.d/winrm.conf
bind:
create_host_path: false
- type: bind
source: ./krb5/winrm-<ドメイン名>.keytab
target: /etc/winrm.keytab
bind:
create_host_path: false
変更を反映するにはconsumerコンテナを再生成してください。
pythonスクリプトの作成
pywinrmを使ってWindowsサーバーへコマンドを送信するサンプルスクリプトを示します。
import sys
import winrm
AD_SERVER = "win-server.example.com" # WindowsサーバーのFQDN
def main():
session = winrm.Session(AD_SERVER,
auth=(None, None),
transport="kerberos",
)
res = session.run_cmd("ipconfig")
print(res.std_out.decode("CP932"))
sys.exit(res.status_code)
if __name__ == "__main__":
main()
WindowsサーバーのFQDNとホスト名が一致していない場合は、 kerberos_hostname_override というパラメーターで別途ホスト名を指定してください。
session = winrm.Session(AD_SERVER,
auth=(None, None),
transport="kerberos",
kerberos_hostname_override="WIN-SERVER.EXAMPLE.COM" # Windowsサーバーのホスト名
)
作成したスクリプトは保存します。
保存先は外部連携名や実行タイミングに応じて変動します。
詳細は外部連携の前処理/後処理で実行するスクリプトの配置を参照してください。
ここでは例として /opt/osstech/var/lib/ucidm/server-data/destination/local-001/scripts/UserAdded/connect_ad.py というパスに保存します。
作成したスクリプトのパーミッションを調整します。
chmod 700 /opt/osstech/var/lib/ucidm/server-data/destination/local-001/scripts/UserAdded/connect_ad.py
rootlesskit chown 1001:root /opt/osstech/var/lib/ucidm/server-data/destination/local-001/scripts/UserAdded/connect_ad.py
変更を反映するにはconsumerコンテナとapiコンテナを再生成してください。
UCIDMの設定
UCIDMの管理画面から前処理/後処理で実行するスクリプトとして、今回作成したスクリプトを追加してください。
追加手順は 外部連携の前処理/後処理で実行するスクリプトの設定 を参照してください。