Metonymical Deflection

ゆるく日々のコト・たまにITインフラ

wso2 identity serverによるSAML Idpの設定方法

wso2 identity server(以下、wso2)を使用したSAML Idpの設定方法を記載していきます。
ここでは動作確認用としてWordpressSAML SPとします。
wso2の認証バックエンドには、Windows2019のADを使用します。

前回記事(Keycloak)のwso2版と考えてください。*1

1.構成

1-1.環境

全ての端末(仮想マシン)はVMWare上に構築しています。

VMWare : VMware(R) Workstation 15 Pro 15.5.1 build-15018445 

wso2用仮想マシン
OS : Ubuntu 22.04.2
Java : openjdk-11
Keycloak : 6.1.0
OpenSSL : 3.0.2

Wordpress仮想マシン
bitnami-wordpress-5.9.0
OVAからデプロイ

Active Directory仮想マシン
OS : Windows Server 2019

ClientPC用仮想マシン
OS : Windows10
1-2.全体の流れ
  • ドメイン登録
  • AD構築
  • 証明書発行
  • wso2インストール
  • wso2各種設定
  • Wordpress インストール&各種設定
  • 動作確認
1-3.全体構成

fig.1

IPアドレスドメイン名は自身の環境に置き換えてください。
私の環境ではヘアピンNATができないためBBルータが2台あります。
BBルータAの方で、TCP9443でポートフォワードの設定をしています。*2

2.ドメイン登録

自身で独自ドメインを取得するか、以下のサイトなどで無料のドメイン登録を行ってください。
ddns.kuku.lu
ここでは上記サイトで、idp.f5.siのドメインを登録したものとして進めます。
登録したドメインを使用して、AレコードにGlobalIP-AのIPアドレスを設定しておいてください。

補足
wso2のHostname設定に、IPアドレスを設定していると、HTTPリダイレクトの際にうまく動作しなかったり、といったことを確認したため、ドメイン登録の項を記載しました。
仮に、閉じられた環境内で構築する場合であっても、別途DNSサーバを構築して、名前解決可能な環境にしておくことが必要だと考えています。*3

3.AD構築

以下のサイトなどを参考にADの構築を行ってください。
www.rem-system.com
上記サイトは、スクショ入りのStep by Stepで詳細に記載されており、特に躓くことなくADを構築できます。

ADはKeycloakの認証バックエンドとして利用しますので、AD上に任意のユーザを2-3つくらい作成しておいてください。
ここでは例として、user001@example.comといったユーザを作成したものとして進めます。*4
補足
AD上でユーザを作成する際、以下のように作成されていることを前提として進めます。

4.証明書発行

ここからは、wso2用仮想マシンでの作業となります。

4-1.openssl.cnfの設定

/etc/ssl/openssl.cnfファイルを編集します。
青文字箇所が変更した部分となります。

vi /etc/ssl/openssl.cnf
==== snip ====
[ CA_default ]

dir             = /etc/ssl/demoCA      # Where everything is kept  ./demoCAから絶対Pathに変更
certs           = $dir/certs            # Where the issued certs are kept

==== snip ====
[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = JP
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Tokyo

localityName                    = Locality Name (eg, city)
localityName_default            = Chiyoda-ku

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = f5.si

# we can do this but it is not needed normally :-)
#1.organizationName             = Second Organization Name (eg, company)
#1.organizationName_default     = World Wide Web Pty Ltd

organizationalUnitName          = Organizational Unit Name (eg, section)
#organizationalUnitName_default =

commonName                      = Common Name (e.g. server FQDN or YOUR name)
commonName_max                  = 64
==== snip ====
4-2.CAの構築

/usr/lib/ssl/misc/CA.plを使用して、CAを構築していきます。

cd /etc/ssl
/usr/lib/ssl/misc/CA.pl -newca

<出力例>

root@u222c96:/etc/ssl# /usr/lib/ssl/misc/CA.pl -newca
CA certificate filename (or enter to create) <ー空Enter

Making CA certificate ...
openssl req  -new -keyout ./demoCA/private/cakey.pem -out ./demoCA/careq.pem
..+......+....+..+.......+.....+.......+.....+....+.....+.+......+........+....+...+.................+.+..+...+....+...+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.....+...+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+.+.....+...+.+..+...+......+.........+....+...................................+..........+......+..+.......+............+......+.................+.......+...+......+.....+.....................+......+.......+.....+......+....+..+...+............+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
..+.+..............+.+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.....+.+...+.....+.+.....+....+..+.........+..........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.....+.....+......+...+....+......+..+.........+...+.+......+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Enter PEM pass phrase: <ーパスフレーズを入力
Verifying - Enter PEM pass phrase: <ーパスフレーズを入力
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]: <ー空Enter
State or Province Name (full name) [Tokyo]: <ー空Enter
Locality Name (eg, city) [Chiyoda-ku]: <ー空Enter
Organization Name (eg, company) [f5.si]: <ー空Enter
Organizational Unit Name (eg, section) : <ー空Enter
Common Name (e.g. server FQDN or YOUR name) :CA.f5.si <ーCAのCommon Nameを手入力。任意の名前でOK
Email Address : <ー空Enter

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password : <ー空Enter
An optional company name []: <ー空Enter
==> 0
openssl ca  -create_serial -out ./demoCA/cacert.pem -days 1095 -batch -keyfile ./demoCA/private/cakey.pem -selfsign -extensions v3_ca -infiles ./demoCA/careq.pem
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem: <ー最初に入力した(cakeyの)パスフレーズを再度入力
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            6e:fa:be:0b:64:8b:ea:4c:c2:ee:c2:7b:62:b3:64:5f:52:40:59:2b
        Validity
            Not Before: Nov 23 00:12:36 2023 GMT
            Not After : Nov 22 00:12:36 2026 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = f5.si
            commonName                = CA.f5.si
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                3B:BE:09:A3:AF:51:5A:6A:D5:3F:DD:C1:D2:60:4A:88:E9:F8:79:BF
            X509v3 Authority Key Identifier:
                3B:BE:09:A3:AF:51:5A:6A:D5:3F:DD:C1:D2:60:4A:88:E9:F8:79:BF
            X509v3 Basic Constraints: critical
                CA:TRUE
Certificate is to be certified until Nov 22 00:12:36 2026 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated
==> 0
CA certificate is in ./demoCA/cacert.pem

これにより、/etc/ssl配下に、demoCAというディレクトリが作成されます。
/etc/ssl/demoCA配下に、CAのルート証明書が格納されています。
/etc/ssl/demoCA/private配下に、CAのキーファイルが格納されています。

4-3.Idpで利用する証明書を発行

/etc/ssl/demoCA配下でIdpの証明書を発行します。
初めに、SAN(Subject Altanative Name)設定ファイルを作成します。

cat > /etc/ssl/demoCA/subjectnames.txt <<EOF
subjectAltName = DNS:idp.f5.si
EOF
cd /etc/ssl/demoCA
openssl genrsa -out idp.key 2048
openssl req -utf8 -new -key idp.key -out idp.csr
openssl ca -in idp.csr -out idp.pem -extfile subjectnames.txt

<出力例>

root@u222c96:/etc/ssl/demoCA# cd /etc/ssl/demoCA
root@u222c96:/etc/ssl/demoCA# openssl genrsa -out idp.key 2048
root@u222c96:/etc/ssl/demoCA# openssl req -utf8 -new -key idp.key -out idp.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]: <ー空Enter
State or Province Name (full name) [Tokyo]: <ー空Enter
Locality Name (eg, city) [Chiyoda-ku]: <ー空Enter
Organization Name (eg, company) [f5.si]: <ー空Enter
Organizational Unit Name (eg, section) : <ー空Enter
Common Name (e.g. server FQDN or YOUR name) :idp.f5.si <ーidp.f5.siと入力
Email Address :

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password : <ー空Enter
An optional company name []: <ー空Enter

root@u222c96:/etc/ssl/demoCA# openssl ca -in idp.csr -out idp.pem -extfile subjectnames.txt
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/demoCA/private/cakey.pem: <ーcakeyのパスフレーズを再度入力
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            6e:fa:be:0b:64:8b:ea:4c:c2:ee:c2:7b:62:b3:64:5f:52:40:59:2c
        Validity
            Not Before: Nov 23 06:24:02 2023 GMT
            Not After : Nov 22 06:24:02 2024 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = f5.si
            commonName                = idp.f5.si
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:idp.f5.si
Certificate is to be certified until Nov 22 06:24:02 2024 GMT (365 days)
Sign the certificate? [y/n]:y <ーyを入力しEnter


1 out of 1 certificate requests certified, commit? [y/n]y <ーyを入力しEnter
Write out database with 1 new entries
Data Base Updated
4-4.発行した証明書の確認

以下ファイルのうち、cacert.pem, idp.pem, idp.keyは後ほど使用しますので、ClientPC内などに保存しておきます。

root@u222c96:/etc/ssl/demoCA# ls
cacert.pem  crl        idp.key    index.txt.attr      newcerts  serial.old
careq.pem   crlnumber  idp.pem    index.txt.attr.old  private   subjectnames.txt
certs       idp.csr    index.txt  index.txt.old       serial

5.wso2インストール

5-1.OpenJDK11インストール

OpenJDK11をインストールします。
unzipは後ほど使用するため一緒にインストールしてしまいます。

apt update && \
apt -y install openjdk-11-jdk unzip

インストール完了後、以下のコマンドでPathを通します。

cat > /etc/profile.d/java.sh <<'EOF'
export JAVA_HOME=$(dirname $(dirname $(readlink $(readlink $(which java)))))
export PATH=$PATH:$JAVA_HOME/bin
EOF

source /etc/profile.d/java.sh

java --version

<出力例>
以下のように出力されればOKです。

root@u222c96:~# java --version
openjdk 11.0.21 2023-10-17
OpenJDK Runtime Environment (build 11.0.21+9-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.21+9-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)
5-2.wso2のDL

以下のサイトからDLしてください。ファイル名はwso2is-6.1.0.zipとなります。*5
wso2.com

DLが完了したら、wso2is-6.1.0.zipを/root/tmp/配下にコピーしておいてください。
コピー後、以下のコマンドで解凍します。

cd /root/tmp
unzip wso2is-6.1.0.zip

以降は、/root/tmp/wso2is-6.1.0/配下で作業をしていきます。

5-3.JKS(Java Key Store)ファイルの準備
5-3-1.証明書のコピー

4-4.で発行した証明書を/root/tmp/wso2is-6.1.0/repository/resources/security/配下にコピーします。

cp /etc/ssl/demoCA/cacert.pem /root/tmp/wso2is-6.1.0/repository/resources/security/
cp /etc/ssl/demoCA/idp.pem /root/tmp/wso2is-6.1.0/repository/resources/security/
cp /etc/ssl/demoCA/idp.key /root/tmp/wso2is-6.1.0/repository/resources/security/
5-3-2.証明書をpfx形式に変換

cacert.pem, idp.pem, idp.keyの3つの証明書を一旦pfx形式に変換します。

cd /root/tmp/wso2is-6.1.0/repository/resources/security

openssl pkcs12 -export \
-in idp.pem \
-inkey idp.key \
-name "idp.f5.si" \
-certfile cacert.pem \
-out idp-f5-si.pfx

<出力例>
以下のように出力されればOKです。

root@u222c96:~/tmp/wso2is-6.1.0/repository/resources/security# openssl pkcs12 -export \
-in idp.pem \
-inkey idp.key \
-name "idp.f5.si" \
-certfile cacert.pem \
-out idp-f5-si.pfx
Enter Export Password: <-パスフレーズを入力
Verifying - Enter Export Password:  <-パスフレーズを入力
5-3-3.pfx形式をjks形式に変換

続いて、idp-f5-si.pfxをjks形式に変換します。

keytool -importkeystore \
-srckeystore idp-f5-si.pfx \
-srcstoretype pkcs12 \
-destkeystore idp-f5-si.jks \
-deststoretype JKS

<出力例>
以下のように出力されればOKです。

root@u222c96:~/tmp/wso2is-6.1.0/repository/resources/security# keytool -importkeystore \
-srckeystore idp-f5-si.pfx \
-srcstoretype pkcs12 \
-destkeystore idp-f5-si.jks \
-deststoretype JKS
Importing keystore idp-f5-si.pfx to idp-f5-si.jks...
Enter destination keystore password: <-パスフレーズを入力
Re-enter new password: <-パスフレーズを入力
Enter source keystore password: <-パスフレーズを入力
Entry for alias idp.f5.si successfully imported.
Import command completed:  1 entries successfully imported, 0 entries failed or cancelled

補足1
以降、以下のようなWarningメッセージが表示されますが無視してください。

The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using~

補足2
wso2の仕様上、JKSのKeystore passwordとPrivate Key passwordを統一する必要があるため、各種パスワードやパスフレーズは「Password!」などに統一しておいた方が良いです。*6

5-3-4.証明書をTruststoreにインポート準備

一旦、idp-f5-si.jksから証明書をPEM形式で取り出します。

keytool -export \
-alias "idp.f5.si" \
-keystore idp-f5-si.jks \
-file idp-f5-si.pem

<出力例>
以下のように出力されればOKです。

root@u222c96:~/tmp/wso2is-6.1.0/repository/resources/security# keytool -export \
-alias "idp.f5.si" \
-keystore idp-f5-si.jks \
-file idp-f5-si.pem
Enter keystore password: <-パスフレーズを入力
Certificate stored in file 
5-3-5.証明書をTruststoreにインポート

取り出した証明書をclient-truststore.jksにインポートします。*7

keytool -import \
-alias idp.f5.si \
-file idp-f5-si.pem \
-keystore client-truststore.jks \
-storepass wso2carbon

<出力例>
以下のように出力されればOKです。

root@u222c96:~/tmp/wso2is-6.1.0/repository/resources/security# keytool -import \
-alias idp.f5.si \
-file idp-f5-si.pem \
-keystore client-truststore.jks \
-storepass wso2carbon
Owner: CN=idp.f5.si, O=f5.si, ST=Tokyo, C=JP
Issuer: CN=CA.f5.si, O=f5.si, ST=Tokyo, C=JP

--- snip ---

Trust this certificate? [no]:  yes <- yesと入力しEnter
Certificate was added to keystore
5-4.wso2の初期設定

deployment.tomlファイルを編集していきます。

vi /root/tmp/wso2is-6.1.0/repository/conf/deployment.toml

[server]
hostname = "idp.f5.si" <-localhostから変更
node_ip = "192.168.33.96" <-127.0.0.1から変更

--- snip ---
最終行に以下を追記

[keystore.tls]
file_name = "idp-f5-si.jks"
type = "JKS"
password = "Password!"
alias = "idp.f5.si"
key_password = "Password!"
5-5.wso2の起動

/root/tmp/wso2is-6.1.0/bin配下にあるshスクリプトを実行します。

cd /root/tmp/wso2is-6.1.0/bin

./wso2server.sh

<出力例>
以下のように出力されればOKです。

root@u222c96:~/tmp/wso2is-6.1.0/bin# ./wso2server.sh
JAVA_HOME environment variable is set to /usr/lib/jvm/java-11-openjdk-amd64
CARBON_HOME environment variable is set to /root/tmp/wso2is-6.1.0
Using Java memory options: -Xms256m -Xmx1024m
[2023-12-03 09:51:53,243]   INFO {org.ops4j.pax.logging.spi.support.EventAdminConfigurationNotifier} - Sending Event Admin notification (configuration successful) to org/ops4j/pax/logging/Configuration
[2023-12-03 09:51:53,416]   INFO {org.wso2.carbon.core.internal.CarbonCoreActivator} - Starting WSO2 Carbon...
[2023-12-03 09:51:53,417]   INFO {org.wso2.carbon.core.internal.CarbonCoreActivator} - Operating System : Linux 5.15.0-72-generic, amd64
[2023-12-03 09:51:53,418]   INFO {org.wso2.carbon.core.internal.CarbonCoreActivator} - Java Home        : /usr/lib/jvm/java-11-openjdk-amd64
[2023-12-03 09:51:53,418]   INFO {org.wso2.carbon.core.internal.CarbonCoreActivator} - Java Version     : 11.0.21
[2023-12-03 09:51:53,418]   INFO {org.wso2.carbon.core.internal.CarbonCoreActivator} - Java VM          : OpenJDK 64-Bit Server VM 11.0.21+9-post-Ubuntu-0ubuntu122.04,Ubuntu
[2023-12-03 09:51:53,419]   INFO {org.wso2.carbon.core.internal.CarbonCoreActivator} - Carbon Home      : /root/tmp/wso2is-6.1.0
[2023-12-03 09:51:53,419]   INFO {org.wso2.carbon.core.internal.CarbonCoreActivator} - Java Temp Dir    : /root/tmp/wso2is-6.1.0/tmp
[2023-12-03 09:51:53,419]   INFO {org.wso2.carbon.core.internal.CarbonCoreActivator} - User             : root, en-US, Asia/Tokyo
[2023-12-03 09:51:53,624]   INFO {org.wso2.carbon.event.output.adapter.kafka.internal.ds.KafkaEventAdapterServiceDS} - Successfully deployed the Kafka output event adaptor service
[2023-12-03 09:51:53,841]   INFO {org.wso2.carbon.identity.hash.provider.pbkdf2.internal.PBKDF2HashServiceComponent} - PBKDF2 bundle activated successfully.

--- snip ---

[2023-12-03 09:52:12,408]   INFO {openjpa.Runtime} - Starting OpenJPA 2.2.0-wso2v1
[2023-12-03 09:52:12,465]   INFO {openjpa.jdbc.JDBC} - Using dictionary class "org.apache.openjpa.jdbc.sql.H2Dictionary".
[2023-12-03 09:52:12,712]   INFO {org.wso2.carbon.core.transports.http.HttpTransportListener} - HTTP port        : 9763
[2023-12-03 09:52:12,713]   INFO {org.wso2.carbon.core.transports.http.HttpsTransportListener} - HTTPS port       : 9443
[2023-12-03 09:52:12,799]   WARN {org.apache.tomcat.util.net.SSLUtilBase} - The trusted certificate with alias [secomscrootca1] and DN [OU=Security Communication RootCA1, O=SECOM Trust.net, C=JP] is not valid due to [NotAfter: Sat Sep 30 13:20:49 JST 2023]. Certificates signed by this trusted certificate WILL be accepted
[2023-12-03 09:52:12,809]   INFO {org.apache.tomcat.util.net.NioEndpoint.certificate} - Connector [https-jsse-nio-9443], TLS virtual host [_default_], certificate type [UNDEFINED] configured from [/root/tmp/wso2is-6.1.0/repository/resources/security/idp-f5-si.jks] using alias [idp.f5.si] and with trust store [/root/tmp/wso2is-6.1.0/repository/resources/security/client-truststore.jks]
[2023-12-03 09:52:12,838]   INFO {org.wso2.carbon.bpel.core.ode.integration.BPELSchedulerInitializer} - Starting BPS Scheduler
[2023-12-03 09:52:12,849]   INFO {openjpa.Runtime} - Starting OpenJPA 2.2.0-wso2v1
[2023-12-03 09:52:12,850]   INFO {openjpa.jdbc.JDBC} - Using dictionary class "org.apache.openjpa.jdbc.sql.H2Dictionary" (H2 2.1.210 (2022-01-17) ,H2 JDBC Driver 2.1.210 (2022-01-17)).
[2023-12-03 09:52:12,893]   INFO {org.wso2.carbon.core.internal.StartupFinalizerServiceComponent} - Server           :  WSO2 Identity Server-6.1.0
[2023-12-03 09:52:12,895]   INFO {org.wso2.carbon.core.internal.StartupFinalizerServiceComponent} - WSO2 Carbon started in 23 sec
[2023-12-03 09:52:13,197]   INFO {org.apache.jasper.servlet.TldScanner} - At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
[2023-12-03 09:52:13,216]   INFO {org.wso2.carbon.ui.internal.CarbonUIServiceComponent} - Mgt Console URL  : https://idp.f5.si:9443/carbon/
[2023-12-03 09:52:13,250]   INFO {org.wso2.identity.apps.common.internal.AppsCommonServiceComponent} - My Account URL : https://idp.f5.si:9443/myaccount
[2023-12-03 09:52:13,251]   INFO {org.wso2.identity.apps.common.internal.AppsCommonServiceComponent} - Console URL : https://idp.f5.si:9443/console
[2023-12-03 09:52:13,252] []  INFO {org.wso2.identity.apps.common.internal.AppsCommonServiceComponent} - Identity apps common service component activated successfully.

wso2は、Ctrl+cで停止させることができます。

5-6.wso2管理コンソールログイン

ClientPCなどから管理コンソールにログインします。
https://idp.f5.si:9443/carbon/にアクセス
Username: admin
Password: admin

以降は、ClientPC側から、https://idp.f5.si:9443/carbon/にアクセスしながら設定を進めて行きます。
当然、Internetに晒されているため、SrcIPをGlobalIP-Bだけに絞るなど、BBルータA上で各種セキュリティ設定を行っておいてください。*8

https://idp.f5.si:9443/carbon/にアクセスした際、ブラウザ上に証明書の警告が表示されますので、/etc/ssl/demoCA/cacert.pemをクライアントPCの信頼されたルート証明機関にインストールしておいてください。

6.wso2の各種設定

設定を行う前にKeycloakとの設定項目名を比較してみます。

wso2の項目名 Keycloakの項目名 備考
Tenant Realm 管理ドメインを作成します。
User Stores User federation ADやLDAPとの連携設定を行います。
Claims Mappers Attributeのマッピングを行います。
Service Provider Clients SAML SPの設定を行います。*9

実装の違いにより項目の詳細は異なっていますが、やろうとしていることは同じです。
どの項目で何ができるかを把握していれば充分だと思います。

6-1.テナントの作成

wso2上にテナントを作成します。*10

6-1-1.新規テナントの作成

Configure>Mutitenancy>Add New Tenantをクリック
必要項目を記載します。

項目 設定値 備考
Domain example.com ADのDomain名と一致させてください
Select Usage Plan For Tenant Demo 他に選択できないためこのままでOKです
First Name super 任意の名前でOKです
Last Name user 任意の姓でOKです
Admin username admin wso2のexample.comテナントにログインする際、admin@example.comとなります
Admin Password Password! 任意のパスワードでOKです
Email admin@example.com 任意のEmailでOKです

以下のように設定してください。そして、Saveをクリック。

テナント作成後、
Configure>Mutitenancy>View Tenantsをクリックすると、テナントの詳細が確認できます。
このテナント上で各種設定を行っていきます。
右上のSign-outをクリックして、一旦サインアウトします。

6-1-2.新規テナントへのログイン

テナントへログインする際は、前項で作成したアカウントでログインしてください。
Username:admin@example.com *11
Password:Password!
以降はこのテナントで作業しますので、上記クレデンシャルを入力してwso2にログインしてください。

6-6.ADとの連携設定

最初にGUIで設定後、CLIで追加設定を行います。*12

6-6-1.GUIでの設定

Main>Identity>User Stores>Addをクリック
必要項目を記載します。

項目 設定値 備考
User Store Manager Class org.wso2.carbon.user.core.ldap.UniqueIDActiveDirectoryUserStoreManager
Domain Name example.com ADのDomain名と一致させます
Connection URL ldap://192.168.240.91:389 ポート番号まで入れてください
Connection Name CN=Administrator,CN=Users,DC=example,DC=com
Connection Password 上記アカウントのパスワード
User Search Base CN=Users,DC=example,DC=com

<Optional>

項目 設定値 備考
Group Search Base CN=Users,DC=example,DC=com

<Advanced>

項目 設定値 備考
Default Realm Name EXAMPLE.COM ほぼ使う事はありませんがKrbのレルム名です

以下のように設定してください。そして、Addをクリック。

6-6-2.CLIでの追加設定

設定ファイルを直接編集するため、一旦wso2をCtrl+cで停止させます。
作成したテナントのUser Stores設定ファイルは以下のPathに存在します。*13
/root/tmp/wso2is-6.1.0/repository/tenants/1/userstores/example_com.xml
このファイルに直接編集&追記していきます。
赤文字が修正、青文字は行を追記します。

vi /root/tmp/wso2is-6.1.0/repository/tenants/1/userstores/example_com.xml

<Property name="UserNameSearchFilter">(&amp; (objectClass=user)(|(userPrincipalName=?)(sAMAccountName=?)))</Property>
<Property name="UserNameJavaRegEx">[a-zA-Z0-9@._-|//]{3,30}$</Property>
<Property name="UserNameJavaScriptRegEx">[a-zA-Z0-9._-|//]{3,30}$</Property>
<Property name="UserNameWithEmailJavaScriptRegEx">[a-zA-Z0-9@._-|//]{3,30}$</Property>

補足
以下3項目は"6-6-1.GUIでの設定"でも設定可能です。*14

CLI上での設定名 GUI上での設定名 備考
UserNameSearchFilter User Search Filter 赤文字を入力。CLI上での"amp;"はエスケープなので、GUI上では入力不要です。
UserNameJavaRegEx Username RegEx (Java) 赤文字を入力。本項目は<Optional>の中ほどにあります。
UserNameJavaScriptRegEx Username RegEx (Javascript) 赤文字を入力。本項目は<Optional>の中ほどにあります。

以下の項目だけはCLIでの設定が必要となります。

UserNameWithEmailJavaScriptRegEx
6-6-3.wso2の起動

修正が完了したら、再度wso2を起動します。

cd /root/tmp/wso2is-6.1.0/bin

./wso2server.sh

wso2起動後に再度テナントにログインすると、以下のようなメッセージが表示されれば、ADとディレクトリ情報の同期が取れています。*15

[2023-12-03 16:06:46,651] [7569af63-31c8-45db-ade5-1ca3100a299f]  WARN {org.wso2.carbon.user.core.ldap.UniqueIDActiveDirectoryUserStoreManager} - Connection to the Active Directory is not secure. Password involved operations such as update credentials and adduser operations will fail
[2023-12-03 16:06:46,661] [7569af63-31c8-45db-ade5-1ca3100a299f]  INFO {org.wso2.carbon.user.core.ldap.UniqueIDReadWriteLDAPUserStoreManager} - LDAP connection created successfully in read-write mode
6-7.Claimsの設定

続いて、属性マッピングの設定を行っていきます。

6-7-1.upnの追加

Main>Identity>Claims>Add>Add Local Claimをクリック
必要項目を記載します。

項目 設定値 備考
Claim URI http://wso2.org/claims/upn
Display Name userPrincipalName
Description userPrincipalName
Mapped Attribute userPrincipalName PRIMARYの右側の空欄に入力します
Supported by Default チェックを入れる

以下のように設定してください。そして、Addをクリック。

6-7-2.usernameの変更

Main>Identity>Claims>List>http://wso2.org/claimsをクリック
スクロールダウンして、Usernameの右横のEditをクリック
Mapped Attributeのuidー>cnに変更。
以下のように設定してください。そして、Updateをクリック。

6-8.Service Providerの設定

SPの設定となりますが、ここではIdpのMetadataを出力するところまでの手順に留めます。

6-8-1.Service Providerの追加

Main>Identity>Service Providers>Addをクリック
Service Provider NameにWordPressと入力。
以下のように設定してください。そして、Registerをクリック

6-8-2.Service Providerの基本設定

必要項目を記載します。

項目 設定値 備考
SaaS Application チェックを入れる

<Claim Configuration>

項目 設定値 備考
Subject Claim URI http://wso2.org/claims/upn プルダウンメニューより選択。一番下の方にあります。
Service Provider Claim Dialect http://wso2.org/claimsを選択してAddをクリック Addをクリックすると、すぐ下に表示されます。

以下のように設定してください。そして、Updateをクリック

6-8-3.Idp Metadaの出力

一旦元の画面に戻るので、Editをクリック

Inbound Authentication Configuration>SAML2 Web SSO Configurationをクリックして、Configureをクリック

一番下までスクロールダウンして、Download IDP Metadataボタンをクリック。
後ほど、Wordpressにインポートしますので、idp.xmlとして保存しておきます。
一旦、Cancelをクリック。


7.Wordpressインストール&各種設定

7-3-2.までは、Keycloakの時と同じ手順となります。

7-1.Wordpressインストール

以下のサイトからWordpressOVAファイルをDLします。
bitnami.com
OVAファイルをVMWare上にデプロイしてください。

7-2.Wordpress初期設定

構成図に基づき、ssh接続やIPアドレス設定を記載しています。
Defaultでは、DHCP設定にてIPアドレスを自動取得しますが、自動取得が特に気にならない方は、7-2-3までスキップしてください。*16

7-2-1.OSコンソールへのログインとssh設定

以下のクレデンシャルでログインしてください。

ユーザ名:bitnami
パスワード:bitnami

sshのパスワード接続を許可したいので、PasswordAuthenticationのコメントアウトを外します。

sudo vi /etc/ssh/sshd_config

PasswordAuthentication yes

その後、以下のコマンドでsshサーバを起動します。

sudo rm -f /etc/ssh/sshd_not_to_be_run
sudo systemctl enable ssh
sudo systemctl start ssh
7-2-2.IPアドレス設定

ssh接続後、IPアドレスを変更します。*17

sudo vi /etc/systemd/network/25-wired.network

[Match]
Name=ens*

[Network]
Address=192.168.11.94/24
Gateway=192.168.11.1
DNS=192.168.11.1

設定が完了したら、一旦再起動します。

7-2-3.Wordpressコンソールへのログイン

再起動後、VMWareのコンソール上に以下のような画面が表示されます。

ClientPCから以下のURLにアクセスしてください。
補足:パスワードはWordpressをデプロイするたびに自動生成されるため都度変更されます。

http://192.168.11.94/admin/
ユーザ名:user
パスワード:vfwUWFiS25BR

以下のような画面で上記クレデンシャルを入力しログインします。

ログインすると以下の画面が表示されます。
Please update nowをクリックして、最新Verにアップデートしておきます。

初回ログイン時は、WordpressのローカルDBを使用しました。
ここから、WordpressSAML SPとして設定することにより、wso2 IdpによるSAML認証ができるように設定をしていきます。

7-3.WordpressSAML SP設定
7-3-1.SAML Plug-inのインストール

Plugins>Add New Pluginをクリック

画面右上Keywordの右側にsamlと入力すると検索候補が表示されます。
SAML Single Sign On - SSO LoginのInstall Nowをクリックします。*18

インストールが完了すると以下の表示に切り替わるので、Activateをクリック

以下の画面が表示されるので、Configure Your IDP Nowをクリック*19

7-3-2.SAML Idp(wso2) Metadataのインポート

画面中央のUpload IDP Metadataタブをクリックします。
Identity Provider Nameには、任意の名前を入力(ここでは例として、wso2と入力)
ファイル選択をクリックし、6-8-3.Idp Metadaの出力で保存したidp.xmlを選択
そして、Uploadをクリック

idp.xmlファイルのアップロードが成功すると、以下の画面が表示。
画面を下スクロールしてSaveをクリック

7-3-3.SAML SP(Wordpress) Metadataのエクスポート

画面上部のService Provider Metadataタブをクリックし、Downloadをクリック
任意のファイル名(ここでは例として、sp.xml)でClientPCに保存

7-3-4.wso2 SP Metadataのインポート

ここからはwso2のexample.comテナントにログインして作業を進めます。
Main>Identity>Service Providers>Listをクリック
WordPressの右横のEditをクリック

Inbound Authentication Configuration>SAML2 Web SSO Configurationをクリックして、Configureをクリック

Metadata File Configurationをクリック
ファイルを選択をクリックして、Wordpressからエクスポートしたsp.xmlを選択
Uploadをクリック

以下の画面に戻るので、SAML2 Web SSO ConfigurationのEditをクリック

以下2つの項目にチェック
Enable Attribute Profile
Include Attributes in the Response Always
画面を一番下までスクロールダウンして、Updateをクリック

元の画面に戻り、SAML2 Web SSO ConfigurationのAttribute Consuming Service Indexの項目に任意の数字が表示されます。

以上で設定は完了です。
ここからは動作確認をしていきます。




8.動作確認

動作確認前に、ここでもう一度構成を確認しておきましょう。

  1. ClientPCー>WordPress SPにアクセスし、SAML認証を選択
  2. ClientPCー>wso2 Idpにリダイレクトされ、クレデンシャルを入力
  3. ClientPCー>WordPress SPにリダイレクトされ、ログイン完了後の画面が表示

fig.1

ClientPCから以下URLにアクセス
http://192.168.11.94/admin/
Login with wso2をクリック

wso2の方にリダイレクトされるので、クレデンシャルを入力して、Continueをクリック

以下の警告画面が表示されますが、そのまま送信するをクリック*20

ログイン完了後、以下の画面が表示されます。

以上です。

*1:同じ挙動を別アプリで動作させてみることは極めて重要です。なぜなら、障害時の切り分けに活用できるからです。加えて、規格で定義されているパラメータと、アプリ独自実装のパラメータが明確に把握できるからです。その上で、規格のドキュメントを読むと、より理解が深まります。

*2:wso2のデフォルト待ち受けポートはTCP9443となります。KeycloakのときはTCP8443でしたので、wso2とKeycloakを並行運用可能です。

*3:もう少し掘り下げて検証すれば、Hostname=IPアドレスでも、うまく動作する可能性はあります。しかし、IPアドレスのままでKeycloakを動作させることが目的ではないため、私は素直にドメイン登録をしました。

*4:このユーザ名は一番最後の動作確認時に利用します。

*5:DLする際にメアドの登録が必要となります。メアド登録に抵抗がある方は、ソースからビルドすることも可能です。ビルドする場合はMaven3.xが必要となります。私がビルドした際、完了までに約30分程度要しました。こちらのgithubからソースをDLすることが可能です。https://github.com/wso2/product-is/tree/v6.1.0

*6:セキュリティ上はよろしくないですが、初めてトライするときは、統一しておいた方が混乱せずに済むと思います。2回目以降は、どこが統一されていないとダメで、どこが異なっていても良いかなどを確認しながら進めてください。

*7:client-truststore.jksは、wso2にDefaultで存在するJKSファイルです。ここには信頼された証明書が格納されています。各種Docを読む限り、この手順となっているのですが、私個人的には、cacert.pemをインポートすれば良いのでは?と思っています。時間のあるときに検証してみようと思います。

*8:本来であれば、リバプロやWAFの導入といった作業をした方が良いです。

*9:本記事ではSAML Idpの設定方法を記載しているため、「SAML SPの設定を行います」、と記載しました。しかし、wso2もKeycloakもCAS(Central Authentication Service)なので、SAMLだけなく、OAuthなど他の認証方式でも本項目を利用します。このため、本来はSAML SPに限定されないという点に留意してください。

*10:初期設定ではadminテナントが存在していますが、名前の通りadminなので、これとは別にIdpとして利用するためのテナントを別途作成します。

*11:@example.comの部分でログインするテナントを識別しています。

*12:これは、UPN(userPrincipalName)とSAM(sAMAccountName より厳密にはcnとなります)の両方でログイン可能とするための設定となります。

*13:/root/tmp/wso2is-6.1.0/repository/tenants/までは決まっています。1/は1番目に作成したテナントを意味しています。userstores/も決まっています。example_com.xmlは、テナント作成時に指定したドメイン名により決まります。例:example.comであれば、example_com.xmlとなります。

*14:はてな記法の関係上、テーブル内で、|(パイプ)とか;(セミコロン)のエスケープができなかったため、CLI上での設定として記載しました。どなたか良い方法があれば教えてください。

*15:Warningメッセージはldapsで通信していないため表示されていますので今回の構成であれば無視してOKです。

*16:Wordpressの最新Ver6.4.1の場合、この方法でIPアドレス設定ができませんでした。Wordpressのマニュアルを読む限り、VMWare上の設定が必要とのことで、VMWare関連ドキュメントへのリンクが大量に掲載されたページしか表示されなかったため、Ver5.9.0を使用しています。ここは頑張りどころではないため古いVer5.9.0でスルーしましたが、WordpressはDebian11で動作しているため、Debian11のネットワーク設定を少しいじればサクッと設定できるかもしれません。

*17:DefaultではDHCP設定となっているため固定IP設定とします。Internetに出られれば良いので、DHCP設定のままでも構いません。

*18:似たような候補でLogin using WordPress Users(WP asSAML IDP)が表示されますが無視してください。

*19:画面に表示されているwso2をクリックすると、wso2の設定マニュアルが表示されます。

*20:ClientPCからWordpressにクレデンシャルが平文で送信されます。一般的に、SAML IdpとSP間で直接通信することはなく、必ずClientPCを経由して通信します。今回の構成では、SAML SPであるWordpressSSL化されていなくても、ClientPCとWordpress間はローカルNW内の通信となり、クレデンシャルがInternetに晒されることはないので特に問題ありません。