読者です 読者をやめる 読者になる 読者になる

認証機能のないアプリケーションでOAuth2認証を提供する

こんにちは、@Dominion525 です。 好きなモビルスーツはMS-06R-1高機動型ザクIIです。

ちょっとしたダッシュボードとか気の利いたOSSのWebアプリケーションなどを動かすときに、気になるのは認証周りです。 都度、関係者分のアカウントを管理したり、パスワードの個別に変更したりするのは大変に面倒です。

こういうのはアプリケーション本体ではなくフロントのリバースプロキシで制限すると便利です。 ただし、基本認証などでは心もとないのでもう少し工夫をしてみます。 (もちろん、対象のアプリケーションは localhost からしかアクセス出来ないようになっているものとします。)

mod_auth_openidc

そこで、OAuth2認証を提供してくれる素敵Apacheモジュール*1mod_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にて認証情報を設定します。

  1. [プロジェクト]から新規プロジェクトを作成します。
  2. [APIと認証]-[認証情報]を参照します。
  3. [新しいクライアントID]からクライアントIDを作成します。

f:id:dominion525:20150406172929p:plain

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
    • 画像を参照してください
    • リダイレクトURL です。標準ではHTTPSですが、非推奨ながらHTTPを利用することもできます。HTTPを用いるときは Google Developers Console 側の設定も変更してください。
  • OIDCCryptoPassphrase
  • OIDCAuthRequestParams
    • 利用可能ユーザを GoogleAppsドメインで制限したい場合に指定します。
    • e.g. hd=example.com

f:id:dominion525:20150406173006p:plain

後処理

$ sudo service apache2 restart

上記が然るべく設定できたら、Apacheを再起動するだけです。 あとはふつうにアクセスすれば、Google Appsのアカウントで認証ができます。

こんな感じの見慣れた画面ですね。

f:id:dominion525:20150406173046p:plain

まとめ

  • 認証はリバースプロキシに任せると楽
  • Apache2 ならmod_auth_openidc で簡単に設定できる

追記

gate

typester/gate という golang でできた小さな Google Apps 認証専用 Proxy もあるようです。

*1:今回は歴史的経緯で Apache2 を用いますが nginx の場合は google_auth_proxy などが使えそうです。

*2:なお、似たような名前で同じ機能を提供してくれる mod_auth_openid はもうメンテナンスされていないようです。