こんにちは、@Dominion525 です。 好きなモビルスーツはMS-06R-1高機動型ザクIIです。
ちょっとしたダッシュボードとか気の利いたOSSのWebアプリケーションなどを動かすときに、気になるのは認証周りです。 都度、関係者分のアカウントを管理したり、パスワードの個別に変更したりするのは大変に面倒です。
こういうのはアプリケーション本体ではなくフロントのリバースプロキシで制限すると便利です。 ただし、基本認証などでは心もとないのでもう少し工夫をしてみます。 (もちろん、対象のアプリケーションは localhost からしかアクセス出来ないようになっているものとします。)
mod_auth_openidc
そこで、OAuth2認証を提供してくれる素敵Apacheモジュール*1が mod_auth_openidc です。*2
弊社では Google Apps を利用しているので、メンバーだけがアクセスできるような制限を簡単に設定することができます。
インストール
現時点では Ubuntuの標準パッケージとしては提供されていないので、開発元で配布されているパッケージを使います。 https://github.com/pingidentity/mod_auth_openidc/releases/
(この記事では v1.8.0を使いました。)
$ wget https://github.com/pingidentity/mod_auth_openidc/releases/download/v1.8.0/libapache2-mod-auth-openidc_1.8.0-1_amd64.deb $ sudo apt-get install libhiredis0.10 libjansson4 $ sudo dpkg -i libapache2-mod-auth-openidc_1.8.0-1_amd64.deb $ sudo a2enmod auth_openidc
Google 側の認証情報の取得
こちらのページを参照します。
Google Developers Consoleにて認証情報を設定します。
- [プロジェクト]から新規プロジェクトを作成します。
- [APIと認証]-[認証情報]を参照します。
- [新しいクライアントID]からクライアントIDを作成します。
Apache の設定
site-enabled/example.com
に次のような設定追加します。
OIDCProviderMetadataURL https://accounts.google.com/.well-known/openid-configuration OIDCClientID [別記参照] OIDCClientSecret [別記参照] OIDCRedirectURI [別記参照] OIDCCryptoPassphrase [PASSWORD] OIDCAuthRequestParams hd=example.com <Proxy *> AuthType openid-connect Require claim hd:[制限するGoogleAppsのドメイン] </Proxy>
- OIDCProviderMetadataURL
https://accounts.google.com/.well-known/openid-configuration
を設定します。
- OIDCClientID
- OIDCClientSecret
- 画像を参照してください
- OIDCRedirectURI
- OIDCCryptoPassphrase
- 暗号化用のパスフレーズです。任意の文字列を指定します。
- OIDCAuthRequestParams
- 利用可能ユーザを GoogleApps のドメインで制限したい場合に指定します。
- e.g.
hd=example.com
後処理
$ sudo service apache2 restart
上記が然るべく設定できたら、Apacheを再起動するだけです。 あとはふつうにアクセスすれば、Google Appsのアカウントで認証ができます。
こんな感じの見慣れた画面ですね。
まとめ
- 認証はリバースプロキシに任せると楽
- Apache2 ならmod_auth_openidc で簡単に設定できる
追記
gate
typester/gate という golang でできた小さな Google Apps 認証専用 Proxy もあるようです。
- GitHub - typester/gate
- Google認証なリバースプロクシ&静的コンテンツ配信サーバー「gate」 - unknownplace.org
- gateを使って手軽に認証を導入する - pixiv inside
*1:今回は歴史的経緯で Apache2 を用いますが nginx の場合は google_auth_proxy などが使えそうです。
*2:なお、似たような名前で同じ機能を提供してくれる mod_auth_openid はもうメンテナンスされていないようです。