2017年7月1日土曜日

田胡研のnginxとシングルサインオン

# はじめに この記事は田胡研初夏のAdventCalendar2017 1日目の記事です. ここに記事を書くのは12月のAdventCalendar以来になります, 最近やったことをあまり整理できていなかったので整理するためにも, またナレッジを少しでも溜めていくためにも7月にAdventCalendarをやることにしました! 1ヶ月間色々書いていけたらと思います. 1日目はnamazuさんです. # 田胡研のnginx 田胡研ではReverseProxyを行うWebServerとしてNginxを利用しています。 Nginxを流行始めたらしい2012年頃から利用しており、 現在田胡研Domain(t-lab.cs.teu.ac.jp)で外部公開するWebサービスについてはすべてNginxを利用して内部の各サービスへReverseProxyすることで公開しています。 公開している物としては * 田胡研web ( http://www.t-lab.cs.teu.ac.jp ) * iotプロジェクト ( http://iot.k.t-lab.cs.teu.ac.jp ) * lifehubプロジェクト ( http://lifehub.t-lab.cs.teu.ac.jp ) など外向きのものや * wiki * gitlab * webcam streaming など内向けのサービスを数え切れないくらい公開しています. これらはすべてnginxを経由しインターネットに公開しています. # シングルサインオン 田胡研では内向けの外部秘なサービスもインターネット経由でアクセス可能にしているため,内向けのサービスでは認証が必要です. 田胡研では所属メンバーに対してLDAPのアカウントを発行しているため,LDAPサーバへの問い合わせを行うことで正規アクセスかどうかを判定できます. このLDAP問い合わせを内向けサービスにそれぞれ実装すればいいのですが,実装が面倒だったりサービス毎にそれぞれログインが必要と非常に勝手が悪いので **一度LOGINサーバでログインしておけばあとは田胡研の内向けすべてのサービスをログイン処理なしで閲覧・操作できる**というシングルサインオンを用意しています. # 田胡研のシングルサインオンの歴史 前に田胡研では2012年頃からnginxを利用していると言いました, 当時nginxにはシングルサインオンを実現するためのモジュールは存在しておらず, 独自にmoduleを開発しperl製のLDAP認証ページと組み合わせたシングルサインオンを利用していました. 2017年になってnginxの更新に取り組んだのですがビルドコンフィグやnginxのmoduleのソースコードが失われていてこの再利用は困難でした. またモジュールも増えておりnginxに独自モジュールを組み込まなくても狙いのシングルサインオンは実現可能になっていることが分かりました. そのためnginxは正規(centos用の最新リリース物)をそのまま利用し,新しく追加された機能を用いてシングルサインオンを実現するようにしました. # nginxのシングルサインオン 現在nginxを利用したシングルサインオンの実現方法は数種存在します. nginx_auth系のmoduleには例として * nginx_auth_basic_module * nginx_auth_ldap_module のようなものがあってbasicではbasic認証を,ldapではldap認証を利用可能です. ただしこのようなものはカスタマイズ性に欠けるのが難点です. 見た目もブラウザのダイアログが出てくるような物なのであまり望ましくありません. そこで今回は [nginx_auth_request_module](http://nginx.org/en/docs/http/ngx_http_auth_request_module.html) を利用することとしました. このモジュールは公開サービスへReverseProxyする前にサブリクエストを任意のサーバに送信することができ, サブリクエストのステータスコードが200外である場合公開サービスへのReverseProxyを行わないようにすることが出来ます. つまりサブリクエストの送付先にLDAPを利用したログインページ兼認証サーバを置き,ReverseProxy前に認証サーバで既にログイン済みかをチェックし, ログイン済み(認証サーバが200応答)であればそのままReverseProxy, 非ログイン(認証サーバが401応答)であればログインページへリダイレクトするという処理が可能です. 田胡研は現在この方法でシングルサインオンを行っています. サブリクエストの送付先を田胡研ではRails製のLDAPサーバへ問い合わせるアプリケーションに設定していますが, サブリクエストの送付先は任意で設定可能なのでGoogleOpenID認証を利用したり等色々と幅が広いmoduleです. # nginx側の具体的設定例 LDAP認証を利用するログインページ等はまた後日記事を書こうと思っているのでどんな感じにnginxの設定がなされているかだけ今回では書いておきます. ```internal.conf auth_request /auth; error_page 401 = @auth_redirect; location /auth { internal; proxy_set_header Host LOGIN_SERVER_INTERNAL_URL; real_ip_header X-Forwarded-For; proxy_set_header Content-Length ""; proxy_pass LOGIN_SERVER_INTERNAL_URL; proxy_pass_request_body off; } location @auth_redirect { return 302 http://login.t-lab.cs.teu.ac.jp/login?request_uri=https://$host$request_uri; } ``` auth_requestでLOGIN_SERVERの/authを叩くようにし 401エラー時はloginページにリダイレクトするようにします. この設定ファイルを各サービス側で読み込んで使ってやることでどんなサービスでも簡単に田胡研のLDAP認証を掛けられるようにしています. 後日LDAPの認証ページをRailsで作る話など書けたらと思います. 明日のカレンダー担当はcut-terさんです.

0 件のコメント:

コメントを投稿