4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VPSのDocker上のアプリにアクセス制限をかける

Last updated at Posted at 2021-08-15

はじめに

login0.png

構成

architecture.png

  • 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」にチェックを入れて進みました。
account0.png

次の画面のTenant Domainは、デフォルトで設定されるもののままとし、Reginは、「Japan」を選択しました。
account1.png

アプリケーション作成・設定

アカウント作成後に表示されるダッシュボード画面で、「Create Application」を選択します。
new-app.png

表示されるダイアログで、適当なアプリケーションの名前を入力し、application typeは、「Regular Web Application」を選択します。
new-app1.png

これで、アプリケーションが作成されました。
top.png

続いて、設定をしていきます。
「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/

settings1.png

今回は、自分で利用するだけでGoogleアカウントと連携しての認証は行わないので、ユーザ名/パスワード認証のみにします。
「Connections」タブで、「google-oauth2」を無効にしておきます。
settings2.png

さらにクライアント側からのユーザの新規登録ができないように、サイドメニューの「Authentication」>「Database」>「Disable Sign Ups」をオンにします。
settings3.png

ユーザ作成

ログイン画面で入力するユーザIDとパスワードを作成します。
サイドメニューの「User Management」>「Users」で「Create User」をクリックします。
user1.png

表示されるダイアログの項目を埋めます。
use2.PNG

「Create」すると、ユーザの一覧に作成したユーザが表示されました。
user3.png

Apacheモジュール導入

次に必要なApacheのモジュールを導入します。
CentOS 7では、yumでmod_auth_openidcをインストールするだけでした。
Apacheの再起動は、次のバーチャルホストの設定等の反映とあわせて行います。

# yum install -y mod_auth_openidc

Apacheの設定

Apacheの設定ファイルを編集していきます。
auth0のための設定は、ダッシュボードの「Quick Start」タブで「Apache」を選択し表示される設定例をベースにします。
Client Secretは、「Settings」タブの項目にある値を使います。

apache1.png

バーチャルホストの設定は、以下の例のように設定します。

  • アプリA
    • www-a.example.comのFQDNの8443ポートで受け付けたリクエストをローカルホストの8500ポートにプロキシ
  • アプリB
    • www-b.example.comのFQDNの8443ポートで受け付けたリクエストをローカルホストの8600ポートにプロキシ
/etc/httpd/conf.d/vhosts.conf
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上のアプリの画面が表示されます。

app1.png

無事にログインできました!
ここでは、開発用ツールとして、VSCodeをWebブラウザ上で操作できるcode-serverを動作させています。
vscode.png

Docker上で動作させているアプリについては、別記事にて紹介しています。

多要素認証の導入

最後にパスワード+SMSを使った2要素認証を導入してみます。
以下のドキュメントにしたがって、2要素認証の設定を行いました。

設定後、アプリにIDとパスワードを入力すると、以下のようなSMSを送信する電話番号の入力画面が出てきました。
mfa0.png

送信先の番号を入力して、「続ける」をクリックすると、SMSが届きました。

mfa1.png

届いた6桁のコードを入力することで、アプリにログインすることができました。

mfa2.png

おわりに

本記事では、auth0をリバースプロキシのApacheに設定し、プロキシ先アプリに対するアクセス制限に利用しました。
比較的簡単な手順で、リッチなログイン画面を導入することができました。
自分ひとりだけで利用するには、Basic認証で十分かもしれませんが、複数人で利用するようなシチュエーションでは便利かなと思いました。
また、多要素認証も実現できるので、実際のサービス開発・運用にも有力なソリューションだなと思いました。

参考

本記事の作成にあたり、以下の記事を参考にさせていただきました。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?