システム概要
Unicorn Cloud ID Manager (以下 UCIDM) は、クラウドまたは社内で管理している内部ディレクトリサービス (OpenLDAP や Active Directory 1 といったサービス) の ID 情報を外部サービスへ ID 連携するためのシステムです。ユーザーやグループの追加・更新・削除、またユーザーのパスワードを変更したときなど、それらの変更を検知して自動的に外部サービスへ ID 連携します。
UCIDM は管理者の運用コストを削減すべく、可能な限り、既存システムを変更することなく、追加で UCIDM サーバーを構築すればすぐ稼働するように設計されています。次のシステム構成図は、お客様のシステムと UCIDM のモジュールがどのように ID 連携されるかのデータフローを簡潔に 2 示したものです。
お客様のシステムにオンプレミス版を導入するとき、UCIDM サーバーを新規に構築して ID 連携します。パスワードを同期するための PassSync Agent のみ、内部ディレクトリサービスを提供するサーバーにインストールする必要があります 3。
オンプレミスの Active Directory のこと
厳密なシステム構成は UCIDM サーバー を参照してください
現時点ではクラウドサービスからパスワード連携することはできません
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 -- https --> api web-ui -- https --> api api -- messaging --> client admin[管理者] -- https --> web-ui client -- ldaps --> ext-directory-service client -- https --> ext-directory-service
インストール
お客様の環境に UCIDM オンプレミス版をインストールする方法を説明します。
UCIDM サーバー をインストールするマシンに関して、マシンスペックやサポート OS などについて インストール要件 をご確認ください。
インストール作業は大きく分けて次の手順になります。それぞれのモジュールのインストールドキュメントをご確認ください。
インストール要件
マシンスペック要件
UCIDM サーバーは複数のアプリケーションを同時に実行するため、ある程度の CPU とメモリサイズを要求します。次のマシンスペックを最低限としつつ、余裕をもったマシンスペックを推奨します。
- CPU のコア数: 4以上を推奨
- メモリ: 8GiB 以上を推奨
- ディスク: 100GiB 程度
また適切なマシンスペックは実運用でID 連携に想定されるピーク時のトラフィック量やリクエストの同時接続数などによっても変わります。運用要件として大きなトラフィック量が想定される場合は弊社のサポート担当者にご相談ください。
アーキテクチャ
現時点では x86_64
のみをサポートします。将来的に arm64
を検討します。
x86_64
サポート OS
- Red Hat Enterprise Linux 9 / 互換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 docker-ce-rootless-extras containerd.io docker-buildx-plugin docker-compose-plugin fuse-overlayfs iptables
アップグレードするとき
通常の dnf コマンドのアップグレードを実行してください。
# dnf upgrade -y docker-ce docker-ce-cli docker-ce-rootless-extras containerd.io docker-buildx-plugin docker-compose-plugin
UCIDM パッケージ
UCIDM は RPM パッケージで提供します。RPM パッケージの入手方法は弊社のサポート担当者にご確認ください。
実際には install.sh
などを同梱した tar.gz
ファイルになります。
初回インストールするとき
ここでは 1.0.0-1
というバージョンを例にインストール作業の説明をしますが、適宜お手持ちの最新のバージョンに置き換えて作業してください。
# 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/opt/osstech/lib/ucidm: compose サービスを管理するホームディレクトリ
ucidm ユーザーの設定
osstech-ucidm をインストールすると ucidm ユーザーが作成されます。docker グループが設定されていることを確認します。
# id ucidm
uid=991(ucidm) gid=991(ucidm) groups=991(ucidm),993(docker)
UCIDM は Docker Compose を使ってコンテナアプリケーションとして動作します。
セキュリティ強化の観点から、コンテナを root ユーザーではなく、非特権ユーザーで実行することが推奨されています。このことを rootless コンテナと呼び、非特権ユーザがコンテナを作成、実行、管理できます。
ここでは非特権ユーザーとして ucidm
というユーザー/グループを作成します。お客様の環境ですでに適切なユーザーが存在するときは任意のユーザー/グループをお使いください。
インストール直後はパスワードが未設定になります。任意のパスワードを設定します。
# passwd ucidm
ユーザー ucidm のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
/etc/sudoers の設定
ここでは非特権ユーザーの ucidm
が必要に応じて sudo コマンドを実行できるようにします。 これはセキュリティ上とても重要な設定になります。 お客様の環境にあわせて sudoers 設定の可否ならびに設定方法を精査してください。
# visudo
(必要な設定を記述する)
例として ucidm ユーザーに無制限の root 権限を付与すると次のような設定になります。
# grep ucidm /etc/sudoers
ucidm ALL=(ALL) ALL
ucidm ユーザーのログイン確認と docker サービスの初期設定
先ほど設定したパスワードで ucidm でログインできることを確認します。
Docker 社のドキュメントをベースに ucidm ユーザーが docker サービスを起動できるように初期設定します。
dockerd-rootless-setuptool.sh という setup スクリプトが用意されているので実行します。
$ dockerd-rootless-setuptool.sh install
[ERROR] Missing system requirements. Run the following commands to
[ERROR] install the requirements and run this tool again.
[ERROR] Alternatively iptables checks can be disabled with --skip-iptables .
########## BEGIN ##########
sudo sh -eux <<EOF
# Load ip_tables module
modprobe ip_tables
# Add subuid entry for ucidm
echo "ucidm:100000:65536" >> /etc/subuid
# Add subgid entry for ucidm
echo "ucidm:100000:65536" >> /etc/subgid
EOF
########## END ##########
もしこれらのエラーが発生したら、iptables のモジュールロード、ならびに subuid と subgid に ucidm
ユーザー/グループを追加します。
$ sudo sh -eux <<EOF
# Load ip_tables module
modprobe ip_tables
# Add subuid entry for ucidm
echo "ucidm:100000:65536" >> /etc/subuid
# Add subgid entry for ucidm
echo "ucidm:100000:65536" >> /etc/subgid
EOF
+ modprobe ip_tables
+ echo ucidm:100000:65536
+ echo ucidm:100000:65536
modprobe コマンドの実行後、再度 setup スクリプトを実行します。
$ dockerd-rootless-setuptool.sh install
実行結果ログに表示されている 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/991/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
OS の再起動時に systemd のユーザーインスタンスが起動するように linger を有効にします。
$ sudo loginctl enable-linger ucidm
$ loginctl show-user ucidm
UID=991
GID=991
Name=ucidm
Timestamp=Thu 2025-01-30 10:58:10 JST
TimestampMonotonic=110923418
RuntimePath=/run/user/991
Service=user@991.service
Slice=user-991.slice
Display=3
State=active
Sessions=3
IdleHint=no
IdleSinceHint=1738202488092508
IdleSinceHintMonotonic=308110904
Linger=yes
パッケージのアップグレード
アップグレード前に一度バックアップを取得することを推奨します。 バックアップの取得方法は バックアップ の項を参照してください。
アップグレード前に既存サービスを停止させます。
$ 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 パッケージに依存します。
初回インストールするとき
$ sudo dnf install -y osstech-base-3.1-163.el9.noarch.rpm osstech-ucidm-agent-ldap-passsync-1.0.0-1.el8.x86_64.rpm
インストール後の設定は OpenLDAP 向け PassSync Agent をご確認ください。
アップグレードするとき
アップグレード前に既存サービスを停止させます。
$ sudo systemctl stop osstech-slapd
$ sudo systemctl stop osstech-ucidm-passsync
通常の rpm パッケージのアップグレードを実行してください。
$ sudo rpm -Uvh osstech-ucidm-agent-ldap-passsync-1.0.0-2.el8.x86_64.rpm
アップグレードを完了したらサービスを開始します。
$ sudo systemctl start osstech-ucidm-passsync
$ sudo systemctl start osstech-slapd
Windows サーバー向け
UCIDM-ADPassHook-Setup.msi と UCIDM-ADPassSync-Setup.msi を使用してインストール/アップグレード/アンインストールを行います。
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\nFor AD] end subgraph linux [Linux サーバー] in-ldapserver[OSSTech OpenLDAP サーバー] passsync-agent-ldap[Agent PassSync\nFor OpenLDAP] end end subgraph server [UCIDM サーバー] proxy["リバースプロキシ\n(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["リバースプロキシ\n(TLS 終端)"] subgraph compose[Docker Compose] agent[Agent] admin-ui-bff[Admin UI] ucidm-ui-bff[UCIDM UI] api[UCIDM\nAPI] client[外部連携\nモジュール] 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 o--o sysadmin(システム\n管理者) admin-ui -- https --> proxy ucidm-ui o--o user(一般\nユーザー) ucidm-ui -- https --> proxy client -- ldaps/https --> ext-directory-service
UCIDM サーバーと周辺サービス全体
前節の図を1つに統合したデータフローです。
%%{init: {"flowchart": {"defaultRenderer": "elk"}} }%% flowchart TB subgraph server [UCIDM サーバー] proxy["リバースプロキシ\n(TLS 終端)"] subgraph compose[Docker Compose] agent[Agent] admin-ui-bff[Admin UI] ucidm-ui-bff[UCIDM UI] 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\nFor AD] end subgraph linux [Linux サーバー] in-ldapserver[OSSTech OpenLDAP サーバー] passsync-agent-ldap[Agent PassSync\nFor 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 o--o sysadmin(システム管理者) admin-ui -- https --> proxy 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: # パスワードを入力
ログインに成功すると、ホームディレクトリの .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 /var/opt/osstech/lib/ucidm
Docker Compose の設定のサンプルファイルを /var/opt/osstech/lib/ucidm
ディレクトリにコピーします。
$ cp /opt/osstech/share/ucidm/compose.yml .
$ cp /opt/osstech/share/ucidm/dot_env.example .env
Docker Compose 上でコンテナとして稼働するアプリケーションやミドルウェアの設定のサンプルファイルも一緒にコピーします。
$ cp -a /opt/osstech/share/ucidm/{rabbitmq,server-data,ucidm-ui} .
$ ls -a # 次のファイルやディレクトリがあることを確認
.env compose.yml rabbitmq server-data ucidm-ui
Docker Compose で各種コンテナを起動すると、サービスのデータを永続化するためのディレクトリがさらにいくつか作られます。コンテナのサービスごとに永続化データ、設定情報やスクリプト等のファイルを配置します。
これらのアプリケーションやミドルウェアの設定の詳細は次のページでみていきます。UCIDM で利用するサービスは次の通りです。
コンテナイメージの取得
compose.yml を配置したらコンテナイメージを取得します。すでにコンテナイメージを取得済みであっても、より新しいイメージがあれば最新のイメージを取得します。
$ docker compose pull
MongoDB
UCIDM は MongoDB に次の情報を格納します。
- ユーザやグループの情報
- 外部連携のために必要な情報
- ID 連携の履歴情報
- アカウント管理の情報
Docker Compose の設定
MongoDB はコンテナとして稼働させます。次のように compose.yml
に設定します。任意で設定している項目の値はサンプルです。お客様の環境にあわせて値を変更してください。
mongo:
container_name: mongo
user: root
image: docker.io/bitnami/mongodb:8.0.3
logging: *default-logging
volumes:
- type: bind
source: ./mongodb
target: /bitnami/mongodb
bind:
create_host_path: true
environment:
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
に設定します。
環境変数の設定
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
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
AMQP_URL という環境変数を設定します。
# rabbitmq の接続 URI
export AMQP_URL="amqp://${ユーザー}:${パスワード}@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"
}
]
}
AMQP_URL の環境変数を削除するには次のように実行します。
$ unset AMQP_URL
RabbitMQ の管理画面を使う
localhost:15672 にアクセスします (ここでは接続先を localhost として説明しますが、適宜、お客様の環境にあわせてください) 。次のように管理画面へのログインページが表示されます。
前節の環境変数で設定したユーザー名とパスワードを使ってログインします。
UCIDM API
UCIDM は ID 連携のための Web API を提供します。
- ユーザ操作
- グループ操作
- 外部連携先設定操作
- 履歴情報一覧
- ジョブ進捗概要取得
- ジョブ詳細情報取得
- 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: ./path/to/example.crt
# target: /saml/ucidm_samlsp.crt
# read_only: true
# bind:
# create_host_path: false
#- type: bind
# source: ./path/to/example.key
# target: /saml/ucidm_samlsp.key
# read_only: true
# bind:
# create_host_path: false
entrypoint:
- ./bin/entrypoint.sh
- -port
- ${API_PORT}
- -jsonl
environment:
AMQP_URL: "${AMQP_URL}"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
JWT_SECRET_KEY: "${JWT_SECRET_KEY}"
JWT_ACCESS_EXPIRATION_TIME: "${JWT_ACCESS_EXPIRATION_TIME}"
JWT_REFRESH_EXPIRATION_TIME: "${JWT_REFRESH_EXPIRATION_TIME}"
XFF_TRUST_IP_RANGES: "${XFF_TRUST_IP_RANGES}"
ID_FEDERATION_CLIENT_HOST: "${ID_FEDERATION_CLIENT_HOST}"
SMTP_HOST: "${SMTP_HOST}"
SMTP_PORT: "${SMTP_PORT}"
SMTP_AUTH_USERNAME: "${SMTP_AUTH_USERNAME}"
SMTP_AUTH_PASSWORD: "${SMTP_AUTH_PASSWORD}"
SMTP_USE_TLS: "${SMTP_USE_TLS}"
PASSWORD_RESET_MAIL_SENDER: "${PASSWORD_RESET_MAIL_SENDER}"
PASSWORD_RESET_REQUEST_MAIL_TEMPLATE_FILE: "${PASSWORD_RESET_REQUEST_MAIL_TEMPLATE_FILE}"
PASSWORD_RESET_SUCCESS_MAIL_TEMPLATE_FILE: "${PASSWORD_RESET_SUCCESS_MAIL_TEMPLATE_FILE}"
PASSWORD_RESET_LDAP_MAIL_ATTRIBUTE: "${PASSWORD_RESET_LDAP_MAIL_ATTRIBUTE}"
# USER_PRIMARY_ID_TEMPLATE: "${USER_PRIMARY_ID_TEMPLATE}"
# GROUP_PRIMARY_ID_TEMPLATE: "${GROUP_PRIMARY_ID_TEMPLATE}"
LDAP_SCHEME: "${AGENT_LDAP_SCHEME}"
LDAP_HOSTS: "${AGENT_LDAP_HOSTS}"
LDAP_PORT: "${AGENT_LDAP_PORT}"
LDAP_SECURE_SKIP: "${AGENT_LDAP_SECURE_SKIP}"
# SSL_CERT_FILE: "${SSL_CERT_FILE}"
LDAP_BIND_DN: "${AGENT_LDAP_BIND_DN}"
LDAP_BIND_PASSWORD: "${AGENT_LDAP_BIND_PASSWORD}"
LDAP_SEARCH_BASE: "${AGENT_LDAP_SEARCH_BASE}"
LDAP_USER_SEARCH_BASE: "${AGENT_LDAP_USER_SEARCH_BASE}"
LDAP_USER_SEARCH_FILTER: "${AGENT_LDAP_USER_SEARCH_FILTER}"
LDAP_GROUP_SEARCH_BASE: "${AGENT_LDAP_GROUP_SEARCH_BASE}"
LDAP_GROUP_SEARCH_FILTER: "${AGENT_LDAP_GROUP_SEARCH_FILTER}"
LDAP_GROUP_MEMBER_ATTRIBUTE: "${AGENT_LDAP_GROUP_MEMBER_ATTRIBUTE}"
# SAML_SP_ENTITY_ID: "${SAML_SP_ENTITY_ID}"
# SAML_SP_ROOT_URL: "${SAML_SP_ROOT_URL}"
# SAML_SP_IDP_METADATA_URL: "${SAML_SP_IDP_METADATA_URL}"
# SAML_SP_TLS_SKIP_VERIFY_FETCH_IDP_METADATA: "${SAML_SP_TLS_SKIP_VERIFY_FETCH_IDP_METADATA}"
# SAML_SP_COOKIE_EXP_TIME: "${SAML_SP_COOKIE_EXP_TIME}"
ports:
- 127.0.0.1:${API_PORT}:${API_PORT}
restart: "always"
ここで参照する環境変数は .env
に設定します。
環境変数の設定
API サーバー
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
API_PORT | 18080 | – | 接続を受け付けるポート番号 |
BASIC_AUTH_PASSWORD | 任意 | – | Basic 認証のためのパスワード |
JWT_SECRET_KEY | 任意 | – | JWT の署名に使用 |
JWT_ACCESS_EXPIRATION_TIME | 任意 | 1h | アクセストークンの有効期限 |
JWT_REFRESH_EXPIRATION_TIME | 任意 | 2160h | リフレッシュトークンの有効期限 |
XFF_TRUST_IP_RANGES | 任意 | – | X-Forwarded-For ヘッダーで指定される信頼するネットワーク (CIDR表記) |
ID_FEDERATION_CLIENT_HOST | 任意 | consumer-local-001:7099 | 外部連携モジュールのバージョン情報をリクエストする宛先となるホストを指定 |
USER_PRIMARY_ID_TEMPLATE | 任意 | – | ユーザーの primaryID 作成のためのテンプレート文字列 |
GROUP_PRIMARY_ID_TEMPLATE | 任意 | – | グループの primaryID 作成のためのテンプレート文字列 |
-
ID_FEDERATION_CLIENT_HOST
(外部連携モジュールのコンテナ) はバージョン情報を取得するときの宛先を設定します- 複数の外部連携モジュールのコンテナを利用していたとしても、どれか1つのコンテナのポート番号を指定します
- ここで取得されるバージョン情報は 1 時間キャッシュされます。外部連携モジュールのコンテナを更新したとき、最大 1 時間はバージョン情報が更新されない可能性があります
-
API サーバーは X-Forwarded-For (以下 XFF) ヘッダーを参照してリクエスト元 IP アドレスを履歴に記録します
- 信頼できるネットワークはカンマ区切りで複数指定できます
- 設定例) 192.168.0.1/24,172.16.0.0/12,2001:db8::/64
- 指定しないときはコンテナネットワークのゲートウェイ (172.18.0.1) がリクエスト元 IP アドレスとなります
- 信頼できるネットワークはカンマ区切りで複数指定できます
primaryID
UCIDM では、各ユーザー/グループを一意に識別するための ID として primaryID を使用します。
primaryID はデフォルトでは DN 文字列の RDN0 の値が割り当てられます。
例) cn=test1,ou=people,dc=example,dc=com という DN であれば test1 が primaryID になる
ここで primaryID は必ず一意となるように設定する必要があります。仮に DN 文字列の RDN0 の値のみだと競合してしまうような場合は USER_PRIMARY_ID_TEMPLATE
と GROUP_PRIMARY_ID_TEMPLATE
のテンプレート文字列を使って一意になるような値を割り当ててください。
例) “%{cn}-%{uid}” と設定した場合、属性の cn=test1, uid=101 ならば test1-101 が primaryID になる
primaryID は、Microsoft Entra ID、Google Workspace、AD、SCIM の外部サービスへの連携において主要なキー情報として連携されます。仕様上の制約 もご確認ください。
ミドルウェア
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
MONGO_USER | 任意 | – | 接続する MongoDB のユーザ名 |
MONGO_PASSWORD | 任意 | – | 接続する MongoDB のパスワード |
MONGO_HOSTS | 任意 | – | 接続する MongoDB のホスト |
MONGO_REPLICA_SET | 任意 | – | 接続する MongoDB の レプリカセットの名前 |
AMQP_URL | 任意 | – | 接続する RabbitMQ の URL |
MAX_PRODUCER_SESSIONS | 任意 | 512 | RabbitMQ Procuder の 最大セッション数 |
メールサーバー
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
SMTP_HOST | 任意 | – | SMTP サーバーの ホスト名 |
SMTP_PORT | 任意 | 465 | SMTP サーバーの ポート番号 |
SMTP_AUTH_USERNAME | 任意 | – | SMTP サーバーの認証で 使用するユーザー名 |
SMTP_AUTH_PASSWORD | 任意 | – | SMTP サーバーの認証で 使用するパスワード |
SMTP_AUTH_METHOD | PLAIN または XOAUTH2 | PLAIN | SMTP サーバーの認証方法 |
SMTP_USE_TLS | true または false | true | SMTP サーバーの TLS の有効/無効 |
SMTP_USE_STARTTLS | true または false | false | SMTP サーバーの STARTTLS の有効/無効 |
SMTP_SECURE_SKIP | true または false | false | SMTP サーバーの 任意の証明書を許可 |
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...
パスワードリセットメール
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
PASSWORD_RESET_ EXPIRATION_TIME | 任意 | 1h | パスワードリセットの有効期限 |
PASSWORD_RESET_ MAIL_SENDER | 任意 | noreply@example.com | パスワードリセットメールの送信元メールアドレス |
PASSWORD_RESET_REQUEST_ MAIL_TEMPLATE_FILE | 任意 | ./template/reset-request.eml | パスワードリセットメールのテンプレートファイルパス |
PASSWORD_RESET_SUCCESS_ MAIL_TEMPLATE_FILE | 任意 | ./template/reset-success.eml | パスワードリセット成功メールのテンプレートファイルパス |
PASSWORD_RESET_ LDAP_MAIL_ATTRIBUTE | 任意 | パスワードリセット時に使用するLDAP属性 |
パスワードリセット向けメールのテンプレートファイル
アカウントのパスワードを忘れたときにメールを送信してパスワードリセットできます。メールのテンプレートファイルを使ってパスワードリセットメールをカスタマイズできます。
メールのテンプレートファイルでは、次のフィールドに対してテンプレート変数を使ってカスタマイズします。
フィールド名 | 説明 |
---|---|
From | パスワードリセットメールの送信元メールアドレス |
To | パスワードリセットメールの送信先メールアドレス |
Reply-To | パスワードリセットメールの返信先メールアドレス |
Subject | パスワードリセットメールの件名 |
以下の変数をテンプレートファイルに記述することで、値が入ったメール送信が可能になります。
テンプレート変数 | 説明 |
---|---|
{{.SenderMailAddress}} | 環境変数 PASSWORD_RESET_MAIL_SENDER の設定値 |
{{.UserName}} | パスワードリセットを行うユーザー名 |
{{.UserMailAddress}} | パスワードリセットメールの送信先メールアドレス |
{{.TemporaryToken}} | パスワードリセットで使用する一時トークン |
テンプレートファイルのサンプル設定は次になります。メールヘッダーと本文の間には空行を入れてください。
一時トークンを送付するメールテンプレートのサンプル
From: 送信者名 <{{.SenderMailAddress}}>
To: {{.UserName}} <{{.UserMailAddress}}>
Reply-To: 返信しないで <no-reply@osstech.co.jp>
Subject: パスワードリセット
パスワードをリセットするための一時トークンを送ります。
このトークンを使って管理画面からパスワードリセットしてください。
一時トークン: {{.TemporaryToken}}
一定時間経過するとパスワードリセットができなくなります。
パスワードリセット完了を連絡するメールテンプレートのサンプル
From: 送信者名 <{{.SenderMailAddress}}>
To: {{.UserName}} <{{.UserMailAddress}}>
Subject: パスワードリセット成功
新しいパスワードに更新されました。
OAuth 認証
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
OAUTH_CLIENT_ID | 任意 | – | OAuth 2.0 認証で使用するクライアント ID |
OAUTH_CLIENT_SECRET | 任意 | – | OAuth 2.0 認証で使用するクライアントシークレット |
OAUTH_REFRESH_TOKEN | 任意 | – | OAuth 2.0 認証で使用するリフレッシュトークン |
OAUTH_AUTH_URL | 任意 | – | アクセストークンを発行する認証エンドポイント |
OAUTH_TOKEN_URL | 任意 | – | アクセストークンを発行するトークンエンドポイント |
LDAP サーバー
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
LDAP_SCHEME | ldap または ldaps | ldap | 接続する LDAP サーバーのプロトコル |
LDAP_HOSTS | 任意 | – | 接続する LDAP サーバーのホスト名 カンマ(,)区切りで複数指定 |
LDAP_PORT | 任意 | – | 接続する LDAP サーバーのポート番号 |
LDAP_SECURE_SKIP | true または false | false | 接続する LDAP サーバーの任意の証明書を許可 |
SSL_CERT_FILE | 任意 | – | LDAP サーバーとの接続において 信頼する CA 証明書を指定 |
LDAP_BIND_DN | 任意 | – | 接続する LDAP サーバーの bind ユーザー |
LDAP_BIND_PASSWORD | 任意 | – | 接続する LDAP サーバーの bind ユーザーのパスワード |
LDAP_SEARCH_BASE | 任意 | – | LDAP ユーザー・グループ検索対象 DN |
LDAP_CREDENTIALS_ SEARCH_BASE | 任意 | LDAP_SEARCH_ BASE 値 | FIDO2 エントリー (ou=Credentials) の検索対象 DN |
LDAP_USER_ SEARCH_BASE | 任意 | – | LDAP ユーザー検索対象 DN |
LDAP_USER_ SEARCH_FILTER | 任意 | – | LDAP ユーザー検索条件 |
LDAP_USER_ UNIQUE_ATTRIBUTE | 任意 | uid | LDAP ユーザーの一意な識別子 |
LDAP_GROUP_ SEARCH_BASE | 任意 | – | LDAP グループ検索対象 DN |
LDAP_GROUP_ SEARCH_FILTER | 任意 | – | LDAP グループ検索条件 |
LDAP_GROUP_ MEMBER_ATTRIBUTE | memberUid, member, uniqueMember | member | グループのメンバー属性 |
LDAP_GROUP_ UNIQUE_ATTRIBUTE | 任意 | cn | LDAP グループの一意な識別子 |
LDAP_EXCLUDE_ LOGGING_ATTRIBUTES | 任意 | – | 登録/更新リクエストのログ出力を除外する属性 カンマ(,)区切りで複数指定 |
- LDAP サーバーで管理している LDAP ユーザーエントリーのパスワード変更に関して API サーバーでは平文パスワードのハッシュ化は行いません。LDAP サーバーの設定で ppolicy_hash_cleartext を使ってハッシュ化してください
LDAP_CREDENTIALS_SEARCH_BASE
に所属する ou=Credentials から FIDO2 エントリーを検索しますLDAP_CREDENTIALS_SEARCH_BASE
を設定しない場合、LDAP_SEARCH_BASE
の値を使います
- 登録/更新リクエストのログ出力から userPassword と unicodePwd は必ず除外されます
SAML 認証
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
SAML_SP_ENTITY_ID | 任意 | – | SAML SP の EntityID |
SAML_SP_ROOT_URL | 任意 | – | SAML SP の ROOT URL |
SAML_SP_IDP_METADATA_URL | 任意 | – | SAML IdP のメタデータの URL |
SAML_SP_IDP_METADATA_FILE | 任意 | – | SAML IdP のメタデータファイルのパス |
SAML_SP_TLS_SKIP_VERIFY_ FETCH_IDP_METADATA | 任意 | false | SAML IdP のメタデータ取得時に自己証明書を許可するかどうか |
SAML_SP_AUTH_TYPE | 任意 | ldap | SAML ログイン時に付与される認証タイプ |
SAML_SP_ROLE_NAME | 任意 | ldap-user | SAML ログイン時に付与されるデフォルトのロール名 |
SAML_SP_COOKIE_EXP_TIME | 任意 | 1h | SAML ログイン時に発行される cookie の有効期限 |
UCIDM の SAML 認証にて使用する証明書ファイルおよび鍵ファイルについては、compose.yml
ファイルの api の volumes 設定において、それぞれ /saml/ucidm_samlsp.crt
と /saml/ucidm_samlsp.key
のファイルに紐付けを行う必要があります。これらのファイルはコンテナで動作するアプリケーションにて参照されます。
SAML 認証の捕捉
SAML_SP_ENTITY_ID
の値を設定することで、SAML 認証が有効になります。
SAML_SP_ROOT_URL
の値を使って SAML 関連のエンドポイントが定義され、メタデータに反映されます。この値はユーザープロファイルのアクセスホスト名:ポート番号を使って、以下のように設定してください。
- <プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/ui/user/api/
SAML_SP_CERTIFICATE_FILE
および SAML_SP_KEY_FILE
にて SAML SP の証明書およびキーファイルのパスを設定します。
SAML IdP のメタデータを IdP からメタデータをダウンロードし、そのメタデータを配置したパスを SAML_SP_IDP_METADATA_FILE
にて設定してください。
API 起動時に SAML IdP のメタデータを指定した URL から 取得したい場合、SAML_SP_IDP_METADATA_URL
にその URL を設定します。(IdP にて自己証明書を使っている場合は、SAML_SP_TLS_SKIP_VERIFY_FETCH_IDP_METADATA
を true に設定する必要があります。)
SAML 認証時、認証されたユーザーに ldap 以外の認証タイプ、デフォルトで ldap-user 以外のロールを指定する場合は、SAML_SP_AUTH_TYPE
および SAML_SP_ROLE_NAME
の値を設定します。
SAML 認証 も合わせてご確認ください。
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 |
JWT_ACCESS_SECRET | 任意 | – | JWT の署名に使う文字列 |
SESSION_MAX_AGE | 任意 | 3600 | 管理画面のログイン セッションの最大時間(秒) |
PUBLIC_HTTP_REQUEST_TIMEOUT | 任意 | 10000 | Server API に対する HTTP リクエストの timeout 時間(ミリ秒) (実行中ジョブ取得、 認証系など一部例外あり) (0 で無制限) |
ユーザープロファイル画面
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}"
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}"
# 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}"
# PUBLIC_ENABLE_SELF_MODIFY: "${ENABLE_SELF_MODIFY}"
# PUBLIC_ENABLE_SELF_HISTORY: "${ENABLE_SELF_HISTORY}"
ports:
- ${UCIDM_NODE_PORT}:${UCIDM_NODE_PORT}
restart: "always"
ここで参照する環境変数は .env
に設定します。
環境変数の設定
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
PORT | 3030 | – | 接続を受け付ける ポート番号 |
PUBLIC_UCIDM_API_SERVER | http://api:18080 | – | 接続する UCIDM API の ベース URL |
JWT_ACCESS_SECRET | 任意 | – | JWT の署名に使う文字列 |
SESSION_MAX_AGE | 任意 | 3600 | 管理画面のログイン セッションの最大時間(秒) |
DISABLE_HEADER_TEMPLATE | true または false | false | ヘッダーカスタマイズの有無 |
DISABLE_FOOTER_TEMPLATE | true または false | false | フッターカスタマイズの有無 |
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_ENABLE_SELF_MODIFY | true または false | false | ユーザー属性変更画面を表示するか非表示にするかの設定 |
PUBLIC_ENABLE_SELF_HISTORY | true または false | false | ユーザー自身の履歴一覧画面を表示するか非表示にするかの設定 |
DEFAULT_LANGUAGE | ja または en | en | ユーザープロファイル画面でのデフォルト言語 |
PUBLIC_HTTP_REQUEST_TIMEOUT | 任意 | 10000 | Server API に対する HTTP リクエストの timeout 時間(ミリ秒) (認証系など一部例外あり) (0 で無制限) |
外部連携
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:
DESTINATION_ID: "ldap-001"
AMQP_URL: "${AMQP_URL}"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
LDAP_URL: "${LDAP1_URL}"
LDAP_BIND_DN: "${LDAP1_BIND_DN}"
LDAP_BIND_PASSWORD: "${LDAP1_BIND_PASSWORD}"
restart: "always"
ここで参照する環境変数は .env
に設定します。
起動時のオプション設定
entrypoint では次の設定ができます。
-verbose
: デバッグログを出力-jsonl
: JSON 形式でログを出力
環境変数の設定
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
DESTINATION_ID | 任意 | – | 外部連携先 ID 管理画面で作成した外部連携先 ID を指定 |
AMQP_URL | 任意 | – | 接続する RabbitMQ の URL |
MONGO_USER | 任意 | – | 接続する MongoDB のユーザ名 |
MONGO_PASSWORD | 任意 | – | 接続する MongoDB のパスワード |
MONGO_HOSTS | 任意 | – | 接続する MongoDB のホスト |
MONGO_REPLICA_SET | 任意 | – | 接続する MongoDB のレプリカセットの名前 |
LDAP_URL | 任意 | – | 接続する LDAP の URL (例: ldaps:// |
LDAP_BIND_DN | 任意 | – | LDAP の Bind DN |
LDAP_BIND_PASSWORD | 任意 | – | LDAP の Bind DN のパスワード |
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:
DESTINATION_ID: "meid-001"
AMQP_URL: "${AMQP_URL}"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
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 形式でログを出力
環境変数の設定
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
DESTINATION_ID | 任意 | – | 外部連携先 ID 管理画面で作成した外部連携先 ID を指定 |
AMQP_URL | 任意 | – | 接続する RabbitMQ の URL |
MONGO_USER | 任意 | – | 接続する MongoDB のユーザ名 |
MONGO_PASSWORD | 任意 | – | 接続する MongoDB のパスワード |
MONGO_HOSTS | 任意 | – | 接続する MongoDB のホスト |
MONGO_REPLICA_SET | 任意 | – | 接続する MongoDB のレプリカセットの名前 |
MEID_CLIENT_ID | 任意 | – | Microsoft Entra ID の Client ID |
MEID_CLIENT_SECRET | 任意 | – | Microsoft Entra ID の Client ID のパスワード |
MEID_TENANT_ID | 任意 | – | Microsoft Entra ID の Tenant ID |
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:
DESTINATION_ID: "google-001"
AMQP_URL: "${AMQP_URL}"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
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 形式でログを出力
環境変数の設定
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
DESTINATION_ID | 任意 | – | 外部連携先 ID 管理画面で作成した外部連携先 ID を指定 |
AMQP_URL | 任意 | – | 接続する RabbitMQ の URL |
MONGO_USER | 任意 | – | 接続する MongoDB のユーザ名 |
MONGO_PASSWORD | 任意 | – | 接続する MongoDB のパスワード |
MONGO_HOSTS | 任意 | – | 接続する MongoDB のホスト |
MONGO_REPLICA_SET | 任意 | – | 接続する MongoDB のレプリカセットの名前 |
GOOGLE_CLIENT_EMAIL | 任意 | – | Google の Client Email |
GOOGLE_PRIVATE_KEY | 任意 | – | Google の秘密鍵 |
GOOGLE_SUBJECT | 任意 | – | Google の Subject (主に管理者のメールアドレスを指定) |
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:
DESTINATION_ID: "ad-001"
AMQP_URL: "${AMQP_URL}"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
LDAP_URL: "${AD_URL}"
LDAP_BIND_DN: "${AD_BIND_DN}"
LDAP_BIND_PASSWORD: "${AD_BIND_PASSWORD}"
restart: "always"
ここで参照する環境変数は .env
に設定します。
起動時のオプション設定
entrypoint では次の設定ができます。
-verbose
: デバッグログを出力-jsonl
: JSON 形式でログを出力
環境変数の設定
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
DESTINATION_ID | 任意 | – | 外部連携先 ID 管理画面で作成した外部連携先 ID を指定 |
AMQP_URL | 任意 | – | 接続する RabbitMQ の URL |
MONGO_USER | 任意 | – | 接続する MongoDB のユーザ名 |
MONGO_PASSWORD | 任意 | – | 接続する MongoDB のパスワード |
MONGO_HOSTS | 任意 | – | 接続する MongoDB のホスト |
MONGO_REPLICA_SET | 任意 | – | 接続する MongoDB のレプリカセットの名前 |
LDAP_URL | 任意 | – | 接続する AD の URL (例: ldaps:// |
LDAP_BIND_DN | 任意 | – | AD の Bind DN |
LDAP_BIND_PASSWORD | 任意 | – | AD の Bind DN のパスワード |
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:
DESTINATION_ID: "scim-001"
AMQP_URL: "${AMQP_URL}"
MONGO_USER: "${MONGO_USER}"
MONGO_PASSWORD: "${MONGO_PASSWORD}"
MONGO_HOSTS: "${MONGO_HOSTS}"
MONGO_REPLICA_SET: "${MONGO_REPLICA_SET}"
SCIM_OAUTH2_CLIENT_ID: "${SCIM_OAUTH2_CLIENT_ID}"
SCIM_OAUTH2_CLIENT_SECRET: "${SCIM_OAUTH2_CLIENT_SECRET}"
restart: "always"
ここで参照する環境変数は .env
に設定します。
起動時のオプション設定
entrypoint では次の設定ができます。
-verbose
: デバッグログを出力-jsonl
: JSON 形式でログを出力
環境変数の設定
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
DESTINATION_ID | 任意 | – | 外部連携先 ID 管理画面で作成した外部連携先 ID を指定 |
AMQP_URL | 任意 | – | 接続する RabbitMQ の URL |
MONGO_USER | 任意 | – | 接続する MongoDB のユーザ名 |
MONGO_PASSWORD | 任意 | – | 接続する MongoDB のパスワード |
MONGO_HOSTS | 任意 | – | 接続する MongoDB のホスト |
MONGO_REPLICA_SET | 任意 | – | 接続する MongoDB のレプリカセットの名前 |
SCIM_OAUTH2_CLIENT_ID | 任意 | – | SCIM 対応サービスとの認証・認可で使用する OAuth2 クライアント ID |
SCIM_OAUTH2_CLIENT_SECRET | 任意 | – | SCIM 対応サービスとの認証・認可で使用する OAuth2 クライアントシークレット |
SCIMServiceType | 任意 | – | 外部連携先のサービスを指定します |
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"],
...
},
"EntryDiff":[
{
"sourceNames":["sn"],
"destinationName":"surname",
"sourceValue":["test1sn"],
"previousValue":["test1"],
"currentValue":["test1"]
},
...
]
}
- DN : UCIDM に連携されてきたエントリの DN 情報
- Attributes : UCIDM に連携されてきたエントリの属性名と属性値の情報
- 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 モジュールを設定します。
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
entrypoint:
- ./bin/agent
- -verbose
- -jsonl
environment:
LDAP_SCHEME: "${AGENT_LDAP_SCHEME}"
LDAP_HOSTS: "${AGENT_LDAP_HOSTS}"
LDAP_PORT: "${AGENT_LDAP_PORT}"
LDAP_SECURE_SKIP: "${AGENT_LDAP_SECURE_SKIP}"
# SSL_CERT_FILE: "${SSL_CERT_FILE}"
LDAP_BIND_DN: "${AGENT_LDAP_BIND_DN}"
LDAP_BIND_PASSWORD: "${AGENT_LDAP_BIND_PASSWORD}"
LDAP_SEARCH_BASE: "${AGENT_LDAP_SEARCH_BASE}"
LDAP_USER_SEARCH_BASE: "${AGENT_LDAP_USER_SEARCH_BASE}"
LDAP_USER_SEARCH_FILTER: "${AGENT_LDAP_USER_SEARCH_FILTER}"
LDAP_GROUP_SEARCH_BASE: "${AGENT_LDAP_GROUP_SEARCH_BASE}"
LDAP_GROUP_SEARCH_FILTER: "${AGENT_LDAP_GROUP_SEARCH_FILTER}"
LDAP_GROUP_MEMBER_ATTRIBUTE: "${AGENT_LDAP_GROUP_MEMBER_ATTRIBUTE}"
PROTOCOL: "${AGENT_LDAP_PROTOCOL}"
EXCLUDE_ATTRIBUTES: "${AGENT_LDAP_EXCLUDE_ATTRIBUTES}"
USER_GROUP_LINK_ATTRIBUTE: "${AGENT_LDAP_USER_GROUP_LINK_ATTRIBUTE}"
PAGE_KEY_PATH: "${AGENT_PAGE_KEY_PATH}"
API_HOST: "${API_HOST}"
API_PORT: "${API_PORT}"
API_ACCOUNT_AUTH_USER: "${AGENT_API_ACCOUNT_AUTH_USER}"
API_ACCOUNT_AUTH_PASSWORD: "${AGENT_API_ACCOUNT_AUTH_PASSWORD}"
restart: "always"
Agent の永続化ディレクトリ
永続化が必要なファイルなどは volumes/agent-data/openldap 配下に配置されます。
$ ls volumes/agent-data/openldap
ここで参照する環境変数は .env
に設定します。
環境変数の設定
接続する 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 | リトライの最大回数 |
接続する OpenLDAP サーバーの設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
LDAP_SCHEME | 任意 | ldap | LDAP サーバーのプロトコル |
LDAP_HOSTS | 任意 | – | 接続する LDAP サーバー名 カンマ(,)区切りで複数指定 |
LDAP_PORT | 任意 | 389 | 接続する LDAP サーバーの ポート番号 |
LDAP_SECURE_SKIP | 任意 | false | LDAP サーバーの任意の証明書を許可 |
SSL_CERT_FILE | 任意 | – | LDAP サーバーとの接続において 信頼する CA 証明書を指定 |
LDAP_BIND_DN | 任意 | – | bind ユーザー |
LDAP_BIND_PASSWORD | 任意 | – | bind パスワード |
LDAP_SEARCH_BASE | 任意 | dc=example,dc=com | ユーザー・グループ検索対象 DN |
LDAP_USER_ SEARCH_BASE | 任意 | ou=users,dc=example,dc=com | ユーザー検索対象 DN |
LDAP_USER_ SEARCH_FILTER | 任意 | (&(objectClass=person) (!(objectClass=computer))) | ユーザー検索条件 |
LDAP_GROUP_ SEARCH_BASE | 任意 | ou=groups,dc=example,dc=com | グループ検索対象 DN |
LDAP_GROUP_ SEARCH_FILTER | 任意 | (objectClass=group) | グループ検索条件 |
LDAP_GROUP_ MEMBER_ATTRIBUTE | memberUid, member, uniqueMember | member | グループのメンバー属性 |
PROTOCOL | syncrepl | – | LDAP 通信のプロトコル |
EXCLUDE_ ATTRIBUTES | 任意 | – | 連携除外属性 カンマ(,)区切りで複数指定 |
USER_GROUP_ LINK_ATTRIBUTE | 任意 | – | ユーザーとグループにおいて紐づけたい属性名を指定 |
POLLING_TIME | – | 1h | syncrepl では未使用 |
PAGE_KEY_PATH | 任意 | – | 同期状況の 保存先ディレクトリ |
- OpenLDAP サーバーに Anonymous bind で接続するときは
BIND_DN
を未設定または空文字にします - OpenLDAP サーバーから正常にエントリを取得して UCIDM API サーバーへの連携に失敗 (リトライしても失敗) したときは自動で復旧しません
- 別途ツールで運用対応する 必要があります
- グループにおいて、メンバーの値が入る属性の属性名を
LDAP_GROUP_MEMBER_ATTRIBUTE
に設定することができます(例:memberUid)- この設定をした属性の情報はグループのメンバーの情報としてグループとは別に UCIDM API に連携されます
- この環境変数に
ucidm-not-divide-member
の値を設定すると、メンバーの情報がグループから分離されず、そのままグループエントリとして連携されます- この
ucidm-not-divide-member
の設定をした際は、USER_GROUP_LINK_ATTRIBUTE
の環境変数設定は行わないようお願いいたします
- この
- ユーザーとグループにおいて、紐づけたい属性を
USER_GROUP_LINK_ATTRIBUTE
に設定することができます(例:gidNumber)- この設定をした場合、例えば gidNumber を設定した場合は、ユーザーの gidNumber と同じ gidNumber を持つグループのメンバーに該当ユーザーが割り当てられて UCIDM API に連携されます
- 設定値がない場合は、この属性によるユーザーとグループの紐づけは行われません
LDAP_HOSTS
で指定された複数のホストに対して、接続を試みます- 接続に失敗した場合はリトライせず、次のホストへ接続を試みます
ID 連携の対象外となる属性
次の属性は連携されません。
- userPassword
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
entrypoint:
- ./bin/agent
- -verbose
- -jsonl
environment:
LDAP_SCHEME: "${AGENT_AD_SCHEME}"
LDAP_HOSTS: "${AGENT_AD_HOSTS}"
LDAP_PORT: "${AGENT_AD_PORT}"
LDAP_SECURE_SKIP: "${AGENT_AD_SECURE_SKIP}"
# SSL_CERT_FILE: "${SSL_CERT_FILE}"
LDAP_BIND_DN: "${AGENT_AD_BIND_DN}"
LDAP_BIND_PASSWORD: "${AGENT_AD_BIND_PASSWORD}"
LDAP_SEARCH_BASE: "${AGENT_AD_SEARCH_BASE}"
LDAP_USER_SEARCH_FILTER: "${AGENT_AD_USER_SEARCH_FILTER}"
LDAP_GROUP_SEARCH_FILTER: "${AGENT_AD_GROUP_SEARCH_FILTER}"
LDAP_GROUP_MEMBER_ATTRIBUTE: "${AGENT_AD_GROUP_MEMBER_ATTRIBUTE}"
PROTOCOL: "${AGENT_AD_PROTOCOL}"
EXCLUDE_ATTRIBUTES: "${AGENT_AD_EXCLUDE_ATTRIBUTES}"
POLLING_TIME: "${AGENT_AD_POLLING_TIME}"
PAGE_KEY_PATH: "${AGENT_PAGE_KEY_PATH}"
API_HOST: "${API_HOST}"
API_PORT: "${API_PORT}"
API_ACCOUNT_AUTH_USER: "${AGENT_API_ACCOUNT_AUTH_USER}"
API_ACCOUNT_AUTH_PASSWORD: "${AGENT_API_ACCOUNT_AUTH_PASSWORD}"
restart: "always"
Agent の永続化ディレクトリ
永続化が必要なファイルなどは volumes/agent-data/ad 配下に配置されます。
$ ls volumes/agent-data/ad
ここで参照する環境変数は .env
に設定します。
環境変数の設定
接続する 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 以上を返す) したときのリトライの設定をします。
UCIDM API サーバーへのリクエストに失敗 (ステータスコードが 500 以上を返す) したときのリトライの設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
CLIENT_RETRY_WAIT_MIN | 任意 | 1s | 1回目のリトライの待ち時間 |
CLIENT_RETRY_WAIT_MAX | 任意 | 30s | リトライの最大の待ち時間 |
CLIENT_RETRY_MAX | 任意 | 4 | リトライの最大回数 |
接続する Active Directory サーバーの設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
LDAP_SCHEME | 任意 | ldap | LDAP サーバーのプロトコル |
LDAP_HOSTS | 任意 | – | 接続する AD サーバー名 カンマ(,)区切りで複数指定 |
LDAP_PORT | 任意 | 389 | 接続する AD サーバーの ポート番号 |
LDAP_SECURE_SKIP | 任意 | false | AD サーバーの任意の証明書を許可 |
SSL_CERT_FILE | 任意 | – | LDAP サーバーとの接続において 信頼する CA 証明書を指定 |
LDAP_BIND_DN | 任意 | – | bind ユーザー |
LDAP_BIND_PASSWORD | 任意 | – | bind パスワード |
LDAP_SEARCH_BASE | 任意 | dc=example,dc=com | ユーザー・グループ検索対象 DN |
LDAP_USER_ SEARCH_BASE | 任意 | – | LDAP_SEARCH_BASE と同じ値を設定 |
LDAP_USER_ SEARCH_FILTER | 任意 | (&(objectClass=person) (!(objectClass=computer))) | ユーザー検索条件 |
LDAP_GROUP_ SEARCH_BASE | 任意 | – | LDAP_SEARCH_BASE と同じ値を設定 |
LDAP_GROUP_ SEARCH_FILTER | 任意 | (objectClass=group) | グループ検索条件 |
PROTOCOL | dirsync | – | LDAP 通信のプロトコル |
EXCLUDE_ ATTRIBUTES | 任意 | – | 連携除外属性 カンマ(,)区切りで複数指定 |
LDAP_GROUP_MEMBER_ ATTRIBUTE | 任意 | member | グループメンバーの値が入る属性の属性名 |
USER_GROUP_ LINK_ATTRIBUTE | 任意 | – | ユーザーとグループにおいて紐づけたい属性名を指定 |
POLLING_TIME | – | 1h | 更新を定期的に 問い合わせる間隔 |
PAGE_KEY_PATH | 任意 | – | 同期状況の 保存先ディレクトリ |
- LDAP_USER_SEARCH_BASE と LDAP_GROUP_SEARCH_BASE は LDAP_SEARCH_BASE と同じ値を設定してください
- Windows Server 2003 以降のドメイン コントローラーで Active Directory への匿名 LDAP 操作が無効になっている ため、Active Directory 向け Agent は anonymous bind をサポートしません。適切な bind ユーザーのアカウントをご用意ください
- AD から正常にエントリを取得して UCIDM API サーバーへの連携に失敗 (リトライしても失敗) したときは自動で復旧しません
- 別途ツールで運用対応する 必要があります
- グループにおいて、メンバーの値が入る属性の属性名を
LDAP_GROUP_MEMBER_ATTRIBUTE
に設定することができます(例:member)- この設定をした属性の情報はグループのメンバーの情報としてグループとは別に UCIDM API に連携されます
- この環境変数に
ucidm-not-divide-member
の値を設定すると、メンバーの情報がグループから分離されず、そのままグループエントリとして連携されます- この
ucidm-not-divide-member
の設定をした際は、USER_GROUP_LINK_ATTRIBUTE
の環境変数設定は行わないようお願いいたします
- この
- ユーザーとグループにおいて、紐づけたい属性を
USER_GROUP_LINK_ATTRIBUTE
に設定することができます(例:gidNumber)- この設定をした場合、例えば gidNumber を設定した場合は、ユーザーの gidNumber と同じ gidNumber を持つグループのメンバーに該当ユーザーが割り当てられて UCIDM API に連携されます
- 設定値がない場合は、この属性によるユーザーとグループの紐づけは行われません
LDAP_HOSTS
で指定された複数のホストに対して、接続を試みます- 接続に失敗した場合はリトライせず、次のホストへ接続を試みます
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 社のドキュメントを参照してください。
ID 連携の対象外となる属性
次の属性は Windows サーバーでのみ必要なシステム関連の属性なので連携されません。
- lmPwdHistory
- ntPwdHistory
- supplementalCredentials
- nTSecurityDescriptor
- pwdLastSet
- parentGUID
- objectSid
- memberOf
- unicodePwd
- dBCSPwd
- codePage
- countryCode
- instanceType
- sAMAccountType
- objectCategory
- badPwdCount
- badPasswordTime
- dSCorePropagationData
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:
LDAP_HOSTS: "dummy"
MEID_TENANT_ID: "${AGENT_MEID_TENANT_ID}"
MEID_CLIENT_ID: "${AGENT_MEID_CLIENT_ID}"
MEID_CLIENT_SECRET: "${AGENT_MEID_CLIENT_SECRET}"
MEID_SCOPES: "${AGENT_MEID_SCOPES}"
MEID_USER_PROPERTIES: "${AGENT_MEID_USER_PROPERTIES}"
MEID_GROUP_PROPERTIES: "${AGENT_MEID_GROUP_PROPERTIES}"
PROTOCOL: "${AGENT_MEID_PROTOCOL}"
EXCLUDE_ATTRIBUTES: "${AGENT_MEID_EXCLUDE_ATTRIBUTES}"
POLLING_TIME: "${AGENT_POLLING_TIME}"
PAGE_KEY_PATH: "${AGENT_PAGE_KEY_PATH}"
API_HOST: "${API_HOST}"
API_PORT: "${API_PORT}"
API_ACCOUNT_AUTH_USER: "${AGENT_API_ACCOUNT_AUTH_USER}"
API_ACCOUNT_AUTH_PASSWORD: "${AGENT_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
に設定します。
環境変数の設定
接続する UCIDM API サーバーの設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
API_SCHEME | https | http | UCIDM API サーバーの プロトコル |
API_HOST | 任意 | localhost | UCIDM API サーバー名 |
API_PORT | 任意 | 18080 | UCIDM API サーバーの ポート番号 |
API_BASIC_AUTH_USER | 任意 | unico | 接続する UCIDM API の Basic 認証ユーザー |
API_BASIC_AUTH_PASSWORD | 任意 | – | 接続する UCIDM API の Basic 認証パスワード |
API_ACCOUNT_AUTH_USER | 任意 | – | 接続する UCIDM API の アカウント認証ユーザー |
API_ACCOUNT_AUTH_PASSWORD | 任意 | – | 接続する UCIDM API の アカウント認証パスワード |
- 認証はベーシック認証またはアカウント認証はどちらか一方を設定します
- 両方設定するとベーシック認証を使います
UCIDM API サーバーへのリクエストに失敗 (ステータスコードが 500 以上を返す) したときのリトライの設定をします。
UCIDM API サーバーへのリクエストに失敗 (ステータスコードが 500 以上を返す) したときのリトライの設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
CLIENT_RETRY_WAIT_MIN | 任意 | 1s | 1回目のリトライの待ち時間 |
CLIENT_RETRY_WAIT_MAX | 任意 | 30s | リトライの最大の待ち時間 |
CLIENT_RETRY_MAX | 任意 | 4 | リトライの最大回数 |
接続する Microsoft Graph アプリケーションの設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
LDAP_HOSTS | dummy | – | 使用しないが、必須属性なので値をセットする |
MEID_TENANT_ID | 任意 | – | ディレクトリ (テナント) ID |
MEID_CLIENT_ID | 任意 | – | アプリケーション (クライアント) ID |
MEID_CLIENT_SECRET | 任意 | – | クライアントシークレット |
MEID_SCOPES | 任意 | https://graph.microsoft.com/ .default | トークンに与えるリソースのアクセス範囲 |
MEID_USER_ PROPERTIES | 任意 | – | ユーザーの連携対象プロパティ カンマ(,)区切りで複数指定 |
MEID_GROUP_ PROPERTIES | 任意 | – | グループの連携対象プロパティ カンマ(,)区切りで複数指定 |
PROTOCOL | msgraph | – | Microsoft Graph |
EXCLUDE_ ATTRIBUTES | 任意 | – | 連携除外属性 カンマ(,)区切りで複数指定 |
POLLING_TIME | – | 1h | 更新を定期的に 問い合わせる間隔 |
PAGE_KEY_PATH | 任意 | – | 同期状況の 保存先ディレクトリ |
- MEID_SCOPES は
.default
を設定し、Microsoft Graph アプリケーションにあらかじめ必要なアクセス権限を設定する - MEID_USER_PROPERTIES や MEID_GROUPPROPERTIES で指定したプロパティ以外の値の変更は ID 連携されません
- Microsoft Entra ID から正常にエントリを取得して UCIDM API サーバーへの連携に失敗 (リトライしても失敗) したときは自動で復旧しません
- 別途ツールで運用対応する 必要があります
Compose サービスの実行
UCIDM は Docker Compose を使い、複数のアプリケーションやミドルウェアのコンテナを起動して、それぞれのサービスが協調してシステムを構成しています。
これまで compose.yml
と .env
の設定を行ってきました。実際にコンテナイメージを取得してサービスを起動してみましょう。
コンテナイメージの取得
最新のコンテナイメージを取得するときは pull サブコマンドを実行します。
$ cd /var/opt/osstech/lib/ucidm
$ docker compose pull
同時に環境変数の設定が誤っているときはワーニングなどが表示されいます。この後のコンテナを起動する前にチェックしてください。
(初回起動時のみ) MongoDB の初期設定
MongoDB の初回セットアップに少し時間がかかるので次のように起動して終了させます。初めてセットアップするときに実行すれば、2回目以降は行う必要はありません。
$ docker compose up -V mongo
起動してログ出力が停止したのを確認して Ctrl+C を入力して停止します。
Docker Compose の起動と終了
サービスを起動するときは up サブコマンドを実行します。
$ docker compose up -d
それぞれのサービスが正常に起動しているかどうかは ps サブコマンドで確認します。
$ docker compose ps
サービスを停止するときは stop サブコマンドを実行します。
$ docker compose stop
コンテナサービスとの疎通確認
次のように疎通確認をします。
$ curl http://localhost:18080/status/version
{"serverVersion":"2730fd8","idFederationClientVersion":"ef562e7","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 で起動するサービスのいくつかは初回起動時に初期設定を行います。これらの設定は最初に実行されたときの1回だけしか適用されません。
パスワードなどを誤ってしまったり、再設定したいときに 運用開始前 であればデータを削除することで初期設定をやり直すことができます。 運用開始後は ID 連携のデータが格納されているので絶対に削除しないでください。
たとえば MongoDB の初期設定をやり直すときは mongodb
ディレクトリを削除して作成し直します。
$ docker compose down
$ sudo 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
リバースプロキシの疎通確認
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"}
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 ユーザー名\nパスワード end end subgraph sender[Sender] stdin pusher[ZeroMQ\nPush] end subgraph zmq [ZeroMQ] queue[Queue] end subgraph passsync [PassSync Agent] puller[ZeroMQ\nPull] ucidm-client[UCIDM\nクライアント] recovery-handler[リカバリ\nハンドラー] recovery-dir[リカバリ\nディレクトリ] end subgraph server [UCIDM API サーバー] upd-passwd[PUT password] end ucidmpsync -- pipe --> stdin stdin -- encode --> pusher sender -- キューイング失敗 --> recovery-dir pusher -- ipc://socket --> queue queue -- ipc://socket --> puller puller -- decode --> ucidm-client ucidm-client -- http --> upd-passwd ucidm-client -- 送信失敗 --> recovery-dir recovery-handler -- 再送信 --> ucidm-client recovery-dir -- 監視 --> recovery-handler
Sender や PassSync Agent で送信に失敗したときもリカバリディレクトリにメッセージが一時保存されて定期的に再処理されます。一時保存されるメッセージは難読化されて保存されます。システム管理者が容易にパスワードの文字列を確認することはできません。
パスワード変更のリカバリの注意事項
UCIDM ではセキュリティ強化の観点から一般ユーザーのパスワードを原則として保存しません。しかし、システムの一時的な障害のために一般ユーザーにパスワード変更をやり直してもらうのも実運用においてコストがかかります。リカバリ機能は難読化した上で再処理する機能になりますが、リカバリデータを削除しない限り、無限にリカバリを繰り返します。一時的な検証ユーザーや誤った設定などにより、パスワード変更のデータが生成され、そのリカバリは絶対に成功しない場合、システム管理者が手動でリカバリデータを削除する必要があります。
リカバリデータでは後述する UCIDM_RECOVERY_PATH
で指定されたディレクトリ配下に格納されます。不要なパスワード変更のデータがある場合はシステム管理者が直接、このディレクトリ配下にあるファイルを削除してください。
設定
systemd のサービスから PassSync Agent が使う環境変数を設定します。主には接続する UCIDM API サーバーの設定をすればデフォルト設定でも構いません。
# vi /opt/osstech/etc/openldap/service/ucidm/agent.env
agent.env の環境変数
接続する UCIDM API サーバーの設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
API_SCHEME | https | http | UCIDM API サーバーのプロトコル |
API_HOST | 任意 | localhost | UCIDM API サーバー名 |
API_PORT | 任意 | 18080 | UCIDM API サーバーの ポート番号 |
API_SECURE_SKIP | 任意 | false | UCIDM API サーバーの任意の証明書を許可 |
API_BASIC_AUTH_USER | 任意 | unico | 接続する UCIDM API の Basic 認証ユーザー |
API_BASIC_AUTH_PASSWORD | 任意 | – | 接続する UCIDM API の Basic 認証パスワード |
API_ACCOUNT_AUTH_USER | 任意 | – | 接続する UCIDM API の アカウント認証ユーザー |
API_ACCOUNT_AUTH_PASSWORD | 任意 | – | 接続する UCIDM API の アカウント認証パスワード |
UCIDM API サーバーへのリクエストに失敗 (ステータスコードが 500 以上を返す) したときのリトライの設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
CLIENT_RETRY_WAIT_MIN | 任意 | 1s | 1回目のリトライの待ち時間 |
CLIENT_RETRY_WAIT_MAX | 任意 | 30s | リトライの最大の待ち時間 |
CLIENT_RETRY_MAX | 任意 | 4 | リトライの最大回数 |
agent プロセスがメッセージキューを使うときの設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
UCIDM_SOCKET_PATH | /var/opt/ osstech/lib/ ucidm-passsync/ agent.sock | my-ipc-socket | Unix ドメインソケット のパス |
UCIDM_SEND_HWM | 任意 | 0 | メッセージキュー のバッファサイズ |
UCIDM_BYTE_ORDER | 任意 | LittleEndian | メッセージエンコーディング のバイトオーダー |
sender/agent プロセスが送信処理に失敗したときにデータを一時保存するリカバリ設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
UCIDM_RECOVERY_PATH | /var/opt/ osstech/lib/ ucidm-passsync/ .recovery | .recovery | リカバリのための メッセージが一時保存 される場所へのパス |
UCIDM_RECOVERY_INTERVAL | 任意 | 10m | リカバリの実行間隔 |
サービスの起動設定
systemd から PassSync サービスを起動します。起動後にサービスがアクティブになっていることを確認します。
# systemctl start osstech-ucidm-passsync.service
# systemctl status osstech-ucidm-passsync.service
PassSync サービスのログを監視するには次のように実行します。
# journalctl -u osstech-ucidm-passsync.service -n 10 -f
osstech-openldap の slapd.conf を次のように設定します。
mdb セクションの一番最後に overlay ucidmpsync
の設定を追加するようにしてください。
# vi /opt/osstech/etc/openldap/slapd.conf
...
# Load dynamic backend modules:
...
moduleload ucidmpsync.la
...
## PassSync
## ----------------------------------------------------------------------
overlay ucidmpsync
ucidmpsync-sender "/opt/osstech/lib64/osstech-ucidm-agent-ldap-passsync/sender"
...
osstech-openldap の osstech-slapd.service に sender が PassSync の環境変数を参照できるように設定を追加します。systemctl edit を使って次の内容を設定してください。
# systemctl edit osstech-slapd.service
[Service]
EnvironmentFile=/opt/osstech/etc/openldap/service/ucidm/agent.env
設定を完了すると次のファイルが作成されます。
/etc/systemd/system/slapd.service.d/override.conf
systemctl cat で次の内容を確認できれば正しい設定になります。
# systemctl cat osstech-slapd.service
...
# /etc/systemd/system/slapd.service.d/override.conf
[Service]
EnvironmentFile=/opt/osstech/etc/openldap/service/ucidm/agent.env
設定を完了したら次のように osstech-slapd.service を再起動します。
# systemctl restart osstech-slapd.service
あるユーザーでパスワード変更を行い、slapd のログから sender が agent にメッセージを送ったログを確認します。
# journalctl -u slapd.service -n 10 -f
sender や agent で ucidm へリクエストして 500 以上のステータスコードが返されたときはリカバリ用ディレクトリにデータが一時保存されます。そして UCIDM_RECOVERY_INTERVAL
の環境変数で指定した期間で再度リクエストします。成功しない限り、無限にリクエストされるので失敗することがわかっているデータの場合は手動で削除してください。
# ls -l /var/opt/osstech/lib/ucidm-passsync/.recovery/
合計 4
-rw-------. 1 ldap ldap 188 4月 14 10:34 2023-04-14-103417.011.data
PassSync Agent の動作を確認できたら OS 再起動時のサービス起動設定を確認します。基本的には OS 起動時に自動起動するとよいです。
# systemctl enable osstech-ucidm-passsync.service
# systemctl is-enabled osstech-ucidm-passsync.service
enabled
PassSync Agent サービスは osstech-slapd.service に依存するため、運用上の都合で osstech-slapd.service を自動起動していない場合はその設定にあわせて運用していただいても構いません。osstech-slapd.service を自動起動しているかどうかは次のコマンドで調べられます。
# systemctl is-enabled osstech-slapd.service
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 Server Service] passwd[ユーザー名\nパスワード] subgraph passhook[PassHook] pusher[ZeroMQ\nPush] end end end subgraph zmq [ZeroMQ] queue[Queue] end subgraph passsync [PassSync Agent] puller[ZeroMQ\nPull] ucidm-client[UCIDM\nクライアント] recovery-handler[リカバリ\nハンドラー] recovery-dir[リカバリ\nディレクトリ] end subgraph server [UCIDM API サーバー] upd-passwd[PUT password] end 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_BIND_DN | 任意 | bind-dn | AD の BIND DN |
AD_BIND_PASSWORD | 任意 | bind-password | AD の BIND パスワード |
AD_PORT | 任意 | 389 | 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_BASIC_AUTH_USER | 任意 | unico | 接続する UCIDM API の Basic 認証ユーザー |
API_BASIC_AUTH_PASSWORD | 任意 | – | 接続する UCIDM API の Basic 認証パスワード |
API_ACCOUNT_AUTH_USER | 任意 | – | 接続する UCIDM API の アカウント認証ユーザー |
API_ACCOUNT_AUTH_PASSWORD | 任意 | – | 接続する UCIDM API の アカウント認証パスワード |
UCIDM API サーバーへのリクエストに失敗 (ステータスコードが 500 以上を返す) したときのリトライの設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
CLIENT_RETRY_WAIT_MIN | 任意 | 1s | 1 回目のリトライの待ち時間 |
CLIENT_RETRY_WAIT_MAX | 任意 | 30s | リトライの最大の待ち時間 |
CLIENT_RETRY_MAX | 任意 | 4 | リトライの最大回数 |
agent プロセスがメッセージキューを使うときの設定をします。
環境変数 | 値 | 規定値 | 説明 |
---|---|---|---|
UCIDM_SOCKET_PATH | 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 システムの管理を行います。UCIDM システム上のアプリケーションの操作や設定になります。
UCIDM API
UCIDM は ID 連携のための Web API を提供します。
認証を必要としない Web API
例えば、API サーバーとの疎通確認のために使う ping API は次のように実行します。
$ curl "https://${ホスト名}:${ポート番号}/status/ping"
{
"message": "pong",
"remoteAddr": "172.18.0.1:54960",
"realIP": "172.18.0.1",
"updatedAt": "2024-11-28T08:07:08.680627934Z"
}
他にも UCIDM のバージョン情報を取得もできます。
$ curl "https://${ホスト名}:${ポート番号}/status/version"
{
"serverVersion": "f8802cf",
"idFederationClientVersion": "ef562e7",
"mongoDBVersion": "8.0.3",
"rabbitMQVersion": "4.0.3"
}
認証を必要とする Web API
UCIDM の大半の Web API を呼び出すには認証を必要とします。UCIDM は次の認証に対応しています。
- ベーシック認証
- アカウント認証
- LDAP 認証
- SAML 認証
例えば、ベーシック認証であれば次のように実行します。
$ curl --basic --user "unico:${Basic 認証パスワード}" \
"https://${ホスト名}:${ポート番号}/p/ping"
{
"message": "pong",
"remoteAddr": "172.18.0.1:54960",
"realIP": "172.18.0.1",
"updatedAt": "2024-11-28T08:07:08.680627934Z"
}
認証を行わない場合は 401 エラーが返ります。
$ curl -i "https://${ホスト名}:${ポート番号}/p/ping"
HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=UTF-8
Www-Authenticate: basic realm=Restricted
Date: Mon, 26 Feb 2024 05:28:45 GMT
Content-Length: 27
{"message":"Unauthorized"}
UCIDM API ドキュメント
Web API の仕様については UCIDM API に同梱している次のドキュメントを参照してください。
https://${ホスト名}:${ポート番号}/docs
ID 連携管理画面
UCIDM では ID 連携管理画面があり、主に以下の画面を提供しています。
- ジョブ進捗概要画面
- 現在の進捗中ジョブ数、失敗したジョブ数、成功したジョブ数を一覧表示します。
- 履歴一覧画面
- 外部連携・認証・LDAP 操作・UCIDM 内部の履歴を一覧表示します。
- 実行中ジョブ画面
- 実行中のジョブを一覧表示します。
- 外部連携設定画面
- 外部連携の設定項目確認や設定を行います。
- ルート設定画面
- エントリに対してどの連携処理を行うかを設定します。
- 管理者アカウント画面
- UCIDM の管理画面にログインできるアカウントを一覧表示します。
- ユーザー画面
- UCIDM のユーザを一覧表示します。
- グループ画面
- UCIDM のグループを一覧表示します。
- 対象外ユーザー画面
- UCIDM の連携対象外ユーザを一覧表示します。
- 対象外グループ画面
- UCIDM の連携対象外グループを一覧表示します。
各画面については後続の節にて説明します。
ID 連携管理画面へのアクセス
ID 連携管理画面へのアクセス URL は環境によって異なるので、compose.yml の admin-ui の設定および nginx の設定を参照の上、アクセスを行ってください。
トップ画面
ID 連携管理画面にアクセスするとトップ画面が表示されます。
画面右上に「ログイン」ボタンがあり、このボタンを押下するとログイン画面に遷移します。
ログイン画面
ユーザー名/パスワードを入力し、「ログイン」ボタンを押下してログインを行います。「パスワードが不明な場合」を押下することで、パスワードリセット申請画面に遷移します。
パスワードリセット申請画面
パスワードリセットを行う管理者名とメールアドレスを入力します。メールアドレスが設定されていない場合、パスワードリセットを行うことはできません。入力情報が正しい場合、入力されたメールアドレスに一時トークンが送信され、パスワードリセット画面に遷移します。
パスワードリセット画面
送られてきたメールに記述された一時トークン、新しいパスワード、新しいパスワード(確認)を入力し、「再設定」ボタンを押下することで、パスワードをリセットできます。
ログイン後トップ画面
以下の画面に遷移するボタンが表示されます。
- ジョブ進捗概要
- 履歴一覧
- 実行中ジョブ一覧
- 外部連携設定
- ルート設定
- 管理者アカウント一覧
- ユーザー一覧
- グループ一覧
- 対象外ユーザー一覧
- 対象外グループ一覧
画面左上にハンバーガーボタンがあり、このボタンを押下することで、上記画面に遷移できるサイドバーが現れます。
画面右上にはログイン名が表示されたボタンがあり、このボタンを押下することで以下の各種メニューが表示されます。
- アカウント情報
- 管理者アカウント詳細画面に遷移します。
- パスワード変更
- 管理者アカウントパスワード変更画面に遷移します。
- ログアウト
- このリンクをクリックすることで、ログアウトが行われます。
履歴一覧画面
- 以下の履歴タイプごとのボタンが表示されます。ボタンを押下することで、それぞれの履歴が一覧表示されます
- ID 連携履歴
- 外部サービスへの連携履歴の確認が行えます -連携時に更新されたデータの差分を確認できます
- 認証履歴
- 認証の履歴を確認することができます
- LDAP 操作履歴
- LDAP に対する操作の履歴を確認することができます
- UCIDM 内部履歴
- UCIDM 内部のサーバーログの履歴を確認することができます
- 全ての履歴
- 上記 4 つの履歴の主要情報をまとめてかくにんすることができます
- 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-admin のロールでログインしている場合は、すべてのアカウントの編集を行うことができます。
- 一覧表示された画面にて、鍵マークの「編集」アイコンを押下すると、管理者アカウントパスワード変更画面に遷移します。
- パスワード変更はログインしているアカウント自身のみ行えます。
- system-admin のロールでログインしている場合は、すべてのアカウントの編集を行うことができます。
- 一覧表示された画面にて、ゴミ箱マークの「削除」アイコンを押下すると、管理者アカウントが削除されます。
- system-admin のロールでログインしている場合は、他のアカウントの削除を行うことができます。
- 自分自身のアカウントは削除できません。
- system-admin のロールでログインしている場合は、他のアカウントの削除を行うことができます。
管理者アカウント新規作成画面
- 新規作成画面で設定内容を入力し、画面下部の「作成」を押下すると新規管理者アカウントが作成されます。ユーザー名とパスワードは必ず入力する必要があります。
- ユーザー名はアルファベット文字、数字、ハイフン、アンダースコアが使えます。
- アカウント作成時は以下の中から適切なロールを指定してください。
- system-admin
- system-user
- ldap-admin
- ldap-user
- 以下の各種設定も行うことができます。
- 言語
- ID 連携管理画面の表示言語を設定します。
- タイムゾーン
- ID 連携管理画面上で表示したい時刻のタイムゾーンを設定します。
- ページ当たりの表示件数
- ID 連携管理画面の履歴一覧画面等のページで 1 ページあたりに表示されるデフォルトの件数を設定します。
- 表示項目
- 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 には以下の情報を入力してください
マッピング設定
ここでは、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 では、外部連携処理の前後で任意のシェルスクリプトを実行することができます。
ここでは、外部連携設定画面において、実行する任意のシェルスクリプトを指定する方法について記載します。
事前準備
次の 外部連携の前処理/後処理で実行するスクリプトの配置 を参考に、スクリプトファイルを配置してください。
設定手順
- 前処理・後処理スクリプト設定フォームにて、実行したいスクリプトを指定します。
- スクリプトファイルは、外部連携の前処理と後処理でそれぞれ指定することができます。
- スクリプトファイルは、ユーザ追加、ユーザ更新等の処理種別ごとに指定することができます。
- 上記の事前準備で配置したスクリプトファイルをプルダウン値として選ぶことができます。
- 「+」ボタンで対象のスクリプトを追加後、「↑」ボタン、「↓」ボタンを押下してスクリプトの実行順序を入れ替えることができます
セルフメンテナンス機能
一般ユーザーが自身の情報を管理します。
ユーザープロファイル画面(管理者用)
UCIDM では ユーザープロファイル画面があり、主に以下の画面を提供しています。
- ユーザー管理画面
- グループ管理画面
- CSV 一括処理画面
- 履歴一覧画面
- 属性権限設定画面
- 表示・属性値設定画面
- デザイン設定画面
- パスワードポリシー設定画面
- 初期値設定画面
- ユーザーステータス設定画面
ユーザープロファイル画面へのアクセス
https://<ホスト名>/ui/admin/login にアクセスします。
ユーザープロファイル画面へのアクセス URL は環境によって異なるので、compose.yml の ucidm-ui の設定および nginx の設定を参照の上、アクセスを行ってください。
ログイン画面
ユーザー名/パスワードを入力し、「ログイン」ボタンを押下してログインを行います。パスワードリセットについては、ID 連携管理画面で行います。
ログイン後トップ画面
以下の画面に遷移するボタンが表示されます。
- ユーザー管理
- グループ管理
- 履歴一覧
- CSV 一括処理
- CSV 一括取込
- CSV 処理結果
- 各種設定
- 属性権限設定
- 表示・属性値設定
- デザイン設定
- パスワードポリシー設定
- 初期値設定
- ユーザーステータス設定
画面左側に以下の各種メニューが表示されます。
- ユーザー管理
- ユーザー管理画面に遷移します。
- グループ管理
- グループ管理画面に遷移します。
- CSV 一括処理
- CSV 一括取込
- CSV 一括取込画面に遷移します。
- CSV 処理結果
- CSV 処理結果画面に遷移します。
- CSV 一括取込
- 履歴一覧
- 履歴一覧画面に遷移します。
- 各種設定
- 属性権限設定
- 属性権限設定画面に遷移します。
- 表示・属性値設定
- 表示・属性値設定画面に遷移します。
- デザイン設定
- デザイン設定画面に遷移します。
- パスワードポリシー設定
- パスワードポリシー設定画面に遷移します。
- 初期値設定
- 初期値設定画面に遷移します。
- ユーザーステータス設定
- ユーザーステータス設定画面に遷移します。
- 属性権限設定
画面右上にユーザー名があり、このユーザー名を押下することで、以下の各種メニューが表示されます。
- ログアウト
- このリンクをクリックすることで、ログアウトが行われます。
ユーザー管理画面
- ユーザーの管理が行えます。
- キーワード検索では、検索ボックスに検索ワードを入れ検索ボタンを押下すると、表示・属性値設定画面で設定されている「検索対象」属性に対して検索ワードを含むユーザーを検索し、画面上に表示します。
- 詳細検索では、表示・属性値設定画面で設定されている「検索対象」属性の項目が表示されます。オプションを設定している属性に対してはチェックボックスが表示されます。検索ボタンを押下することで絞り込み検索が行えます。
- 検索結果の表示列は、表示・属性値設定画面で設定されている「表示」属性の項目がデフォルトになります。
- 「CSV エクスポート」ボタンを押下することで、表示されているユーザーの一覧をCSV ファイルとしてエクスポートできます。表示・属性値設定画面で設定している属性が使用されます。「参照のみ」の属性は対象外となります。
- ハンバーガーボタンを押すことで表示項目の一覧が表示されます。チェックボックスを操作することで画面上に表示する項目のon/offを切り替えられます。
- 行内一番左側のアイコンはユーザーのステータスを表します。緑色のユーザーアイコンは有効状態であることを表し、グレーのユーザーアイコンに赤いバツ印のついたアイコンはユーザーが無効状態であることを表します。
- 対象ユーザーの詳細画面に遷移するボタンと削除ボタンとユーザーのステータス切り替えボタンとパスワード変更ボタンと認証デバイスの設定を行うボタンが表示されます。
- 登録ボタンを押下すると、ユーザー登録画面に遷移します。
- 認証デバイス設定を行うボタンは、TOTP と Passkey の登録を行うURLが何も設定されていない場合は表示されません。
ユーザー詳細
- ユーザーの属性を更新します。
- 画面上部の削除ボタンからユーザーの削除が行えます。
- 画面上部の無効化ボタンからユーザーの無効化が行えます。またすでに無効状態のユーザーの場合は有効化ボタンになり、ユーザーの有効化が行えます。無効になったユーザーはユーザープロファイル画面にログインできなくなります。
- 編集したい属性の値を書き換えて更新ボタンを押すと、ユーザーの属性を更新出来ます。
- テキストボックス下部のプラスボタンを押すと、テキストボックスが1つ追加されます。また、テキストボックス右側のマイナスボタンを押すと、テキストボックスが1つ削除されます。
- 更新ボタン上部のプラスボタンを押すと編集属性を追加出来ます。また、属性名左側のゴミ箱ボタンを押すと編集属性を削除出来ます。
- テキストボックス内が空の場合は更新時には値なしとして無視されます。
- 画面下部の所属グループのテーブルにて、現在所属しているグループの一覧を確認できます。
- 所属グループ名を選択すると、選択した所属グループのグループ詳細画面に遷移します。
- 所属グループのテーブル上部の「所属グループ登録」から、任意のグループへの所属処理が行えます。所属したいグループにチェックを入れて「所属グループ登録」ボタンを押してください。
- 所属グループのテーブル上部の「所属グループ削除」から、任意のグループへの所属解除処理が行えます。所属解除したいグループにチェックを入れて「所属グループ削除」ボタンを押してください。
ユーザーパスワード変更
- ユーザーのパスワードを管理者が設定します。
- このときのパスワードルールとして、パスワードの長さと禁止文字が適用されます。
- ポリシーを満たすパスワードを入力し、更新ボタンを押すことでパスワードを更新出来ます。
- AD に存在するユーザーのパスワード変更の場合、LDAPS 接続である必要があります。
ユーザー登録
- ユーザーの登録が行えます。
- 値のテキストボックスに設定する値を入力し、画面下部の登録ボタンを押して登録してください。
- マルチバリューのテキストボックス下部のプラスボタンを押すと、テキストボックスが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
を入力するたびに、適切なパスワードポリシーを検索します。
認証デバイス設定画面
- 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
制約をかけていた場合、登録に失敗する場合があります。 - 任意の属性名の属性を設定できますが、サーバー側で未定義の属性は登録に失敗する場合があります。
- 画面下部の所属メンバーのテーブルにて、現在所属しているメンバーの一覧を確認できます。
- メンバー名を選択すると、選択したメンバーのユーザー詳細画面に遷移します。
- 所属メンバーのテーブル上部の「メンバー登録」から、任意のメンバーの登録処理が行えます。登録したいメンバーにチェックを入れて「メンバー登録」ボタンを押してください。
- 所属メンバーのテーブル上部の「メンバー削除」から、任意のメンバーの削除処理が行えます。削除したいメンバーにチェックを入れて「メンバー削除」ボタンを押してください。
CSV 一括処理画面
- CSV 一括取込画面で、CSV 一括処理を行えます。
- CSV ファイル、リソースタイプ、操作種別を選択後、CSV 一括取込ボタンを押下することで、CSV データの内容が送信されます。
- CSV ファイルを選択後、プレビューボタンを押下することで、CSV の内容(最初の 1000 件が表示されます。)
- CSV の一括処理が完了した後、CSV 処理結果画面でその結果を確認できます。
- 失敗のレコードがある場合、失敗のレコード数右のダウンロードアイコンを押下することで、一括処理に失敗したレコードだけが抽出された CSV ファイルをダウンロードできます。
- テーブル一番右のアイコンを押下することで、CSV ID に対応する一括処理の履歴の詳細を確認できます。
履歴一覧画面
- ログイン関係の認証履歴と LDAP の操作履歴の確認が行えます。
- 履歴の検索が行えます。
- エクスポート機能を使うことで特定の期間の全てのログを1つのファイルにまとめられます。
属性権限設定画面
- ロールとタイプの権限設定が表示されます。
- 設定したい項目の鉛筆マークを押下することで、その詳細画面に遷移します。
属性権限設定詳細画面
- 属性名は、表示設定画面で設定したユーザーとグループの属性が使用されます。使用しない場合は、全ての権限をオフにします。
- 属性に対して、「参照」、「編集」、「削除」を設定し、「更新」ボタンを押下することで、更新できます。
- 参照権限が与えられていない属性は、ユーザー属性変更画面に表示されません。
- 参照権限は、一般ユーザーは更新できず、表示のみになります。
- 編集権限は、一般ユーザーが変更できるようになります。
- 削除権限は、一般ユーザーが何も入力しない状態で更新を行うと、その属性が削除されます。
- 「インポート」ボタンを押下することで、選択された JSON ファイルの情報をそのままセットできます。「更新」ボタンを押下しないと反映されません。
- 「エクスポート」ボタンを押下することで、設定された情報を JSON ファイルとして保存できます。
- 「編集」ボタンを押下してオンにすると、自動で「参照」ボタンがオンになります。
- 「削除」ボタンを押下してオンにすると、自動で「編集」ボタンがオンになります。
表示・属性値設定画面
- 一般とユーザーとグループとOpenAMの日本語/英語の表示設定が表示されます。
- 設定したい項目の鉛筆マークを押下することで、その詳細画面に遷移します。
表示・属性値設定詳細画面
- 属性に対して以下の設定が可能です。
- 表示名
- 注意事項
- 注意事項においては、HTML 形式での記述が可能となります。
- 表示順(ユーザーとグループのみ)
- 必須(ユーザーとグループのみ)
- 多値(ユーザーとグループのみ)
- 参照のみ(ユーザーとグループのみ)
- この設定を on にした場合、対応する属性値の参照のみが許可されます。属性値を更新することはできなくなります。
- オプション値(ユーザーとグループのみ)
- マッピング設定(ユーザーとグループのみ)
- 必須権限は、必須属性になります。対象属性が入力されていないと更新できません。
- 多値権限は、対象属性に対して複数の値を入力できるようになります。
- 「インポート」ボタンを押下することで、選択された JSON ファイルの情報をそのままセットできます。「更新」ボタンを押下しないと反映されません(ユーザーとグループのみ)。
- 「エクスポート」ボタンを押下することで、設定された情報を JSON ファイルとして保存できます(ユーザーとグループのみ)。
- 表示名と注意事項とオプション値について設定したい場合は、「詳細設定」ボタンを押下することで、設定できます。
- 細かい設定の仕様については以下になります。
- 一般と 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 になります)。
- 編集後、「確認」ボタンを押下することで、どのような画面になるかを確認できます。
- 「保存」ボタンを押下することで、編集内容を保存できます。
- ヘッダーのロゴ画像については、images/header ディレクトリにロゴ画像を置くことで設定できます。ファイル名は logo.xxx(xxx は拡張子)にする必要があります。
- ファビコンの画像については、images/favicon ディレクトリに画像を置くことで設定できます。ファイル名は favicon.xxx(xxx は拡張子)にする必要があります。
- その他の画像については、images ディレクトリに配置することで、サンプルファイルのように画像を表示することが可能になります(パスワードポリシーでは対応していません)。
- パスワードポリシーの内容は、ユーザー登録画面、パスワード変更画面、パスワードリセット画面に表示されます。
パスワードポリシーの埋め込み変数
パスワードポリシーで設定されている値を表示するために埋め込み変数が用意してあります。デザイン設定のプレビュー画面では、デフォルトパスワードポリシーの値が表示されます。
埋め込み変数 | 説明 |
---|---|
.PwdMaxLength | パスワードの最大長 |
.PwdMinLength | パスワードの最小長 |
.PwdAlphabetCount | アルファベットの文字数 |
.PwdUpperCount | 大文字の文字数 |
.PwdLowerCount | 小文字の文字数 |
.PwdSymbolCount | 記号の文字数 |
.PwdDigitCount | 数字の文字数 |
.PwdComplexityCount | パスワードの複雑性 |
.PwdProhibitedString | パスワードの禁止文字 |
.PwdNotContainName | ユーザー名を含めない |
.PwdNotSameOldPassword | パスワードが1つ前と異なる |
サンプルのカスタムファイル
用意しているカスタムファイルの中身は以下になります。
ヘッダーとフッターの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; }
パスワードポリシー設定画面
- パスワードポリシーが表示されます。
- 「検索」ボタンを押下することで、設定名と対象ベース 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 と条件に一致したユーザーにそのパスワードポリシーが適用されます。何も一致するパスワードポリシーが存在しない場合はデフォルトポリシーが適用されます。
- 「インポート」ボタンを押下することで、選択された JSON ファイルの情報をそのままセットできます。「更新」ボタンを押下しないと反映されません。
- 「エクスポート」ボタンを押下することで、設定された情報を JSON ファイルとして保存できます。
- 「削除」ボタンを押下することで、表示されているパスワードポリシーは削除されます。デフォルトポリシーを削除することはできません。
パスワードポリシー
- パスワードポリシーでは以下のルールを設定できます。
- 最大文字数
- パスワードの最大文字数を設定します。
- 最小文字数
- パスワードの最小文字数を設定します。
- アルファベットの文字数
- パスワードに含めなければならないアルファベットの最小文字数を設定します。
- 大文字の文字数
- パスワードに含めなければならない大文字アルファベットの最小文字数を設定します。
- 小文字の文字数
- パスワードに含めなければならない小文字アルファベットの最小文字数を設定します。
- 記号の文字数
- パスワードに含めなければならない記号の最小文字数を設定します。
- 数字の文字数
- パスワードに含めなければならない数字の最小文字数を設定します。
- 複雑度
- 英大文字、英小文字、数字、記号という 4 つのカテゴリから、いくつのカテゴリをパスワードに含めるかを設定します。
- 禁止文字
- パスワードに含めてはいけない禁止文字を設定します。
- ユーザー名を含めない
- ユーザー名をパスワードに含めるかどうかを設定します。オンでパスワードにユーザー名を含めてはならないになります。
- 1 つ前のパスワードと異なる
- 1 つ前のパスワードと同じパスワード更新を許可するかどうかを設定します。オンで 1 つ前のパスワードと異なる必要があるになります。
- 最大文字数
初期値設定画面
- ユーザーとグループの初期値設定が表示されます。
- 登録ボタンを押下して必要な情報を入力することで、新しく設定を登録できます。
- 編集したい設定の鉛筆マークを押下することで、詳細画面に遷移します。
- 削除したい設定のゴミ箱マークを押下することで、設定が削除されます。
初期値設定詳細画面
- 設定を編集します。
- 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)];
}
カスタムロール有効設定画面
- 一般ユーザーがログインするときにカスタムロールを使うときの属性名やスクリプトを設定します。
- 「カスタムロールを有効にする」がオンになっている場合、カスタムロール属性の値をカスタムロールとして使用されます。オフになっている場合は、この画面の設定内容は使用されません。
- 「カスタムロール属性のスクリプトを利用する」がオンになっている場合、カスタムロールを取得するときにスクリプトが呼び出されるようになります。オフになっている場合は、スクリプトは呼び出されません。
- 「関数呼び出し確認」ボタンを押下することで、指定した関数の動作を確認することができます。
カスタムロール有効設定のスクリプト例
- ユーザーステータス設定のスクリプトとは仕様が異なります。
- カスタムロール名を返す
getRoleName()
という名前で関数を設定します。 - 必ず関数の戻り値を返す必要があります。
- 関数の戻り値として null または undefined を返した場合は一般ログイン時のときはデフォルトロールが使われます。
例えば、カスタムロール属性の値の2番目の要素をカスタムロール名とするときは次のようになります。
function getRoleName(values) {
// カスタムロールを取得するときにこの関数が呼ばれる
// 第1引数の values にはカスタムロール属性の値が文字列の配列として渡される
// 関数の戻り値はカスタムロールの名前を表す string 値を返す
return values[1];
}
ユーザープロファイル画面(一般ユーザー用)
UCIDM では ユーザープロファイル画面があり、主に以下の画面を提供しています。
- ユーザー属性変更画面
- パスワード変更画面
- 認証デバイス設定
- 履歴一覧
ユーザープロファイル画面へのアクセス
https://<ホスト名>/ui にアクセスします。
ユーザープロファイル画面へのアクセス URL は環境によって異なるので、compose.yml の ucidm-ui の設定および nginx の設定を参照の上、アクセスを行ってください。
トップ画面
ユーザープロファイル画面にアクセスするとトップ画面が表示されます。画面中央に「ログイン」ボタンがあり、このボタンを押下するとログイン画面に遷移します。
SAML でのログインを有効化している場合は SAML 用のログインボタンが表示されます。
ログイン画面
ユーザー名/パスワードを入力し、「ログイン」ボタンを押下してログインを行います。「パスワードが不明な場合」を押下することで、パスワードリセット申請画面に遷移します。
パスワードリセット申請画面
パスワードリセットを行う一般ユーザー名とメールアドレスを入力します。メールアドレスが設定されていない場合、パスワードリセットを行うことはできません。入力情報が正しい場合、入力されたメールアドレスに一時トークンが送信され、パスワードリセット画面に遷移します。
パスワードリセット画面
送られてきたメールに記述された一時トークン、新しいパスワード、新しいパスワード(確認)を入力し、「再設定」ボタンを押下することで、パスワードをリセットできます。
ログイン後トップ画面
以下の画面に遷移するボタンが表示されます。
- ユーザー属性変更
- パスワード変更
- 認証デバイス設定
- 履歴一覧
画面右上にユーザー名があり、このユーザー名を押下することで、以下の各種メニューが表示されます。
- 言語設定
- 日本語または英語に切り替えられます。
- ログアウト
- このリンクをクリックすることで、ログアウトが行われます。
- SAML 認証でログインしていて、シングルログアウトの設定が有効な場合、このリンクをクリックすることで、シングルログアウトの処理が行われます。
ユーザー属性変更画面
- ユーザーの属性情報が表示されます。
- 更新したい属性があれば、入力を行い「更新」ボタンを押下することで更新できます。
- 管理者の権限設定によって、表示されないまたは編集できない場合があります。
パスワード変更画面
- パスワードを変更する画面が表示されます。
- 現在のパスワードと新しいパスワードを入力します。
- 現在のパスワードが誤っている場合、パスワードを更新することはできません。
認証デバイス設定画面
- TOTP と Passkey の設定を行う画面が表示されます。
- TOTP の操作を許可するためには、管理者の権限設定で
oathDeviceProfiles
属性に参照と編集と削除権限が許可されている必要があります。 - TOTP の設定では、デバイス情報が見つからなければ「登録」ボタンが表示され、見つかる場合は現在のデバイス情報が表示されます。
- TOTP の再登録を行う場合は、一度削除する必要があります。
- Passkey の操作を許可するためには、管理者の権限設定で
fido2Credential
属性に参照と編集と削除権限が許可されている必要があります。 - Passkey の設定では、「登録」ボタンは常に表示され、デバイス情報が見つかる場合は現在のデバイス情報の一覧が表示されます。
履歴一覧画面
- 自身の操作履歴の一覧が表示されます。
- 表示される履歴の操作は、属性変更とパスワード変更になります。
仕様上の制約
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 連携管理画面 および ユーザープロファイル画面(管理者用)において、それぞれの画面にて同名のアカウントでログインを行って同時に各種操作をした場合、主にログアウト操作をした際に上手く動かない事象が確認できています。
システム運用
システムを運用する上で必要となる UCIDM 以外の一般的な機能や設定について紹介します。
コンテナイメージのバージョンアップ
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 サービスを停止するときは 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
}
他には次のパラメータが設定可能です。
weekly
1週間に1度monthly
1ヶ月に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
に設定したバックアップスクリプトを使って定期実行する設定を行います。
rpmインストール時に /etc/cron.d/ucidm-backup
というcronの設定ファイルが配置されます。
デフォルト設定では毎日 4:30 に実行されます。
$ sudo vi /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
移行
システムやデータ移行に関する内容を記載します。
データソースのシステム移行
UCIDM ではエントリー (ユーザーやグループなど) を識別する一意、且つ不可変な ID として entryUUID を使います。
内部ディレクトリサービス (OpenLDAP や Active Directory といったサービス) やクラウドサービス (Microsoft Entra ID など) といった、UCIDM からみてデータソースとなるシステムを移行する場合、それぞれのシステムにおいて entryUUID として管理されている ID の値が変わらないように移行する必要があります。
MongoDB
UCIDM はデータをエントリーや設定などのデータを MongoDB で管理しています。
MongoDB 間のデータ移行
物理サーバーのリプレースなど、既存の UCIDM 環境から別のサーバーマシンへ移行しなければならないときに MongoDB のデータのみを移行します。デプロイ済みの MongoDB コンテナにデータ移行のためのツールが同梱されているのでそれらを使います。
バックアップ/ダンプ
mongodump コマンドを使って1つのバイナリのダンプファイルを生成します。環境変数のユーザー名とパスワードは適宜、設定した値を指定してください。デフォルトでは ucidm
というデータベースを使っています。ダンプは相対的に速く完了します。定期的に実行してフルバックアップとして保管することもできます。
$ cd /var/opt/osstech/lib/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 mongo \
mongorestore --authenticationDatabase admin \
--uri "mongodb://${USERNAME}:${PASSWORD}@localhost:27017" \
--nsInclude "ucidm.*" --archive < ./20231002-mongodb.dump
FAQ
システム
- システム全般やシステム構成に関する質問
トラブルシューティング
- 一般的なトラブルシューティング
ログ確認
- コンテナログの確認方法
Agent の再同期
- 内部ディレクトリサービスから UCIDM API への再同期方法
Google 連携
- Google 連携方法
Microsoft Entra ID 連携
- Microsoft Entra ID 連携方法
JWT
- JWT の設定方法など
OpenAM との連携
- OpenAM との連携について
システム
システム全般やシステム構成などに関する内容を記載します。
複数台のマシンを使って冗長構成をサポートしていますか?
オンプレミス版 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
コンテナのログについては ログ確認 を参照してください。
エントリのデータが外部連携先に反映されていない
- LDAP Agent および AD Agent に、UCIDM の API からエラーが返っていないか確認してください
- ldap-agent または ad-agent のコンテナのログを確認してください
- 履歴一覧画面に失敗のレコードがないか確認してください
- 画面にて、DN 情報等を元にレコードの絞り込みを行うことができます
- もし失敗のレコードがあった際は、そのエラー内容を確認してください
- 必要に応じて、api や consumer のコンテナのログを確認してください
- 進捗中ジョブ一覧画面にて実行中のレコードがないか確認してください
- 画面にて、DN 情報等を元にレコードの絞り込みを行うことができます
- ここに表示されているジョブは現在実行中ですので、処理が終わるまでお待ちください
- LDAP Agent および AD Agent が UCIDM API サーバーにエントリを送信しているか確認してください
- OpenLDAP 、AD の操作を行い、Agent のログでそのエントリの受信が確認できない場合は Agent の設定を確認してください
- 個別またはすべてのエントリの再同期については Agent の再同期 を参照してください
ログ確認
ここではコンテナのログの確認方法について説明します。
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 社の公式ドキュメントを参照してください。
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 サブコマンドを実行したタイミング以降の変更差分のみを検出できるようになります。
Google Workspace 連携
一般的な Google Workspace 連携について記載します。
連携方法
.env に Google Workspace の接続情報を設定します。
GOOGLE_CLIENT_EMAIL=XXXXXXX
GOOGLE_PRIVATE_KEY=XXXXXXX
GOOGLE_SUBJECT=XXXXXXX
設定後、コンテナを以下のコマンドで起動します。既にコンテナが起動している場合は削除後、起動してください。
$ docker compose up -d consumer-google
コンテナ起動後は、UCIDM の管理画面のジョブ進捗概要、履歴一覧で確認します。
Google Workspace に連携されたかを直接確認する場合は、Google Workspace の管理コンソールで確認します。
ID 連携が行われていない
UCIDM の管理画面の履歴で失敗していないか確認してください。
-
失敗している場合
Google Workspace の接続情報、外部連携先が正しい設定になっているかを確認してください。
-
失敗していない場合
1度コンテナ consumer-google を削除して、コンテナを作成してください。
Microsoft Entra ID 連携
一般的な Microsoft Entra ID 連携について記載します。
連携方法
.env に Microsoft Entra ID の接続情報を設定します。
MEID_CLIENT_ID=XXXXXXX
MEID_CLIENT_SECRET=XXXXXXX
MEID_TENANT_ID=XXXXXXX
設定後、コンテナを以下のコマンドで起動します。既にコンテナが起動している場合は削除後、起動してください。
$ docker compose up -d consumer-meid
コンテナ起動後は、UCIDM の管理画面のジョブ進捗概要、履歴一覧で確認します。
Microsoft Entra ID に連携されたかを直接確認する場合は、Microsoft Entra ID ポータルで確認します。
ID 連携が行われていない
UCIDM の管理画面の履歴で失敗していないか確認してください。
-
失敗している場合
Microsoft Entra ID の接続情報、外部連携先が正しい設定になっているかを確認してください。
-
失敗していない場合
1 度コンテナ consumer-meid を削除して、コンテナを作成してください。
JWT の設定方法など
UCIDM の認証で使用する JWT について記載します。
JWT は、JSON 形式で署名や暗号化を用いて認証や情報共有に使用されます。
JWT は、署名によって保護されているため、秘密鍵の管理には十分な注意が必要になります。
JWT_SECRET_KEY の生成方法
/dev/urandom で生成します。生成された文字を環境変数に設定します。
$ head -c 64 /dev/urandom | base64
R28sScYPNyixe5WRiR2iUpuBBwSsAD4SPGmwpLmyabcAMaKR1PI/S58uAjWP2p9zSmeZuv3A+D5L
bIsmUDazMg==
トークンの有効期限の設定について
-
有効期限を秒で設定する場合
5 秒に設定する場合、“5s“を環境変数に設定します。
-
有効期限を分で設定する場合
5 分に設定する場合、“5m“を環境変数に設定します。
-
有効期限を時間で設定する場合
5 時間に設定する場合、“5h“を環境変数に設定します。
-
有効期限を日数で設定する場合
時間に変換して設定します。5 日の場合、“120h“を環境変数に設定します。
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 のメタデータが取得できます。
- <プロトコル>://<ユーザープロファイル画面の 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 用語集
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 で設定します。