wso2 identity server(以下、wso2)を使用したSAML Idpの設定方法を記載していきます。
ここでは動作確認用としてWordpressをSAML SPとします。
wso2の認証バックエンドには、Windows2019のADを使用します。
前回記事(Keycloak)のwso2版と考えてください。*1
1.構成
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
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です |
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-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">(& (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をクリック
7.Wordpressインストール&各種設定
7-3-2.までは、Keycloakの時と同じ手順となります。
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アドレス設定
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を使用しました。
ここから、WordpressをSAML SPとして設定することにより、wso2 IdpによるSAML認証ができるように設定をしていきます。
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.動作確認
動作確認前に、ここでもう一度構成を確認しておきましょう。
- ClientPCー>WordPress SPにアクセスし、SAML認証を選択
- ClientPCー>wso2 Idpにリダイレクトされ、クレデンシャルを入力
- ClientPCー>WordPress SPにリダイレクトされ、ログイン完了後の画面が表示
fig.1
ClientPCから以下URLにアクセス
http://192.168.11.94/admin/
Login with wso2をクリック
wso2の方にリダイレクトされるので、クレデンシャルを入力して、Continueをクリック
以下の警告画面が表示されますが、そのまま送信するをクリック*20
ログイン完了後、以下の画面が表示されます。
以上です。
9.最後に
以下のサイトを参考にさせて頂きました。
WSO2 Identity Server Documentation
GitHub - wso2/product-is at v6.1.0
How to setup WSO2 with Let's Encrypt certificate - Techglimpse
WSO2 identity server email or pseudo as username - Stack Overflow
*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であるWordpressがSSL化されていなくても、ClientPCとWordpress間はローカルNW内の通信となり、クレデンシャルがInternetに晒されることはないので特に問題ありません。