Apache httpd の SAML 認証設定メモ(mod_auth_mellon + Azure AD)

Linux
Linux
スポンサーリンク

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 の構成は下の図の通りです。

Apache httpd + mod_auth_mellon と Azure AD の構成図

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アプリケーションなどに導入してみてはいかがでしょうか。

コメント

タイトルとURLをコピーしました