Nginx + Google-authenticatorまたはすべてがそう簡単ではない...

Googleワンタイムパスワードに基づくnginxでの認証。



さまざまな理由から、認証auth_basicとパスワード付きファイルを拒否する必要がありましたが、安全ではありません。

さまざまなレベルの知識を持つ多くのユーザーがいるため、証明書の承認は適切ではありません。



彼らは、Nginx(http_auth_request_module)+ Apache(google-authenticator-apache-module)に基づいたソリューションを提案しました。



彼は数日間それを拾いましたが、それがどのように機能するかのいくつかのポイントを理解できませんでした。 突っついても理解しました。











その考え方は次のとおりです。 承認チェックはnginx自体ではなく、Apacheサーバーで行われます。 承認が渡された場合、nginxはauth_requestサブクエリをApache 'Authentication Server'に送信し、apacheがHTTP 200で応答し、nginxはユーザーが承認に合格したことを喜んで考慮します。



どのように機能しますか? 「認証サーバー」で、特定の安全なキーを含む各ユーザーのファイル(ファイル名-ログイン)を作成します。

詳細には触れませんが、この安全なキーと現在の時刻に基づいて、サーバー側とクライアント側で互いに独立して、ワンタイムパスワードが毎分生成されると想定しています。



パスワードを生成するアプリケーションが使用されるため:



Android向けGoogle認証システム

iOS向けGoogle認証システム

電話がない場合は、Windows用のアプリケーションがあります。

Windows用のGoogle認証システム

Javaの下にもあります...



少し後でアプリケーションをサーバーと同期する方法ですが、今度はサーバーで構成する必要があるもの。



残念ながら、Nginxの下にはモジュールがなく、Nginx実装の特性のためではありません。 なぜ私は確かに言うことができないが、彼らは州のマシンなどについての言葉を言った... :)



しかし、Apacheの下にはモジュールがあります!!! google-authenticator-apache-moduleと呼ばれる



centsOS 6用のバイナリアセンブリもあります。動作し、チェックされています。 ソースコードがあり、レポにはもっと新しいものがあります。 バイナリアセンブリを試し、ソースからモジュールを組み立てました。



したがって、apache + google-authenticator-apache-moduleでは、「承認サーバー」を作成し(信頼性のために2台のサーバーを使用することもできます)、必要なすべてのサーバーでNginx_yを接続します。



したがって、apache2を取得するか、google-authenticator-apache-moduleバイナリモジュールを収集または取得します。



そしてこの設定を書きます:



Loadmodule authn_google_module modules/mod_authn_google.so Listen *:8888 <Location ~ "/(|_auth/)" > #        Nginx_.         :) Order deny,allow Deny from all Allow from 10.0.0.0/8 Allow from 192.168.0.0/24 AuthType Basic AuthName "My Closed Zone Gauth" AuthBasicProvider "google_authenticator" Require valid-user GoogleAuthUserPath /etc/httpd/ga_auth GoogleAuthCookieLife 600 GoogleAuthEntryWindow 3 # GoogleAuthLogLevel -        . GoogleAuthLogLevel 1 </Location>
      
      







Apacheを再起動し、ブラウザでそれを開こうとします-認証リクエストはありますか? 素晴らしい!!!



もっと...



/ etc / httpd / ga_auth-秘密鍵を持つファイルがあるディレクトリ。



それらを作成する方法と方法: google-authenticator



libpam-google-authenticatorをダウンロードして、get google-authenticatorを取得します。 ここで、彼女は必要なものを生成できます。



スクリプトを作成して、ファイルが必要な場所に正しく移動するようにしました。



 #!/bin/bash /usr/bin/google-authenticator -t -D -f -l$1@mydomain.com -r3 -R600 -s /etc/httpd/ga_auth/$1 -w2 /bin/chown apache:apache /etc/httpd/ga_auth/$1
      
      







ユーザーログインパラメーターをスクリプトに渡します。



スクリプトが終了すると、ファイルが作成され、コンソールに出力されます。



 https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/zzzz@mydomain.auth%3Fsecret%3DQYYY34XXXX534A4QA Your new secret key is: DQYYY34XXXX534A4QA Your verification code is 123456 Your emergency scratch codes are: 99942105 28654999 45999608 33300650 99907825
      
      







/ etc / httpd / ga_auth / _user_login_ファイルにはさまざまなものが含まれていますが、google-authenticator-apache-moduleの動作に影響を与えるものはありません。ただし、「あなたの新しい秘密鍵は:」 QUCFKE6AK3PBA4QAを含む行ですが、ファイルに触れることはできません。



次に、リンクhttps://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/zzzz@mydomain.auth%3Fsecret%3DQYYY34XXXX534A4QAを開きます

(リンクは意図的にカーブします)

そして見る







電話にGoogle認証システムをインストールします(まだインストールしていない場合)。 QRコードをスキャンすると、電話全体が1分ごとにワンタイムパスワードの生成を開始します。



あなたはApacheにログインしようとすることができます、それは動作するはずですが、404を発行することができます- 承認後、Apacheは何らかのindex.htmlを表示したいのですが、おそらくあなたはそれを持っていません。



ところでgoogle-authenticator-apache-moduleモジュールは正直に/ var / log / httpd / error_logに書き込みます。



そのため、「承認サーバー」と電話があります-両方が同じシーケンスのワンタイムパスワードを生成します。



nginxの構成に移りましょう。



Nginxをより新しく 、最後の安定版1.5.7を取り、 --with-http_auth_request_module (http_auth_request_moduleキーポイント)で収集します。



  auth_request_set $auth_cookie $upstream_http_set_cookie; add_header Set-Cookie $auth_cookie; location = /_auth/ { internal; proxy_pass http://gauth_pool/; proxy_pass_request_body off; proxy_buffering off; proxy_cache off; proxy_set_header Content-Length ""; proxy_set_header Host mydomain.com; }
      
      







この設定を別のファイルで選択し、必要に応じて含めます。



/etc/nginx/nginx.confの最後に、信頼性のためにapacheのプールと少なくとも2台のサーバーを追加します。



 upstream gauth_pool { server ga1.mydomain.com:8888 weight=1; server ga2.mydomain.com:8888 weight=5; }
      
      







Nginxに必要な場所に次を追加します。



 server { listen 443 ssl spdy; # listen 80; server_name www.mydomain.com; satisfy any; include /etc/nginx/allow_nets.txt; deny all; auth_request /_auth/; include location_auth.conf;
      
      







チェック:)



/etc/nginx/allow_nets.txt-許可する必要のないIPのリスト。 すべての人を承認して苦しめる必要はないと思います。



今、最も興味深いのは微妙な点です:



これはすべて次のように機能します。



ログインしました。 サイトで作業している間、Cookieの承認は常に確認されています

set-cookie: google_authn=user:1390714695:FRxZCSDzox/a5KEGXXXXXXX5TYGIYZrRf=







これは絶えず更新され、1390714695-Cookieの有効期限が切れる時間です。 現在の時刻+ {GoogleAuthCookieLife 600}は、Apache設定から常に更新されています。 このページで非アクティブの時間を言うことができます。 10分間放置-再度ログインします。



そして第二のポイント。 入力したワンタイムパスワードは永久に残りません。 一般に、期間は1分であり、これで終わりです。 しかし、パラメータを使用して

GoogleAuthEntryWindow 3では、パスワードの「時間枠」を拡大できます。

ポイントは、google-authenticator-apache-moduleが現在のパスワードに加えて、前後のGoogleAuthEntryWindowパスワードを生成できることです。これにより、モバイルの時計とサーバーの時計が一致しない場合でもログインできます。



ワンタイムパスワードが認証をより長く通過するように同じことを行うことができます。これにより、認証を「合格」に長く保つことができます。



そして最後に、Apacheからのログの一部:



 [Sun Jan 20 09:01:49 2014] [error] [client 1.2.3.4] **** COOKIE AUTH at T=1390714549, referer: https://www.mydomain.com/ [Sun Jan 20 09:01:49 2014] [error] [client 1.2.3.4] Cookie auth is DECLINED, referer: https://www.mydomain.com/ [Sun Jan 20 09:01:49 2014] [error] [client 1.2.3.4] **** PW AUTH at T=1390714549 user "my_user", referer: https://www.mydomain.com/ [Sun Jan 20 09:01:49 2014] [error] [client 1.2.3.4] getUserSecret with username "my_user", referer: https://www.mydomain.com/ [Sun Jan 20 09:01:49 2014] [error] [client 1.2.3.4] OPENING FILENAME /etc/httpd/ga_auth/my_user, referer: https://www.mydomain.com/ [Sun Jan 20 09:01:49 2014] [error] [client 1.2.3.4] Comparing Authentication @ T=46017151 Code=475002 "332994" vs. "475002", referer: https://www.mydomain.com/ [Sun Jan 20 09:01:49 2014] [error] [client 1.2.3.4] Comparing Authentication @ T=46017151 Code=87841 "332994" vs. "087841", referer: https://www.mydomain.com/ [Sun Jan 20 09:01:49 2014] [error] [client 1.2.3.4] Comparing Authentication @ T=46017151 Code=627132 "332994" vs. "627132", referer: https://www.mydomain.com/ [Sun Jan 20 09:01:49 2014] [error] [client 1.2.3.4] Comparing Authentication @ T=46017151 Code=332994 "332994" vs. "332994", referer: https://www.mydomain.com/ [Sun Jan 20 09:01:49 2014] [error] [client 1.2.3.4] Created cookie expires 1390715149 hash is sEFQLm92bSI= Cookie: google_authn=my_user:1390715149:sEFQLm92bSI=, referer: https://www.mydomain.com/
      
      







タイプの文字列を徐々に、またはむしろ1分に1回

Comparing Authentication @ T=46017151 Code=87841 "332994" vs.





パスワードが記載された行のみが表示されるまで、そして1分後に新しいパスワードによる承認が削減されます。



All Articles