Google認証機能を持つApache HTTP Webサーバを構築してみた

こんにちは、新卒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://<ドメイン名>
承認済みのリダイレクト URIhttps://<ドメイン名>/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

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です