システム概要

Unicorn Cloud ID Manager (以下 UCIDM) は、 社内で管理している内部ディレクトリサービス (OpenLDAP や Active Directory 1 といったサービス) の ID 情報を外部サービスへ ID 連携するためのシステムです。ユーザーやグループの追加・更新・削除、またユーザーのパスワードを変更したときなど、それらの変更を検知して自動的に外部サービスへ ID 連携します。

UCIDM は管理者の運用コストを削減すべく、可能な限り、既存システムを変更することなく、追加で UCIDM サーバーを構築すればすぐ稼働するように設計されています。次のシステム構成図は、お客様のシステムと UCIDM のモジュールがどのように ID 連携されるかのデータフローを簡潔に 2 示したものです。

お客様のシステムにオンプレミス版を導入するとき、UCIDM サーバーを新規に構築して ID 連携します。パスワードを同期するための PassSync Agent のみ、内部ディレクトリサービスを提供するサーバーにインストールする必要があります。

1

オンプレミスの Active Directory のこと

2

厳密なシステム構成は UCIDM サーバー を参照してください

flowchart TB
direction TB

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

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

  • RedHat Enterprise Linux 8 / 互換OS
  • RedHat Enterprise Linux 9 / 互換OS (推奨)

ネットワーク要件

UCIDM サーバーを構築するには、インターネット上にあるコンテナレジストリにアクセスしてコンテナイメージを取得します。サーバーマシンから外向けにインターネットアクセスできる必要があります。

さらに UCIDM サーバーから内部ディレクトリサービスのサーバーに変更検知のためにポーリングします。UCIDM サーバーから内部ディレクトリサービスのサーバーへアクセスできる必要があります。

ユーザーおよびグループの追加

OS を初期インストールした直後の状態を想定して説明します。

UCIDM は Docker Compose を使ってコンテナアプリケーションとして動作します。

セキュリティ強化の観点から、コンテナを root ユーザーではなく、非特権ユーザーで実行することが推奨されています。このことを rootless コンテナと呼び、非特権ユーザがコンテナを作成、実行、管理できます。

ここでは非特権ユーザーとして ucidm というユーザー/グループを作成します。お客様の環境ですでに適切なユーザーが存在するときは任意のユーザー/グループをお使いください。

ucidm ユーザーおよびグループの作成

ユーザーおよびグループを作成します。

# useradd ucidm
# id ucidm
uid=1000(ucidm) gid=1000(ucidm) groups=1000(ucidm)

作成したユーザーに任意のパスワードを設定します。

# passwd ucidm
ユーザー ucidm のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

/etc/sudoers の設定

ここでは非特権ユーザーの ucidm が必要に応じて sudo コマンドを実行できるようにします。 これはセキュリティ上とても重要な設定になります。 お客様の環境にあわせて sudoers 設定の可否ならびに設定方法を精査してください。

# sudo visudo
(必要な設定を記述する)

例として ucidm ユーザーに無制限の root 権限を付与すると次のような設定になります。

# grep ucidm /etc/sudoers
ucidm ALL=(ALL) ALL

Docker Compose

UCIDM は Docker Compose を使って複数のアプリケーションやミドルウェアを管理します。そのため、UCIDM をインストールするには Docker と Docker Compose もインストールする必要があります。またセキュリティ強化の観点から rootless コンテナの導入を推奨します。

Docker 社のドキュメントをベースにインストールの手順を説明します。

Docker 社のパッケージはバージョンによって変わる可能性があります。適切なパッケージがみつからない場合は Docker 社のドキュメントを参考にしてください。

初回インストールするとき

Docker 社が提供するリポジトリ設定を取得します。

$ sudo dnf install -y yum-utils
$ sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Docker 関連のモジュールをインストールします。

$ sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin fuse-overlayfs iptables

docker グループを作成して非特権ユーザー (ucidm) に設定します。

$ sudo groupadd docker
$ sudo usermod -aG docker ucidm

ucidm ユーザーでログインします。

$ whoami
ucidm
$ groups
docker ucidm

subuid と subgid に ucidm ユーザー/グループが存在することを確認します。

$ grep ^$(whoami): /etc/subuid
ucidm:100000:65536
$ grep ^$(whoami): /etc/subgid
ucidm:100000:65536

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
EOF
########## END ##########

もし iptables のモジュールに関してこのようなエラーが発生したら指示の通り、次のように実行します。

$ sudo sh -eux <<EOF
> # Load ip_tables module
> modprobe ip_tables
> EOF

modprobe コマンドの実行後、再度 setup スクリプトを実行します。

$ dockerd-rootless-setuptool.sh install

DOCKER_HOST の環境変数が表示されているはずです。この設定を .bashrc の最後に追加します。

$ vi ~/.bashrc
...
export DOCKER_HOST=unix:///run/user/1000/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=1000
GID=1000
Name=ucidm
Timestamp=Fri 2023-09-29 02:51:20 EDT
TimestampMonotonic=2118735295
RuntimePath=/run/user/1000
Service=user@1000.service
Slice=user-1000.slice
Display=9
State=active
Sessions=9
IdleHint=no
IdleSinceHint=0
IdleSinceHintMonotonic=0
Linger=yes

アップグレードするとき

通常の dnf コマンドのアップグレードを実行してください。

$ sudo dnf upgrade -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

UCIDM モジュール

UCIDM は RPM パッケージで提供します。RPM パッケージの入手方法は弊社のサポート担当者にご確認ください。

初回インストールするとき

ここでは 1.0.0-1 というバージョンを例にインストール作業の説明をしますが、適宜お手持ちの最新のバージョンに置き換えて作業してください。

$ sudo rpm -ivh osstech-ucidm-1.0.0-1.el8.x86_64.rpm

基本的には /opt/osstech 配下にインストールされます。次のコマンドでインストールされた内容を確認できます。

$ rpm -ql osstech-ucidm

インストールされるものの主な構成について説明します。

  • /opt/osstech/bin: コマンドラインで使う運用ツール
  • /opt/osstech/share/ucidm: docker-compose.yml を始め、アプリケーションやミドルウェアの設定ファイルのサンプルなど
  • /opt/osstech/var/lib/ucidm: 実際に UCIDM システムを稼働させるときのディレクトリ

アップグレードするとき

アップグレード前に既存サービスを停止させます。

$ cd /opt/osstech/var/lib/ucidm
$ docker compose down

通常の rpm パッケージのアップグレードを実行してください。

$ sudo rpm -Uvh osstech-ucidm-1.0.0-2.el8.x86_64.rpm

PassSync Agent モジュール

PassSync モジュールは、既存の内部ディレクトリサービスを提供するサーバーにインストールします。RPM パッケージや Windows インストーラーの入手方法は弊社のサポート担当者にご確認ください。バージョンについては、適宜お手持ちの最新のバージョンに置き換えて作業してください。

Linux サーバー向け

前提条件

OSSTech 社 OpenLDAP サーバーを使っていただく必要があります。

初回インストールするとき

$ sudo rpm -ivh osstech-ucidm-agent-ldap-passsync-1.0.0-1.el8.x86_64.rpm

インストール後の設定は OpenLDAP 向け PassSync Agent をご確認ください。

アップグレードするとき

アップグレード前に既存サービスを停止させます。

$ sudo systemctl stop osstech-slapd
$ sudo systemctl stop ucidm-passsync.service

通常の rpm パッケージのアップグレードを実行してください。

$ sudo rpm -Uvh osstech-ucidm-agent-ldap-passsync-1.0.0-2.el8.x86_64.rpm

アップグレードを完了したらサービスを開始します。

$ sudo systemctl start ucidm-passsync.service
$ sudo systemctl start osstech-slapd

Windows サーバー向け

UCIDM-ADPassHook-Setup.msi と UCIDM-ADPassSync-Setup.msi を使用してインストール/アップグレード/アンインストールを行います。

UCIDM-ADPassHook

初回インストールするとき

  1. UCIDM-ADPassHook-Setup.msi を右クリックして インストール を選択します。
  2. インストール後、OS を再起動します。

インストール後の設定は Active Directory 向け PassSync Agent をご確認ください。

アップグレードするとき

  1. UCIDM-ADPassHook-Setup.msi を右クリックして アンインストール を選択します。
  2. アンインストール後、OS を再起動します。
  3. 新しいバージョンの UCIDM-ADPassHook-Setup.msi を右クリックして インストール を選択します。
  4. インストール後、OS を再起動します。

アンインストールするとき

  1. UCIDM-ADPassHook-Setup.msi を右クリックして アンインストール を選択します。
  2. アンインストール後、OS を再起動します。
  3. System32 にある UCIDM_ADPassHook.dll と UCIDM_PasswordHook_EventMessages.dll を削除します。

UCIDM-ADPassSync

初回インストールするとき

  1. UCIDM-ADPassSync-Setup.msi を右クリックして インストール を選択します。
  2. インストール完了後、OS を再起動することでサービス UCIDM-ADPassSync が起動します。UCIDM-ADPassSync が起動しているかどうかは、コンピュータの管理 から サービスとアプリケーション -> サービス 一覧にある UCIDM-ADPassSync の状態で確認できます。

インストール後の設定は Active Directory 向け PassSync Agent をご確認ください。

アップグレードするとき

アップグレードする時はサービス UCIDM-ADPassSync が停止している必要があります。

  1. サービスが起動している場合は、コンピュータの管理 から サービスとアプリケーション -> サービス 一覧にある UCIDM-ADPassSync を右クリックして 停止 を選択をすると停止します。
  2. 停止後、新しいバージョンの UCIDM-ADPassSync-Setup.msi を右クリックして インストール を選択します。インストールが失敗した場合は、C:\OSSTech ディレクトリを削除し、再インストールします。
  3. インストール後、OSを再起動することでサービス UCIDM-ADPassSync が起動します。UCIDM-ADPassSync が起動しているかどうかは、コンピュータの管理 から サービスとアプリケーション -> サービス 一覧にあるUCIDM-ADPassSyncの状態で確認できます。

アンインストールするとき

アンインストールする時はサービス UCIDM-ADPassSync が停止している必要があります。

  1. サービスが起動している場合は、コンピュータの管理 から サービスとアプリケーション -> サービス 一覧にある UCIDM-ADPassSync を右クリックして 停止 を選択をすると停止します。
  2. 停止後、UCIDM-ADPassSync-Setup.msi を右クリックして アンインストール を選択してアンインストールします。サービス UCIDM-ADPassSync を停止せずにアンインストールした場合は、OS を再起動することでサービス UCIDM-ADPassSync は削除されます。アンインストール時に EventLog サービスなどの警告が表示された場合は「OK」を選択します。
  3. C:\OSSTech\UCIDM-ADPassSync ディレクトリを削除します。

設定

パッケージのインストール 後にそれぞれのモジュールの設定を行ってサービスを起動します。

それぞれのモジュールがインストールされているサーバー別に設定を説明します。

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 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 サーバー]
  subgraph compose[Docker Compose]
    agent[Agent]
    proxy["リバースプロキシ\n(TLS 終端)"]
    api[UCIDM API]
  end
end

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 -- https --> proxy
proxy -- http --> api

UCIDM サーバーと外部サービスのデータフロー

flowchart TB

subgraph server [UCIDM サーバー]
  subgraph compose[Docker Compose]
    agent[Agent]
    admin-ui-bff[Admin UI]
    ucidm-ui-bff[UCIDM UI]
    proxy["リバースプロキシ\n(TLS 終端)"]
    api[UCIDM\nAPI]
    client[外部連携\nモジュール]

    client o--o mongodb
    api o--o mongodb(MongoDB)
    api -- publish --> rabbitmq(RabbitMQ)
  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

in-directory-service -- ldaps/https --> agent
api -- ldaps --> ldap-server

agent -- https --> proxy
proxy -- http --> admin-ui-bff
proxy -- http --> ucidm-ui-bff
admin-ui-bff -- https --> proxy
ucidm-ui-bff -- https --> proxy
proxy -- http --> api
rabbitmq -- subcribe --> client

admin-ui-bff -- アセット --> admin-ui(ID 連携\n管理画面)
admin-ui o--o sysadmin(システム\n管理者)
admin-ui -- https --> proxy

ucidm-ui-bff -- アセット --> ucidm-ui(ユーザー\nプロファイル\n画面)
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 サーバー]
  subgraph compose[Docker Compose]
    agent[Agent]
    admin-ui-bff[Admin UI]
    ucidm-ui-bff[UCIDM UI]
    proxy["リバースプロキシ\n(TLS 終端)"]
    api[UCIDM API]
    client[外部連携モジュール]

    api o--o mongodb(MongoDB)
    api -- publish --> rabbitmq(RabbitMQ)
    client o--o mongodb
  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

adserver -- ldaps --> agent
in-ldapserver -- ldaps --> agent

api -- ldaps --> in-directory-service

agent -- https --> proxy
proxy -- http --> admin-ui-bff
proxy -- http --> ucidm-ui-bff
admin-ui-bff -- https --> proxy
ucidm-ui-bff -- https --> proxy
proxy -- http --> api
rabbitmq -- subcribe --> client

admin-ui-bff -- アセット --> admin-ui(ID 連携管理画面)
admin-ui o--o sysadmin(システム管理者)
admin-ui -- https --> proxy

ucidm-ui-bff -- アセット --> ucidm-ui(ユーザープロファイル画面)
ucidm-ui o--o user(一般ユーザー)
ucidm-ui -- https --> proxy

client -- ldaps/https --> ext-directory-service

Docker Compose

UCIDM は Docker Compose を使い、複数のアプリケーションやミドルウェアのコンテナを起動して、それぞれのサービスが協調してシステムを構成しています。

これらはすべて docker-compose.yml に設定します。また docker-compose.yml はデフォルトの動作で環境変数を同じディレクトリ内の .env から読み込みます。

.env ファイルはパスワードなどの機密情報を含むため、ファイルを保管する場所のアクセス権限に注意してください。ここでは ucidm ユーザーのみがアクセス権限をもつと仮定して、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 の設定ファイル

docker-compose.yml を配置するディレクトリの権限を変更します。

$ sudo chown -R ucidm:docker /opt/osstech/var/lib/ucidm
$ ls -ld /opt/osstech/var/lib/ucidm
drwxr-xr-x. 2 ucidm docker 6  2月 20 18:16 /opt/osstech/var/lib/ucidm

docker-compose.yml を配置するディレクトリに移動します。

$ cd /opt/osstech/var/lib/ucidm

Docker Compose の設定のサンプルファイルを /opt/osstech/var/lib/ucidm ディレクトリにコピーします。

$ cp /opt/osstech/share/ucidm/docker-compose.yml .
$ cp /opt/osstech/share/ucidm/dot_env.example .env

Docker Compose 上でコンテナとして稼働するアプリケーションやミドルウェアの設定のサンプルファイルも一緒にコピーします。

$ cp -r /opt/osstech/share/ucidm/{nginx,rabbitmq,server-data,ucidm-ui} .
$ ls -a
.  ..  .env  docker-compose.yml  nginx  rabbitmq  server-data  ucidm-ui

Docker Compose で各種コンテナを起動すると、/opt/osstech/var/lib/ucidm のディレクトリに、デフォルトで volumes のディレクトリが作られます。

この volumes は主に DB の情報などのデータを格納する用途で使われます。設定情報やスクリプト等のファイルは、それぞれの用途に特化したディレクトリに配置します。

これらのアプリケーションやミドルウェアの設定の詳細は次のページでみていきます。UCIDM で利用するサービスは次の通りです。

コンテナイメージの取得

docker-compose.yml を配置したらコンテナイメージを取得します。すでにコンテナイメージを取得済みであっても、より新しいイメージがあれば最新のイメージを取得します。

$ docker compose pull

MongoDB

UCIDM は MongoDB に次の情報を格納します。

  • ユーザやグループの情報
  • 外部連携のために必要な情報
  • ID 連携の履歴情報
  • アカウント管理の情報

Docker Compose の設定

MongoDB はコンテナとして稼働させます。次のように docker-compose.yml に設定します。任意で設定している項目の値はサンプルです。お客様の環境にあわせて値を変更してください。

  mongo:
    container_name: mongo
    user: root
    image: docker.io/bitnami/mongodb:7.0.4
    logging: *default-logging
    volumes:
      - ./volumes/mongodb:/bitnami/mongodb
    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}"
    ports:
      - 27017:27017
    restart: "always"

ここで参照する環境変数は .env に設定します。

環境変数の設定

環境変数規定値説明
MONGODB_ROOT_USER任意rootMongoDB の root ユーザー名
MONGODB_ROOT_PASSWORD任意MongoDB の root ユーザーのパスワード
MONGODB_PORT_NUMBER任意27017MongoDB に接続するポート番号
MONGODB_INITIAL_PRIMARY_PORT_NUMBER任意27017レプリカセットのプライマリーノードのポート番号
MONGODB_ADVERTISED_HOSTNAME任意レプリカセットが使うホスト名
MONGODB_REPLICA_SET_NAME任意レプリカセットの名前
MONGODB_REPLICA_SET_MODEprimaryレプリケーションモード (primary, secondary, arbiter)
MONGODB_REPLICA_SET_KEY任意レプリカセットの認証のための共通鍵
MONGODB_SYSTEM_LOG_VERBOSITY00ログレベル (0-5)

詳細については MongoDB® packaged by Bitnami を参照してください。

RabbitMQ

UCIDM は API サーバーで受け取った ID 連携の情報を RabbitMQ を経由して複数の外部連携先に送ります。

Docker Compose の設定

RabbitMQ はコンテナとして稼働させます。次のように docker-compose.yml に設定します。

  rabbitmq:
    container_name: rabbitmq
    hostname: rabbitmq
    image: docker.io/library/rabbitmq:3.12.2-management
    logging: *default-logging
    environment:
      RABBITMQ_DEFAULT_USER: "${RABBITMQ_USER}"
      RABBITMQ_DEFAULT_PASS: "${RABBITMQ_PASSWORD}"
    ports:
      - 5672:5672
      - 15672:15672
    volumes:
      - ./rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
      - ./volumes/rabbitmq-data:/var/lib/rabbitmq
    restart: "always"
    healthcheck:
      test: rabbitmq-diagnostics -q ping
      interval: 10s
      timeout: 5s
      retries: 6
      start_period: 20s

ここで参照する環境変数は .env に設定します。

環境変数の設定

環境変数説明
RABBITMQ_DEFAULT_USER任意初期化時に作成する RabbitMQ のユーザ名
RABBITMQ_DEFAULT_PASS任意初期化時に作成する RabbitMQ のパスワード

RabbitMQ の管理

RabbitMQ サービスを起動した後の ExchangeQueue を管理するための機能を紹介します。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"
    }
  ]
}

この後のコマンドライン操作で .env に設定されている AMQP_URL を上書きしないように環境変数を削除します。

# unset AMQP_URL

RabbitMQ の管理画面を使う

localhost:15672 にアクセスします (ここでは接続先を localhost として説明しますが、適宜、お客様の環境にあわせてください) 。次のように管理画面へのログインページが表示されます。

前節の環境変数で設定したユーザー名とパスワードを使ってログインします。

Reverse Proxy

UCIDM API や管理画面にアクセスするときに HTTPS で通信するためのリバースプロキシを経由します。プロキシサーバーには Nginx を使います。

あらかじめ、お客様のドメイン向けの SSL/TLS サーバー証明書をご用意ください。

  proxy:
    depends_on:
      - admin-ui
      - ucidm-ui
      - api
    container_name: proxy
    image: docker.io/library/nginx:stable
    logging: *default-logging
    ports:
      - 8080:80
      - 4430:443
      - 5443:5443
      - 8443:8443
    restart: unless-stopped
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/common_proxy.conf:/etc/nginx/common_proxy.conf:ro

nginx の設定ファイル

設定ファイルは /opt/osstech/var/lib/ucidm/nginx ディレクトリに配置します。

# ls nginx
common_proxy.conf  nginx.conf  ssl

$ ls nginx/ssl
sample.crt  sample.key

これは動作確認テストのために sample.{crt,key} という自己証明書を使った設定をしています。お客様でご用意いただいた SSL/TLS サーバー証明書を nginx/ssl 配下に配置します。

そして Configuring HTTPS servers を参考にして次の2つの設定を行います。

ssl_certificate /etc/nginx/ssl/${サーバー証明書};
ssl_certificate_key /etc/nginx/ssl/${秘密鍵};

UCIDM API の起動後、次のように HTTPS で通信してレスポンスを取得できるかで確認できます。

$ curl -i https://localhost:8443/status/version
HTTP/1.1 200 OK
...
{"serverVersion":"b67adba","idFederationClientVersion":"","mongoDBVersion":"7.0.4","rabbitMQVersion":"3.12.2"}

UCIDM API

UCIDM は ID 連携のための Web API を提供します。

  • ユーザ操作
  • グループ操作
  • 外部連携先設定操作
  • 履歴情報一覧
  • ジョブ進捗概要取得
  • ジョブ詳細情報取得

UCIDM API はコンテナとして稼働させます。次のように docker-compose.yml に設定します。

外部連携モジュールから名前付きパイプを介してバージョン情報を受け取ります。設定の詳細については コンテナ間のデータ連携 を参照してください。この情報は 1 時間キャッシュされます。外部連携モジュールのコンテナを更新したとき、最大 1 時間はバージョン情報が更新されない可能性があります。

  api:
    depends_on:
      mongo:
        condition: service_started
      rabbitmq:
        condition: service_healthy
    container_name: api
    hostname: api
    image: docker.io/osstech/ucidm-api:latest
    logging: *default-logging
    volumes:
      - ./server-data:/ucidm
      - ./volumes/id-federation-client-pipe:${ID_FEDERATION_CLIENT_PIPE}
    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}"
      BASIC_AUTH_PASSWORD: "${BASIC_AUTH_PASSWORD}"
      JWT_SECRET_KEY: "${JWT_SECRET_KEY}"
      JWT_ACCESS_EXPIRATION_TIME: "${JWT_ACCESS_EXPIRATION_TIME}"
      JWT_REFRESH_EXPIRATION_TIME: "${JWT_REFRESH_EXPIRATION_TIME}"
      MAX_PRODUCER_SESSIONS: "${MAX_PRODUCER_SESSIONS}"
      ID_FEDERATION_CLIENT_PIPE: "${ID_FEDERATION_CLIENT_PIPE}"
      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}"
      # 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}"
      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_USER_ENABLED_ATTRIBUTE: "${AGENT_LDAP_USER_ENABLED_ATTRIBUTE}"
      LDAP_GROUP_SEARCH_BASE: "${AGENT_LDAP_GROUP_SEARCH_BASE}"
      LDAP_GROUP_SEARCH_FILTER: "${AGENT_LDAP_GROUP_SEARCH_FILTER}"
      # SAML_SP_ENTITY_ID: "${SAML_SP_ENTITY_ID}"
      # SAML_SP_ROOT_URL: "${SAML_SP_ROOT_URL}"
      # SAML_SP_CERTIFICATE_FILE: "${SAML_SP_CERTIFICATE_FILE}"
      # SAML_SP_KEY_FILE: "${SAML_SP_KEY_FILE}"
      # 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}"
    ports:
      - ${API_PORT}:${API_PORT}
    restart: "always"

ここで参照する環境変数は .env に設定します。

環境変数の設定

環境変数規定値説明
API_PORT18080接続を受け付けるポート番号
AMQP_URL任意接続する RabbitMQ の URL
MONGO_USER任意接続する MongoDB のユーザ名
MONGO_PASSWORD任意接続する MongoDB のパスワード
MONGO_HOSTS任意接続する MongoDB のホスト
MONGO_REPLICA_SET任意接続する MongoDB のレプリカセットの名前
BASIC_AUTH_PASSWORD任意Basic 認証のためのパスワード
JWT_SECRET_KEY任意JWT の署名に使用
JWT_ACCESS_EXPIRATION_TIME任意1hアクセストークンの有効期限
JWT_REFRESH_EXPIRATION_TIME任意2160hリフレッシュトークンの有効期限
MAX_PRODUCER_SESSIONS任意512RabbitMQ Procuder の
最大セッション数
ID_FEDERATION_CLIENT_PIPE任意/mnt/id-federation-client-pipe名前付きパイプをマウントさせるパスを指定
SMTP_HOST任意SMTP サーバーのホスト名
SMTP_PORT任意465SMTP サーバーのポート番号
SMTP_AUTH_USERNAME任意SMTP サーバーの認証で使用するユーザー名
SMTP_AUTH_PASSWORD任意SMTP サーバーの認証で使用するパスワード
SMTP_AUTH_METHODPLAIN または XOAUTH2PLAINSMTP サーバーの認証方法
SMTP_USE_TLStrue または falsetrueSMTP サーバーの TLS 通信の有効/無効
SMTP_USE_STARTTLStrue または falsefalseSMTP サーバーの STARTTLS 通信の有効/無効
SMTP_SECURE_SKIPtrue または falsefalseSMTP サーバーで自己証明書を使うことの可否
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任意アクセストークンを発行するトークンエンドポイント
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パスワードリセット成功メールのテンプレートファイルパス
USER_PRIMARY_ID_TEMPLATE任意ユーザーの primaryID 作成のためのテンプレート文字列
GROUP_PRIMARY_ID_TEMPLATE任意グループの primaryID 作成のためのテンプレート文字列
LDAP_SCHEMEldap または ldapsldap接続する LDAP サーバーのプロトコル
LDAP_HOSTS任意接続する LDAP サーバーのホスト名
LDAP_PORT任意接続する LDAP サーバーのポート番号
LDAP_SECURE_SKIPtrue または falsefalseLDAPS 通信で自己証明書を使うことの可否
LDAP_BIND_DN任意接続する LDAP サーバーの bind ユーザー
LDAP_BIND_PASSWORD任意接続する LDAP サーバーの bind ユーザーのパスワード
LDAP_SEARCH_BASE任意LDAP ユーザー・グループ検索対象 DN
LDAP_USER_SEARCH_BASE任意LDAP ユーザー検索対象 DN
LDAP_USER_SEARCH_FILTER任意LDAP ユーザー検索条件
LDAP_USER_ENABLED_ATTRIBUTE任意ucidmUserEnabledLDAP ユーザー の有効/無効を管理する属性名
LDAP_GROUP_SEARCH_BASE任意LDAP グループ検索対象 DN
LDAP_GROUP_SEARCH_FILTER任意LDAP グループ検索条件
SAML_SP_ENTITY_ID任意SAML SP の EntityID
SAML_SP_ROOT_URL任意SAML SP の ROOT URL
SAML_SP_CERTIFICATE_FILE任意SAML SP の証明書ファイルのパス
SAML_SP_KEY_FILE任意SAML SP の鍵ファイルのパス
SAML_SP_IDP_METADATA_URL任意SAML IdP のメタデータの URL
SAML_SP_IDP_METADATA_FILE任意SAML IdP のメタデータファイルのパス
SAML_SP_TLS_SKIP_VERIFY_FETCH_IDP_METADATA任意falseSAML IdP のメタデータ取得時に自己証明書を許可するかどうか
SAML_SP_AUTH_TYPE任意ldapSAML ログイン時に付与される認証タイプ
SAML_SP_ROLE_NAME任意ldap-userSAML ログイン時に付与されるロール名

環境変数設定の補足

primaryID

UCIDM では、各ユーザー/グループを一意に識別するための ID として primaryID を使用します。

primaryID はデフォルトでは DN 文字列の RDN0 の値が割り当てられます。

例) cn=test1,ou=people,dc=example,dc=com という DN であれば test1 が primaryID になる

ここで primaryID は必ず一意となるように設定する必要があります。仮に DN 文字列の RDN0 の値のみだと競合してしまうような場合は USER_PRIMARY_ID_TEMPLATEGROUP_PRIMARY_ID_TEMPLATE のテンプレート文字列を使って一意になるような値を割り当ててください。

例) “%{cn}-%{uid}” と設定した場合、属性の cn=test1, uid=101 ならば test1-101 が primaryID になる

primaryID は、Microsoft Entra ID、Google Workspace、AD、SCIM の外部サービスへの連携において主要なキー情報として連携されます。仕様上の制約 もご確認ください。

パスワードリセット向けメールのテンプレートファイル

アカウントのパスワードを忘れたときにメールを送信してパスワードリセットできます。メールのテンプレートファイルを使ってパスワードリセットメールをカスタマイズできます。

メールのテンプレートファイルでは、次のフィールドに対してテンプレート変数を使ってカスタマイズします。

フィールド名説明
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: パスワードリセット成功

新しいパスワードに更新されました。

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...

SAML 認証

SAML_SP_ENTITY_ID の値を設定することで、SAML 認証が有効になります。

SAML_SP_ROOT_URL の値を使って SAML 関連のエンドポイントが定義され、メタデータに反映されます。この値はユーザープロファイルのアクセスホスト名:ポート番号を使って、以下のように設定してください。

  • <プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/api/

SAML_SP_CERTIFICATE_FILE および SAML_SP_KEY_FILE にて SAML SP の証明書およびキーファイルのパスを設定します。

SAML IdP のメタデータが URL にて取得可能な場合、SAML_SP_IDP_METADATA_URL にその URL を設定します。(IdP にて自己証明書を使っている場合は、SAML_SP_TLS_SKIP_VERIFY_FETCH_IDP_METADATA を true に設定する必要があります。)

SAML IdP のメタデータが URL にて取得可能でない場合、IdP からメタデータをダウンロードし、そのメタデータを配置したパスを SAML_SP_IDP_METADATA_FILE にて設定してください。

SAML 認証時、認証されたユーザーに ldap 以外の認証タイプ、ldap-user 以外のロールを指定する場合は、SAML_SP_AUTH_TYPE および SAML_SP_ROLE_NAME の値を設定します。

SAML 認証 も合わせてご確認ください。

ID 連携管理画面

UCIDM は ID 連携の管理者向けの管理画面を提供します。

管理画面のアプリケーションはコンテナとして稼働させます。次のように docker-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 に設定します。

環境変数の設定

環境変数規定値説明
PORT3030接続を受け付ける
ポート番号
PUBLIC_UCIDM_API_SERVERhttp://api:18080接続する UCIDM API の
ベース URL
JWT_ACCESS_SECRET任意JWT の署名に使う文字列
SESSION_MAX_AGE任意3600管理画面のログイン
セッションの最大時間(秒)

ユーザープロファイル画面

UCIDM はユーザープロファイル画面を提供します。

ユーザープロファイル画面のアプリケーションはコンテナとして稼働させます。次のように docker-compose.yml に設定します。

  ucidm-ui:
    container_name: ucidm-ui
    image: docker.io/osstech/ucidm-ui:latest
    logging: *default-logging
    volumes:
      - ./ucidm-ui/templates:/templates
      - ./ucidm-ui/images:/images
    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}"
      # PUBLIC_ENABLE_SAML_LOGIN: "${ENABLE_SAML_LOGIN}"
      # PUBLIC_ENABLE_SP_INIT_SLO: "${ENABLE_SP_INIT_SLO}"
    ports:
      - ${UCIDM_NODE_PORT}:${UCIDM_NODE_PORT}
    restart: "always"

ここで参照する環境変数は .env に設定します。

環境変数の設定

環境変数規定値説明
PORT3030接続を受け付ける
ポート番号
PUBLIC_UCIDM_API_SERVERhttp://api:18080接続する UCIDM API の
ベース URL
JWT_ACCESS_SECRET任意JWT の署名に使う文字列
SESSION_MAX_AGE任意3600管理画面のログイン
セッションの最大時間(秒)
DISABLE_HEADER_TEMPLATEtrue または falsefalseヘッダーカスタマイズの有無
DISABLE_FOOTER_TEMPLATEtrue または falsefalseフッターカスタマイズの有無
PUBLIC_ENABLE_SAML_LOGINtrue または falsefalseユーザープロファイル画面で SAML でのログインを行うことの可否
PUBLIC_ENABLE_SP_INIT_SLOtrue または falsefalseユーザープロファイル画面で SAML シングルログアウトを行うことの可否

外部連携

UCIDM は次の外部連携先への ID 連携に対応しています。

複数の連携先がある場合、個々の連携先単位に 1 つのプロセスが割り当てられます。

例えば、3 つの連携先がある場合は 3 つのプロセスが起動します。設定がやや冗長となるデメリットはありますが、ある連携先サービスで障害が発生しても他の連携先には影響しないというメリットがあります。

外部サービスや連携先のプロトコル単位にモジュールを実装して拡張できる設計になっています。もしお客様の環境に必要なモジュールがない場合は弊社のサポート担当者にご相談ください。

OpenLDAP 外部連携モジュール

UCIDM は OpenLDAP に対して ID 連携できます。

OpenLDAP 外部連携モジュールはコンテナとして稼働させます。次のように docker-compose.yml に設定します。

  consumer-ldap:
    depends_on:
      rabbitmq:
        condition: service_healthy
    container_name: consumer-ldap
    image: docker.io/osstech/ucidm-consumer:latest
    logging: *default-logging
    volumes:
      - ./server-data:/ucidm
    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}"
      LDAP_USER_ENABLED_ATTRIBUTE: "${AGENT_LDAP_USER_ENABLED_ATTRIBUTE}"
    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 のパスワード
LDAP_USER_ENABLED_ATTRIBUTE任意ucidmUserEnabled内部 LDAP ユーザー の有効/無効を管理する属性名

OpenLDAP 動作設定

管理画面にて OpenLDAP の動作設定をすることができます。

設定項目と内容は次になります。

  • TLS の検証をスキップ
    • TLS の検証をスキップするかを指定します
  • ステータス用属性名
    • OpenLDAP ではユーザのステータス用の属性がなく、OpenLDAP 外部連携モジュールでは、ユーザエントリのパスワードの値を書き換えることで、有効化/無効化の制御をしています
    • マッピング後の属性について、true/false のステータスとして使いたい属性を指定します(有効化の場合は true、無効化の場合は false が割り当てられる必要があります)
    • ステータス用属性に指定した属性については、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 外部連携モジュールはコンテナとして稼働させます。次のように docker-compose.yml に設定します。

  consumer-meid:
    depends_on:
      rabbitmq:
        condition: service_healthy
    container_name: consumer-meid
    image: docker.io/osstech/ucidm-consumer:latest
    logging: *default-logging
    volumes:
      - ./server-data:/ucidm
    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 外部連携モジュールはコンテナとして稼働させます。次のように docker-compose.yml に設定します。

  consumer-google:
    depends_on:
      rabbitmq:
        condition: service_healthy
    container_name: consumer-google
    image: docker.io/osstech/ucidm-consumer:latest
    logging: *default-logging
    volumes:
      - ./server-data:/ucidm
    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 外部連携モジュールはコンテナとして稼働させます。次のように docker-compose.yml に設定します。

  consumer-ad:
    depends_on:
      rabbitmq:
        condition: service_healthy
    container_name: consumer-ad
    image: docker.io/osstech/ucidm-consumer:latest
    logging: *default-logging
    volumes:
      - ./server-data:/ucidm
    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}"
      LDAP_USER_ENABLED_ATTRIBUTE: "${AGENT_LDAP_USER_ENABLED_ATTRIBUTE}"
    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 のパスワード
LDAP_USER_ENABLED_ATTRIBUTE任意ucidmUserEnabled内部 LDAP ユーザー の有効/無効を管理する属性名

AD 動作設定

管理画面にて AD の動作設定をすることができます。

設定項目と内容は次になります。

  • TLS の検証をスキップ
    • TLS の検証をスキップするかを指定します
  • ステータス用属性名
    • マッピング後の属性について、AD のユーザステータスして反映させたい属性を指定します
    • 本属性には true/false の真偽値が連携されてくる必要があります(有効化の場合は true、無効化の場合は false が割り当てられる必要があります)
    • ステータス用属性に指定した属性については、AD のユーザ送信データにそのまま含まれるということはありません
  • ドライランモード
    • 接続の取得やエントリの検索は行いますが、実際にエントリの追加/変更/削除は行わないモードとなります
    • 主にテスト時の動作確認等に使うことを想定しています
  • ドメイン
    • AD のドメイン名を指定します(例:destad.com)
    • 主に userPrincipalName の値の自動生成に使われます
  • ベース DN
    • AD のベース DN を指定します
    • 主に sAMAccountName をキーにしてユーザ/グループ検索を行う際の検索基点として使われます
  • プライマリグループ用属性名
    • ユーザのリクエストにおいて、primaryGroupID に設定したいグループの DN または RDN の値を入れる属性を指定します
    • プライマリグループ用属性に指定した属性については、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 では、上記「プライマリグループ用属性名」の属性に連携されてきた値(グループの DN or RDN)をみて、AD のユーザーの primaryGrouoID の値をセットします。 プライマリグループに設定したいグループのメンバーに、そのユーザーが所属していない場合には、エラーになります。(グループに対象のユーザーをメンバーとして追加後、再度 primaryGroupID の連携を行う必要がございます。)

SCIM 外部連携モジュール

UCIDM は SCIM 対応のサービスに対して ID 連携できます。

現状は以下のサービスに対して動作を確認できています。

  • Salesforce

また、SCIM 対応サービスとの認証・認可においては以下に対応しています。

  • OAuth 2.0

SCIM 外部連携モジュールはコンテナとして稼働させます。次のように docker-compose.yml に設定します。

consumer-scim:
  depends_on:
    rabbitmq:
      condition: service_healthy
  container_name: consumer-scim
  image: docker.io/osstech/ucidm-consumer:latest
  logging: *default-logging
  volumes:
      - ./server-data:/ucidm
  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 では、外部連携処理の前後で任意のシェルスクリプトを実行することができます。

次の 外部連携の前処理/後処理で実行するスクリプトの配置 を参考に、スクリプトファイルを配置後、外部連携の前処理/後処理で実行するスクリプトの設定 を参考に、実行したいスクリプトファイルを指定してください。

外部連携の前処理/後処理で実行するスクリプトの配置

各外部連携処理の前後で任意のシェルスクリプトを実行することができます。

シェルスクリプトには、第一引数に以下の情報が渡されます。

{
	"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 で処理されます。

シェルスクリプトは、各処理種別ごとに、以下のディレクトリ上に格納する必要があります。また、スクリプトファイルには実行権限をつける必要があります。

  • ユーザ追加
    • /opt/osstech/var/lib/ucidm/server-data/destination/{DESTINATION_ID}/scripts/UserAdded/
  • ユーザ更新
    • /opt/osstech/var/lib/ucidm/server-data/destination/{DESTINATION_ID}/scripts/UserModified/
  • ユーザ削除
    • /opt/osstech/var/lib/ucidm/server-data/destination/{DESTINATION_ID}/scripts/UserDeleted/
  • ユーザパスワード更新
    • /opt/osstech/var/lib/ucidm/server-data/destination/{DESTINATION_ID}/scripts/UserPasswordModified/
  • グループ追加
    • /opt/osstech/var/lib/ucidm/server-data/destination/{DESTINATION_ID}/scripts/GroupAdded/
  • グループ更新
    • /opt/osstech/var/lib/ucidm/server-data/destination/{DESTINATION_ID}/scripts/GroupModified/
  • グループ削除
    • /opt/osstech/var/lib/ucidm/server-data/destination/{DESTINATION_ID}/scripts/GroupDeleted/
  • グループメンバー追加
    • /opt/osstech/var/lib/ucidm/server-data/destination/{DESTINATION_ID}/scripts/GroupMemberAdded/
  • グループメンバー削除
    • /opt/osstech/var/lib/ucidm/server-data/destination/{DESTINATION_ID}/scripts/GroupMemberDeleted/

上記ディレクトリ上にシェルスクリプトを配置することで、外部連携設定画面にて、シェルスクリプトの指定が可能になります。

外部連携設定画面での設定については、以下のページをご参照ください。

外部連携の前処理/後処理で実行するスクリプトの設定

更新差分の確認

experimental: 実験的な機能

本機能は実験的な機能であるため、必ず 既知の制約事項・不具合 をご確認の上、参考情報として扱うようにしてください。属性によって差分情報を取得できないもの、差分情報のフォーマット上の問題で差分として検出されてしまうもの、複雑なオブジェクトを扱うときに意図しない値の差分を取得してしまう場合があります。

履歴一覧画面の履歴から更新差分の画面へ遷移できます。外部サービスへ ID 連携したとき、更新前後の値において差分が検出された場合、その連携先の属性に対してそれぞれの値を確認できます。

ドライランモードを有効にして、実際に ID 連携を行う前にどの属性の値が更新されるのか、現時点で内部ディレクトリサービスと外部サービスで適切な同期を取れているかといった点を確認することもできます。

次に本機能の概要をまとめます。

  • ID 連携に失敗したときは差分情報を作成しません
    • 検証用途で差分比較したいときはドライランモードを有効にしてください
  • ID 連携に成功しても、差分がまったくないときは差分情報を作成しません
  • パスワードや機密情報に相当する値の差分情報は作成しません
  • 基本的にはエントリーの追加・更新の ID 連携に対して差分情報が作成されます
    • 削除に対しても差分情報が作成されることもありますが、実運用においては削除データなのでとくに意味はありません
    • パスワード追加・更新は基本的に差分を生成しないはずですが、外部サービスによっては通常の更新リクエストとして扱う処理の都合上、他の属性で差分があった場合にその値を更新した差分として表示される可能性があります
  • 差分情報は外部連携の後処理スクリプトへも連携されます

既知の制約事項・不具合

本機能は実験的な機能であるため、いくつか制約事項や正常に差分を取得できない属性があります。ここに記載されていないことで意図しない振る舞いがあれば、弊社までご連絡いただけると助かります。

意図した差分情報が検出されなかったり、不要な差分情報を検出されているいったことが起こったとしても、ID 連携の処理に影響を与えることはありません。

すべての連携先サービス共通

  • boolean 値をとる属性において文字列比較の都合により、例えば TRUEtrue を差分とみなしてしまう場合があります
連携元の値: 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
  • 実際に連携する外部サービスの振る舞いによって意図しない差分が表示される場合があります

    • 問題がある場合は、実際に連携されている外部サービスとその属性を弊社までご連絡いただけると助かります

外部連携モジュールのバージョン情報の連携

管理画面のフッターで管理画面、API サーバー、外部連携モジュールのバージョンを確認できます。

API サーバーと外部連携モジュールは別コンテナーで管理されており、外部連携モジュールから API サーバーへバージョン情報を連携するために 名前付きパイプ (named pipe) を使います。名前付きパイプを使うことで、それぞれのコンテナはローカルから参照できるパイプに対して読み書きするので特別な権限や仕組みを必要としないことがメリットになります。

名前付きパイプを介したコンテナ間のデータ通信

Docker Compose で各種コンテナを起動した後であれば /opt/osstech/var/lib/ucidm のディレクトリ配下に volumes ディレクトリがあります。存在しないときは手動で作成してください。

volumes ディレクトリ配下に名前付きパイプを作成します。

# mkfifo volumes/id-federation-client-pipe

もし作成前に Docker Compose を起動してディレクトリが作成されてしまっていれば削除してから再作成してください。

# rm -rf volumes/id-federation-client-pipe

次のようにバージョン情報を返すだけのコンテナを稼働させます。このとき、ホスト OS で作成した名前付きパイプのパスを環境変数で指定した場所へマウントします。

  consumer-version:
    container_name: consumer-version
    image: cr.gitlab.osstech.co.jp/product/unicorncidm/id-federation-client/consumer:latest
    logging: *default-logging
    volumes:
      - ./volumes/id-federation-client-pipe:${ID_FEDERATION_CLIENT_PIPE}
    entrypoint:
      - /bin/version.sh
      - "/bin/consumer -version > ${ID_FEDERATION_CLIENT_PIPE}"
    restart: "always"

環境変数の設定

環境変数規定値説明
ID_FEDERATION_CLIENT_PIPE任意/mnt/id-federation-client-pipe名前付きパイプをマウントさせるパスを指定

Agent モジュール

UCIDM は社内で管理している内部ディレクトリサービス (OpenLDAP や Active Directory といったサービス) から ID 情報を取得するための Agent モジュールを使います。お客様の環境にあわせて Agent モジュールを設定します。

OpenLDAP 向け Agent

UCIDM は社内で管理している OpenLDAP サーバーから ID 情報を取得して UCIDM API に連携します。

OpenLDAP 向け Agent はコンテナとして稼働させます。次のように docker-compose.yml に設定します。

  agent-ldap:
    depends_on:
      - api
    container_name: agent-ldap
    image: docker.io/osstech/ucidm-agent:latest
    logging: *default-logging
    volumes:
      - ./volumes/agent-data/openldap:${COOKIE_PATH}
    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}"
      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}"
      REQUESTER: "${AGENT_LDAP_REQUESTER}"
      PROTOCOL: "${AGENT_LDAP_PROTOCOL}"
      COOKIE_PATH: "${AGENT_COOKIE_PATH}"
      GROUP_MEMBER_ATTRIBUTE: "${AGENT_LDAP_GROUP_MEMBER_ATTRIBUTE}"
      USER_GROUP_LINK_ATTRIBUTE: "${AGENT_LDAP_USER_GROUP_LINK_ATTRIBUTE}"
      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_SCHEMEhttpshttpUCIDM API サーバーの
プロトコル
API_HOST任意localhostUCIDM API サーバー名
API_PORT任意18080UCIDM API サーバーの
ポート番号
API_BASIC_AUTH_USER任意unico接続する UCIDM API の
Basic 認証ユーザー
API_BASIC_AUTH_PASSWORD任意接続する UCIDM API の
Basic 認証パスワード
API_ACCOUNT_AUTH_USER任意接続する UCIDM API の
アカウント認証ユーザー
API_ACCOUNT_AUTH_PASSWORD任意接続する UCIDM API の
アカウント認証パスワード
  • 認証はベーシック認証またはアカウント認証はどちらか一方を設定します
    • 両方設定するとベーシック認証を使います

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

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

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

環境変数規定値説明
LDAP_SCHEME任意ldapLDAP サーバーのプロトコル
LDAP_HOSTS任意接続する AD サーバー名
カンマ(,)区切りで複数指定
LDAP_PORT任意389接続する LDAP サーバーの
ポート番号
LDAP_SECURE_SKIP任意falseTLS の自己証明書を許可
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)グループ検索条件
REQUESTER任意Agentベーシック認証時の実施者名
PROTOCOLsyncreplLDAP 通信のプロトコル
GROUP_MEMBER_ATTRIBUTE任意memberグループメンバーの値が入る属性の属性名
USER_GROUP_LINK_ATTRIBUTE任意ユーザーとグループにおいて紐づけたい属性名を指定
POLLING_TIME1hsyncrepl では未使用
COOKIE_PATH任意同期状況の
保存先ディレクトリ
  • OpenLDAP サーバーに Anonymous bind で接続するときは BIND_DN を未設定または空文字にします
  • アカウント認証の設定をすると、そのアカウント名が REQUESTER として使われます
  • OpenLDAP サーバーから正常にエントリを取得して UCIDM API サーバーへの連携に失敗 (リトライしても失敗) したときは自動で復旧しません
  • グループにおいて、メンバーの値が入る属性の属性名を 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 に連携されます
    • 設定値がない場合は、この属性によるユーザーとグループの紐づけは行われません

ID 連携の対象外となる属性

次の属性は連携されません。

  • userPassword

Active Directory 向け Agent

UCIDM は社内で管理している Active Directory サーバーから ID 情報を取得して UCIDM API に連携します。

Active Directory 向け Agent はコンテナとして稼働させます。次のように docker-compose.yml に設定します。

  agent-ad:
    depends_on:
      - api
    container_name: agent-ad
    image: docker.io/osstech/ucidm-agent:latest
    logging: *default-logging
    volumes:
      - ./volumes/agent-data/ad:${COOKIE_PATH}
    environment:
      LDAP_SCHEME: "${AGENT_AD_SCHEME}"
      LDAP_HOSTS: "${AGENT_AD_HOSTS}"
      LDAP_PORT: "${AGENT_AD_PORT}"
      LDAP_SECURE_SKIP: "${AGENT_AD_SECURE_SKIP}"
      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}"
      REQUESTER: "${AGENT_AD_REQUESTER}"
      PROTOCOL: "${AGENT_AD_PROTOCOL}"
      POLLING_TIME: "${AGENT_AD_POLLING_TIME}"
      COOKIE_PATH: "${AGENT_COOKIE_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_SCHEMEhttpshttpUCIDM API サーバーの
プロトコル
API_HOST任意localhostUCIDM API サーバー名
API_PORT任意18080UCIDM API サーバーの
ポート番号
API_BASIC_AUTH_USER任意unico接続する UCIDM API の
Basic 認証ユーザー
API_BASIC_AUTH_PASSWORD任意接続する UCIDM API の
Basic 認証パスワード
API_ACCOUNT_AUTH_USER任意接続する UCIDM API の
アカウント認証ユーザー
API_ACCOUNT_AUTH_PASSWORD任意接続する UCIDM API の
アカウント認証パスワード
  • 認証はベーシック認証またはアカウント認証はどちらか一方を設定します
    • 両方設定するとベーシック認証を使います

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

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

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

接続する Active Directory サーバーの設定をします。

環境変数規定値説明
LDAP_HOSTS任意接続する AD サーバー名
カンマ(,)区切りで複数指定
LDAP_PORT任意389接続する AD サーバーの
ポート番号
LDAP_SECURE_SKIP任意falseTLS の自己証明書を許可
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)グループ検索条件
REQUESTER任意Agentベーシック認証時の実施者名
PROTOCOLdirsyncLDAP 通信のプロトコル
GROUP_MEMBER_ATTRIBUTE任意memberグループメンバーの値が入る属性の属性名
USER_GROUP_LINK_ATTRIBUTE任意ユーザーとグループにおいて紐づけたい属性名を指定
POLLING_TIME1h更新を定期的に
問い合わせる間隔
COOKIE_PATH任意同期状況の
保存先ディレクトリ
  • Windows Server 2003 以降のドメイン コントローラーで Active Directory への匿名 LDAP 操作が無効になっている ため、Active Directory 向け Agent は anonymous bind をサポートしません。適切な bind ユーザーのアカウントをご用意ください
  • アカウント認証の設定をすると、そのアカウント名が REQUESTER として使われます
  • OpenLDAP サーバーから正常にエントリを取得して UCIDM API サーバーへの連携に失敗 (リトライしても失敗) したときは自動で復旧しません
  • グループにおいて、メンバーの値が入る属性の属性名を 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 に連携されます
    • 設定値がない場合は、この属性によるユーザーとグループの紐づけは行われません

ユーザーステータスの属性

UCIDM には AD の userAccountControl を参照して有効/無効を表す ucidmUserEnabled 属性が用意されています。

各外部連携先でステータスを扱う場合、この属性をマッピングで設定する必要があります。

ID 連携の対象外となる属性

次の属性は Windows サーバーでのみ必要なシステム関連の属性なので連携されません。

  • lmPwdHistory
  • ntPwdHistory
  • supplementalCredentials
  • nTSecurityDescriptor
  • pwdLastSet
  • parentGUID
  • objectSid
  • memberOf
  • unicodePwd
  • dBCSPwd
  • codePage
  • countryCode
  • instanceType
  • sAMAccountType
  • objectCategory
  • badPwdCount
  • badPasswordTime
  • dSCorePropagationData

Docker Compose 実行

UCIDM は Docker Compose を使い、複数のアプリケーションやミドルウェアのコンテナを起動して、それぞれのサービスが協調してシステムを構成しています。

これまで docker-compose.yml.env の設定を行ってきました。実際にコンテナイメージを取得してサービスを起動してみましょう。

コンテナイメージの取得

最新のコンテナイメージを取得するときは pull サブコマンドを実行します。

# cd /opt/osstech/var/lib/ucidm
# docker compose pull

同時に環境変数の設定が誤っているときはワーニングなどが表示されいます。この後のコンテナを起動する前にチェックするとよいです。

Docker Compose の起動と終了

サービスを起動するときは up サブコマンドを実行します。

# docker compose up -d

それぞれのサービスが正常に起動しているかどうかは ps サブコマンドで確認します。

# docker compose ps

サービスを停止するときは stop サブコマンドを実行します。

# docker compose stop

初期設定をやり直したいとき

Docker Compose で起動するサービスのいくつかは初回起動時に初期設定を行います。これらの設定は最初に実行されたときの1回だけしか適用されません。

パスワードなどを誤ってしまったり、再設定したいときに 運用開始前 であれば volumes 配下のデータを削除することで初期設定をやり直すことができます。 運用開始後は ID 連携のデータが格納されているので絶対に削除しないでください。

# docker compose down
# ls volumes/
agent-data  id-federation-client-pipe  mongo-config-data  mongodb  rabbitmq-data
# rm -rf volumes/

volumes 配下のデータを削除後に起動すると、再度 .env から初期設定を行って volumes 配下に初期設定済みのデータが生成されます。

# docker compose up -d

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_SCHEMEhttpshttpUCIDM API サーバーのプロトコル
API_HOST任意localhostUCIDM API サーバー名
API_PORT任意18080UCIDM API サーバーの
ポート番号
API_BASIC_AUTH_USER任意unico接続する UCIDM API の
Basic 認証ユーザー
API_BASIC_AUTH_PASSWORD任意接続する UCIDM API の
Basic 認証パスワード
API_ACCOUNT_AUTH_USER任意接続する UCIDM API の
アカウント認証ユーザー
API_ACCOUNT_AUTH_PASSWORD任意接続する UCIDM API の
アカウント認証パスワード

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

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

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

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

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

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

サービスの起動設定

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

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

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

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

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

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

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

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

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

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

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

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

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

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

# systemctl restart osstech-slapd.service

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

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

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

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

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

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

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

# systemctl is-enabled osstech-slapd.service

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-dnAD の BIND DN
AD_BIND_PASSWORD任意bind-passwordAD の BIND パスワード
AD_PORT任意389AD のポート番号
AD_SEARCH_BASE任意dc=ad,dc=example,dc=comAD の search base
API_SCHEMEhttpshttpUCIDM API サーバーのプロトコル
API_HOST任意localhostUCIDM API サーバー名
API_PORT任意18080UCIDM API サーバーの
ポート番号
API_BASIC_AUTH_USER任意unico接続する UCIDM API の
Basic 認証ユーザー
API_BASIC_AUTH_PASSWORD任意接続する UCIDM API の
Basic 認証パスワード

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

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

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

環境変数規定値説明
UCIDM_SOCKET_PATH/OSSTech/UCIDM-ADPassSync/socket/adpsyncmy-ipc-socketUnix ドメインソケット
のパス
UCIDM_SEND_HWM任意0メッセージキュー
のバッファサイズ
UCIDM_BYTE_ORDER任意LittleEndianメッセージエンコーディング
のバイトオーダー

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

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

システム管理

インストール後の設定 が完了したら UCIDM システムの管理を行います。UCIDM システム上のアプリケーションの操作や設定になります。

UCIDM API

UCIDM は ID 連携のための Web API を提供します。

認証を必要としない Web API

例えば、API サーバーとの疎通確認のために使う ping API は次のように実行します。

$ curl "https://${ホスト名}:${ポート番号}/status/ping"
{
  "message": "pong",
  "updatedAt": "2024-02-26T05:22:17.665220118Z"
}

他にも UCIDM のバージョン情報を取得もできます。

$ curl "https://${ホスト名}:${ポート番号}/status/version"
{
  "serverVersion": "b67adba",
  "idFederationClientVersion": "0385936",
  "mongoDBVersion": "7.0.4",
  "rabbitMQVersion": "3.12.10"
}

認証を必要とする Web API

UCIDM の大半の Web API を呼び出すには認証を必要とします。UCIDM は次の認証に対応しています。

  • ベーシック認証
  • アカウント認証
  • LDAP 認証
  • SAML 認証

例えば、ベーシック認証であれば次のように実行します。

$ curl --basic --user "unico:${Basic 認証パスワード}" \
       "https://${ホスト名}:${ポート番号}/p/ping"
{
  "message": "pong",
  "updatedAt": "2024-02-26T05:27:31.435610255Z"
}

認証を行わない場合は 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 連携管理画面があり、主に以下の画面を提供しています。

  • ジョブ進捗概要画面
    • 現在の進捗中ジョブ数、失敗したジョブ数、成功したジョブ数を一覧表示します。
  • 履歴一覧画面
    • 外部連携の履歴を一覧表示します。
  • 実行中ジョブ一覧画面
    • 実行中のジョブを一覧表示します。
  • 外部連携先設定画面
    • 外部連携先の設定項目確認や設定を行います。
  • 管理者アカウント一覧画面
    • UCIDM の管理画面にログインできるアカウントを一覧表示します。
  • ユーザー一覧画面
    • UCIDM のユーザを一覧表示します。
  • グループ一覧画面
    • UCIDM のグループを一覧表示します。
  • 対象外ユーザー一覧画面
    • UCIDM の連携対象外ユーザを一覧表示します。
  • 対象外グループ一覧画面
    • UCIDM の連携対象外グループを一覧表示します。

各画面については後続の節にて説明します。

ID 連携管理画面へのアクセス

ID 連携管理画面へのアクセス URL は環境によって異なるので、docker-compose.yml の admin-ui の設定および nginx の設定を参照の上、アクセスを行ってください。

トップ画面

ID 連携管理画面にアクセスするとトップ画面が表示されます。

画面右上に「ログイン」ボタンがあり、このボタンを押下するとログイン画面に遷移します。

ログイン画面

ユーザー名/パスワードを入力し、「ログイン」ボタンを押下してログインを行います。「パスワードが不明な場合」を押下することで、パスワードリセット申請画面に遷移します。

パスワードリセット申請画面

パスワードリセットを行う管理者名とメールアドレスを入力します。メールアドレスが設定されていない場合、パスワードリセットを行うことはできません。入力情報が正しい場合、入力されたメールアドレスに一時トークンが送信され、パスワードリセット画面に遷移します。

パスワードリセット画面

送られてきたメールに記述された一時トークン、新しいパスワード、新しいパスワード(確認)を入力し、「再設定」ボタンを押下することで、パスワードをリセットできます。

ログイン後トップ画面

以下の画面に遷移するボタンが表示されます。

  • ジョブ進捗概要
  • 履歴一覧
  • 実行中ジョブ一覧
  • 外部連携先設定
  • 管理者アカウント一覧
  • ユーザー一覧
  • グループ一覧
  • 対象外ユーザー一覧
  • 対象外グループ一覧

画面左上にハンバーガーボタンがあり、このボタンを押下することで、上記画面に遷移できるサイドバーが現れます。

画面右上にはログイン名が表示されたボタンがあり、このボタンを押下することで以下の各種メニューが表示されます。

  • アカウント情報
    • 管理者アカウント詳細画面に遷移します。
  • パスワード変更
    • 管理者アカウントパスワード変更画面に遷移します。
  • ログアウト
    • このリンクをクリックすることで、ログアウトが行われます。

履歴一覧画面

  • UCIDM サーバーの履歴の検索が行えます。
  • 外部サービスへの連携履歴の確認が行えます。
    • 連携時に更新されたデータの差分を確認できます。

実行中ジョブ一覧画面

  • 実行中ジョブを一覧表示します。
  • 実行中のジョブの検索が行えます。

外部連携先設定画面

  • 外部連携先を一覧表示します。
  • 一覧表示された画面にて、「作成」画面を押下すると、新規外部連携先設定画面に遷移します。
    • 新規外部連携先設定画面で設定内容を入力し、画面下部の「作成」を押下すると新規外部連携先設定が作成されます。また、外部連携先に対応する Queue が作られます。(コンテナは作られないので、別途 docker-compose.yml 等を編集し、コンテナを作成する必要があります。)
  • 一覧表示された画面にて、鉛筆マークの「編集」アイコンを押下すると、新規外部連携先詳細画面に遷移します。
    • 新規外部連携先詳細画面では、既存の外部連携先設定を確認できます。また、内容を編集し、「更新」ボタンを押下すると、外部連携先の設定内容を更新することができます。
    • 新規外部連携先詳細画面下部の「削除」ボタンを押下すると、対象の外部連携先設定および対応する Queue が削除されます。(コンテナは削除されないので、別途 docker-compose.yml 等を編集し、コンテナを削除する必要があります。)
  • 一覧表示された画面にて、ゴミ箱マークの「削除」アイコンを押下すると、対象の外部連携先設定および対応する Queue が削除されます。(コンテナは削除されないので、別途 docker-compose.yml 等を編集し、コンテナを削除する必要があります。)

管理者アカウント一覧画面

  • UCIDM の管理画面へログインできる管理者アカウントを一覧表示します。
  • 一覧表示された画面にて、「作成」画面を押下すると、管理者アカウント新規作成画面に遷移します。
  • 一覧表示された画面にて、鉛筆マークの「編集」アイコンを押下すると、管理者アカウント詳細画面に遷移します。
    • 編集はログインしているアカウント自身のみ行えます。
    • 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 の MongoDB に登録されていて、連携対象外となっているグループを一覧表示します。
  • 連携対象外となっているグループの検索が行えます。
  • 各グループについて、「対象にする」ボタンを押下することで、そのグループを連携対象にすることができます。

マッピング設定

ここでは、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 のような環境値を「環境値リスト」に設定し、「関数呼び出し確認」ボタンをクリックすることで、呼び出し結果が表示されます。

マッピングの動き

全体として以下の順に処理が行われます。外部連携先に連携したい属性は、必ずここで定義を入れる必要があります。マッピング定義がない属性はマッピング結果に反映されません。

  • 連携元の属性名
  • テンプレート文字列
  • 固定値
  • カスタムスクリプト

以下で上記マッピング処理の詳細な動きについて説明します。

  • 連携元の属性名
    • 連携元の属性名 の値がある場合
      • ビルトイン関数名 の値がある場合
        • 連携元の属性名に対応する属性値をビルトイン関数に引数として渡し、その結果をマッピングの結果とします
      • ビルトイン関数名 の値がない場合
        • 連携元の属性名に対応する属性値を取得して、マッピング結果とします
    • 連携元の属性名 の値がない、連携元の属性名 の属性値が取得できない場合は、後続の処理に進みます
  • テンプレート文字列
    • テンプレート文字列 の値がある場合は、属性値をつかって、テンプレート文字列 の文字列を置換して、マッピング結果とします
    • 属性名に対応する属性値がマルチバリューの場合は、その部分にはマルチバリューの 0 番目の要素がセットされます
    • 属性名に対応する属性値がない場合は、その部分には空文字(“”)がセットされます
    • テンプレート文字列 の値がない場合は、後続の処理に進みます
  • 固定値
    • 固定値 の値がある場合は、その値をマッピング結果とします
    • 固定値 の値がない場合は、後続の処理に進みます
  • カスタムスクリプト
    • useScript が true の場合はカスタムスクリプトによる関数実行を行い、その実行結果の返り値をマッピング結果とします
      • カスタムスクリプトは実行時エラーが発生する可能性があるため、ここでエラーが返る可能性があります
    • useScript が false の場合は、後続の処理に進みます
  • ここまで値がセットされない場合は、空配列をマッピング結果とします

事前定義済みのビルトイン関数

invertBooleanValue

  • 引数として受け取った boolean の値を、その真偽値を反転させてマッピング結果とします
    • true として読み込める値は以下となります
      • true(大文字/小文字を区別しない), t(大文字/小文字を区別しない), 1
    • false として読み込める値は以下となります
      • false(大文字/小文字を区別しない), f(大文字/小文字を区別しない), 0
  • 引数の値が存在しない場合、boolean でない場合はマッピングエラーとなります
  • 引数の値が複数存在する場合は、その 1 つめの要素について真偽値の反転処理をおこないます

マッピング設定のインポート・エクスポート

ID 連携管理画面では、マッピング設定のインポートおよびエクスポートをすることができます。

マッピング設定のインポート

  • 外部連携先設定詳細のマッピング設定欄の「インポート」ボタンを押すことで、UTF-8 形式の json ファイルをインポートすることができます。
  • 「参照」ボタンでインポートしたい json ファイルを指定してから、「インポート」を押下しください。
  • インポート後、画面上のマッピング設定の内容が json ファイルの内容で上書きされます。内容が正しいことを確認してから外部連携先設定の更新を行ってください。

マッピング設定のエクスポート

  • 外部連携先設定詳細のマッピング設定欄の「エクスポート」ボタンを押すことで、UTF-8 形式の json ファイルがダウンロードできます。

外部連携の前処理/後処理で実行するスクリプトの設定

UCIDM では、外部連携処理の前後で任意のシェルスクリプトを実行することができます。

ここでは、外部連携先設定画面において、実行する任意のシェルスクリプトを指定する方法について記載します。

事前準備

次の 外部連携の前処理/後処理で実行するスクリプトの配置 を参考に、スクリプトファイルを配置してください。

設定手順

  • 前処理・後処理スクリプト設定フォームにて、実行したいスクリプトを指定します。
  • スクリプトファイルは、外部連携の前処理と後処理でそれぞれ指定することができます。
  • スクリプトファイルは、ユーザ追加、ユーザ更新等の処理種別ごとに指定することができます。
  • 上記の事前準備で配置したスクリプトファイルをプルダウン値として選ぶことができます。
  • 「+」ボタンで対象のスクリプトを追加後、「↑」ボタン、「↓」ボタンを押下してスクリプトの実行順序を入れ替えることができます

UCIDM モジュールのバージョンアップ

UCIDM は Docker Compose を使ってコンテナイメージとしてパッケージングされています。そのため、コンテナイメージを更新することで新しいバージョンにアップグレードできます。

但し、オンプレ版の UCIDM は1台のサーバーで運用することを前提に設計されているため、サービスを停止せずに稼働したままバージョンアップすることはできません。アップグレードによる移行や設定変更がなかったとしても、必ず再起動のタイミングで十数秒程度のダウンタイムが発生します。またバージョンアップするときに移行作業を必要とする場合もあります。バージョンアップするときはサポート担当者にご相談ください。アップグレード作業をするときはサービス停止のアナウンスを行い、ID 連携を行っていない時間帯に実施してください。

UCIDM の一部のサービスのみをバージョンアップする場合とすべてのサービスをバージョンアップする場合で作業手順が異なります。バージョンアップの作業は root 権限を必要とします。

deploy コマンド

一部のサービスのみをバージョンアップするための運用ツールとして deploy というコマンドがあります。

バージョン情報を確認します。

# /opt/osstech/bin/deploy -version
revision: c47dd3a

稼働しているコンテナの情報を表示します。

# /opt/osstech/bin/deploy info

コンテナイメージのアップグレード

特定のコンテナイメージを使うすべてのサービスをアップグレードするときは次のように実行します。

# /opt/osstech/bin/deploy upgrade \
  -path /opt/osstech/var/lib/ucidm/docker-compose.yml \
  -image docker.io/osstech/ucidm-consumer:latest

コンテナイメージのロールバック

アップグレードしたときに問題が発生した場合など、それまで使っていたコンテナイメージにロールバックできます。

# /opt/osstech/bin/deploy rollback \
  -path /opt/osstech/var/lib/ucidm/docker-compose.yml \
  -image docker.io/osstech/ucidm-consumer

ロールバックはローカルリポジトリから、いま使っているコンテナイメージの1つ前のバージョンを使います。従ってロールバックを実行すると1つずつ過去のバージョンに戻り続けます。

docker compose を使う

すべてのサービスをアップグレードするときは次のように docker compose コマンドを使って次のように実行します。

# cd /opt/osstech/var/lib/ucidm
# docker compose pull
# docker compose down
# docker compose up -d

アップグレードして正常にサービスが起動しているかを ps コマンドで確認します。

# docker compose ps

セルフメンテナンス機能

一般ユーザーが自身の情報を管理します。

ユーザープロファイル画面(管理者用)

UCIDM では ユーザープロファイル画面があり、主に以下の画面を提供しています。

  • ユーザー属性管理画面
    • 権限設定画面
    • 表示名変更画面
    • 注意事項設定画面
  • テンプレートファイル編集画面
  • LDAP 管理画面
  • 履歴一覧画面

ユーザープロファイル画面へのアクセス

https://<ホスト名>:<ポート番号>/admin/login にアクセスします。

ユーザープロファイル画面へのアクセス URL は環境によって異なるので、docker-compose.yml の ucidm-ui の設定および nginx の設定を参照の上、アクセスを行ってください。

ログイン画面

ユーザー名/パスワードを入力し、「ログイン」ボタンを押下してログインを行います。パスワードリセットについては、ID 連携管理画面で行います。

ログイン後トップ画面

以下の画面に遷移するボタンが表示されます。

  • ユーザー属性管理
  • テンプレートファイル編集
  • LDAP 管理
  • 履歴一覧

画面左上に「メニュー」ボタンがあり、このボタンを押下することで、以下の各種メニューが表示されます。

  • ユーザー属性管理
    • ユーザー属性管理画面に遷移します。
  • テンプレートファイル編集
    • テンプレートファイル編集画面に遷移します。
  • LDAP 管理
    • LDAP 管理画面に遷移します。
  • 履歴一覧
    • 履歴一覧画面に遷移します。
  • ログアウト
    • このリンクをクリックすることで、ログアウトが行われます。

ユーザー属性管理画面

以下の画面に遷移するボタンが表示されます。

  • 権限設定
    • 一般ユーザーがアクセスするユーザー属性変更画面に表示するユーザー属性の権限を設定します。
  • 表示名変更
    • ログイン名とユーザー属性の表示名を変更します。
  • 注意事項設定
    • 一般ユーザーがアクセスするユーザー属性変更画面の入力フォームに表示する注意事項を設定します。

権限設定

  • 属性名、「参照」、「編集」、「多値」を設定し、「更新」ボタンを押下することで、更新できます。
  • 参照権限が与えられていない属性は、ユーザー属性変更画面に表示されません。
  • 参照権限は、一般ユーザーは更新できず、表示のみになります。
  • 編集権限は、一般ユーザーが変更できるようになります。
  • 多値権限は、一般ユーザーが複数の値を入力できるようになります。
  • 「インポート」ボタンを押下することで、選択された JSON ファイルの情報をそのままセットできます。「更新」ボタンを押下しないと反映されません。
  • 「エクスポート」ボタンを押下することで、設定された情報を JSON ファイルとして保存できます。

表示名変更

  • 各属性の表示名の日本語と英語を入力し、「設定」ボタンを押下することで、設定できます。
  • 設定されていないものは、そのまま属性名が使用されます。

注意事項設定

  • 各属性の注意事項の日本語と英語を入力し、「設定」ボタンを押下することで、設定できます。
  • 入力されていない属性または編集権限がない属性は、注意事項が表示されません。

テンプレートファイル編集画面

  • ヘッダーとフッターをカスタマイズする画面が表示されます。
  • ヘッダーとフッターどちらを編集するか選択し、コード編集欄に HTML を記述します(背景色は選択しない場合、transparent になります)。
  • 編集後、「確認」ボタンを押下することで、どのような画面になるかを確認できます。
  • 「保存」ボタンを押下することで、編集内容を保存できます。
  • ヘッダーのロゴ画像については、images/header ディレクトリにロゴ画像を置くことで設定できます。ファイル名は logo.xxx(xxx は拡張子)にする必要があります。
  • ファビコンの画像については、images/favicon ディレクトリに画像を置くことで設定できます。ファイル名は favicon.xxx(xxx は拡張子)にする必要があります。
  • その他の画像については、images ディレクトリに配置することで、サンプルファイルのように画像を表示することが可能になります。

LDAP 管理画面

以下の画面に遷移するボタンが表示されます。

  • LDAP ユーザー検索
    • LDAP に登録されているユーザーを検索します。
  • LDAP グループ検索
    • LDAP に登録されているグループを検索します。
  • LDAP ユーザー登録
    • LDAP のユーザーを登録します。
  • LDAP グループ登録
    • LDAP のグループを登録します。

LDAP ユーザー検索

  • LDAP ユーザーの検索が行えます。
  • 対象ユーザーの詳細画面に遷移するボタンと削除ボタンが表示されます。

LDAP ユーザー詳細

  • LDAP ユーザーの属性を更新します。
  • LDAP ユーザーの削除が行えます。
  • LDAP ユーザーを有効化/無効化できます。無効になった LDAP ユーザーはユーザープロファイル画面にログインできなくなります。

LDAP グループ検索

  • LDAP グループの検索が行えます。

LDAP ユーザー登録

  • LDAP ユーザーの登録が行えます。

LDAP グループ登録

  • LDAP グループの登録が行えます。

履歴一覧画面

  • ログイン関係の認証履歴と LDAP の操作履歴の確認が行えます。
  • 履歴の検索が行えます。
  • エクスポート機能を使うことで特定の期間の全てのログを1つのファイルにまとめられます。

サンプルのテンプレートファイル

用意しているテンプレートファイルの中身は以下になります。

html ファイル

<div>
    <h1>UCIDM</h1>
    <img src="/images/osstech-logo-s.png" alt="サンプルロゴ" width="188" height="64" />
</div>

css ファイル

body { background-color: transparent; }

ユーザープロファイル画面(一般ユーザー用)

UCIDM では ユーザープロファイル画面があり、主に以下の画面を提供しています。

  • ユーザー属性変更画面
  • パスワード変更画面

ユーザープロファイル画面へのアクセス

https://<ホスト名>:<ポート番号>/ にアクセスします。

ユーザープロファイル画面へのアクセス URL は環境によって異なるので、docker-compose.yml の ucidm-ui の設定および nginx の設定を参照の上、アクセスを行ってください。

トップ画面

ユーザープロファイル画面にアクセスするとトップ画面が表示されます。画面中央に「ログイン」ボタンがあり、このボタンを押下するとログイン画面に遷移します。

SAML でのログインを有効化している場合は SAML 用のログインボタンが表示されます。

ログイン画面

ユーザー名/パスワードを入力し、「ログイン」ボタンを押下してログインを行います。「パスワードが不明な場合」を押下することで、パスワードリセット申請画面に遷移します。

パスワードリセット申請画面

パスワードリセットを行う一般ユーザー名とメールアドレスを入力します。メールアドレスが設定されていない場合、パスワードリセットを行うことはできません。入力情報が正しい場合、入力されたメールアドレスに一時トークンが送信され、パスワードリセット画面に遷移します。

パスワードリセット画面

送られてきたメールに記述された一時トークン、新しいパスワード、新しいパスワード(確認)を入力し、「再設定」ボタンを押下することで、パスワードをリセットできます。

ログイン後トップ画面

以下の画面に遷移するボタンが表示されます。

  • ユーザー属性変更
  • パスワード変更

画面左上に「メニュー」アイコンがあり、このアイコンを押下することで、以下の各種メニューを含むサイドバーが表示されます。

  • ユーザー属性変更
    • ユーザー属性変更画面に遷移します。
  • パスワード変更
    • パスワード変更画面に遷移します。
  • 設定
    • ユーザーの設定画面に遷移します。
  • ログアウト
    • このリンクをクリックすることで、ログアウトが行われます。
    • SAML 認証でログインしていて、シングルログアウトの設定が有効な場合、このリンクをクリックすることで、シングルログアウトの処理が行われます

ユーザー属性変更画面

  • ユーザーの属性情報が表示されます。
  • 更新したい属性があれば、入力を行い「更新」ボタンを押下することで更新できます。
  • 管理者の権限設定によって、表示されないまたは編集できない場合があります。

パスワード変更画面

  • 現在のパスワードと新しいパスワードを入力します。
  • 現在のパスワードが誤っている場合、パスワードを更新することはできません。

仕様上の制約

ID 連携全般

primaryID は変更不可

primaryID は外部サービスへも主要なキー情報として連携されます。そのため、既存の primaryID を変更すると外部サービスにも影響があります。UCIDM ではユーザー/グループのエントリ情報が初めて連携されてきたときに primaryID を生成します。ユーザー/グループエントリを更新して 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 連携管理画面 および ユーザープロファイル画面(管理者用)において、それぞれの画面にて同名のアカウントでログインを行って同時に各種操作をした場合、主にログアウト操作をした際に上手く動かない事象が確認できています。

移行

システムやデータ移行に関する内容を記載します。

MongoDB

UCIDM はデータをエントリーや設定などのデータを MongoDB で管理しています。

MongoDB 間のデータ移行

物理サーバーのリプレースなど、既存の UCIDM 環境から別のサーバーマシンへ移行しなければならないときに MongoDB のデータのみを移行します。デプロイ済みの MongoDB コンテナにデータ移行のためのツールが同梱されているのでそれらを使います。

バックアップ/ダンプ

mongodump コマンドを使って1つのバイナリのダンプファイルを生成します。環境変数のユーザー名とパスワードは適宜、設定した値を指定してください。デフォルトでは ucidm というデータベースを使っています。ダンプは相対的に速く完了します。定期的に実行してフルバックアップとして保管することもできます。

$ cd /opt/osstech/var/lib/ucidm
$ docker compose exec mongo \
    mongodump --authenticationDatabase admin \
              --uri "mongodb://${USERNAME}:${PASSWORD}@localhost:27017" \
              --db ucidm --archive > $(date +%Y%m%d)-mongodb.dump
$ ls
20231002-mongodb.dump  ...

リストア/インポート

mongorestore コマンドを使って mongodump で取得したダンプファイルからデータベースを復元します。ここではデータベースの名前が ucidm であるという前提で実行しています。リストアはダンプと比較して、相対的に多くの時間がかかります。

$ docker 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 の設定方法など

システム

システム全般やシステム構成などに関する内容を記載します。

複数台のマシンを使って冗長構成をサポートしていますか?

オンプレミス版 UCIDM は冗長構成をサポートしません。

冗長構成をとることで可用性を向上させられますが、導入や運用に対していくらか複雑さもあがります。オンプレミス版ではシンプルな構成でシステム管理者の運用コストを削減することを狙いとしています。

OpenLDAP と Active Directory の両方を同時に使って ID 連携できますか?

内部ディレクトリサービスはどちらか1つであることを前提としています。ID 連携をするときに外部連携先ごとにマッピング設定が必要になります。複数のデータソースに対して制御する機能はありません。

UCIDM の認証・認可はどのような仕組みですか?

ベーシック認証とローカルアカウント認証に対応しています。また ユーザープロファイル画面 では OpenLDAP または Active Directory と LDAP 認証に対応しています。お客様の要件にあわせて対応を検討しますので弊社のサポート担当者にご確認ください。

トラブルシューティング

一般的なトラブルシューティングの流れについて記載します。

UCIDM が意図した動作をしていないようにみえる

ご迷惑をおかけして申し訳ありません。

UCIDM の内部処理でなんらかの不具合が発生している可能性があります。

次のように詳細ログを収集する運用ツールを実行して作成したログアーカイブを添付して弊社のサポート担当者にご連絡ください。

# /opt/osstech/bin/containerlog archive -path /opt/osstech/var/lib/ucidm/docker-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 というサブコマンドを使って確認できます。

docker-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 社の公式ドキュメントを参照してください。

Agent の再同期

なんらかの理由で LDAP サーバーのエントリが UCIDM API サーバーに ID 連携されていないときに運用対応する方法について説明します。

Agent モジュール のコンテナ内に運用ツールが同梱されており、Agent モジュールと同じ設定を使って再同期できます。

デフォルトでは Docker Compose を次の場所に配置します。ここではデフォルトの位置にインストールされている前提で作業を進めていきます。

docker-compose.yml を配置したディレクトリへ移動します。

$ cd /opt/osstech/var/lib/ucidm

次のように実行してヘルプが表示されることを確認してください。-it の後にコンテナ名を指定します。デフォルトでは agent-ldap または agent-ad という名前で設定しています。

$ 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 ldap entry
	flags            describe all known top-level flags
	help             describe subcommands and their syntax
	update           update entries in the ucidm server


Use "resync flags" for a list of top-level flags

個別エントリの再同期

DN と種別 (ユーザーまたはグループ) を指定して個別エントリーを再同期します。

ユーザーエントリのとき

$ docker compose exec -it agent-ldap \
  /bin/resync -verbose entry -dn uid=user1,ou=users,dc=example,dc=com -type user

グループエントリのとき

$ docker compose exec -it agent-ad \
  /bin/resync -verbose entry -dn cn=group1,ou=groups,dc=example,dc=com -type group

すべてのエントリの再同期

LDAP サーバーのすべてのエントリーを UCIDM API サーバーに再同期します。Agent モジュールの cookie を削除して起動したときとほぼ同じような振る舞いとなります。

デフォルトではドライランモードで実行されて実際にエントリーは更新しません。LDAP サーバーのエントリがすべて 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-ldap /bin/resync update -type user -dryrun=false

グループエントリのとき (ドライラン無効)

$ docker compose exec -it agent-ad /bin/resync update -type group -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-ldap /bin/resync delete -type user -dryrun=false

グループエントリのとき (ドライラン無効)

$ docker compose exec -it agent-ad /bin/resync delete -type group -dryrun=false

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 のユーザーの primaryID を連携させることで、その primaryID を持つユーザーでログインされます。

エンドポイント

UCIDM の SAML 認証においては、以下のエンドポイントを提供しています。(SAML 認証有効時)

API から直接レスポンスを受け取ることも可能ですが、ユーザープロファイル画面を介してのアクセスを想定しています。

SAML SP メタデータの取得

以下のいずれかにアクセスすることで、SAML SP のメタデータが取得できます。

  • <プロトコル>://< UCIDM API の HOST >:< PORT >/auth/saml/metadata
  • <プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/api/saml/metadata

アサーションコンシューマサービス

以下のアサーションコンシューマサービスのエンドポイントを提供しています。

  • <プロトコル>://< UCIDM API の HOST >:< PORT >/auth/saml/acs
  • <プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/api/saml/acs

シングルログアウト

以下のシングルログアウト用のエンドポイントを提供しています。

  • <プロトコル>://< UCIDM API の HOST >:< PORT >/auth/saml/slo
  • <プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/api/saml/slo

SAML ログイン開始ポイント

以下のいずれかにアクセスすることで、SAML SP 起点のログインフローが開始されます。

  • <プロトコル>://< UCIDM API の HOST >:< PORT >/auth/saml/login
  • <プロトコル>://<ユーザープロファイル画面の HOST >:< PORT >/api/saml/login

UCIDM 用語集

experimental: 実験的な機能

まだ開発中の実験段階の機能であることを表しています。実際のデータを使ってシステム管理者の方にご利用いただき、弊社へのフィードバックを頂けることを目的としています。機能をより良くするための改善点や不具合報告を歓迎します。

experimentalとして提供している機能は今後の開発において提供範囲の変更が発生したり、正常に動作しない条件が含まれるなど安定的に機能を提供できない可能性があります。また原則として弊社のサポートは行っておりません。experimentalの機能を使って、お客様の運用環境で問題が生じたとしても弊社から完全なサポートは提供できないことをご理解いただいたうえでご利用ください。

外部連携モジュール

UCIDM サーバー内で外部の連携先に ID 連携のための通信を行うモジュールのことです。

サポートしている外部サービスや連携プロトコルの詳細については 外部連携 を参照してください。

Agent モジュール

内部ディレクトリサービスのサーバーへ定期的に問い合わせて (ポーリングと呼ぶ) 変更を検出し、UCIDM サーバーへ変更された情報のみを連携するモジュールのことです。

LDAP プロトコルの機能を用いて実装されています。詳細については 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 連携

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 で設定します。