mod_auth_mellon は、Apache httpd の SAML(サムル)認証モジュールです。mod_auth_mellon を使えば、Apache httpd で提供している Webサービスなどを、SAML 2.0 に対応している IdP(*1) と簡単に連携することができますので、強固な認証システムを手軽に実装できるのが魅力です。そこで今回は、Apache httpd の mod_auth_mellon を使って Azure AD(IdP)と連携する設定手順をまとめてみました。
(*1) IdP:IDプロバイダーの略称で、ユーザーIDなどの認証情報を保管し、ユーザー認証を行うサービスです。一方この IdP の認証を利用する Webサービスなどを SP(サービスプロバイダー)と呼びます。
SAML 構成
今回設定する SAML の構成は下の図の通りです。
SPとなるサービスURL(https://sample.apar.jp/)へのアクセスは、認証を必要とし、IdPとなる Azure AD で認証に成功したユーザーのみアクセスを許可するように設定します。(エンドポイントURLについては後ほどご説明いたします)
今回は、IdP として Azure AD を利用していますが、Okta、HENNGE One、Google Workspace など SAML 2.0 に対応している IdP であればなんでも利用できます。
下準備
今回設定する SP と IdP は次の通りです。
SP:Webサーバー(Apache httpd)
Apache httpd は、SSL(HTTPS)で通信できるようにしておきましょう。サーバーOSは AlmaLinux ですが、Rocky Linux など RHEL系のOSでしたら同じ手順で設定できると思います。
- サーバーOS:AlmaLinux 9.2
- Webサーバー:Apache httpd 2.4(要SSL設定)
- サービスURL:https://sample.apar.jp/
- その他:PHP
SAML認証に PHP は必要ありませんが、IdP から受け取った情報を確認するために使えるようにしておくことをオススメします。
関連記事:AlmaLinux 9.0 LAMPサーバインストールメモ【Apache2.4+MySQL8.0+PHP8.1】
IdP:Azure AD
Microsoft 365 を使っていれば、Azure AD を利用することができます。(ただし管理者アカウントが必要です)
Azure AD が利用できない場合は、12ヶ月無料版がありますので、そちらを利用するのが費用もかからずお手軽です。
Azure の無料アカウントを今すぐ作成 | Microsoft Azure
mod_auth_mellon のインストールと設定
mod_auth_mellon のインストール
mod_auth_mellon パッケージををインストールします。
sudo dnf install mod_auth_mellon
mod_auth_mellon の設定ファイル(auth_mellon.conf)は以下の場所に配置されます。今回は初期設定のままで特に変更は必要ありません。設定の詳細については mod_auth_mellon リポジトリ のREADMEを参照してください。
cat /etc/httpd/conf.d/auth_mellon.conf MellonCacheSize 100 MellonLockFile "/run/mod_auth_mellon/lock"
SAML メタデータの作成
SAML の SP と IdP は、XML形式の SAML メタデータと呼ばれる情報を交換しますので、まず SP のメタデータを作成します。
SAML メタデータの保存場所を作成します。(場所はどこでも構いません)
sudo mkdir /etc/httpd/mellon
SAML メタデータの作成ツールの最新版をダウンロードして実行権限をつけます。(パッケージに付属の作成ツール /usr/libexec/mod_auth_mellon/mellon_create_metadata.sh には不具合があります。2023年6月27日現在)
cd /usr/local/bin/ sudo curl -O https://raw.githubusercontent.com/latchset/mod_auth_mellon/main/mellon_create_metadata.sh sudo chmod 755 /usr/local/bin/mellon_create_metadata.sh
カレントディレクトリを SAML メタデータの保存場所に移動して、メタデータ作成ツールで SAML メタデータを作成します。ツールの使い方は簡単で、以下のようにエントリーIDとエンドポイントURLを指定して実行すれば、カレントディレクトリに SAML メタデータが作成されます。
cd /etc/httpd/mellon/ sudo /usr/local/bin/mellon_create_metadata.sh \ <エントリーID> \ <エンドポイントURL>
エントリーIDは、一般的に SP で提供しているサービスのURL(今回の場合は https://sample.apar.jp/)を指定します。
エンドポイントURLは、IdP と SAML メタデータなどを交換するために使われるURLを指定します。(エンドポイントURLは自由に指定できます)今回、エンドポイントURLは、https://sample.apar.jp/saml を指定しますが、サービスで使われるパスとかぶらないように指定しましょう。
以上をふまえて、SAML メタデータを作成します。
cd /etc/httpd/mellon/ sudo /usr/local/bin/mellon_create_metadata.sh \ https://sample.apar.jp/ \ https://sample.apar.jp/saml
以下のような表示がされれば、SAML メタデータの作成成功です。作成されたファイル(Output file のセクションを参照)を Apache httpd 設定で指定しますのでメモしておきましょう。
Output files: Private key: https_sample.apar.jp_.key Certificate: https_sample.apar.jp_.cert Metadata: https_sample.apar.jp_.xml Host: sample.apar.jp Endpoints: SingleLogoutService (SOAP): https://sample.apar.jp/saml/logout SingleLogoutService (HTTP-Redirect): https://sample.apar.jp/saml/logout AssertionConsumerService (HTTP-POST): https://sample.apar.jp/saml/postResponse AssertionConsumerService (HTTP-Artifact): https://sample.apar.jp/saml/artifactResponse AssertionConsumerService (PAOS): https://sample.apar.jp/saml/paosResponse
また、以下の SAML メタデータのXMLファイルは Azure AD を設定する時にも使いますので、手元のパソコンにダウンロードしておいてください。
Metadata: https_sample.apar.jp_.xml
Apache httpd の設定
今回の SP となるサービスサイト(https://sample.apar.jp/)は、バーチャルホストで設定していますので Apache httpd の設定は次のようになります。青文字の部分を追加してください。(MellonIdPMetadataFile ディレクティブは後ほど設定しますので、今はコメントアウトしておいてください)
sudo vi /etc/httpd/conf.d/ssl.conf
<VirtualHost *:443>
ServerName sample.apar.jp
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
Options FollowSymLinks
AllowOverride None
# SAML認証を有効化
AuthType Mellon
MellonEnable auth
Require valid-user
# エンドポイントURL(パス)の指定
MellonEndpointPath /saml/
# SP の SAML メタデータ関連ファイルの指定
MellonSPMetadataFile /etc/httpd/mellon/https_sample.apar.jp_.xml
MellonSPPrivateKeyFile /etc/httpd/mellon/https_sample.apar.jp_.key
MellonSPCertFile /etc/httpd/mellon/https_sample.apar.jp_.cert
# IdP の SAML メタデータ
# MellonIdPMetadataFile /etc/httpd/mellon/sample.apar.jp.xml
</Directory>
(略)
</VirtualHost>
Apache httpd を再起動します。
sudo systemctl restart httpd
まだ SAML認証の設定が完全ではないため、サービスURLにアクセスすると、Internal Server Error が発生しますが、問題ありません。
Azure AD の設定
つづいて IdP となる Azure AD の設定です。
Azure AD の管理画面(Microsoft Entra 管理センター)を開きます。
左メニューの「アプリケーション」>「エンタープライズアプリケーション」をクリックします。(「アプリケーション」が表示されない場合は「表示数を増やす」をクリックしてみてください)
「+新しいアプリケーション」をクリックします。
「+独自のアプリケーションの作成」をクリックします。
適当なアプリの名前(SPで提供しているサービス名など)を入力して、「ギャラリーに見つからないその他のアプリケーションを統合します (ギャラリー以外)」を選択したら画面下部にある「作成」をクリックします。
アプリが作成されたら「シングル サインオンの設定」をクリックします。
「SAML」をクリックします。
「メタデータファイルをアップロードする」をクリックして、SP の SAML メタデータのXMLファイル(今回の場合は https_sample.apar.jp_.xml)をアップロードします。
SP の基本的な SAML 構成が自動で設定されますので、そのまま「保存」をクリックします。(保存されたら右上の「×」をクリックして閉じてください)
以下のメッセージが表示された場合は「いいえ、後でtestします」をクリックしてください。
下にスクロールして「フェデレーション メタデータ XML」の「ダウンロード」をクリックしてください。(ここでダウンロードされるファイルが IdP の SAML メタデータです。このファイルを Apache httpd の MellonIdPMetadataFile ディレクティブで指定します)
今回は、IdP となる Azure AD に登録されているユーザーすべてにサービスURLへのアクセスを許可するため、「プロパティ」をクリックして「割り当てが必要ですか?」を「いいえ」に変更して「保存」をクリックします。(「はい」のままにしておけば、アクセスを許可するユーザーを個別に割り当てることができます。このあたりはお好みで設定してください)
Azure AD の設定は以上です。SP となる Apache httpd の設定に戻ります。
Apache httpd の設定(MellonIdPMetadataFile)
Azure AD の設定でダウンロードした「フェデレーション メタデータ XML」すなわち IdP の SAML メタデータファイルを Apache httpd の MellonIdPMetadataFile ディレクティブで指定します。
IdP の SAML メタデータファイル(今回の場合、ファイル名は「sample.apar.jp.xml」になります)を Webサーバにアップロードして、SAML メタデータの保存場所の下に配置してください。
/etc/httpd/mellon/sample.apar.jp.xml
MellonIdPMetadataFile ディレクティブのコメントアウトを外して、 IdP の SAML メタデータファイルをフルパスで指定します。
sudo vi /etc/httpd/conf.d/ssl.conf # IdP の SAML メタデータ # MellonIdPMetadataFile /etc/httpd/mellon/sample.apar.jp.xml ↓ MellonIdPMetadataFile /etc/httpd/mellon/sample.apar.jp.xml
Apache httpd を再起動します。
sudo systemctl restart httpd
以上で、SAML 認証の設定完了です。
動作確認
サービスURL(今回の場合は「https://sample.apar.jp/」)にアクセスして、Azure AD すなわち Microsoft アカウントのログイン画面にリダイレクトされ、認証が完了すればサービスURLにアクセスできることを確認してください。
認証済みのユーザーがアクセスすると、「MELLON_」から始まるサーバー変数に、Azure AD のユーザー情報がセットされてきます。php が使えれば var_dump($_SERVER);
などで確認してみてください。
(おまけ)ログアウトの実装方法
よく使いそうな mod_auth_mellon でのログアウトの実装方法です。
ログアウト用のエンドポイントURLに「ReturnTo」パラメータを加えてログアウト後のURLを指定します。(「ReturnTo」パラメータが指定されていないとエラーになってしまいます)
<a href="/saml/logout?ReturnTo=https://sample.apar.jp/">Log out</a>
おわりに
Webアプリケーションには全く手を入れずにSAML認証を導入できるのは、mod_auth_mellon の大きな魅力です。認証のセキュリティに不安がある Webアプリケーションなどに導入してみてはいかがでしょうか。
コメント