Apache LDAPでネストされたグループのユーザーを認証する方法は?


21

次の設定でLDAP認証を使用しています

 AuthName            "whatever"
 AuthType            Basic
 AuthBasicProvider   ldap
 AuthLDAPUrl         "ldap://server/OU=SBSUsers,OU=Users,OU=MyBusiness,DC=company,DC=local?sAMAccountName?sub?(objectClass=*)"
 Require ldap-group  CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local

これは機能しますが、認証するすべてのユーザーをに入れなければなりませんMySpecificGroup。しかし、LDAPサーバーでは、ユーザーの別のリストを持つMySpecificGroupグループも含むように構成しましたMyOtherGroup

ただし、これらのユーザーMyOtherGroupは認証されていMySpecificGroupないため、すべてを手動で追加する必要があるため、基本的にネストされたグループ化を使用できません。Windows SBS 2003を使用しています。

これを行うためにApache LDAPを構成する方法はありますか?または、無限再帰の可能性があるために許可されない問題がありますか?

回答:


19

AuthLDAPSubGroupDepthこれを機能させるには設定が必要です。ここで指定する整数は、ユーザー検索が中止される前に評価されるサブグループの最大のネストの深さを指定します。

これを設定に追加します。

AuthLDAPSubGroupDepth 1

詳細:ここここ


:私は、Apache 2.2を実行している、それのmod_authnz_ldapはないAuthLDAPSubGroupDepthディレクティブがあるhttpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html
Selivanovパベル

それでは、なぜ更新しないのですか?
バートデヴォス

2
私はDebian Squeezeを実行していますが、安定したディストリビューション(十分にテストされた定期的なセキュリティアップデート)のパッケージを使用することを好みます。Apache 2.3はまだベータ版であり、すぐに安定版または安定版バックポートに登場します。AuthnProviderAlias今のところ使用して、この問題を解決しました。Apache 2.2のソリューションを誰も提供しない場合、報奨金はあなたのものです:)
セリバノフパベル

異なるサーバー上にあるグループの新しい情報を考えると、この方法はまだ機能するとは思わない。
ジェフストランク

3
AuthLDAPSubGroupDepthは、Apache HTTPd 2.4には存在しません。AuthLDAPMaxSubGroupDepthは、使用する正しいディレクティブです。
クリスハリス

33

さらにAuthLDAPSubGroupDepth、これはApache 2.4でのみ使用可能です。MicrosoftAD LDAPを使用する場合、LDAP_MATCHING_RULE_IN_CHAINマッチングルールを使用してネストされたグループを使用して認証を行うことができます。これは、ネットワーク上のクエリが少ないDCサーバーで実行されるため、クライアントでサブグループを検索するよりもはるかに高速です。

Require ldap-filter memberof:1.2.840.113556.1.4.1941:=CN=Access to Apache,OU=My Organization Unit,DC=company,DC=com

文字列1.2.840.113556.1.4.1941はと呼ばれるOIDLDAP_MATCHING_RULE_IN_CHAINです。このOIDは、Microsoftによって割り当てられ、LDAP実装(Active Directoryの一部)で使用されます。他のLDAPサーバーでは使用できません。人間が再利用可能な形式は次のとおりです。iso(1).member_body(2).us(840).microsoft(113556).ad(1).as_schema(4).LDAP_MATCHING_RULE_IN_CHAIN(1941)

Microsoftのドキュメントから:

このルールは、DNに適用されるフィルターに制限されています。これは特別な「拡張」一致演算子で、一致が見つかるまでオブジェクトの祖先のチェーンをルートまでたどります。

こちらもご覧ください:


可能であれば、この10倍に賛成します。RHEL 5を実行しているユーザーにとって、これは優れたソリューションです。ベンダーのソースをコンパイルして最新の機能を取得することは、必ずしも望ましい解決策ではありません!
アーロンコプリー

助けてくれてうれしいです。これは、ApacheでのLDAP_MATCHING_RULE_IN_CHAINの最初の文書化された使用方法だと思います。
ミルチャVutcovici

LDAP_MATCHING_RULE_IN_CHAIN再帰的なグループメンバーシップを取得し、ヘッダーとしてバックエンドサーバーに渡すために使用する方法はありますか(Apacheをリバースプロキシとして使用)??
ガーションパピ

mod_authnz_ldapこれは提供しません。ただしLDAP_MATCHING_RULE_IN_CHAIN、アプリケーションでLDAPフィルターを使用できます。参照:stackoverflow.com/a/34075052/290087
Mircea Vutcovici

6

Apache 2.2の唯一のオプションは、メインの許可グループに含まれるすべてのグループをリストすることです。

Require ldap-group  CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local
Require ldap-group  CN=MyOtherGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local

ネストされたグループが複雑すぎない場合、これは合理的なはずです。


ADドメインの横断(2つのLDAPサーバーを使用)

Webサーバーで実行されているslapd_metaオーバーレイを使用してOpenLDAPをセットアップし、認証をプロキシできます。

/etc/ldap/slapd.confは次のようになります。

database meta
suffix   "DC=company,DC=local"
uri      "ldap://a.foo.com/OU=MyBusiness,DC=company,DC=local"
uri      "ldap://b.foo.com/OU=otherdomainsuffix,DC=company,DC=local"

次に、mod_authnz_ldapスタンザは次のようになります。

AuthName            "whatever"
AuthType            Basic
AuthBasicProvider   ldap
AuthLDAPUrl         "ldapi:///DC=company,DC=local?sAMAccountName?sub?(objectClass=*)"
Require ldap-group  CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local
Require ldap-group  CN=MyOtherGroup,OU=Security Groups,OU=otherdomainsuffix,DC=company,DC=local

これを機能させるにはマッサージが必要ですが、これは一般的な考え方だと思います。


1
残念ながら、グループが異なるADドメインにある場合は機能しません(Domain1_DomainLocal_GroupにはDomain2_Global_Groupが含まれます)。私が最初に試したのは:)
セリバノフパベル

それは、グループの1つが別のサーバー上にあるということですか?それが本当なら、AuthLDAPSubGroupDepthもあなたには機能しないと思います。
ジェフストランク

はい、2つのサーバー、2つのドメイン。LinuxボックスをADに統合してPAM認証を使用することを検討しましたが、Apache 2.0、mod-authnz-external + pwauthはグループをサポートしていないため、mod-auth-pamはサポートされていません。これはすべて悲しいことに:(
セリバノフパベル

1
ああ、あなたが答えを更新したことに気付いていません。OpenLDAP slapd_metaを使用することは解決策かもしれませんが、グループのユーザーを追加/削除し、グループを相互に含めることにより、1つのポイント(Active Directory)で管理されるユーザー権限を取得するこの構成の主なポイントを殺します。追加のOpenLDAPサービスなしのAuthnProviderAliasを使用したアナログソリューションは次のとおりです。<AuthnProviderAlias ldap first-ldap> AuthLDAPURL ... </ AuthnProviderAlias> <AuthnProviderAlias ldap second-ldap> AuthLDAPURL ... </ AuthnProviderAlias> ... AuthBasicProvider first-ldap second -ldap
Selivanovパベル

1
Bart De Vosに賞金を与えることにしました。これは私の質問ではありません。元の質問(私自身の特定なし)のために彼の解決策はシンプルで動作します
セリバノフパベル

4

@Mircea_Vutcoviciが提供する解決策は私にとっては有効でしたが、私の唯一の批判は、ビット演算子を使用していると人々がきしみ音を立てることがあるということです。

たとえば、Apache HTTPdをADグループ認証のフロントエンドとして使用するApache Bloodhoundインストールを仲間の開発者グループに引き渡します。彼らは、ビット単位の演算子で問題を抱えるでしょう。もちろん、管理者はきしみにならないでしょう...私は願っています。

そうは言っても、ビット演算子を使用せず、複数のldap-group定義を使用しないソリューションがあります。

次の設定は私のために機能します:

<Location /protected>
    # Using this to bind
    AuthLDAPURL "ldap://<MY_SERVER>:3268/<MY_SEARCH_BASE>?sAMAccountName?sub?(objectClass=user)"
    AuthLDAPBindDN "<MY_BIND_DN>"
    AuthLDAPBindPassword "<MY_PASSWORD>"
    LDAPReferrals Off

    AuthType Basic
    AuthName "USE YOUR AD ACCOUNT"
    AuthBasicProvider ldap
    Require ldap-group <MY_PARENT_GROUP>
    AuthLDAPMaxSubGroupDepth 1
    AuthLDAPSubgroupAttribute member
    AuthLDAPSubGroupClass group
    AuthLDAPGroupAttribute member
    AuthLDAPGroupAttributeIsDN on
</Location>

重要な部分は次の構成でした:

AuthLDAPSubGroupClass group

AuthLDAPMaxSubGroupDepthは、それ自体では機能せず、AuthLDAPSubgroupAttributeと組み合わせた場合も機能しません。サブグループに対する認証が機能し始めたのは、少なくとも私と私の状況ではAuthLDAPSubGroupClassを使用したときだけでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.