web-dev-qa-db-ja.com

Kerberos Web認証

シンプルなログインページで保護された内部の単一ページWebアプリ(UNIX、Apache、およびPostgresql)を開発しました。現在、ユーザーはパスワード付きの独自のログインロールを持っています。

これはいくつかの理由で面倒になり始めています:

  1. ユーザーは複数のパスワードを持っています(私のWebアプリとActive Directoryの場合、会社のネットワークはWindowsです)。

  2. ユーザー情報を2つの異なる場所に保存する(一元化したい)。

私は要点までKerberosを調査してきました。KDCをセットアップし、GSSAPI認証を介してデータベースに接続できます(コマンドラインのみ)。

私が理解していることから、Active Directoryと統合する独自のKDCを使用できるはずです。

私が現在取り組んでいる私の問題は、KerberosによるWebアプリ認証です。

ユーザーがWebを使用している場合-Kerberos資格情報を取得/確認するにはどうすればよいですか?資格情報をCookieに保存できますか? OAuth、Webauth、または類似のものを使用する必要がありますか?

明確にするために、私がしたいことは:

ユーザーが有効な資格情報を持っていない場合は、ログインページを渡して資格情報を取得し(kinit経由で、ブラウザからはどうですか?)、有効な資格情報を返します。 (ブラウザーに資格情報を保存する方法、Kerberos資格情報からCookieを作成する方法はありますか?).

私はググってかなりの数のPDFとWebリソースを読みましたが、残念ながらそれらのどれも私がKerberos Web認証を達成する方法をしっかりと把握するのに十分にそれを沈黙させることができませんでした。

あなたが気づかなかったなら、私はすべてをどのようにつなぎ合わせるかについて混乱しており、すべてがどのように組み合わさるかについての概念的な概観に感謝します。

5
fbynite

これを行う通常の方法は、Webアプリケーションで認証要求を処理するときは常に、Kerberosに対して認証して、有効なログイン/パスワードを確認することです。

現在のユーザーの認証の詳細を確認する別の方法が見つかるとは思いません。 Windowsセッション。これは設計上安全ではありません。ユーザーとパスワードの組み合わせを保存する場合は、アクセス可能な形式で保存する必要があります。これにより、ハイジャックが可能になります。

1
user120925
  1. ユーザーのCookieに有効なIDがない場合、ユーザーはログインページにリダイレクトされます。
  2. 彼らはフォーム/ ajaxポストで資格情報をサーバーに送信し、サーバーはそれらが何らかの手段(Kerberos、データベースなど)を介して有効であることを確認します。
  3. 有効な場合は、セッションでユーザー名を設定し(一意のIDを持つ必要があります)、CookieでセッションIDを送り返します。

Cookieの内容に関しては、Cookieやその他の機密情報を決して保存しないでください。一意でランダムな識別子を保存するだけで済みます。ユーザーがページに別のリクエストを行う場合、この識別子を使用してセッションデータにアクセスします。これは次のようになります

auth-id:abc123

認証されている場合、セッションデータには認証に使用したユーザー名が含まれている必要があります。また、サーバー側にkerberos資格情報を保存する必要もありません。有効であるかどうかを確認してから、ユーザー名をセッションに保存するだけです。

繰り返しになりますが、サーバー上で認証がどのように行われるかは、セッションや認証済みの状態を維持する方法とは無関係であることを理解することが重要です。

1
Despertar

簡素化する。 ADのLDAPインターフェースを使用して、指定されたパスワードを持つユーザーに対してldap_bindを実行することを検討しましたか?これは、パスワードを保存したり、レイヤーを追加したりせずに、ADサーバーに対してユーザーの資格情報を検証する非常に簡単な方法です。

Apacheには、このビットを自動的に実行する認証プラグインもあります。 http://httpd.Apache.org/docs/current/mod/mod_authnz_ldap.html または https:// httpd。 Apache.org/docs/2.0/en/mod/mod_auth_ldap.html

Kerberosは、ユーザーにパスワードを要求したくない場合に便利です(代わりに、環境で実行されているデーモンからトークンを要求します)。これがWebアプリで機能するのを見たことはありません。アプリがブラウザのサンドボックスから抜け出す必要があると思います。

0
NickPoole