Desenvolvimento

5 abr, 2012

Integrando MediaWiki com LDAP

Publicidade

Neste artigo, saiba mais sobre a ligação do MediaWiki com o LDAP para autenticação. Usar o LDAP para autenticação simplifica o gerenciamento de usuários para que não tenha que manter usuários e permissões em dois ou mais locais diferentes. Como muitas soluções PHP possuem suporte à autenticação LDAP disponível, o LDAP pode ser sua melhor opção para criar um repositório de grupos e usuários central.

Antes de começar, é necessário possuir:

  •     PHP 5.1 ou superior (Consulte o site do MediaWiki para obter detalhes sobre as versões requeridas do PHP);
  •     MySQL 4.0 ou superior ou PostgreSQL 8.1 ou superior;
  •     O módulo de autenticação LDAP PHP.

Consulte “Recursos” para obter links.

MediaWiki

O MediaWiki é uma solução implementada em PHP que fornece a funcionalidade wiki— a capacidade para qualquer usuário com as permissões corretas editar os conteúdos de uma página da web. Há muitos exemplos de MediaWiki em ação—o mais famoso é provavelmente a Wikipédia, que atende a milhões de usuários no mundo todo (consulte “Recursos”).

É possível fazer o download do MediaWiki gratuitamente (consulte “Recursos”). O MediaWiki oferece uma visão geral resumida sobre a instalação do MediaWiki em seu sistema após ter feito o download.

ApacheDS

ApacheDS é uma implementação LDAP escrita na linguagem Java. É uma boa solução para teste e uso em quase todas as plataformas devido a sua natureza multiplataforma.

LDAP é um protocolo de aplicativo que especifica um método para acessar e armazenar informações de diretório. Geralmente, essas informações de diretório estão na forma de informações sobre os usuários, como nomes, nomes de usuários e grupos aos quais os usuários pertencem. É possível usar implementações LDAP para muitas coisas, desde diretórios de endereço de email corporativos até autenticação e autorização.

Além de usar o ApacheDS para serviços, é possível instalar o Apache Directory Studio para ajudá-lo a administrar serviços de diretório. Ele é um plug-in para Eclipse que fornece uma interface gráfica com o usuário (GUI) para navegar facilmente por uma árvore LDAP e visualizar e editar usuários e grupos.

Instalação do ApacheDS

Há duas maneiras de instalar o ApacheDS para testar a autenticação com o MediaWiki:

  • Instalar o plug-in do Apache Directory Studio no ambiente de desenvolvimento integrado (IDE) do Eclipse;
  • Instalar apenas o servidor ApacheDS.

Instalação do plug-in do Apache Directory Studio no Eclipse IDE

A instalação do plug-in do Apache Directory Studio é acompanhada com uma versão integrada do servidor ApacheDS que é possível executar e usar. Para seguir este artigo, esta solução é ideal porque você pode configurar e executar a solução rapidamente.

Para instalar o Apache Directory Studio, abra o Eclipse IDE, selecione Help > Install New Software e insira a URL do site de atualização dos Apache Directory Services. Certifique-se de selecionar todos os recursos e, em seguida, clique em Next para instalá-los. 

Se concordar com todos os termos e condições, aceite-os e continue. É necessário reiniciar o Eclipse para que as mudanças entrem em vigor.

Depois de reiniciar o Eclipse, alterne para a perspectiva LDAP selecionando a opção de menu Window > Open Perspective.

Para criar uma nova instância de servidor, clique na guia Server e clique no botão Add . Nomeie o novo servidor local e, a seguir, clique em Finish quando tiver terminado. O servidor pode ser iniciado clicando em Run no menu de contexto.

É necessário criar uma conexão com o servidor antes de ser possível navegar em seu diretório do LDAP com o navegador LDAP. Para criar a conexão com o servidor, clique no servidor na guia Servers e selecione LDAP Browser > Create Connection. O plug-in cria uma nova conexão na guia Connections.

Instalação apenas do servidor ApacheDS

Para instalar apenas o servidor ApacheDS, faça o download do arquivo binário apropriado para seu sistema operacional no site de download do ApacheDS (consulte “Recursos”‘).

Se a versão binária em archive for a usada, extraia-a para uma pasta depois da conclusão do download. Depois de extrair os arquivos para uma pasta, é necessário configurar uma partição de exemplo para iniciar os serviços ApacheDS (consulte “Recursos”). Se você não configurar a partição de exemplo, receberá erros ao tentar iniciar os serviços.

Depois de ter feito a extração, é possível executar o arquivo apacheds.bat se estiver usando o Microsoft Windows. Execute o shell script apacheds.sh se estiver usando Mac OS X ou Linux.

Para conectar-se ao servidor recém-criado, use LDAP Browser > Create Connection. A nova conexão poderá ser vista na guia Connections. Os detalhes da conexão também poderão ser vistos na guia LDAP Browser.

Configuração de usuários e grupos

Antes de continuar com a execução do MediaWiki, será necessário configurar alguns usuários e grupos para testar a autenticação. Se quiser simplesmente importar alguns usuários e grupos de amostra, é possível importar o arquivo em Formato de Troca de Dados LDAP (LDIF) incluído neste artigo (consulte Download).

Se estiver configurando a estrutura sozinho, é necessário incluir uma entrada de contexto selecionando New > Context Entry no menu de atalho. Isso permite a inclusão de componentes e a organização de domínio para incluir seus usuários e grupos.

Configuração de usuários

O método mais fácil de configurar um usuário usando o navegador LDAP é clonar uma entrada existente. O plug-in ApacheDS é acompanhado de um usuário, admin, já configurado. O Distinguished Name (DN) de LDAP do usuário admin é uid=admin,ou=system. O DN de um usuário ou grupo é o nome completo que identifica a entidade exclusivamente. A seção “Configurando autenticação” descreve melhor os DNs.

Realize as seguintes etapas para clonar a entrada admin :

  •  Selecione LDAP > New Entry;
  • Selecione Create entry from scratch, como mostra a figura abaixo:

  • Adicione a classe de objeto inetOrgPerson e, a seguir, clique em Next:

  • Adicione um nome de usuário exclusivo atribuído ao uid e, a seguir, clique em Next:

  • Adicione os valores para os campos cn e sn e, a seguir, clique em Finish:

Agora que o usuário foi criado, é possível encontrá-lo no navegador LDAP.

É possível editar uma entrada LDAP clicando na entrada na lista e então selecionando Edit Entry no menu de contexto ou pressionando a tecla F7 . Editando as entradas, é possível alterar o nome do usuário (cn) e como o nome do usuário é exibido (displayName). Certifique-se de alterar a senha do usuário para não esquecer mais tarde quando estiver testando o login do MediaWiki.

Configuração de grupos

É possível configurar um grupo para seus usuários selecionando New > Entry. Na janela Object Classes, selecione a classe de objeto groupOfUniqueNames. 

Agora, siga as mesmas etapas usadas para configurar o usuário, mas defina o campo cn para o nome do grupo em vez de usar o campo uid . É possível adicionar o DN de um usuário nos valores para o atributo uniqueMember . A figura abaixo mostra como o grupo é exibido no navegador LDAP quando você tiver concluído.

Agora que os usuários e grupos foram configurados, você está pronto para configurar o MediaWiki e adicionar a extensão adequada para fazer a autenticação diante do seu diretório LDAP.

Instalação do MediaWiki

Para instalar o MediaWiki, faça o download do archive no site do MediaWiki (consulte “Recursos”). As etapas de alto nível para instalá-lo são:

  1. Extraia o conteúdo do archive em uma pasta disponível no seu servidor da web;
  2. Em seu navegador, vá até o diretório de configuração (por exemplo, http://localhost/mediawiki/config/index.php);
  3. O instalador do MediaWiki irá orientar no restante das etapas.

Para obter mais informações sobre a instalação do MediaWiki, consulte “Recursos” para ver o guia de instalação completo.

Instalação do módulo LDAP do MediaWiki

Quando o MediaWiki estiver configurado e em execução, é necessário instalar o módulo LDAP do MediaWiki para fazer a ligação com a instância do ApacheDS e autenticar os usuários.

Para instalar o módulo, acesse o site da extensão de autenticação LDAP do MediaWiki (consulte “Recursos”) e faça o download da captura instantânea. Extraia a extensão na pasta mediawiki/extensions para que sua pasta de extensões seja como a da listagem.

mwuser@umediawiki161:/var/www/mediawiki/extensions$ ls
LdapAuthentication README

Agora que a extensão foi instalada na pasta correta, você está pronto para modificar o arquivo LocalSettings.php e incluir os valores de configuração para a extensão.

Configurar a autenticação

Configurar o módulo para contrapor ao LDAP é provavelmente a parte mais difícil do processo. Os nomes no LDAP podem ser confusos, portanto, é difícil fazer com que eles sejam corretos sem saber o que eles significam.

Em um diretório, as entradas recebem designações de classe no campo objectClass. É importante lembrar que uma entrada pode conter mais que uma instância do mesmo campo, mas com valores diferentes. Qualquer entrada pode conter mais de um par campo-valor objectClass.

As classes descrevem quais campos são requeridos e permitidos na entrada. Um grupo, por exemplo, é simplesmente uma entrada que contém a classe de objeto groupOfUniqueNames . As entradas com essa classe podem ter um ou mais uniqueMember, que contém o DN de um membro (usuário) para esse grupo. Os usuários, por outro lado, são geralmente entradas de tipo inetOrgPerson para autenticação.

No ApacheDS, são configuradas as entradas que contêm os DNs tanto para usuários quanto para grupos. Como mencionado anteriormente, o DN de LDAP de um usuário ou grupo é o nome completo que identifica a entidade exclusivamente. O DN contém um caminho separado por vírgulas de campos LDIF que começam com escopo específico e qualificam o objeto completamente. Se o DN representa um usuário, ele pode conter o nome comum (cn) ou o identificador de usuário (uid).

Por exemplo, um determinado usuário no novo diretório ApacheDS, como editor1, o DN poderia ser uid=editor1,ou=users,o=wiki,dc=mywiki,dc=com. A Tabela 1 contém mais informações sobre os campos nesse DN.

Campo Exemplo Descrição
uid editor1 O identificador exclusivo para o nome do usuário, geralmente o nome de login do usuário.
ou users O nome da unidade organizacional à qual o usuário pertence.
o wiki O nome da organização.
dc dc=mywiki,dc=com O componente de domínio da organização. Geralmente corresponde ao nome do domínio da Internet. Por exemplo, essa entrada dc pode corresponder a mywiki.com.

Grupos são especificados de forma muito semelhante aos usuários, no sentido de que o campo que identifica exclusivamente o grupo pode ser o campo de nome comum (cn) em vez de uid. Um exemplo de DN de grupo é cn=wikiusers,ou=groups,o=wiki,dc=mywiki,dc=com.

Consulte Recursos para obter mais informações sobre LDIF.

Com uma compreensão básica dos DNs em LDAP, é mais fácil saber o que inserir na configuração. Para adicionar a configuração ao MediaWiki, edite o arquivo LocalProperties.php no diretório inicial do MediaWiki e inclua o código mostrado na listagem abaixo. 

require_once("$IP/extensions/LdapAuthentication/LdapAuthentication.php");
$wgAuth = new LdapAuthenticationPlugin();

$wgLDAPDomainNames = array("ApacheDS");
$wgLDAPServerNames = array("ApacheDS" => "ldap.example.com");
$wgLDAPPort = array("ApacheDS" => 10389);
$wgLDAPEncryptionType = array( "ApacheDS" => "clear");

$wgLDAPProxyAgent = array(
"ApacheDS"=>"uid=proxyuser,ou=users,o=wiki,dc=mywiki,dc=com");
$wgLDAPProxyAgentPassword = array( "ApacheDS"=>"password");
$wgLDAPGroupUseRetrievedUsername = array("ApacheDS"=>true);
$wgLDAPSearchAttributes = array( "ApacheDS" => "uid");
$wgLDAPBaseDNs = array( "ApacheDS"=>"dc=mywiki,dc=com");
$wgLDAPGroupBaseDNs = array( "ApacheDS"=>"ou=groups,o=wiki,dc=mywiki,dc=com");
$wgLDAPUserBaseDNs = array( "ApacheDS"=>"ou=users,o=wiki,dc=mywiki,dc=com");

$wgLDAPGroupUseFullDN = array( "ApacheDS"=>true );
$wgLDAPLowerCaseUsername = array( "ApacheDS"=>true);
$wgLDAPGroupObjectclass = array( "ApacheDS"=>"groupofuniquenames" );
$wgLDAPGroupAttribute = array( "ApacheDS"=>"uniquemember" );
$wgLDAPGroupNameAttribute = array( "ApacheDS"=>"cn" );

$wgLDAPRequiredGroups = array( "ApacheDS" =>
array("cn=WikiUsers,ou=groups,o=wiki,dc=mywiki,dc=com"));
$wgLDAPGroupSearchNestedGroups = array( "ApacheDS"=>false );

Como é possível ver, todas as entradas são variáveis que são atribuídas aos arrays. Em cada array, uma entrada é atribuída para a chave que é o nome escolhido para a variável $wgLDAPDomainNames.

As informações mostradas na tabela a seguir configuram as informações de domínio e host.

Configuração Descrição
$wgLDAPDomainNames O nome da região para autenticação. Esses elementos são exibidos aos usuários em uma caixa suspensa, portanto, escolha nomes que façam sentido para eles. Os nomes podem ser quaisquer valores arbitrários, mas as outras chaves de configuração usam esses nomes em seus arrays.
$wgLDAPServerNames Os nomes do host dos servidores nos quais os serviços LDAP estão executando.
$wgLDAPPort A porta para LDAP, se a ela for uma porta não padrão. Como a porta LDAP padrão (389, 636 para LDAP por SSL) é menor que 1024, privilégios elevados para fazer a ligação à porta podem ser necessários.
$wgLDAPEncryptionType O tipo de criptografia a ser usado para a conexão LDAP. Não use nada diferente de tls ou ssl em uma implementação de produção ou quando estiver usando informações de usuários reais.

Depois de ter configurado as informações de domínio e host, é possível configurar um usuário para fazer a ligação com o diretório do LDAP. Também é possível permitir acesso anônimo, mas é possível que isso não esteja de acordo com seus objetivos de segurança. As configurações do usuário de proxy são mostradas a seguir.

Configuração Descrição
$wgLDAPProxyAgent O DN completo para o usuário usar na ligação ao LDAP. Não use o usuário administrativo de LDAP.
$wgLDAPProxyAgentPassword A senha para o usuário de proxy.

Depois de fazer a ligação ao diretório do LDAP com o usuário de proxy de forma bem sucedida, é necessário especificar os DNs base em que procurar informações de usuários. Essas definições de configuração são explicadas em mais detalhes abaixo.

Configuração Descrição
$wgLDAPGroupUseRetrievedUsername Configure para verdadeiro para usar o nome do usuário conforme recuperado do LDAP. Isso ajuda a assegurar que o valor correto seja usado ao filtrar grupos que contenham o usuário.
$wgLDAPSearchAttributes O nome do campo LDIF para procurar usando o nome de login. Muitas vezes, deve ser uid.
$wgLDAPBaseDNs O DN base para usar em procuras. Configure isso para o DN do seu domínio ou organização.
$wgLDAPGroupBaseDNs O DN base para os grupos no diretório do LDAP.
$wgLDAPUserBaseDNs O DN base em que os usuários são armazenados no diretório do LDAP.

O acesso de grupo é controlado pelas configurações mostradas na tabela a seguir.

Configuração Descrição
$wgLDAPGroupUseFullDN Se definido como verdadeiro, o DN completo do grupo é usado para ligação. Como você está sendo específico no nome do grupo, use verdadeiro aqui.
$wgLDAPLowerCaseUsername Converte ou mantém o nome de login do usuário em minúsculas se definido como verdadeiro.
$wgLDAPGroupObjectclass O nome da classe de objeto do grupo que contém seus usuários. Os exemplos nesse artigo usam a classe groupOfUniqueNames . É possível digitar todo o valor em minúscula aqui.
$wgLDAPGroupAttribute O campo a se procurar no grupo para encontrar o DN do usuário. Para a classe groupOfUniqueNames , é o campo uniqueMember . O valor pode ser em minúscula.
$wgLDAPGroupNameAttribute O atributo do nome do grupo. Nos exemplos nesse artigo, o atributo é cn.
$wgLDAPRequiredGroups Esta variável permite que você restrinja o acesso por grupo. Essa deve ser o DN completo do grupo que contém os usuários capazes de acessar sua instalação do MediaWiki.
$wgLDAPGroupSearchNestedGroups A menos que você saiba que possui grupos aninhados, deixe este valor como falso por motivos de desempenho.

Agora que o módulo de autenticação LDAP para MediaWiki foi configurado, acesse o seu site do MediaWiki e tente efetuar o login no MediaWiki usando um dos usuários criados. Se tudo correr bem, o MediaWiki efetua login e você passa a ser um usuário autenticado. Se você obtiver um erro em sua tentativa de login, consulte a seção “Resolução de problemas” para saber mais sobre como é possível rastrear a origem do erro.

Segurança

Para facilitar o uso e teste, o exemplo de LDAP nesse artigo foi feito em texto não criptografado. Porém, essa certamente não é uma prática recomendada para um sistema de produção. A transmissão de informações em texto não criptografado permite que as pessoas com conhecimentos para tal “espionem” as conversas entre o MediaWiki e o servidor do LDAP. Essas pessoas podem obter informações de usuários e senhas, o que pode levar a resultados catastróficos para sua organização.

Antes de implementar uma solução de autenticação LDAP na produção, certifique-se de alterar a variável $wgLDAPEncryptionType para tls ou ssl. Eu testei a autenticação MediaWiki para LDAP em texto não criptografado usando máquinas virtuais isoladas em uma rede apenas de hosts, o que me permitiu fazer testes realistas sem expor nenhuma informação a pessoas externas. Frequentemente, é mais fácil fazer com que tudo esteja funcionando primeiro e, depois, implementar uma solução de criptografia de Secure Sockets Layer (SSL), porque a criptografia vem com seus próprios desafios. Durante a configuração, assegure-se de que está realmente depurando problemas de LDAP e não problemas de certificado de segurança.

Resolução de problemas

Um dos benefícios de usar o servidor independente ApacheDS é que é possível modificar facilmente os arquivos de propriedade de criação de log para exibir informações de depuração detalhadas no console. Mesmo que você acabe usando um diretório LDAP diferente para as suas necessidades de produção, ser capaz de depurar informações no lado do servidor permite determinar se os DNs base e as outras propriedades especificadas estão configurados corretamente. À medida que você faz consultas para encontrar usuários e grupos, os DNs e filtros para elas são impressos na saída do console do servidor juntamente com os resultados da pesquisa.

A depuração no servidor também permite certificar que a conexão está sendo feita corretamente. Se estiver tendo problemas com a ligação ao diretório LDAP, verificar se a conexão está sendo feita corretamente é o primeiro passo a ser dado.

Além disso, é possível ligar a depuração para o módulo de autenticação LDAP do MediaWiki. As duas entradas adicionadas ao seu arquivo LocalSettings.php para mostrar a depuração são mostradas abaixo. 

$wgLDAPDebug = 5;
$wgDebugLogGroups["ldap"] = "/tmp/ldap.log";

Tome cuidado com quem pode visualizar essas informações de depuração. Se o nível de depuração for configurado como maior que 3, o módulo de autenticação LDAP imprime informações confidenciais nos logs. É necessário se certificar de que as linhas desses valores são comentadas em uma instância de produção para que nenhuma informação confidencial seja impressa nos logs.

Resumo

MediaWiki é uma solução de PHP que pode ser usada para permitir que os usuários editem e publiquem facilmente o seu próprio conteúdo na web, tornando-a ideal para bases de conhecimento internas e compartilhamento de informações. As soluções de compartilhamento de conhecimento geram preocupações sobre o acesso para editar os dados, por isso o LDAP é útil. Uma solução LDAP permite gerenciar usuários e grupos de forma centralizada em um formato padronizado que pode ser acessado por uma grande variedade de clientes.

Download

Sample LDIF file Example.zip 1KB HTTP

Recursos

Aprender

Obter produtos e tecnologias

  • Faça o download do MediaWiki no site oficial.
  • Faça o download do ApacheDS como um servidor independente ou plug-in para o Eclipse.
  • Instale o módulo de autenticação LDAP do MediaWiki na página Extension:LDAP_Authentication .

Discutir

  • Participe da comunidade do developerWorks. Entre em contato com outros usuários do developerWorks, enquanto explora os blogs, fóruns, grupos e wikis orientados ao desenvolvedor.

***

Sobre o autor: Nathan A. Good mora na área de Twin Cities em Minnesota. Profissionalmente, ele executa desenvolvimento de software, arquitetura de software e administração de sistemas. Quando não está desenvolvendo software, ele se diverte montando PCs e servidores, lendo sobre novas tecnologias e trabalhando com elas e tentando atrair a atenção de seus amigos para o software livre. Ele escreveu e coescreveu muitos livros e artigos, incluindo Professional Red Hat Enterprise Linux 3, Regular Expression Recipes: A Problem-Solution Approach e Foundations of PEAR: Rapid PHP Development.