Como autenticar usuários em grupos aninhados no Apache LDAP?

21

Estou trabalhando com autenticação LDAP com a seguinte configuração

 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

Isso funciona, no entanto, tenho que colocar todos os usuários nos quais quero me autenticar MySpecificGroup. Mas no servidor LDAP eu configurei que MySpecificGrouptambém contém o grupo MyOtherGroupcom outra lista de usuários.

Mas esses usuários MyOtherGroupnão são autenticados, tenho que adicioná-los manualmente MySpecificGroupe basicamente não podemos usar o agrupamento aninhado. Estou usando o Windows SBS 2003.

Existe uma maneira de configurar o Apache LDAP para fazer isso? Ou existe um problema com possível recursão infinita e, portanto, não é permitido?

marca
fonte

Respostas:

19

Você precisa definir AuthLDAPSubGroupDepthpara fazer isso funcionar. O número inteiro que você fornece aqui especifica a profundidade máxima de aninhamento de subgrupos que será avaliada antes que a pesquisa do usuário seja descontinuada.

Adicione isto à sua configuração:

AuthLDAPSubGroupDepth 1

Mais informações: aqui e aqui .

Bart De Vos
fonte
Estou executando o Apache 2.2, é mod_authnz_ldap não tem AuthLDAPSubGroupDepth directiva: httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html
Selivanov Pavel
Então, por que não atualizar?
Bart De Vos
2
Estou executando o Debian Squeeze e prefiro usar pacotes de distribuição estável: atualizações de segurança regulares e bem testadas. O Apache 2.3 ainda é beta, aparecerá em backports estáveis ​​ou estáveis ​​em breve. Eu resolvi esse problema usando AuthnProviderAliaspor enquanto. Se ninguém irá oferecer solução para Apache 2.2, generosidade é sua :)
Selivanov Pavel
dadas as novas informações dos grupos em servidores diferentes, acho que esse método ainda não funcionará.
Jeff Strunk
3
AuthLDAPSubGroupDepth não existe no Apache HTTPd 2.4. AuthLDAPMaxSubGroupDepth é a diretiva correta a ser usada.
21415 Chris Chris
33

Além disso AuthLDAPSubGroupDepth, disponível apenas no apache 2.4, é possível, ao usar o Microsoft AD LDAP, autorizar usando grupos aninhados usando a regra de correspondência LDAP_MATCHING_RULE_IN_CHAIN. Isso é muito mais rápido do que pesquisar subgrupos no cliente, porque isso é feito no servidor DC com menos consultas na rede.

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

A sequência 1.2.840.113556.1.4.1941é um OID chamado LDAP_MATCHING_RULE_IN_CHAIN. Esse OID é atribuído pela Microsoft para ser usado com sua implementação LDAP (parte do Active Directory). Você não pode usá-lo com outros servidores LDAP. O formato redeable humano é:iso(1).member_body(2).us(840).microsoft(113556).ad(1).as_schema(4).LDAP_MATCHING_RULE_IN_CHAIN(1941)

Da documentação da Microsoft:

Esta regra é limitada aos filtros que se aplicam ao DN. Este é um operador de correspondência especial "estendido" que percorre a cadeia de ascendência em objetos até a raiz até encontrar uma correspondência.

Veja também:

Mircea Vutcovici
fonte
Eu votaria neste 10x se pudesse. Para as pessoas que executam o RHEL 5, esta é uma ótima solução. Compilar a fonte do fornecedor para obter os recursos mais recentes nem sempre é uma solução desejável!
Aaron Copley
Fico feliz que tenha ajudado. Eu acho que esse foi o primeiro uso documentado do LDAP_MATCHING_RULE_IN_CHAIN ​​no apache.
Mircea Vutcovici
Existe uma maneira de usar LDAP_MATCHING_RULE_IN_CHAINpara recuperar a associação do grupo recursivo e passá-lo como um cabeçalho para um servidor back-end (usando o Apache como um proxy reverso)?
Gershon Papi
mod_authnz_ldapnão fornece isso. No entanto, você pode usar o LDAP_MATCHING_RULE_IN_CHAINfiltro LDAP no seu aplicativo. Veja: stackoverflow.com/a/34075052/290087
Mircea Vutcovici
6

Parece que sua única opção no Apache 2.2 é listar todos os grupos incluídos pelo seu grupo autorizado principal.

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

Isso deve ser razoável se seus grupos aninhados não forem muito complicados.


Cruzando domínios do AD (usando dois servidores LDAP)

Você pode configurar o OpenLDAP com a sobreposição slapd_meta em execução no servidor da Web para proxy sua autenticação.

O arquivo /etc/ldap/slapd.conf deve se parecer com:

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"

Então, sua sub-rotina mod_authnz_ldap seria algo como:

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

Isso exigirá alguma massagem para que funcione, mas acho que essa é a ideia geral.

Jeff Strunk
fonte
1
Infelizmente, isso não funciona quando os grupos estão em domínios diferentes do AD (Domain1_DomainLocal_Group inclui Domain2_Global_Group). Foi a primeira coisa que eu tentei :)
Selivanov Pavel
Isso significa que um dos grupos está em um servidor diferente? Se isso for verdade, suspeito que AuthLDAPSubGroupDepth também não funcionará para você.
Jeff Strunk
Sim, dois servidores, dois domínios. Pensei em integrar a caixa do Linux no AD e usar a autenticação do PAM, mas o mod-auth-pam não é suportado desde o apache 2.0, o mod-authnz-external + pwauth não suporta grupos. Isso tudo é infelizmente :(
Selivanov Pavel
1
Não notei que você atualizou a resposta. Usar o OpenLDAP slapd_meta pode ser a solução, mas acaba com o ponto principal dessa configuração: obtenha direitos de usuário gerenciados em um único ponto (Active Directory) adicionando / excluindo usuários de grupos e incluindo grupos um no outro. Aqui está a minha solução analógica com o AuthnProviderAlias ​​sem serviço OpenLDAP adicional: <AuthnProviderAlias ​​ldap first-ldap> AuthLDAPURL ... </AuthnProviderAlias> <AuthnProviderAlias ​​ldap second-ldap> AuthLDAPURL ... </AuthnProviderAlias> ... AuthBasicProvider primeiro -ldap
Selivanov Pavel
1
Decidi dar uma recompensa a Bart De Vos: essa não é minha pergunta; para pergunta original (sem a minha própria específica) a solução é simples e vai trabalhar
Selivanov Pavel
4

Embora a solução fornecida por @Mircea_Vutcovici tenha funcionado para mim, minha única crítica é que as pessoas podem ficar melindrosas quando vêem operadores bit a bit em uso.

Por exemplo, entregarei uma instalação do Apache Bloodhound, que usa o Apache HTTPd como front-end com autenticação de grupo do AD, a um grupo de colegas desenvolvedores. Eles terão problemas em lidar com os operadores bit a bit. Administradores não serão tão delicados, é claro ... espero.

Dito isto, tenho uma solução que não usa o operador bit a bit e que não usa várias definições de grupo LDAP.

A seguinte configuração funciona para mim:

<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>

A parte crítica foi a seguinte configuração:

AuthLDAPSubGroupClass group

AuthLDAPMaxSubGroupDepth não funciona por si só, nem quando associado a AuthLDAPSubgroupAttribute. Foi somente quando eu usei AuthLDAPSubGroupClass que a autenticação em subgrupos começou a funcionar ... pelo menos para mim e minha situação.

Chris Harris
fonte