WEBシステムの認証というと10年くらい前まではActiveDirectoryによるNTLM認証やKerberos認証、LDAP認証がメインでした。
ただ、今の時代はAWSやAzureなどによるクラウドサービスが当たり前となって、クラウドやオンプレなどの「場所」を問わずにWEBシステムを稼働させることが多くなってきております。
NTLM認証はWindows2000以降では推奨されておりませんし、Kerberos認証の場合にはサーバのFQDNに依存するため、社内と社外のDNSが違ったりするとアクセスできません。
また、いずれの場合もSSOを実現するにはADに参加しているPCである必要があり、主にエンタープライズの社内だけの利用を想定された技術かと思います。
そうなると、当然今後は社内だけでの認証ではなく、いつでも、どこからでも利用できる認証サービスが求められています。
すでにインターネット上の多数サービスはGoogleやTwitter、Facebookなどに認証を任せて、アプリケーション側ではユーザ情報を保持しない方式がとられてます。これはOpenIDConnctやSAMLを利用したものです。
そこで今回はテストとして、オンプレ環境にあるADFSサーバを利用してOpenIDConnectによる認証をApacheで実装してみました。
もちろん同じ方法でGoogleやTwitterなどの認証サービスを利用することも可能です。
環境
ADFSサーバ:WindowsServer 2019 ※すでにADFSサーバは構築されている前提です。
Webサーバ:CentOS 7.8
httpd-2.4.6-93.el7.centos.x86_64
利用するモジュール
ApacheでOpenID認証をするための「mod_auth_openiodc」を利用します。
mod_auth_openidcのインストール
さっそくインストールしてみます。
mod_auth_openidcはgithubからRPMを直接ダウンロードしますが、事前に必要となるモジュール類をインストールするためにepelのリポジトリを利用します。
// Apacheがインストールされてなければインストール
# yum install -y httpd
// epelリポジトリインストール
# yum -y install epel-release
// epelリポジトリ有効化
# yum-config-manager --enable epel
// 必要モジュールインストール
# yum install -y jansson jansson-devel
# yum install -y openssl openssl-devel
# yum install -y hiredis hiredis-devel
// epelリポジトリ無効化
# yum-config-manager --disable epel
// cjoseはyumからインストールできなかったのでcurlでダウンロードしてからRPMをインストール
# curl -L -o cjose-0.5.1-1.el7.centos.x86_64.rpm https://github.com/pingidentity/mod_auth_openidc/releases/download/v2.3.0/cjose-0.5.1-1.el7.centos.x86_64.rpm
# yum install -y cjose-0.5.1-1.el7.centos.x86_64.rpm
// cmod_auth_openidcも同様にダウンロードしてからインストール
# curl -L -o mod_auth_openidc-2.3.1-1.el7.centos.x86_64.rpm https://github.com/pingidentity/mod_auth_openidc/releases/download/v2.3.1/mod_auth_openidc-2.3.1-1.el7.centos.x86_64.rpm
# yum install -y mod_auth_openidc-2.3.1-1.el7.centos.x86_64.rpm
モジュールがインストールされたことと、関連ファイルについて確認します。
# rpm -qa | grep mod_auth_openidc
mod_auth_openidc-2.3.1-1.el7.centos.x86_64
# rpm -ql mod_auth_openidc
/etc/httpd/conf.modules.d/10-auth_openidc.conf
/usr/lib64/httpd/modules/mod_auth_openidc.so
/usr/share/doc/mod_auth_openidc-2.3.1
/usr/share/doc/mod_auth_openidc-2.3.1/ChangeLog
/usr/share/doc/mod_auth_openidc-2.3.1/LICENSE.txt
これでmod_auth_openidcモジュールのインストールは完了です。
ADFS側でのアプリケーション登録とクライアントID/Secret取得
認証サーバとしてADFSを利用するためには、ADFSへのアプリケーション登録をして、クライアントIDとSecretを取得する必要があります。
画面での例だけ載せておきます。
ApacheでのOpenID認証の設定
今回は例としてApahceのコンテンツすべて(/logoutを除く)に対してOpenID認証を必須とするように設定します。
ApacheでOpenID認証をするための設定ファイルを作成します。設定例として以下を載せます。
OIDCRedirectURIは認証が成功したときに飛ばされるURLです。先ほどADFS登録したリダイレクトURLと一致させる必要があります。合わせて、先ほど取得したクライアントIDとSecretを記載してください。
OIDCProviderMetadataURLにはADFS側のURLになります。実際にアクセスするとAuthorizeエンドポイントやTokenエンドポイントの情報が表示されます。その情報をもとにmod_auth_openidcがうまく処理してくれます。
OIDCDefaultLoggedOutURLではOpenID認証ががかからないログアウトページを指定します。
その他OIDCRemoteUserClaimなどはADのプリンシパル名からIDだけを抜き取るなどの設定ですので適宜変更してください。
# vi /etc/httpd/conf.d/autoindex.conf
OIDCRedirectURI https://<<リダイレクトURL>>
OIDCCryptoPassphrase password
OIDCProviderMetadataURL https://<<ADFSサーバ>>/adfs/.well-known/openid-configuration
OIDCResponseType "code"
OIDCClientID << クライアントID >>
OIDCClientSecret << Secret >>
OIDCScope "openid"
OIDCPKCMethod S256
OIDCSessionInactivityTimeout 300
OIDCHTMLErrorTemplate /etc/httpd/conf.d/auth_openidc_error.html
OIDCDefaultLoggedOutURL https://<<認証がかかっていないURL(Logoutした時に移動するぺージ>>
OIDCClaimPrefix OIDC-CLAIM-
OIDCRemoteUserClaim upn ~(.*)@
OIDCPassClaimAs both
OIDCAuthNHeader X-Remote-User
OIDCSSLValidateServer Off
OIDCOAuthSSLValidateServer Off
あとはhttpd.conf側でOpenID認証をかける範囲を設定します。
# vi /etc/httpd/conf/httpd.conf
// デフォルトの設定コメントアウト
#<Directory "/var/www">
# AllowOverride None
# # Allow open access:
# Require all granted
#</Directory>
// 追加 認証する対象ディレクトリ
<Location />
AuthType openid-connct
Require valid-user
</Location>
// 追加 認証除外する対象ディレクトリ
<Location /logout>
Require all granted
</Location>
設定したらhttpdサービスを忘れずに再起動します。
// httpd再起動
# systemctl restart httpd.service
動作確認
動作確認を行います。まずWEBにアクセスすると、ADFSサーバにリダイレクトされることを確認します。
正しい認証情報を入力して、認証に成功すると登録されたリダイレクトURLに飛ばされることを確認します。
あとは、/var/log/httpd/access_logなどを確認して、ユーザーIDが記録されていることを確認します。
まとめ
今回はOpenIDConnectによる認証をApacheで試してみました。
あまりOpenIDConnctやSAMLの内部的な動きについては解説していませんが、とりあえずは動かすことを目的としています。
もし、WEBシステム側で認証部分を自作する必要があれば内部のTokenなどの動きを理解する必要があります。
もし、AzureADと連携をするのであれば以下の書籍が詳しく書かれているのでオススメです。
今回は以上となります。
コメント