1. 記事一覧 >
  2. ブログ記事
category logo

AD FS構成からmod_auth_openidcによるOpenID Connect認証成功まで全手順

(更新) (公開)

はじめに

Active Directory フェデレーション サービス(AD FS)、Apache、mod_auth_openidc、php を使って、SSO(シングルサインオン)の環境を作成しました。今回、その全手順を紹介していきます。
※AD インストール、ドメインコントローラーに昇格、AD FS インストールの部分は省略して、そこからスタートです。

他に分かりやすいサイトがありますので、OpenID Connect そのものの詳しい説明は有りません。


構成

構成は、以下です。
同じような構成の場合、さくっと作成できるはずというのが今回の趣旨になります。
ちょっとした違いで、どこかで引っかかるかもしれませんが、ご了承ください。

AD FS Apache mod_auth_openidc構成図

ユーザー
OS: Windows 10 PRO x64
IE
Chrome
Edge
Firefox


OpenID Provider
以下の呼び方の場合もあります。
OpenID プロバイダー
OP
Identity Provider
IdP


OS: Windows Server 2019 Datacenter Desktop
AD FS をインストールするサーバーです。
ルートドメイン名:ad.contoso.com
NetBIOS ドメイン名:AD
フェデレーション サービス名:fs.contoso.com


Relying Party
以下の呼び方の場合もあります。
RP
Service Provider
SP
Client
クライアント


OS: Raspberry Pi Desktop
Debian ベースの Linux です。
/etc/debian_version:10.7
Apache/2.4.38 (Debian)
mod_auth_openidc-2.3.10.2
PHP 7.3.31-1~deb10u1 (cli)
※php は、php である必要は無く、今回、認証が必要な Web アプリに見立てています。


FS 用 SSL 証明書作成

FS用SSL証明書作成 図

Windows Server 2019 での作業になります。


自己署名証明書を作成します。

セキュリティリスクはありますが、自己署名証明書でも問題無く機能します。

正式な証明書がある場合、この手順をスキップしてください。

PowerShell のコマンドレットで作成します。
fs.contoso.comは、任意で、後で設定する"フェデレーション サービス名"になります。

New-SelfSignedCertificate `
  -Type SSLServerAuthentication `
  -Subject "fs.contoso.com" `
  -DnsName "fs.contoso.com" `
  -KeyLength "4096" `
  -KeyExportPolicy Exportable `
  -NotAfter (Get-Date).AddYears(5)

certlm.mscを起動します。
certlm.mscを起動


個人 → 証明書 → 右クリック → すべてのタスク → エクスポート
をクリックします。
個人→証明書→右クリック→すべてのタスク→エクスポート


次へをクリックします。
個人→証明書→右クリック→すべてのタスク→エクスポート→次へ


「はい、秘密キーをエクスポートします(Y)」を選択して、次へをクリックします。
はい、秘密キーをエクスポートします


「Personal Information Exchange - PKCS #12 (.PFX)(P)」を選択して、次へをクリックします。(チェックボックスは画像のままで。)
Personal Information Exchange - PKCS


「グループまたはユーザー名 (推奨)(G)」にチェックを入れて、次へをクリックします。(AD\Administratorは自動で入りました。)
グループまたはユーザー名 (推奨)


保存ファイル名を入力して、次へをクリックします。
保存ファイル名を入力して、次へ


完了をクリックします。
保存ファイル名を入力して、次へ 完了


FS 構成

FS構成 図

Windows Server 2019 での作業になります。


サーバーマネージャーから「このサーバーにフェデレーション サービスを構成します。」をクリックします。
このサーバーにフェデレーション サービスを構成します。


「フェデレーション サーバー ファームに最初のフェデレーション サーバーを作成します」にチェックで、次へをクリックします。
フェデレーション サーバー ファームに最初のフェデレーション サーバーを作成します


次へをクリックします。
フェデレーション サーバー ファームに最初のフェデレーション サーバーを作成します 次へ


インポートボタンから先ほどのcert.pfxを選択します。(正式証明書がある場合は、正式証明書を選択します。)
インポートボタン1


インポートボタン2


フェデレーション サービス名は、証明書の Subject で自動入力されます。
フェデレーション サービスの表示名を入力します。(何でも良いですが、ログイン画面に表示されます。)
次へをクリックします。
フェデレーション サービス名


グループ管理サービスアカウントを選択し、アカウントパスワードを入力し、次へをクリックします。

グループ管理サービスアカウント(gMSA)とは、複数のサーバーで利用可能なサービスアカウントのことで、複数のサーバーで動かすサービスに共通のサービスアカウントを使いたいときに使用します。

グループ管理サービスアカウントを選択


「Windows Internal Database を使用してサーバーにデータベースを作成します。」にチェックで、次へをクリックします。

Windows Internal Database を使用してサーバーにデータベースを作成します


次へをクリックします。
Windows Internal Database を使用してサーバーにデータベースを作成します 次へ


構成をクリックします。
構成をクリック


閉じるをクリックします。※!は、警告で、エラーでは無いため、問題ありません。
構成をクリック 閉じるをクリック


ファイアウォール有効化

FS用SSL証明書作成 図

Windows Server 2019 での作業になります。


FS 関係のファイアウォールを有効にします。


プログラム →Windows 管理ツール → セキュリティが強化された Windows Defender ファイアウォールを起動します。
プログラム→Windows 管理ツール→セキュリティが強化された Windows Defender ファイアウォールを起動


AD FS ・・・の3つを有効にします。(選択して「規則の有効化」クリック)
規則の有効化


Apache2 インストール

Apache2インストール 図

Linux での作業になります。


フェデレーション サービス名=fs.contoso.com
が名前解決できない場合、hosts に登録します。

このフェーズでは、一旦https://IPアドレス/info.phpの動作が確認できるところまでで、必要最低限の事しかしません。


AD FS と通信できるか確認します。
以下のようにいろいろ返ってきたら、問題無いです。

# curl -k https://fs.contoso.com/adfs/fs/federationserverservice.asmx
<?xml version="1.0" encoding="utf-8"?><wsdl:definitions name="ADFS1TrustInformationService" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:i0="http://schemas.microsoft.com/ActiveDirectory/FederationService/2005/07/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"><wsp:Policy wsu:Id="BasicHttpBinding_ITrustInformationContract_policy"><wsp:ExactlyOne><wsp:All><sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"><wsp:Policy><sp:TransportToken><wsp:Policy><sp:HttpsToken RequireClientCertificate="false"/></wsp:Policy></sp:TransportToken><sp:AlgorithmSuite><wsp:Policy><sp:Basic256/></wsp:Policy></sp:AlgorithmSuite><sp:Layout><wsp:Policy><sp:Strict/></wsp:Policy></sp:Layout></wsp:Policy></sp:TransportBinding></wsp:All></wsp:ExactlyOne></wsp:Policy><wsdl:import namespace="http://schemas.microsoft.com/ActiveDirectory/FederationService/2005/07/" location="https://fs.contoso.com/adfs/fs/federationserverservice.asmx?wsdl=wsdl0"/><wsdl:types/><wsdl:binding name="BasicHttpBinding_ITrustInformationContract" type="i0:ITrustInformationContract"><wsp:PolicyReference URI="#BasicHttpBinding_ITrustInformationContract_policy"/><soap:binding transport="http://schemas.xmlsoap.org/soap/http"/></wsdl:binding><wsdl:service name="ADFS1TrustInformationService"><wsdl:port name="BasicHttpBinding_ITrustInformationContract" binding="tns:BasicHttpBinding_ITrustInformationContract"><soap:address location="https://fs.contoso.com/adfs/fs/federationserverservice.asmx"/></wsdl:port></wsdl:service></wsdl:definitions>

Apache2 をインストールして、mod_auth_openidc を組み込みます。

# apt -y update
# apt -y install apache2
# apt -y install libapache2-mod-auth-openidc
# a2enmod auth_openidc
# a2enmod ssl
# a2ensite default-ssl

Apache2 用自己署名証明書を作成します。
Country Name などの入力内容は適当で構いません。

キーが1024bitなどと短すぎると、以下のエラーになるかもしれません。今回2048bitで作成しています。

AH02562: Failed to configure certificate adfstest.itccorporation.jp:443:0 (with chain), check /etc/ssl/certs/server.crt

SSL Library Error: error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small

# openssl genrsa -aes128 2048 > server.key
Generating RSA private key, 2048 bit long modulus (2 primes)
............................................+++++
.....................................+++++
e is 65537 (0x010001)
Enter pass phrase:
Verifying - Enter pass phrase:

# openssl req -new -key server.key > server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Aichi
Locality Name (eg, city) []:Toyota
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ITC
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:adfstest.itccorporation.jp
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt
Signature ok
subject=C = JP, ST = Aichi, L = Toyota, O = ITC, CN = adfstest.itccorporation.jp
Getting Private key
Enter pass phrase for server.key:

# openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:
writing RSA key
# cp -p server.crt /etc/ssl/certs/server.crt
# cp -p server.key /etc/ssl/private/server.key
# chmod 400 /etc/ssl/private/server.key
# vi /etc/apache2/sites-available/default-ssl.conf
    SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
を以下に変更
    SSLCertificateFile      /etc/ssl/certs/server.crt
    SSLCertificateKeyFile /etc/ssl/private/server.key
# apt -y install php-common libapache2-mod-php php-cli
# systemctl restart apache2
# vi /var/www/html/info.php
<?php
  phpinfo();

https://192.168.11.9/info.phpへアクセスします。
info.phpへアクセス

phpinfo が表示されて、mod_auth_openidc が組み込まれていることを確認できたら、準備完了です。
現時点では、まだ mod_auth_openidc は使われていません。


AD FS の管理

AD FSの管理 図

Windows Server 2019 での作業になります。


サーバーマネージャーから
ツール →AD FS の管理
をクリックします。
ツール→AD FS の管理


アプリケーション グループを右クリックして、アプリケーショングループの追加をクリックします。
アプリケーション グループを右クリックして、アプリケーショングループの追加をクリック


「サーバー アプリケーション」を選択して、名前、説明を適当に入力し、次へをクリックします。
「サーバー アプリケーション」を選択


リダイレクト URL を https://192.168.11.9/redirect_uri とし、次へをクリックします。
クライアント識別子(クライアント ID)は、後で必要になるため、コピーしておきます。
リダイレクト URI は、Web アプリ側で意味のない(使わない)URI を適当に設定します。これも後で必要になります。
リダイレクトURL クライアント識別子


「共有シークレットを生成する」にチェックを入れて、次へをクリックします。
共有シークレットは、後で必要になるため、コピーしておきます。
共有シークレットを生成する


次へをクリックします。
共有シークレットを生成する 次へ


閉じるをクリックします。
共有シークレットを生成する 次へ 閉じる


mod_auth_openidc の設定

mod_auth_openidcの設定

Linux での作業になります。


まず、AD FS の設定がうまくいっているか確認してみます。

# curl -k https://fs.contoso.com/adfs/.well-known/openid-configuration
{"issuer":"https:\/\/fs.contoso.com\/adfs","authorization_endpoint":"https:\/\/fs.contoso.com\/adfs\/oauth2\/authorize\/","token_endpoint":"https:\/\/fs.contoso.com\/adfs\/oauth2\/token\/","jwks_uri":"https:\/\/fs.contoso.com\/adfs\/discovery\/keys","token_endpoint_auth_methods_supported":["client_secret_post","client_secret_basic","private_key_jwt","windows_client_authentication"],"response_types_supported":["code","id_token","code id_token","id_token token","code token","code id_token token"],"response_modes_supported":["query","fragment","form_post"],"grant_types_supported":["authorization_code","refresh_token","client_credentials","urn:ietf:params:oauth:grant-type:jwt-bearer","implicit","password","srv_challenge","urn:ietf:params:oauth:grant-type:device_code","device_code"],"subject_types_supported":["pairwise"],"scopes_supported":["aza","openid","vpn_cert","winhello_cert","email","logon_cert","profile","allatclaims","user_impersonation"],"id_token_signing_alg_values_supported":["RS256"],"token_endpoint_auth_signing_alg_values_supported":["RS256"],"access_token_issuer":"http:\/\/fs.contoso.com\/adfs\/services\/trust","claims_supported":["aud","iss","iat","exp","auth_time","nonce","at_hash","c_hash","sub","upn","unique_name","pwd_url","pwd_exp","mfa_auth_time","sid","nbf"],"microsoft_multi_refresh_token":true,"userinfo_endpoint":"https:\/\/fs.contoso.com\/adfs\/userinfo","capabilities":[],"end_session_endpoint":"https:\/\/fs.contoso.com\/adfs\/oauth2\/logout","as_access_token_token_binding_supported":true,"as_refresh_token_token_binding_supported":true,"resource_access_token_token_binding_supported":true,"op_id_token_token_binding_supported":true,"rp_id_token_token_binding_supported":true,"frontchannel_logout_supported":true,"frontchannel_logout_session_supported":true,"device_authorization_endpoint":"https:\/\/fs.contoso.com\/adfs\/oauth2\/devicecode"}r


このようにissuerauthorization_endpointが載っている json が返ってきたら正常です。
応答内容は、必要なすべてのエンドポイントと公開鍵の場所情報を含む、OpenID プロバイダーの構成に関する一連のクレーム(claim)です。クレーム(claim)とは、OpenID プロバイダー(ここでは、AD FS)から得られる json の情報群、データの事です。


mod_auth_openidc の設定を追加します。

# vi /etc/apache2/mods-available/auth_openidc.conf

全部コメントアウトされていると思いますので、以下の設定を末尾等に設定します。

OIDCRedirectURI https://192.168.11.9/redirect_uri
OIDCCryptoPassphrase password
OIDCProviderMetadataURL https://fs.contoso.com/adfs/.well-known/openid-configuration
OIDCScope openid
OIDCSSLValidateServer Off
OIDCResponseType code
OIDCClientID c442e5d3-1e52-4365-9c8d-9488eed9da74
OIDCClientSecret esjIM3pAYmhrcwM7-cAo_Zp5MRHej5h2NainQ2XV
OIDCPKCEMethod S256
OIDCOAuthSSLValidateServer Off
OIDCSessionInactivityTimeout 300
OIDCHTMLErrorTemplate /etc/apache2/auth_openidc_error.html
OIDCDefaultLoggedOutURL https://192.168.11.9/loggedout.html
OIDCClaimPrefix OIDC_CLAIM_
OIDCRemoteUserClaim sub
OIDCPassClaimsAs both
OIDCAuthNHeader X-Remote-User

フェデレーション サービス名:fs.contoso.com

クライアント識別子:c442e5d3-1e52-4365-9c8d-9488eed9da74

リダイレクトURI:https://192.168.11.9/redirect_uri

シークレット:esjIM3pAYmhrcwM7-cAo_Zp5MRHej5h2NainQ2XV

で設定しています。適宜読み替えが必要です。


以下、設定の意味です。


OIDCRedirectURI https://192.168.11.9/redirect_uri
mod_auth_openidc で保護されているサーバー上のパスのみを指している必要があります。
ただし、提供する必要のある実際のコンテンツを指してはいけません。
ログイン成功後最初にリダイレクトされる URI です。この URI にリダイレクトされた後、元々アクセスしようとしていた URI にリダイレクトされます。


例:
https://192.168.11.9/info.php へアクセス

ログイン画面 でログイン(ログイン成功)

https://192.168.11.9/redirect_uri へリダイレクト

https://192.168.11.9/info.php へリダイレクト


必要に応じて、/protected/redirect_uriなどの相対 URL を使用できます。


OIDCCryptoPassphrase password
任意の値を設定します。
暗号化の目的でパスワードを設定します。これは次の目的で使用されます。
・(一時的な)状態 Cookie の暗号化
・セッション Cookie を含む可能性のあるキャッシュエントリの暗号化。
サーバーが同じ OIDCCryptoPassphrase を使用している場合、暗号化されたキャッシュをサーバー間で共有できます。
値が exec で始まる場合:結果のコマンドが実行され、
プログラムによって標準出力に戻された最初の行がパスワードとして使用されます。
コマンドは、絶対コマンドでも、Web サーバールートからの相対コマンドでもかまいません。
ロードバランサーで振り分けられているような場合、お互いに Cookie を読み取れるように、すべて同じ値である必要があります。


OIDCProviderMetadataURL https://fs.contoso.com/adfs/.well-known/openid-configuration
OpenID Connect Provider メタデータの URI を指定します。
この URI からエンドポイント、サポートしているタイプやアルゴリズムなどを取得します。


OIDCScope openid
アプリケーションがどこまでの情報(アクセストークン)を要求するかの設定です。


スコープとclaimの例:
openid: sub, iss, aud, exp, iat, and at_hash
profile: name, family_name, given_name, middle_name, nickname, picture, and updated_at
email: email, email_verified


IDトークンサンプル:

{
  "iss": "http://my-domain.auth0.com",
  "sub": "auth0|123456",
  "aud": "my_client_id",
  "exp": 1311281970,
  "iat": 1311280970,
  "name": "Jane Doe",
  "given_name": "Jane",
  "family_name": "Doe",
  "gender": "female",
  "birthdate": "0000-10-31",
  "email": "janedoe@example.com",
  "picture": "http://example.com/janedoe/me.jpg"
}

複数指定の場合、ダブルクォートでくくって、スペース区切りで設定します。
例:"openid profile email"
この設定が無い場合のデフォルトは、openidです。

AD FSの場合、profile emailを追加しても何も変わらないようです。(AD FS設定で変わるかどうかは未検証です。)


OIDCSSLValidateServer Off
OP(OpenID Provider)の証明書を検証するかどうかの設定です。
OP(OpenID Provider)つまり、今回の場合、AD FS に自己署名証明書を設定したため、Offにして証明書の検証を行いません。
デフォルトは、Onです。


OIDCResponseType code
レスポンスタイプ(response_type)を指定します。
フローは以下の種類があります。(詳しいことは省略します。)
code : Authorization Code Flow
id_token : Implicit Flow
id_token token : Implicit Flow
code id_token : Hybrid Flow
code token : Hybrid Flow
code id_token token : Hybrid Flow
デフォルトは、codeです。


OIDCClientID c442e5d3-1e52-4365-9c8d-9488eed9da74
クライアント ID(client-id)を指定します。
(AD FS の画面に表示されていたクライアント識別子です。)


OIDCClientSecret esjIM3pAYmhrcwM7-cAo_Zp5MRHej5h2NainQ2XV
secret を指定します。
(AD FS の画面に表示されていたシークレットです。)


OIDCPKCEMethod S256
PKCE メソッドを設定します。
S256の場合は、SHA-256 です。
PKCE は、Proof Key for Code Exchange の略で、呼び方はピクシーと呼びます。RFC 7636 として公開されています。
PKCE は認可コードの横取り攻撃の対策として定義されています。


PKCEについて詳しい説明は省略しますが、ここのサイトが分かりやすかったです。

Auth0を利用してOAuth 2.0のPKCEを理解する

https://dev.classmethod.jp/articles/oauth-2-0-pkce-by-auth0/

設定されていない場合、PKCE は使用されません。(認可コードの横取り攻撃の対策無しになります。)


OIDCOAuthSSLValidateServer Off
RP(Relying Party)の証明書を検証するかどうかの設定です。
RP(Relying Party)つまり、今回の場合、https://192.168.11.9/に自己署名証明書を設定したため、Offにして証明書の検証を行いません。

・・・と思いましたが、OIDCOAuth*の設定、つまり、OAuth2.0の設定があるときに関係するようです。今回必要の無い設定です。

デフォルトは、Onです。


OIDCSessionInactivityTimeout 300
無操作の時にセッションが無効になるまでの秒を設定します。
デフォルトは 300 秒です。


OIDCHTMLErrorTemplate /etc/apache2/auth_openidc_error.html
エラー発生時に表示される HTML のパスを指定します。
以下が HTML の例ですが、1 つ目の%s にはエラーメッセージが、2 つ目の%s にはエラーの説明が埋め込まれます。

<html>
<head>
<meta charset="utf-8"/>
<title>OIDCHTMLErrorTemplate</title>
</head>
<h1>OpenID connect Error</h1>
<p>Error: %s</p>
<p>Description: %s</p>
<p><a href="/">Home</a></p>
</body>
</html>

設定されていない場合、内部テンプレートが使用されます。


OIDCDefaultLoggedOutURL https://192.168.11.9/loggedout.html
ログアウト後に遷移する URI を指定します。
以下が HTML の例です。

<html>
  <head>
    <meta charset="utf-8" />
    <title>Logged Out</title>
  </head>
  <body>
    <h1>You have been logged out.</h1>
    <p><a href="/">Return to login</a></p>
  </body>
</html>

設定されていない場合、内部ページが表示されます。


OIDCClaimPrefix OIDC_CLAIM_
claim を環境変数や HTTP ヘッダーフィールドにする際に付与するプレフィックスを指定します。
OIDC_CLAIM_を設定し、phpinfo で見た例です。(Apache Environment)

OIDC_CLAIM_を設定し、phpinfoで見た例

デフォルトは、OIDC_CLAIM_です。


OIDCRemoteUserClaim sub
apache の認証されたユーザー ID を示す変数 REMOTE_USER として設定する claim の名前を指定します。
デフォルトは、subです。


subを設定し、phpinfo で見た例です。(Apache Environment)

subを設定し、phpinfoで見た例


正規表現で切り出すこともできます。
この例では、email から@の左側の文字列を取り出してユーザー ID とします。
OIDCRemoteUserClaim email ^(.*)@


この例では、email から DOMAIN\userid としています。
OIDCRemoteUserClaim email ^(.*)@([^.]+)\..+$ $2\\$1

(2021年11月25日時点情報)mod_auth_openidc公式の説明文に書いてある例ですが、よく見ると正規表現が間違っていて、以下のエラーになりました。

oidc_util_json_string_print: oidc_util_check_json_error: response contained an "error" entry with value: ""invalid_grant""

oidc_util_json_string_print: oidc_util_check_json_error: response contained an "error_description" entry with value: ""MSIS9612: The authorization code received in 'code' parameter is invalid. ""

oidc_proto_resolve_code_and_validate_response: failed to resolve the code

正:OIDCRemoteUserClaim email ^(.*)@([^\.]+)\..+$ $2\\$1


OIDCPassClaimsAs both
アクセストークンの claim をアプリケーションにどのような形で渡すかを指定します。
none:渡さない。
environment:環境変数
headers:HTTP ヘッダ
both:環境変数&HTTP ヘッダ


bothを設定し、phpinfo で見た例です。(Apache Environment と HTTP Headers Information) ↓
bothを設定し、phpinfoで見た例 environment


bothを設定し、phpinfoで見た例 headers


バージョン 2.4.6 から
base64url
も使えるようです。


デフォルトは、bothです。


リフレッシュトークンが有効な場合、OIDC_refresh_token で渡されます。

リフレッシュトークンは、アクセストークンが無効または期限切れになったときに再認証無しで新規アクセストークンを取得するため、発行されるトークンです。


OIDCAuthNHeader X-Remote-User
認証されたユーザーの名前で設定する HTTP ヘッダー変数名を指定します。つまり、REMOTE_USER で設定され、OIDCRemoteUserClaim または OIDCOAuthRemoteUserClaim で構成されたものをコピーします。
設定されていない場合、ヘッダーは追加されません。


X-Remote-Userを設定し、phpinfo で見た例です。(HTTP Headers Information)

X-Remote-Userを設定し、phpinfoで見た例 headers


mod_auth_openidc 設定に対応する HTML を配置します。

# vi /var/www/html/loggedout.html
<html>
  <head>
    <meta charset="utf-8" />
    <title>OIDCDefaultLoggedOutURL</title>
  </head>
  <body>
    <h1>You have been logged out.</h1>
    <p><a href="/">Return to login</a></p>
  </body>
</html>
# vi /etc/apache2/auth_openidc_error.html
<html>
<head>
<meta charset="utf-8"/>
<title>OIDCHTMLErrorTemplate</title>
</head>
<h1>OpenID connect Error</h1>
<p>Error: %s</p>
<p>Description: %s</p>
<p><a href="/">Home</a></p>
</body>
</html>

ドキュメントルート(/var/www/html)全体に対して、認証を有効にし、/var/www/html/loggedout.htmlだけ認証不要にします。

# vi /etc/apache2/apache2.conf
#<Directory /var/www/>
#        Options Indexes FollowSymLinks
#        AllowOverride None
#        Require all granted
#</Directory>

<Location />
    AuthType openid-connect
    Require valid-user
</Location>

<Location /loggedout.html>
    Require all granted
</Location>
# systemctl restart apache2

この時点で、https://192.168.11.9/info.phpにアクセスして、
以下のように認証画面が表示されて、AD(Active Directory)のユーザーでログイン出来たら成功です。
※fs.contoso.com のログイン画面へリダイレクトされます。fs.contoso.com の名前解決ができない場合、hosts 登録が必要です。

fs.contoso.comのログイン画面


Windows 統合認証(IWA/WIA)

AD FS で Windows 統合認証 (IWA/WIA) を使用するようにブラウザーを構成します。
どういうことかと言うと、以下の流れになるということです。


Windows に ad\administrator でログイン

ブラウザを開いて、https://192.168.11.9/info.phpへアクセス

認証画面が表示されず、https://192.168.11.9/info.phpへ ad\administrator でログイン完了


PC端末での作業 IE 図

PC端末での作業になります。


●IE の場合
インターネットオプション →「統合 Windows 認証を使用する」にチェックします。
インターネットオプション→「統合 Windows 認証を使用する」にチェック


ローカル イントラネットに
https://192.168.11.9
https://fs.contoso.com
を登録します。
ローカル イントラネット 登録

「イントラネットのネットワークを自動的に検出する」のチェック無しで「詳細設定」とします。


セキュリティ設定の「イントラネット ゾーンでのみ自動的にログオンする」にチェックを入れ OK ボタンをクリックします。
「イントラネット ゾーンでのみ自動的にログオンする」にチェックを入れOKボタンをクリック


一旦、IE を閉じて、https://192.168.11.9/info.phpへアクセスして、ユーザー名、パスワード入力無しでアクセス出来たら成功です。


信頼済みサイトに登録する以下の方法でもできます。
信頼済みサイトに
https://192.168.11.9
https://fs.contoso.com
を登録します。
信頼済みサイト 登録


セキュリティ設定の「現在のユーザー名とパスワードで自動ログオンする」にチェックを入れ OK ボタンをクリックします。
セキュリティ設定の「現在のユーザー名とパスワードで自動ログオンする」にチェックを入れOKボタンをクリック


●Chrome、Chromium 版 Edge の場合 IE の対応に加えて、AD FS の方の対応が必要になります。


PC端末での作業 IE 図

Windows Server 2019 での作業になります。


この作業が必要な理由ですが、Chrome、Chromium 版 Edge が AD FS に Windows 統合認証(IWA/WIA)対象ブラウザとして、登録されていないからです。
PowerShell で以下のように確認できます。

> Get-AdfsProperties | select -ExpandProperty WiaSupportedUserAgents
MSAuthHost/1.0/In-Domain
MSIE 6.0
MSIE 7.0
MSIE 8.0
MSIE 9.0
MSIE 10.0
Trident/7.0
MSIPC
Windows Rights Management Client
MS_WorkFoldersClient
=~Windows\s*NT.*Edge

Chrome、Chromium 版 Edge、加えて Firefox の User-Agent 文字列には、Mozilla/5.0が含まれているため、PowerShell で以下のように、Set-AdfsPropertiesコマンドレットで登録します。

> Set-AdfsProperties -WIASupportedUserAgents ((Get-ADFSProperties | Select -ExpandProperty WIASupportedUserAgents) + "Mozilla/5.0")

AD FS の再起動は必要ありません。ブラウザを閉じてアクセスすると、以下のように認証画面が出ずにアクセスできるはずです。
Windows統合認証 Edge


●Firefox の場合

PC端末での作業 IE 図

PC端末での作業になります。


IE、Chrome の対応に加えて、about:configの設定が必要になります。

URL 欄にabout:configを入力して、「危険性を承知の上で使用する」をクリックします。
URL 欄にabout:configを入力して、「危険性を承知の上で使用する」をクリック


検索欄にnetwork*auth.trustを入力し、表示された
network.automatic-ntlm-auth.trusted-uris
network.negotiate-auth.trusted-uris
設定両方に、fs.contoso.comを設定します。 network.negotiate-auth.trusted-uris network.automatic-ntlm-auth.trusted-uris


Windows統合認証 Firefox


ヨシ!

loading...