パスワードなしの LDAP ログインと PHP の Kerberos チケットを使用したユーザー情報の取得
P粉071743732
P粉071743732 2024-03-26 10:40:55
0
1
381

FreeIPA/Kerberos を使用して、会社のイントラネット サイトの一部に SSO を実装しようとしています。しかし、このトピックに関する情報はほとんどありません。

テスト ネットワーク上で 3 台のマシンが実行されています:

  1. Centos 8 Stream 上の FreeIPA v4.9.8 サーバー
  2. Debian 11 上の Web サーバー (Apache v2.4.53、PHP v7.4.28)
  3. Kinit および Firefox を使用する Xubuntu 22.04 クライアント

Kinit、Unix ログイン、および Apache Kerberos 認証は機能します。クライアント システム上の Firefox ブラウザは、パスワードなしで FreeIPA WebConfig にログインできます (Kerberos チケットを使用)。この機能をイントラネット ページに移動したいと考えています。これまで、これらのページへのログインは従来の LDAP ログインに基づいていました。ログイン スクリプトを少し調整することで、ユーザーは新しい FreeIPA サーバーにログインできるようになりました。ただし、依然としてパスワードが必要ですが、Kerberos チケットのおかげで、パスワードは実際には必要なくなりました。

問題は、パスワードなしのログインとはどのようなものでしょうか?

ログイン スクリプトの機能スニペット:

リーリー

今、私には 2 つの考えがあります:

  1. ldap_bind() の代わりに ldap_sasl_bind() を使用することもできますが、その関数は php.net (https://www.php.net/manual/en/function.ldap-sasl-bind.php) に文書化されていません。 。誰かがこの機能の使用方法を知っていれば、感謝します。
  2. また、何らかの方法でパスワードなしで ldap_search() を実行して、ユーザー情報 (フルネーム、電子メールなど) を取得できれば幸いです。
###事前にどうもありがとうございました。

######編集:######

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粉071743732
P粉071743732

全員に返信(1)
P粉614840363

Web サーバーに 正しい Kerberos チケットがあることを確認してください。

通常、Kerberos 認証は、包括的な「すべての」チケットではなく、そのサーバーでのみ有効なチケットのみを送信します。クライアントが Web アプリに対して認証すると、取得できるのは HTTP/webapp.example.tld のチケットだけであり、実際にそれを使用してユーザーに代わって LDAP にアクセスすることはできません。

ユーザーに代わって LDAP にアクセスする必要がある場合、次のオプションがあります。

  • ネットワーク アプリケーションは、独自の LDAP ディレクトリ資格情報を持つことができます。おそらくこれが最も簡単な方法です。 Web アプリケーションは、キータブから取得した独自のチケットを使用して、標準のパスワード バインディングまたは Kerberos (SASL) バインディングを使用できます。

    • LDAP は、Web アプリケーションが認証に独自の資格情報を使用する「偽装」もサポートしていますが、

      また、どのアカウントにアクセス許可を取得するかを決定するために、「承認 ID」(authzid) も指定します。 。 たとえば、「webapp」として認証するが、authzid「myuser」を指定した場合 (そして LDAP サーバーが

      許可している場合

      )、「myuser」が通常持つ権限を取得します。 「ウェブアプリ」の代わりに。

  • Web アプリケーションの HTTP ネゴシエーション (SPNEGO) 認証では、「委任」を有効にすることができます。委任
  • マスター krbtgt チケットを Web サーバーに送信します。その後、それが一時チケット キャッシュに配置され、Web アプリケーション環境で使用できるようになります。 ただし、委任にはいくつかの問題があります:

      これにより、クライアントは「forward」フラグを使用して新しい
    1. krbtgt

      チケットをリクエストする必要があるため、すべての HTTP リクエストが遅くなります (Web サーバーがリクエストによる ID ネゴシエーションを回避するために Cookie などを使用できる場合を除く)。認証)、さらなるリクエスト用(例:「セッション」モードの mod_auth_gssapi)。

    2. Web アプリケーションは、アクセスするすべてのユーザー (管理者を含む) のワイルドカード チケットを保存するため、高度に信頼されている必要があります。Web アプリケーション自体が悪用しないと信頼されている場合でも、盗まれる可能性があります。サーバー。
    3. Kerberos を使用するほとんどの API (ldap_sasl_bind() を含む) は、
    4. KRB5CCNAME

      環境変数がチケット キャッシュを指すことを期待します。ただし、環境変数はプロセス スコープであるため、PHP が同じプロセスを再利用するたびに (さらに悪いことに、Apache プロセス内で Web アプリケーションを実行するために mod_php を使用している場合)、無関係なリクエストで環境変数がリークされる可能性があります。

    5. AD では追加のバリエーションが導入されたため、これは特に「制約のない委任」と呼ばれます。

  • ネットワーク アプリケーションは、「制約付き委任」とも呼ばれる S4U2Proxy を使用して、ユーザー
  • に代わって、特定の限定されたサービス セットに対して

    チケットを作成できます (例: FreeIPA は、ldap/foo へのアクセスのみに制限できます) .example.com)。

    これは少し複雑で (PHP にはこれ用の API がありません。正しいフラグを使用して kinit を生成する必要がある場合があります)、KRB5CCNAME クロスと同じ潜在的な問題がまだあります。リクエスト漏れ。

通常の Kerberos 認証の場合、使用法は次のとおりです:

リーリー ###それだけです。 GSSAPI SASL メカニズムは、環境ですでに利用可能な Kerberos チケット ($KRB5CCNAME または gss-proxy 経由など) があることを想定しており、そこで見つかったチケットを使用して認証します。

偽装を使用する場合 (LDAP サーバーに設定されていると仮定して)、authz_id を指定する必要があります:

リーリー

ほとんどの

ldap_*() PHP 関数は C libldap ライブラリの直接ラッパーであるため、そのドキュメントは部分的なリファレンスとして使用できます。

あなたの例ではすでにユーザーの正確な DN が指定されているようです。そのため、

mail による追加のフィルタリングは必要ないようです。メールDN。また、特定の DN を読み取りたい場合は、サブツリー検索ではなく「基本」検索に ldap_read() を使用します。 いいえ、そんなことはありませんでした。ユーザー名 (つまり、クライアントの Kerberos プリンシパル) はクライアント チケットに保存されるため、Web サーバーはチケットを復号化した後、IPA と通信することなくすぐにそれを認識します。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!