OpenID Foundation Japan

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>