mod_auth_openidcを用いてApache HTTP ServerをRelying Partyにする
mod_auth_openidcは、Ping Identity社がオープンソースソフトウェアとしてGitHub上に公開している、Apache 2.x HTTP ServerをOpenID ConnectのRelying Partyとして動作させる事を可能にする認証モジュールです。
本モジュールを利用することで、指定したパスにあるコンテンツをOpenID Connectの認証により保護し、Reverse Proxy Serverとして、OpenID Provicerから発行されたID Tokenに含まれる認証情報や、Userinfoエンドポイントから取得したユーザの属性情報等をHTTPにヘッダに乗せ、後続のWebアプリケーションに連携することが可能になります。
したがって、既存のWebアプリケーションの前段に配置することで、ほぼ改修無くWebアプリケーションをRelying Partyとすることも可能となります。
インストール
Red Hat Enterprise Linux 7では、yum install mod_auth_openidc
コマンドを利用することで、mod_auth_openidcがインストールされます。
2018年5月現在では、上記コマンドを実行することでmod_auth_openidcのv1.8.8がインストールされます。本ドキュメントでは、上記コマンドでインストールしたv1.8.8ベースでの設定をご説明します。
※mod_auth_openidcのv1.8.8は、いくつかの脆弱性を持っています。Red Hatでは、攻撃の容易性や影響度から、対応無しとしていますが、本番環境で運用する場合はGitHub上から最新のバージョンをインストールする事が可能です。
設定
yumでmod_auth_openidcをインストールすると、/etc/httpd/conf.d/
以下にauth_openidc.conf
というファイルが配置されます。
こちらのファイルに設定可能な項目が記載されていますので、それらの設定項目の中で、設定が必要な項目について解説いたします。
当該ファイルはmod_auth_openidcリポジトリのWikiでも確認可能です。
Locationの設定
Relying Partyとして保護したいパスに対し、下記の設定を記述することで、認証済みと判定されたユーザのみがアクセス可能な状態にります。
<Location /example/path/>
# openid connect の認証が必要であることの指定
AuthType openid-connect
# 認証済みユーザであればアクセス可能
Require valid-user
</Location>
OpenID Providerの設定
OpenID Providerが、OpenID Connect Discoveryの定義通りにMetadataを公開している場合、MetadataURLの指定を行うことで、OpenID Providerに関する設定を取得できます。
MetadataURLが存在しない場合は、それぞれの項目を直接指定する必要があります。
MetadataURLの指定
MetadataURLを指定します。
OIDCProviderMetadataURL https://op.example.com/.well-known/openid-configuration
Issuerの指定
MetadataURLが存在設定できない場合には、Issuerの識別子を指定します。
OIDCProviderIssuer https://op.example.com
AuthorizationEndpointの指定
MetadataURLが存在設定できない場合には、認証エンドポイントを指定します。
OIDCProviderAuthorizationEndpoint https://op.example.com/authorize
TokenEndpointの指定
MetadataURLが存在設定できない場合には、トークンエンドポイントを指定します。
OIDCProviderTokenEndpoint https://op.example.com/token
UserinfoEndpointの指定
MetadataURLが存在設定できない場合には、ユーザインフォエンドポイントを指定します。
OIDCProviderUserInfoEndpoint https://op.example.com/userinfo
JWKS URIの指定
MetadataURLが存在設定できない場合には、署名検証用の公開鍵エンドポイントを指定します。
OIDCProviderJwksUri https://op.example.com/jwks
Clientの設定
mod_auth_openidcを使ってRelying Partyにしたいアプリケーションの値を登録します。
Clientの設定値には、OpenID Providerで登録されている値を入力します。
client_idの指定
Relying Partyに割り当てられたclient_idを指定します。
OIDCClientID ad98f17b-c61f-4a51-a9a9-0807f76b9fb4
client_secretの指定
Relying Partyに割り当てられたclient_secret指定します。
Implicit Flowを使う場合はclient_secretは不要ですが、当モジュールではこちらの設定が必須となっているので利用しない場合であっても値を設定する必要があります。
OIDCClientSecret 8a6bebbf-0ae6-42e2-9c69-5b78dde289b0
RedirectURIの指定
OpenID Providerで認証が完了した後に遷移するRelying PartyのURLを指定します。
Locationの設定で指定したパス配下を指定する必要があるので注意が必要です。
OIDCRedirectURI https://rp.example.com/example/path/callback
その他必要な設定
ここまでOpenID Provider及びRelying Partyの設定を行いましたが、両者間でやりとりを行うために必要な残りの設定を記載します。
署名アルゴリズムの指定
ID Tokenの署名に利用する署名アルゴリズムを指定します。
OIDCIDTokenSignedResponseAlg RS256
ResponseTypeの設定
ResponseTypeを指定します。
値はcode
, id_token
, token
の組み合わせで指定します。
OIDCResponseType code
Scopeの設定
Relying Partyが要求するScopeを指定します。
OpenID Connectを利用する場合はopenidが必須です。
OIDCScope openid profile
認証クッキーの暗号パスフレーズの設定
mod_auth_openidcでは、認証後にmod_auth_openidc_session
という名前のクッキーが発行され、セッションが管理されます。その際のセッション情報の暗号化パスフレーズを指定します。
OIDCCryptoPassphrase passphrase
サンプル設定
OIDCProviderMetadataURL https://op.example.com/.well-known/openid-configuration
OIDCClientID ad98f17b-c61f-4a51-a9a9-0807f76b9fb4
OIDCClientSecret 8a6bebbf-0ae6-42e2-9c69-5b78dde289b0
OIDCRedirectURI https://rp.example.com/example/path/cb
OIDCResponseType "code"
OIDCScope "openid"
OIDCCryptoPassphrase "passphrase"
<Location /example/path/>
AuthType openid-connect
Require valid-user
</Location>