FreeIPA/Kerberos を使用して、会社のイントラネット サイトの一部に SSO を実装しようとしています。しかし、このトピックに関する情報はほとんどありません。
テスト ネットワーク上で 3 台のマシンが実行されています:
Kinit、Unix ログイン、および Apache Kerberos 認証は機能します。クライアント システム上の Firefox ブラウザは、パスワードなしで FreeIPA WebConfig にログインできます (Kerberos チケットを使用)。この機能をイントラネット ページに移動したいと考えています。これまで、これらのページへのログインは従来の LDAP ログインに基づいていました。ログイン スクリプトを少し調整することで、ユーザーは新しい FreeIPA サーバーにログインできるようになりました。ただし、依然としてパスワードが必要ですが、Kerberos チケットのおかげで、パスワードは実際には必要なくなりました。
問題は、パスワードなしのログインとはどのようなものでしょうか?
ログイン スクリプトの機能スニペット:
リーリー今、私には 2 つの考えがあります:
######編集:######
Web サーバー VM とクライアント VM は両方とも「ipa-client-install」によって初期化されます。さらに、Web サーバーは Apache サービスを登録しています (ipa service-add HTTP/ebook.exampletest.de)。Apache 設定にもこれが反映されています: リーリー すでに述べたように、ユーザー認証は次のように機能するようです (
クライアント (自分のチケット)>
Web サービス (自分のチケット)>
ipa サーバー)。そうしないと、Apache サーバーは ldap/kerberos ユーザー名を返しません。それともここで何か重要なことを見逃しているのでしょうか?この認証を強制する他の方法はありますか?
出力: <?php print_r($_SERVER) ?>(インターセプト)
ああああP粉6148403632024-03-27 09:46:20
Web サーバーに 正しい Kerberos チケットがあることを確認してください。
通常、Kerberos 認証は、包括的な「すべての」チケットではなく、そのサーバーでのみ有効なチケットのみを送信します。クライアントが Web アプリに対して認証すると、取得できるのは HTTP/webapp.example.tld
のチケットだけであり、実際にそれを使用してユーザーに代わって LDAP にアクセスすることはできません。
ユーザーに代わって LDAP にアクセスする必要がある場合、次のオプションがあります。
また、どのアカウントにアクセス許可を取得するかを決定するために、「承認 ID」(authzid) も指定します。 。 たとえば、「webapp」として認証するが、authzid「myuser」を指定した場合 (そして LDAP サーバーが
許可している場合)、「myuser」が通常持つ権限を取得します。 「ウェブアプリ」の代わりに。
マスター krbtgt チケットを Web サーバーに送信します。その後、それが一時チケット キャッシュに配置され、Web アプリケーション環境で使用できるようになります。
ただし、委任にはいくつかの問題があります:
チケットをリクエストする必要があるため、すべての HTTP リクエストが遅くなります (Web サーバーがリクエストによる ID ネゴシエーションを回避するために Cookie などを使用できる場合を除く)。認証)、さらなるリクエスト用(例:「セッション」モードの mod_auth_gssapi)。
環境変数がチケット キャッシュを指すことを期待します。ただし、環境変数はプロセス スコープであるため、PHP が同じプロセスを再利用するたびに (さらに悪いことに、Apache プロセス内で Web アプリケーションを実行するために mod_php を使用している場合)、無関係なリクエストで環境変数がリークされる可能性があります。
チケットを作成できます (例: FreeIPA は、ldap/foo へのアクセスのみに制限できます) .example.com)。 これは少し複雑で (PHP にはこれ用の API がありません。正しいフラグを使用して kinit
を生成する必要がある場合があります)、KRB5CCNAME クロスと同じ潜在的な問題がまだあります。リクエスト漏れ。 < /p>
通常の Kerberos 認証の場合、使用法は次のとおりです:
リーリー ###それだけです。 GSSAPI SASL メカニズムは、環境ですでに利用可能な Kerberos チケット ($KRB5CCNAME または gss-proxy 経由など) があることを想定しており、そこで見つかったチケットを使用して認証します。偽装を使用する場合 (LDAP サーバーに設定されていると仮定して)、authz_id を指定する必要があります:
リーリー
ほとんどのldap_*() PHP 関数は C libldap ライブラリの直接ラッパーであるため、そのドキュメントは部分的なリファレンスとして使用できます。
mail による追加のフィルタリングは必要ないようです。メールDN。また、特定の DN を読み取りたい場合は、サブツリー検索ではなく「基本」検索に ldap_read() を使用します。
いいえ、そんなことはありませんでした。ユーザー名 (つまり、クライアントの Kerberos プリンシパル) はクライアント チケットに保存されるため、Web サーバーはチケットを復号化した後、IPA と通信することなくすぐにそれを認識します。