はじめに
- 本記事は、Qiitaエンジニアフェスタ2021の「Auth0を使ってID管理にまつわる記事を投稿しよう!」への投稿記事です。
- 自分の調査や開発に利用しているサーバ(さくらのVPS)上で、Dockerコンテナとして動作しているWebアプリや開発ツールをインターネットを通して利用するにあたり、アクセス制限をしています。
- VPSのパケットフィルタ機能で、ポートや接続元IPを絞っていますが、さらに強化するために認証・認可のためのプラットフォームであるAuth0を使いました。
構成
- CentOS 7マシンにDocker環境を構築しています。Docker上のアプリにアクセスするために、Dockerホスト上にインストールしたApacheをリバースプロキシとして使っています。
- リバースプロキシとなるApacheには、外部からは、
8443
ポートのHTTPS通信で接続します。VPSのパケットフィルタ機能で、8443
ポートを許可しています。 - Apacheに対して、Auth0の設定を施し、アクセス制限をかけます。
- Docker上の各アプリには、Apacheの名前ベースのバーチャルホスト機能を利用し、各アプリに割り当てられたドメインのURLでアクセスします。
TLS証明書は、以下の記事を参考にさせていただき、Let's Encryptでワイルドカード証明書を取得しています。
環境
- さくらのVPS
- CentOS 7.9
- Apache 2.4
Auth0準備
まずは、Auth0に登録し、利用のための設定をします。
無料で登録できるとのことなので、下記から登録していきます。
私の場合は、Googleアカウントで登録していきました。
アカウント・テナント作成
上のURLにアクセスしていくとAccount Type
を聞かれたので、「Personal」を選択しました。
また、リージョンが選択できるようなので、「I need advanced settings」にチェックを入れて進みました。
次の画面のTenant Domain
は、デフォルトで設定されるもののままとし、Regin
は、「Japan」を選択しました。
アプリケーション作成・設定
アカウント作成後に表示されるダッシュボード画面で、「Create Application」を選択します。
表示されるダイアログで、適当なアプリケーションの名前を入力し、application type
は、「Regular Web Application」を選択します。
続いて、設定をしていきます。
「Settings」タブ >「Application URIs」 > 「Allowed Callback URLs」にApacheのバーチャルホストに設定する2つのドメイン分のURLをカンマ区切り入力し、下の方の「Save Changes」を押します。
(この値は、後のApacheの設定ファイルに記述するOIDCRedirectURI
の値とあわせます)
https://www-a.example.com:8443/redirect_uri/
https://www-b.example.com:8443/redirect_uri/
今回は、自分で利用するだけでGoogleアカウントと連携しての認証は行わないので、ユーザ名/パスワード認証のみにします。
「Connections」タブで、「google-oauth2」を無効にしておきます。
さらにクライアント側からのユーザの新規登録ができないように、サイドメニューの「Authentication」>「Database」>「Disable Sign Ups」をオンにします。
ユーザ作成
ログイン画面で入力するユーザIDとパスワードを作成します。
サイドメニューの「User Management」>「Users」で「Create User」をクリックします。
「Create」すると、ユーザの一覧に作成したユーザが表示されました。
Apacheモジュール導入
次に必要なApacheのモジュールを導入します。
CentOS 7では、yumでmod_auth_openidc
をインストールするだけでした。
Apacheの再起動は、次のバーチャルホストの設定等の反映とあわせて行います。
# yum install -y mod_auth_openidc
Apacheの設定
Apacheの設定ファイルを編集していきます。
auth0のための設定は、ダッシュボードの「Quick Start」タブで「Apache」を選択し表示される設定例をベースにします。
Client Secret
は、「Settings」タブの項目にある値を使います。
バーチャルホストの設定は、以下の例のように設定します。
- アプリA
-
www-a.example.com
のFQDNの8443ポート
で受け付けたリクエストをローカルホストの8500
ポートにプロキシ
-
- アプリB
-
www-b.example.com
のFQDNの8443ポート
で受け付けたリクエストをローカルホストの8600
ポートにプロキシ
-
Listen 8443 https
ProxyRequests Off
# アプリA
<VirtualHost *:8443>
ServerName www-a.example.com
# HTTPSのための設定
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
OIDCProviderMetadataURL https://dev-xxxxxxxx.jp.auth0.com/.well-known/openid-configuration
OIDCClientID 9FXXXXXXXXXXXXXXXXXHK
OIDCClientSecret ylxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxym
OIDCScope "openid name email"
OIDCRedirectURI https://www-a.example.com:8443/redirect_uri/
OIDCCryptoPassphrase <passwordToEncryptTheSessionInformationOnTheCookie>
<Location />
AuthType openid-connect
Require valid-user
LogLevel debug
</Location>
# Dockerアプリへのプロキシ設定
ProxyPass / http://localhost:8500/
ProxyPassReverse / http://localhost:8500/
</VirtualHost>
# アプリB
<VirtualHost *:8443>
ServerName www-b.example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
OIDCProviderMetadataURL https://dev-xxxxxxxx.jp.auth0.com/.well-known/openid-configuration
OIDCClientID 9FXXXXXXXXXXXXXXXXXHK
OIDCClientSecret ylxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxym
OIDCScope "openid name email"
OIDCRedirectURI https://www-b.example.com:8443/redirect_uri/
OIDCCryptoPassphrase <passwordToEncryptTheSessionInformationOnTheCookie>
<Location />
AuthType openid-connect
Require valid-user
LogLevel debug
</Location>
ProxyPass / http://localhost:8600/
ProxyPassReverse / http://localhost:8600/
</VirtualHost>
ここまでの設定をApacheに反映するために、Apacheの再起動を行います。
# httpd -t
→ 「Syntax OK」を確認
# systemctl restart httpd
実際にアクセス
最後に実際にアプリにアクセスしてみます。
アプリのURLにアクセスすると、以下のようなログイン画面が表示されました。
先ほど作成したユーザID/パスワードを入力すると、Docker上のアプリの画面が表示されます。
無事にログインできました!
ここでは、開発用ツールとして、VSCodeをWebブラウザ上で操作できるcode-serverを動作させています。
Docker上で動作させているアプリについては、別記事にて紹介しています。
多要素認証の導入
最後にパスワード+SMSを使った2要素認証を導入してみます。
以下のドキュメントにしたがって、2要素認証の設定を行いました。
設定後、アプリにIDとパスワードを入力すると、以下のようなSMSを送信する電話番号の入力画面が出てきました。
送信先の番号を入力して、「続ける」をクリックすると、SMSが届きました。
届いた6桁のコードを入力することで、アプリにログインすることができました。
おわりに
本記事では、auth0をリバースプロキシのApacheに設定し、プロキシ先アプリに対するアクセス制限に利用しました。
比較的簡単な手順で、リッチなログイン画面を導入することができました。
自分ひとりだけで利用するには、Basic認証で十分かもしれませんが、複数人で利用するようなシチュエーションでは便利かなと思いました。
また、多要素認証も実現できるので、実際のサービス開発・運用にも有力なソリューションだなと思いました。
参考
本記事の作成にあたり、以下の記事を参考にさせていただきました。