私は小規模なコンサルタント会社で働いており、クライアント向けのWebアプリを頻繁に作成しています。書くのにしばしば繰り返されるウェブアプリの一部は認証システムです。多くのWebアプリでは、さまざまなプロバイダーからのOAuthログインと、メールベースの登録をサポートしたいと考えています。
ただし、すべてのWebアプリケーションでこれをプログラミングするには時間がかかります。理想的には、アプリケーションサーバーの前に配置され、認証に関連するすべて(ログイン、登録、ログアウトなど)を処理する汎用の認証プロキシサーバーが理想的です。このようなものは安全でしょうか?または、このようにしてはならないセキュリティ関連の理由がある場合はどうなりますか?
私はそれが次のようになると想像しています:
認証サーバー
SESSION
というCookieのJWT)。このセッション情報は、ユーザーが過去のある時点で正しくログインしたことの証明になります。セッション情報が正しい場合は、X-UserId
ヘッダーをリクエストに追加し、それをアプリケーションサーバーに転送します。認証情報を含むCookieがない場合、またはセッション情報が正しくない場合は、X-UserId
ヘッダーなしでリクエストをアプリケーションサーバーに転送します。/login
、/logout
、および/register
)。これらのリクエストは完全に独自に処理します。アプリケーションサーバーは、これらの要求を認識しません。アプリケーションサーバー
X-UserId
ヘッダーに完全に依存して、認証を実行しません。次に、ログインがどのように機能するか、および認証サーバーとアプリケーションサーバー間の相互作用の例を示します。
login.html
ページを取得する手順は次のとおりです。
/login.html
のリクエストを送信します。SESSION
というCookieを探します。存在しないため、X-UserId
ヘッダーを追加せずにリクエストをアプリケーションサーバーに転送します。/login.html
に定義されたルートがあり、X-UserId
ヘッダーが存在する必要がないため、login.html
のHTMLを返します。login.html
ページには、実際にログインするためのJSコードを含めることができます。これを行う方法の1つを次に示します。
/login/email
に送信して、メールアドレスとパスワードを使用してログインします。HttpOnly
というSESSION
Cookieが返されます。これが成功した後、ユーザーは/home.html
に誘導されます。この手順は/login.html
に似ていますが、ユーザーが実際に認証される必要がある点が異なります。
/home.html
にリクエストを送信します。SESSION
Cookieをチェックし、JWTをデコードします。認証サーバーは、JWTの情報に基づいてデータベースからユーザーIDを取得します。ユーザーIDが5であるとしましょう。X-UserId=5
ヘッダーをリクエストに追加し、それをアプリケーションサーバーに転送します。 (SESSION
Cookieが存在しない場合、またはJWTを正常にデコードできない場合、認証サーバーはX-UserId
ヘッダーを追加せずにリクエストをアプリケーションサーバーに転送します。次の手順は、認証が成功し、認証サーバーが `X-UserIdヘッダーを追加することを前提としています。)/home.html
に対するものであるため、アプリケーションサーバーは有効なユーザーIDが必要であることを認識しているため、X-UserId
ヘッダーを確認します。X-UserId
ヘッダーからユーザーIDを正常に取得し、それを使用してアプリケーションDBからデータを引き出し、home.html
ページを作成します。home.html
ページを含む応答を認証サーバーに送信します。以下は、上記に当てはまらない追加情報です。
X-UserId
ヘッダーを削除します。このような設定は安全ですか?
逆プロキシは、あなたが求めているものに対してかなり一般的です。かなりの数の企業がサーバーを参考に設計しており、それを参照として使用できます。
たとえば、私は会社でWebSeal(IBM ISAM)をかなり使用しました(私の周りに何らかの理由で人気があるようです)。それらには、OAuthおよびその他のほとんどのタイプの認証用にすでに構築されたモジュールがあります。
これらのサーバーを使用して、次のことができます。
デザインノート:
リクエストを承認する場合は、OAuth 2.0またはJWTをご覧ください。
IdentityにIDトークンを使用します(例:OpenID仕様、またはJWTの独自の外観をロールする場合)
Webアプリケーションで認証トークンを使用してアクセストークンを取得します。
アクセストークンを使用して、保護されたリソースを提供します。
これは素晴らしい設定です。
ネットワークとこのタイプのアクセスについて彼らがどのように考えているかについての詳細は、グーグルのビヨンドコープのドキュメントをご覧ください。
https://cloud.google.com/beyondcorp/
自分でロールしたい場合は、duoネットワークゲートウェイなどを使用できます。ただし、リバースプロキシの問題は、すべてのDNSがリバースプロキシの同じIPをポイントし、各リソースを手動で構成する必要があることです。
別のアプローチは、認証を必要とするPACファイルとフォワードプロキシの組み合わせです。次に、フォワードプロキシを介してすべてのURLを送信するように指定できます。フォワードプロキシは認証を実行し、トラフィックをどこにでもリソースに渡します。リソースは、送信元IPアドレスのみを許可するように構成できます。