こんにちは、新卒2年目になりました、伊藤です。
昨年は、Azure Static Web AppsでGoogle認証機能を持つアプリケーションを作成する方法を紹介しました。
https://tech-lab.sios.jp/archives/43562
今回は、既存のインフラでも利用されることの多いApache HTTP Webサーバを使い、Googleアカウントで認証できるWebサーバを構築する手順をご紹介します。
設定には、ApacheのOpenID Connect (OIDC)モジュールであるmod_auth_openidc
を使用します。
Googleの認証プロバイダの設定
Google認証プロバイダの設定は、基本的に以前の記事(https://tech-lab.sios.jp/archives/43562)にある『Googleの認証プロバイダを設定する』セクションの手順に従ってください。
OAuth同意画面の設定項目は次の通りです。
アプリ名 | oidctest |
ユーザーサポートメール、デベロッパーの連絡先情報 | 設定者のメールアドレス |
アプリケーションのホームページ | https://<ドメイン名> |
承認済みドメイン | <ドメイン名> |
スコープ | openid, userinfo.email, userinfo.profile |
認証情報の設定項目は次の通りです。
アプリケーションの種類 | ウェブアプリケーション |
名前 | oidctest |
承認済みのJavascript生成元 | https://<ドメイン名> |
承認済みのリダイレクト URI | https://<ドメイン名>/callback |
OAuthクライアントを作成すると、クライアントIDとクライアントシークレットが発行されます。これらは後のApache設定で不可欠ですので、必ず安全な場所に控えておいてください。
Apache HTTP Webサーバの構築
使用環境
構築時に利用した環境は以下です。
- Rocky Linux 9.2
また、OIDC認証ではHTTPS通信が前提となるため、クライアントPCからWebサーバへHTTPSでアクセスできるように設定しておいてください。
パッケージインストール
以下のパッケージをインストールします。
- Apache HTTP
- Apache HTTP SSLモジュール
- Apache HTTP OpenID Connectモジュール
Apache HTTPのインストール
Apache HTTPをインストールし、バージョンを確認します。
$ sudo dnf -y install httpd
$ httpd -v
Server version: Apache/2.4.62 (Rocky Linux)
Server built: Jan 10 2025 00:00:00
Apache HTTP SSLモジュールのインストール
Apache HTTP SSLモジュールをインストールし、バージョンを確認します。
$ sudo dnf -y install mod_ssl
$ rpm -aq | grep mod_ssl
mod_ssl-2.4.62-1.el9_5.2.x86_64
Apache HTTP OpenID Connectモジュールのインストール
Apache HTTP OpenID Connectモジュールをインストールし、バージョンを確認します。
$ sudo dnf -y install mod_auth_openidc
$ rpm -aq | grep mod_auth_openidc
mod_auth_openidc-2.4.10-1.el9.x86_64
自己署名証明書の作成
今回は検証目的のため、自己署名証明書を作成してHTTPS通信を有効にします。作成手順は以前の記事(https://tech-lab.sios.jp/archives/44751)の『自己署名証明書の作成』セクションを参照してください。
Apache HTTPの設定
Googleアカウントの設定
Google IdP (Identity Provider) の情報を設定します。auth_openidc_google.conf
ファイルを作成します。
$ sudo vim /etc/httpd/conf/auth_openidc_google.conf
OIDCProviderMetadataURL https://accounts.google.com/.well-known/openid-configuration
OIDCScope "openid email profile"
OIDCResponseType "code"
OIDCProviderMetadataURL
では、メタデータの取得先を設定します。Googleに関する設定項目を自動的に取得できます。OIDCScope
では、OAuth 同意画面で設定したスコープを設定します。OIDCResponseType
では、認証フローを設定します。Webアプリケーションでは一般的にcode
(Authorization Code Flow)です。
クライアント ID およびクライアントシークレットの設定
OAuthクライアントの作成時に取得したクライアントIDとクライアントシークレットを設定します。auth_openidc_client_secret_google.conf
ファイルを作成します。
機密情報を含むため、Apache実行ユーザ(通常apache)以外は読み取れないように権限を設定します。
$ sudo vim /etc/httpd/conf/auth_openidc_client_secret_google.conf
OIDCClientID xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com
OIDCClientSecret XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
$ sudo chown apache:apache /etc/httpd/conf/auth_openidc_client_secret_google.conf
$ sudo chmod 600 /etc/httpd/conf/auth_openidc_client_secret_google.conf
Webサーバの設定
Apache HTTPを設定します。Apacheの基本的なセキュリティ設定(ディレクトリ一覧表示の禁止、不要なデフォルトページの無効化など)や、SSL/TLSの基本的な設定、HTTPからHTTPSへのリダイレクト設定については、以前の記事(https://tech-lab.sios.jp/archives/44751)の『Apache HTTPの設定』セクションも参考にしてください。
OIDCの設定のうち、OIDCRedirectURI
は、認証プロバイダで設定した承認済みのリダイレクト URIと完全に一致させる必要があります。OIDCCryptoPassphrase
は、mod_auth_openidc
がセッション情報などを暗号化する際に使用するパスフレーズです。任意の十分な長さを持つ秘密の文字列を設定してください。OIDCSSLValidateServer
は、自己署名証明書を使用している場合やテスト環境ではOffにしますが、本番環境ではセキュリティ上の理由からOn(デフォルト)とし、必要に応じて証明書検証の設定を適切に行ってください。
$ sudo vim /etc/httpd/conf/httpd.conf
Listen 80
Listen 443
…<省略>…
ServerName <ドメイン名>:443
…<省略>…
Options FollowSymLinks # Indexesを削除してディレクトリ一覧表示を禁止する
…<省略>…
$ sudo vim /etc/httpd/conf.d/ssl.conf
#Listen 443
…<省略>…
# SSL設定
SSLCertificateKeyFile /etc/pki/tls/private/server.key
SSLCertificateFile /etc/pki/tls/certs/server.crt
$ sudo vim /etc/httpd/conf.d/welcome.conf
#
# This configuration file enables the default "Welcome" page if there
# is no default index page present for the root URL. To disable the
# Welcome page, comment out all the lines below.
#
# NOTE: if this file is removed, it will be restored on upgrades.
#
#<LocationMatch "^/+$">
# Options -Indexes
# ErrorDocument 403 /.noindex.html
#</LocationMatch>
…<省略>…
$ sudo vim /etc/httpd/conf.d/autoindex.conf
#
# Directives controlling the display of server-generated directory listings.
#
# Required modules: mod_authz_core, mod_authz_host,
# mod_autoindex, mod_alias
#
# To see the listing of a directory, the Options directive for the
# directory must include "Indexes", and the directory must not contain
# a file matching those listed in the DirectoryIndex directive.
#
#
# IndexOptions: Controls the appearance of server-generated directory
# listings.
#
#IndexOptions FancyIndexing HTMLTable VersionSort
…<省略>…
$ sudo vim /etc/httpd/conf.d/auth_openidc.conf
<VirtualHost *:443>
ServerName <ドメイン名>
DocumentRoot /var/www/html
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder on
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key
SSLCompression off
SSLSessionTickets off
# Google IdP (Identity Provider) の設定ファイルを読み込む
Include conf/auth_openidc_google.conf
# クライアント ID およびクライアントシークレットの設定ファイルを読み込む
Include conf/auth_openidc_client_secret_google.conf
OIDCRedirectURI https://<ドメイン名>/callback
OIDCCryptoPassphrase a-random-secret-used-by-apache-oidc-and-balancer
OIDCSSLValidateServer Off
<Location />
# OIDCによる認証、認可を使用する
AuthType openid-connect
Require valid-user
# 動作確認用にSSI を使えるようにする(OIDC認証したいだけであれば不要)
Options +Includes
DirectoryIndex index.shtml
</Location>
</VirtualHost>
<VirtualHost *:80>
# httpでアクセスした場合はhttpsに書き換える
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,QSA,L]
</VirtualHost>
設定の確認
Apache HTTPの設定ファイルに文法的な誤りがないか確認しましょう。Syntax OKと表示されれば問題ありません。
$ sudo apachectl configtest
Syntax OK
サービス起動・自動起動有効化
設定を反映させるために、Apache HTTPサービスを起動(または再起動)し、OS起動時に自動で起動するように設定します。
$ sudo systemctl start httpd
$ sudo systemctl enable httpd
Webページの配置
OIDC認証後にユーザー情報が表示されるか確認するための簡単なテストページ(index.shtml
)を、Apacheのドキュメントルート(/var/www/html/
)に配置します。このページはSSI (Server Side Includes) を使用してOIDCから渡された情報を表示します。
/var/www/html/index.shtml
<DOCTYPE! html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>OpenID Connect ログインしました</title>
</head>
<body>
<h1>OpenID Connect ログインしました</h1>
<p>REMOTE_USER=<!--#echo var="REMOTE_USER" --></p>
<p>
OIDC_CLAIM_email=<!--#echo var="OIDC_CLAIM_email" --><br/>
OIDC_CLAIM_email_verified=<!--#echo var="OIDC_CLAIM_email_verified" -->
<br/>
</p>
<p>
<img src="<!--#echo var="OIDC_CLAIM_picture" -->"
alt="OIDC_CLAIM_picture" /><br/>
OIDC_CLAIM_name=<!--#echo var="OIDC_CLAIM_name" --><br/>
OIDC_CLAIM_given_name=<!--#echo var="OIDC_CLAIM_given_name" --><br/>
OIDC_CLAIM_family_name=<!--#echo var="OIDC_CLAIM_family_name" --><br/>
</p>
</body>
</html>
動作確認
Webブラウザでhttps://<ドメイン名>
にアクセスします。自己署名証明書を使用しているため、ブラウザにセキュリティ警告が表示されることがありますが、今回は検証目的なので「危険性を承知の上で使用」などのボタンでアクセスを続行します。

Googleのログインが求められます。

ログイン時には、同意画面が表示されます。

ログインに成功するとindex.shtml
にリダイレクトされます。Googleアカウントのメールアドレス、プロフィール画像、氏名などが表示されることを確認します。

まとめ
以上の手順で、Googleアカウントで認証できるApache HTTP Webサーバを構築することができました。
OIDCモジュールは他の多くの認証プロバイダにも対応しているため、応用すれば様々なサービスとの連携が可能です。機会があれば、他のプロバイダとの連携も試してみたいと思います。
参考
https://qiita.com/trueroad/items/593870ebafb675196e88