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

こんにちは。Misoca 開発チームの eitoball です。先日、いびがわマラソン2019 を走ってきました。フルマラソンは2回目ですが、初めてサブ4(グロスで3時間55分、ネットで3時間47分)を達成しました!

はじめに

今回は、Webサイトへのアクセス制限に GitHub や Facebook の認証を簡単に使えるようにできる OAuth2 Proxy というソフトウェアの紹介です。

OAuth2 Proxy

この記事、https://tech.misoca.jp/entry/2015/04/07/145743 では、mod_auth_openidc という Apache のモジュールを利用して、ウェブサイトに認証機能を追加する方法を紹介しました。認証に使うサービスは、OpenID Connect Provider である必要があります。OAuth2 Proxy では、認証に使うサービスは、OAuth2 での認証を提供していれば、利用することができます。

OAuth2 Proxy は、リバースプロキシサーバーのように動作して、下の図の secured upstream http service で表現される認証をつけたいWebサイトの前段でリクエストを受けつけます。外部サービスで認証済みの場合は、リクエストを後段で動作しているWebサイトに渡して結果を返します。認証していない場合は認証用のページを表示します。

OAuth2 Proxy の前段に、Apache や Nginx などを置いて、SSLターミネーションとすることもできますし、OAuth2 Proxy が直接、SSLを使った通信をすることを可能です。

設定例

GitHub を使って、認証する例を説明します。

インストール

aptやrpmパッケージは提供されていないようです。そのため、https://github.com/pusher/oauth2_proxy/releases より、使用するオペレーティングシステムに応じたパッケージをダウンロード・解凍して、/usr/local/sbinoauth2_proxy というバイナリを配置します。

$ curl -L -o oauth2_proxy.tar.gz https://github.com/pusher/oauth2_proxy/releases/download/v4.0.0/oauth2_proxy-v4.0.0.linux-amd64.go1.12.1.tar.gz
$ tar xzf oauth2_proxy.tar.gz
$ sudo cp oauth2_proxy-v4.0.0.linux-amd64.go1.12.1/oauth2_proxy /usr/local/sbin/

GitHub 側の認証情報の取得

「OAuth Apps」で認証情報を設定します。組織の場合は、ダッシュボードページの「Settings」タブから「OAuth Apps」からアクセスできます。多分、http://github.com/organizations/<組織名>/settings/applications のようなURIになります。個人の場合は、ここ から設定できます。

「New OAuth App」ボタンをクリックして、「Application name」、「Homepage URL」、「Authorization callback URL」を指定します。「Authorization callback URL」には、「https://<開発サーバーのホスト名>/oauth2/callback」を指定します。指定したら「Register Application」ボタンを押して、設定を保存します。

New_OAuth_Application.png (144.3 kB)

OAuth2 Proxy の設定

以下のような内容を/usr/local/etc/oauth2_proxy.cfgとして配置します。

http_address = "127.0.0.1:4180" # OAuth2 Proxy のアドレスとポート

upstreams = [
  "http://127.0.0.1:3000/" # 認証情報を付与したいサーバーのURL
]

email_domains = [ 
  "*" # 今回はどんなメールアドレスも認証する
]

client_id = "<GitHubで設定したOAuth AppのクライアントID>"
client_secret = "<GitHubで設定したOAuth Appのクライアントシークレット>"

provider = "github"

github_org = "<認証したいGitHubのorganization>"

cookie_secret = "<クッキーの暗号化鍵>"

設定できる項目などについては、OAuth2 Proxy の Configuration を参照して下さい。

cookie_secret には、ruby -rsecurerandom -e'puts SecureRandom.base64(16)'python -c 'import os,base64; print base64.urlsafe_b64encode(os.urandom(16))' のようなコマンドを実行して生成するのがお勧めです。

後、OAuth2 Proxy が自動起動できるようにします。systemd を使っているので、以下のような内容を /etc/systemd/system/oauth2_proxy.serviceに配置します。

[Unit]
Description=OAuth2 Proxy

[Service]
Type=simple
User=root
ExecStart=/usr/local/sbin/oauth2_proxy -config=/usr/local/etc/oauth2_proxy.cfg

[Install]
WantedBy=multi-user.target

そして、以下のコマンドを実行して、設定の有効化とOAuth2 Proxyを起動をします。

$ sudo systemctl enable oauth2_proxy
$ sudo systemctl restart oauth2_proxy

Apache の設定

Apache 側では、mod_proxy モジュールを有効にして、OAuth2 Proxy のリバースプロキシとして設定します。以下のような設定をします。

<VirtualHost *:443>
  ServerAdmin admin@example.com
  DocumentRoot /var/www/html
  ServerName sugoi-server.example.com
  
  # SSL の設定
  
  ProxyPass / http://localhost:4180/
  ProxyPassReverse / http://localhost:4180/
  ProxyPreserveHost On
  ProxyRequests Off
</VirtualHost>

確認

Apache を再起動して、認証を設定したサイトにアクセスすると以下のような画面が出ると思います。

Sign_In.png (18.6 kB)

「Sign in with GitHub」ボタンを押すとGitHubでの認証画面が出るので、ログインとパスワードを入力すれば、サイトにアクセスできるはずです。

最後に

OAuth2 Proxy の紹介とそれを使って、認証機能のないWebサイトに簡単に認証を提供する方法を紹介しました。

Misoca では、このようなちょっとしたことに興味もあるソフトウェアエンジニアやサイトリライアビリティエンジニアを募集しています。

recruit.misoca.jp recruit.misoca.jp