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) ?>(インターセプト)
ああああ
Web サーバーに 正しい Kerberos チケットがあることを確認してください。
通常、Kerberos 認証は、包括的な「すべての」チケットではなく、そのサーバーでのみ有効なチケットのみを送信します。クライアントが Web アプリに対して認証すると、取得できるのは
HTTP/webapp.example.tld
のチケットだけであり、実際にそれを使用してユーザーに代わって LDAP にアクセスすることはできません。ユーザーに代わって LDAP にアクセスする必要がある場合、次のオプションがあります。
また、どのアカウントにアクセス許可を取得するかを決定するために、「承認 ID」(authzid) も指定します。 。 たとえば、「webapp」として認証するが、authzid「myuser」を指定した場合 (そして LDAP サーバーが
許可している場合)、「myuser」が通常持つ権限を取得します。 「ウェブアプリ」の代わりに。
マスター krbtgt チケットを Web サーバーに送信します。その後、それが一時チケット キャッシュに配置され、Web アプリケーション環境で使用できるようになります。
ただし、委任にはいくつかの問題があります:
これにより、クライアントは「forward」フラグを使用して新しい- krbtgt
Web アプリケーションは、アクセスするすべてのユーザー (管理者を含む) のワイルドカード チケットを保存するため、高度に信頼されている必要があります。Web アプリケーション自体が悪用しないと信頼されている場合でも、盗まれる可能性があります。サーバー。 -
Kerberos を使用するほとんどの API (ldap_sasl_bind() を含む) は、- KRB5CCNAME
AD では追加のバリエーションが導入されたため、これは特に「制約のない委任」と呼ばれます。
チケットをリクエストする必要があるため、すべての HTTP リクエストが遅くなります (Web サーバーがリクエストによる ID ネゴシエーションを回避するために Cookie などを使用できる場合を除く)。認証)、さらなるリクエスト用(例:「セッション」モードの mod_auth_gssapi)。
環境変数がチケット キャッシュを指すことを期待します。ただし、環境変数はプロセス スコープであるため、PHP が同じプロセスを再利用するたびに (さらに悪いことに、Apache プロセス内で Web アプリケーションを実行するために mod_php を使用している場合)、無関係なリクエストで環境変数がリークされる可能性があります。
チケットを作成できます (例: FreeIPA は、ldap/foo へのアクセスのみに制限できます) .example.com)。
これは少し複雑で (PHP にはこれ用の API がありません。正しいフラグを使用して
kinit
を生成する必要がある場合があります)、KRB5CCNAME クロスと同じ潜在的な問題がまだあります。リクエスト漏れ。通常の Kerberos 認証の場合、使用法は次のとおりです:
リーリー ###それだけです。 GSSAPI SASL メカニズムは、環境ですでに利用可能な Kerberos チケット ($KRB5CCNAME または gss-proxy 経由など) があることを想定しており、そこで見つかったチケットを使用して認証します。リーリー
ほとんどのldap_*()
あなたの例ではすでにユーザーの正確な DN が指定されているようです。そのため、PHP 関数は C libldap ライブラリの直接ラッパーであるため、そのドキュメントは部分的なリファレンスとして使用できます。
mail
による追加のフィルタリングは必要ないようです。メールDN。また、特定の DN を読み取りたい場合は、サブツリー検索ではなく「基本」検索に ldap_read() を使用します。
いいえ、そんなことはありませんでした。ユーザー名 (つまり、クライアントの Kerberos プリンシパル) はクライアント チケットに保存されるため、Web サーバーはチケットを復号化した後、IPA と通信することなくすぐにそれを認識します。