WordPressサイトにシングルサインオン(SSO)と多要素認証(MFA)を導入する

## 背景と目的
管理対象のWordPressサイトが多数あるため、Google Authenticator等でのTOTPの利用が事実上困難になっていました。
そうは言っても、今のご時世に多要素認証無しというのはまずいので、シングルサインオンを導入して多要素認証を使えるようにしました。

## シングルサインオン(SSO)とは
1つのアカウントで様々なアプリケーションにログインできる仕組みです。GoogleアカウントやAppleIDで様々なサービスにログインできるのが身近な例でしょうか。
SSOのサービスが多要素認証を提供していれば、連携するサービスに一括で多要素認証を導入できます。

## SSOサービスの選定

組織でSSOを利用する場合、Active Directoryとか、Auth0等が一般的なのでしょうが、零細事業者にはなかなか手が出ません。
Googleアカウント認証も考えられますが、非技術者が扱う場合にGCPの画面で戸惑ってしまいそうだったり、多数のサイトを登録できるのか不透明なのがちょっと悩ましいところでした。

IIJさんがちょうどいいサービスを提供しているので、こちらを使うことにしました。

### IIJ IDサービス

https://www.iij.ad.jp/biz/iid/

- SSOプロトコルとしてSAML 2.0とOpen ID Connect 1.0に対応
- 1ユーザーから利用可能。最低利用期間なし、初期費用なし
- 多要素認証を利用する場合、1IDにつき210円(税抜, 2024/10現在)
- 連携するサービス数に対する費用は発生しない

シンプルなサービスなので、管理画面はわかりやすいと思います。

申し込んでから使えるようになるまで1～2週間かかります。1か月間の試用もできます。
クレカ払いはできません。自動引落か銀行振込での支払いになります。


## SAML or Open ID Connect
IIJ IDサービスではSAML 2.0とOpen ID Connect 1.0に対応しています。
仕組みは色々違いますが、WordPressでSSOを利用するという観点ではさほど違いはない(はず)です。

https://qiita.com/ykna/items/2367fe3cd13460baac9f

本当は証明書管理が不要なOpen ID Connectにしたかったのですが、残念ながらIIJ IDサービスではOpen ID ConnectのWordPressプラグインが動作しなかった[^1]のでSAMLを選択しました。
SAMLで使われる証明書の有効期間が15年あるので、そのうちOpen ID Connectに乗り換えたいところではあります。

### SAMLプラグインの選定

SAML対応のプラグインは複数ありますが、今回は利用者が多く継続的に更新されているminiOrange社のプラグインを使用します。miniOrange社はSSOサービスを提供している企業です。

https://ja.wordpress.org/plugins/miniorange-saml-20-single-sign-on/

無料版プラグインはほとんどの機能がロックされていますが、少人数の管理者ログインに使うには十分です。


## 設定手順

大まかな設定手順は以下の通りです。

1. 事前準備
    - IIJ IDサービスにユーザ/グループを作成
    - 多要素認証の設定
1. WordPressプラグインをインストール
1. IIJ IDサービスに新規「アプリケーション」を登録する
1. 新規登録したアプリケーションを使えるユーザを登録する
1. アプリケーションの「メタデータファイル」をダウンロードして、そのファイルをWordPressプラグインの設定ページにアップロードする
1. WordPressプラグインの設定ページから「メタデータファイル」をダウンロードして、それをIIJ IDサービスのフェデレーション設定画面にアップロードする
1. IIJ IDサービスを通して登録されるWordPressユーザーの役割(管理者、編集者等)を設定する
1. 動作確認

以下で詳細に説明します。

### 1. 事前準備

#### ユーザとグループの設定

IIJ IDサービス上で必要なユーザを作成しておいてください。

https://manual.iij.jp/iid/admin-help/9053811.html

複数ユーザで使う場合はグループを作成するのがお勧めです。

https://manual.iij.jp/iid/admin-help/9053970.html

#### 多要素認証の設定
多要素認証を強制するので、ログインポリシーの設定で第二要素としてSmartKey(スマホ上の認証アプリ)やFIDO2キー(いわゆるパスキー)を追加します。

https://manual.iij.jp/iid/admin-help/12583498.html

各ユーザーは、多要素認証デバイスを登録しておきます。

SmartKeyはIIJ IDサービスで使用される認証アプリです。IIJ IDと紐づけることで、認証要求があった際にアプリ内のアイコンをスライドすることで認証できます。
※ 紐づけの際にはSMS認証が必要です。

https://manual.iij.jp/iid/user-help/15761890.html

FIDO2キー(パスキー)はログイン後でないと登録できません。ログイン時に登録したい場合は、上記のログインポリシー設定で明示的に許可する必要があります。
運用に慣れないうちはSmartKeyを使うのがいいと思います。

https://manual.iij.jp/iid/user-help/22816289.html


### 2. WordPressプラグインのインストール
1.	導入対象のWordPressに管理者でログインする
2.	`SAML Single Sign On – SSO Login`プラグインをインストールし、有効化しておく

後の手順でIIJ IDコンソールとWordPress管理画面を行ったり来たりするので、両方の画面を開いたままにしておきます。

### 3.IIJ IDサービスにWordPressサイトを登録

#### アプリケーションを追加する
1. 管理者アカウントでIIJ IDコンソールにログインします
1. メニューから `アプリケーション` > `アプリケーションの管理` を選択します
1. `アプリケーションを追加する` ボタンをクリック
1. `カスタムアプリケーションを追加する` をクリック
1. `SAMLアプリケーション` を選択して `次へ進む` をクリック
1. アプリケーション情報を入力します
    ![2024-08-26_11h18_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10470/4e5b221c-d528-7cf3-eaab-dc33e0a239d8.png)

    - `アプリケーション名` にWordPressのサイト名を入力します
    - `アプリケーションの説明` と `アプリケーションロゴ` は必要に応じて設定します
    - IDプロバイダの選択は`アプリケーション専用のエンティティIDを利用`のまま
1. `アプリケーションを追加する` ボタンをクリック

※ 多数のサイトを登録すると、アプリケーションの追加ができなくなる場合があります。その時はサポートに問い合わせてみてください。

#### 利用者の追加
作成したアプリケーション(＝WordPressサイト)にログインできるユーザを指定します。
1. 追加されたWPサイトの `編集する` ボタンをクリック
1. `利用者設定` タブをクリック
1. `利用者を追加する` ボタンをクリック
1. WordPressにログイン可能にするグループまたはユーザを検索する
1. `利用者を追加する` ボタンをクリック

### 4. IDプロバイダ情報の設定

IIJ IDサービスの情報をWordPressに登録します。

1. IIJ IDコンソールのアプリケーション編集画面で`IDプロバイダ情報`タブをクリック
![2024-08-26_16h15_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10470/ca25f13c-ed76-78f7-928d-865ac719008a.png)
1. 一番下にあるメタデータの`ダウンロードする`ボタンをクリック
1. `idp_metadata.xml`ファイルがダウンロードされます
4.	WordPress管理画面に移動して`miniOrange SAML 2.0 SSO`をクリック 
5.	"Let's get started"の画面が表示されたら`Configure You IDP Now`ボタンをクリック
    ※ たくさん並んでいるボタンはマニュアルへのリンクなので設定には関係ありません
    ※ "Let's get started"の画面が出なければ無視して良い
7.	"Confirure Service Provider"の`Upload IDP Metadata`をクリック
8.	Identity Provider Nameに`IIJ_ID`と入力
![2024-08-26_11h45_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10470/16e6c31d-0e3d-fd35-7288-2553f670cb4f.png)

9.	"Upload Metadata"のファイルを選択ボタンをクリックして、ダウンロードしておいたIDプロバイダ情報のファイル(idp_profile.xml)を選択する
10.	`Upload`ボタンをクリックする
10.	`Identity Provider details saved successfully.`と表示されれば成功


### 5. サービスプロバイダ情報の設定

WordPress側の情報をIIJ IDサービスに登録します。

1. `Service Provider Metadata`タブをクリック
2. "Provider Metadata URL"の`Download`ボタンをクリックする
3. `Metadata.xml`というファイルがダウンロードされます
4. IIJ IDコンソールのアプリケーション編集画面に戻り、`フェデレーション設定`をクリック
5. "SAML基本情報"の`SPのメタデータをアップロードする`を選択
6. `ファイルを選択`ボタンをクリック
7. 先ほどダウンロードした`Metadata.xml`を選択
8. `変更を適用する`ボタンをクリック


### 6. 新規ユーザーの権限設定
1.	`Attribute/Role Mapping`をクリック 
2.	下にスクロールして、"Role MappingのDefault Role"を`管理者`に変更する
    ※ 運用ポリシーによっては編集者にすることも考えられます
3.	`Update`ボタンをクリック

### 7. 動作確認

1.	WordPressからログアウトする 
2.	`Login with IIJ_ID`ボタンをクリック
3.	IIJ IDの認証画面が表示された場合にはログインを行う
4.	管理画面にログインでき、`ユーザー`メニューが表示されていることを確認する
    ※ 役割が「管理者」の場合です


## FAQ

### SSOユーザー以外はどうなる?
従来通りユーザー名/パスワードでログインできます。
SSOを使わないユーザーを追加登録することもできます。

### WordPressにBasic認証をかけていても使える?
使えます。
SAML2.0では、IdP(ここではIIJ IDサービス)からSP(WordPress側)へ直接アクセスしてくることはありません。

### 非HTTPSサイトで使える?
簡単に試してみた限りでは、ブラウザの警告画面から進めなくなる現象が発生しました。行ったり来たりしているとログインできるようですが、お勧めしません。
HTTPS対応を先にやりましょう。

### WordPressやPHPが古くても使える?

SAML Single Sign On – SSO Loginプラグインのバージョン要件は以下の通りです。

- WordPress version 3.7またはそれ以降
- Tested up to 6.6.2
- PHP version 5.6またはそれ以降

※ プラグインVersion 5.1.9、2024/10現在


### IIJ IDサービス側でユーザを削除したら、WordPress上のユーザーは削除される?
削除されません。
IIJ IDサービス側でユーザを削除、またはアプリケーションの利用者から外した場合、そのユーザはWordPressにSSOでログインできなくなります。しかし、WordPress上のユーザーは残ったままになるので、ユーザーが不要であれば手動で削除する必要があります。
ユーザー同期のためのSCIMというプロトコルがありますが、miniOrange社のSCIMプラグインではユーザーの更新・削除は有料版の機能となります。
(関係ないけど、IIJ IDサービスは「ユーザ」、WordPressは「ユーザー」表記なんですよね...うーん)

### SSOサービスダウン時はどうなるか
SSOを使っているWordPressユーザーでもWordPressのパスワード認証が有効なので、万が一SSOサービスがダウンした場合には、従来通りの方法でWordPressユーザーのパスワードをリセットしてログインすることはできます。もちろん、この場合はSSOで使っている多要素認証が働きません。

裏を返すと、SSOと多要素認証を迂回できる可能性があります。miniOrange社のプラグインではSSOを強制する機能は有料版の機能となります。
他のプラグインを使うことでパスワード認証を無効化する方法はあるかもしれません。

### SSOでログインしようとしたら`Error code: WPSAMLERR006`が出た

IIJ IDサービスのアプリケーション登録の「利用者設定」で許可されていないユーザがログインしようとするとこのエラーになります。

## 検証バージョン
WordPress 6.6.2
SAML Single Sign On – SSO Loginプラグイン 5.1.9

## 参考資料

IIJ IDサービス マニュアル［管理者用］
https://manual.iij.jp/iid/admin-help/

IIJ IDサービス マニュアル［管理者用］ SAMLアプリケーション
https://manual.iij.jp/iid/admin-help/35212431.html

miniOrange社による導入マニュアル
https://plugins.miniorange.com/saml-single-sign-on-sso-wordpress-using-custom-idp
※ 日本語も選択できますが、昔の自動翻訳のようなので英語版にリンクしてあります。
途中で有料版の説明が出てくるので「Free」を選択してください。

## 最後に
ゆくゆくはFIDO2キーだけにしてパスワードレス化したい所。
他に使えそうなサービスやプラグインがあればコメントいただけると嬉しいです。

## 更新履歴
2024/10/15 FAQに「WordPressやPHPが古くても使える?」を追加
2024/10/23 アプリケーションの追加ができなくなる場合があることを追記
2024/10/25 Error code: WPSAMLERR006について追加

[^1]:Open ID Connectの設定をWordPressプラグイン側でOAuth2と見なして設定すれば一応動くようではあります。しかし、意図された使い方ではないと思われます。