12:03カテゴリ:技術こんにちは、滝澤です。Partyにするmod_auth_openidcというモジュールを使ってみる機会がありましたので、本記事で情報共有します。記事が長くなったので本編と設定例である3編に分けました。ADと略す)を利用する場合の設定例を紹介します。設定例ウェブサイトURIまず、ウェブサイトURIとリダイレクトURIを決めます。ウェブサイトURIには、利用するウェブサイトのURIを指定します。このとき、パス名を付けない形式にしてください。リダイレクトURIには、リダイレクトURI(redirect_uri)として使用されるURIを指定します。コンテンツが存在するURIに被らないものにしてください。このリダイレクトURI経由でリクエストのやりとりが行われます。次のヘルプのページに従って、アプリケーションの登録とクライアントIDとクライアントシークレットを取得してください。(Google)このとき、以下のような値を指定します。次のヘルプのページに従って、アプリケーションの登録を行います。(Microsoft)このとき、以下のような値を指定します。ID」がクライアントIDになります。「APIアクセス」の「キー」をクリックすると、「キー」のブレードが表示されるので、ここで「説明」と「有効期限」を入力して保存すると値が表示されます。これがクライアントシークレットになります。編集して、各ディレクティブを設定します。以降、ディレクティブ毎に説明します。デフォルト値で特に問題ないと思われるものについては説明はしません。OIDCRedirectURIリダイレクトURI(request_uri)として指定した値を記述します。https://example.com/redirect_uriOIDCCryptoPassphrasecookieやキャッシュエントリーなどの暗号化に利用するパスフレーズの文字列を指定します。XXXXXXXXXXXXXXXXXXXXXXXXOIDCMetadataDirOIDCMetadataDirにメタデータ用のディレクトリを指定します。このディレクトリはapacheの実行権限でファイルの読み書きができる必要があります。/var/cache/httpd/mod_auth_openidc/metadataOIDCProviderMetadataURLOIDCProviderMetadataURLの指定があったら、コメントアウトして無効にします。OIDCAuthRequestParamsOP毎に異なることがあるので、コメントアウトされていなければコメントアウトしてください。OIDCSessionInactivityTimeout無操作タイムアウトの秒数を指定します。デフォルトは300秒です。300OIDCCacheTypeキャッシュのストレージのタイプを指定します。本記事の動作確認ではRedisを使うので、"redis"を指定します。redisさらに、関連するディレクティブの設定も行ってください。redisを指定した場合は下記のようにOIDCRedisCacheServerとOIDCRedisCachePasswordの指定も行う必要があります。8dTjsdkngM4Y2okg3XjYgWRXOIDCHTMLErrorTemplateエラーページのテンプレートファイルのパスを指定します。/etc/httpd/conf.d/auth_openidc.error.html上記の設定を行った場合は、ファイル"/etc/httpd/conf.d/auth_openidc.error.html"に次のような内容の記述を行ってください。1つ目の%sにはエラーメッセージが、2つ目の%sにはエラーの説明が埋め込まれます。href="/">Home</a></p></body></html>OIDCDefaultLoggedOutURLログアウト後に遷移するURIを指定します。https://example.com/loggedout.html上記のように設定した場合は、次のよう内容のファイルloggedout.htmlをドキュメントルートに配置します。ログインできるようにトップページへにリンクを用意します。href="/">Login</a></p></body></html>OIDCClaimPrefixclaimを環境変数やHTTPヘッダーフィールドにする際に付与するプレフィックスを指定します。OIDC_CLAIM_例えば、claimの一つ"name"は環境変数あるいはHTTPヘッダーフィールドの名前としては"OIDC_CLAIM_name"になります。リバースプロキシーとして動かしている場合は、バックエンド側ウェブサーバー側でHTTPヘッダーを環境変数に変換する際の"-"と"_"の曖昧性を排除するために、次のように"_"を使わないようにした方がよいと思われます。OIDC-CLAIM-OIDCRemoteUserClaimapacheの認証されたユーザーIDを示す変数REMOTE_USERとして設定するclaimの名前を指定します。デフォルトでは「sub@iss」の形式になります。subはエンドユーザーの識別子で、issはIssuerから"https://"を除いたものになります。複数のOPで共通で利用でき、ユーザーを識別可能なclaimを指定してください。emailが使えれば次のようにしてもよいでしょう。email共通で利用できるclaimがなければ、コメントアウトしてデフォルトの形式(sub@issの形式)に任せてもよいと思います。given_nameくらいしかなく、ユーザーを識別可能なものはsubかnameしかありません。同姓同名が存在しなければnameは使えますが、そうでなければコメントアウトしてデフォルトの形式にしてもよいでしょう。OIDCPassClaimsAsclaimをアプリケーション環境にどのようにして渡すかを指定します。bothOIDCAuthNHeaderリバースプロキシーとして動かしている場合は、REMOTE_USERの情報をバックエンドに送信するHTTPヘッダーに追加するヘッダーフィールド名を指定します。X-Remote-UserOP毎のメタデータと設定ファイルの配置OIDCMetadataDirディレクティブで指定したディレクトリ(先の例では"/var/cache/httpd/modauthopenidc/metadata")に、OP毎に次のようなファイル名の3つのファイルを用意します。(設定)ここで、ISSUERはissuerの値から「https://」と最後の「/」を取り除いた文字列をURLエンコードしたものになります。issuerはメタデータURIから取得できるので、次のように取得して、「https://」と最後の「/」を取り除きます。's|^"||;s|"$||;s|https://||;s|/$||'sts.windows.net/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX※{tenant}をテナント名に置き換えてください。次に、この文字列をURLエンコードします。@urists.windows.net%2FXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXこれにより、3つのファイル名が次のように確定します。ADの場合:sts.windows.net%2FXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.providersts.windows.net%2FXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.clientsts.windows.net%2FXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.confISSUER.providerファイル次のようにメタデータURIのファイルを取得してそのまま保存します。保存後にapacheのユーザー権限で書き込みできるようにパーミッションを変更してください。/var/cache/httpd/mod_auth_openidc/metadata/sts.windows.net%2FXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.provider※{tenant}をテナント名に置き換えてください。ファイル名も先に決まったものに置き換えてください。ISSUER.clientファイル次のようにクライアントIDとクライアントシークレットをJSONで記述します。"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}ISSUER.confファイルOP毎の設定をJSONで記述します。共通の設定と異なるものがあれば、ここに記述することになります。上書きできる設定は次のページを参考にしてください。動作確認として取得した変数を表示するために、次の内容のSSIを使ったページindex.shtmlをドキュメントルートに配置してみます。REMOTE_USERはユーザーIDに、OIDC_CLAIM_nameはユーザーのフルネームに置き換わります。明示的にログアウトできるように、ログアウトするパス「/redirect_uri?session=logout」へのリンクを用意します。href="/redirect_uri?session=logout">Logout</a></p></body></html>apacheの設定apacheの設定は以下のようになります。Connectによる認証・認可を要求する。claimのhdがexample.comである場合のみ認可する。claimのissが下記の値(https://sts.windows.net/〜)の場合のみ認可する。issuerはテナント毎にユニークであるため、組織内のユーザーに制限できる。動作確認のためのSSI用の設定を行う。ログアウト後に遷移するページでは認証されていないユーザーにもアクセスを許可する。設定が完了したら、設定を反映するために、apacheを再起動してみましょう。httpd.service実際にアクセスしてみて何か問題があれば、エラーログに出力されるので確認しましょう。ADの両方用の設定を行った場合は、動作確認用のページにアクセスすると次のようなOPを選択する画面が表示されます。ここで、それぞれのOPのリンクをクリックすると、それぞれのOPで認証・認可が行われます。ログインが完了すると次のようなページが表示されます。氏名とユーザーIDが表示されていれば成功です。この例のユーザーIDについて、OIDCRemoteUserClaimディレクティブの設定をコメントアウトしてデフォルトの「sub@iss」の形式にした場合はこのようになります。株式会社ハートビーツの技術情報やイベント情報などをお届けする公式ブログです。こちら「みんな仲良く」「プライドを持って」「変化を楽しむ」という企業理念に共感していただけるエンジニアを募集しています。