quinta-feira, 28 de janeiro de 2010

Ubuntu: Autenticando em um domínio Windows

Há algum tempo, um amigo me perguntou se seria possível adicionar uma máquina linux num domínio Windows. Eu disse que era possível, mas nunca havia ido atrás para tentar descobrir. Nesses últimos dias, me pediram aki no trabalho para pesquisar uma forma de permitir que os servidores usassem o linux sem que fosse necessário criar uma conta para cada máquina. Daí, em vista disso, fui atrás de tentar descobrir como fazer.

A princípio não é uma tarefa difícil. Tudo o que você precisará fazer é configurar alguns arquivos, ingressar a máquina no domínio e configurar o pam para que o sistema busque as informações de logon no servidor de autenticação.

Isso existe aos milhares na internet, com várias soluções prontas onde vc só coloca os dados do seu domínio e pronto, já está funcionando. No entanto, o que eu proponho com esse post não é suprir uma solução pronta, mas explicar como cada parte do conjunto da solução se integra, de forma a produzir o nosso produto final, que é permitir a autenticação em uma máquina com linux usando o Active Directory do Windows Server como provedor.



Primeiramente, vamos ao nosso ambiente de trabalho. Estou usando o Ubuntu 9.10 rodando em uma máquina virtual no VirtualBox. Vamos supor que nosso domínio se chame HEAVEN.BR e o ip do PDC (Primary Domain Controller) seja 192.168.0.128 e nossa máquina cliente se chame cliente.

Para podermos logar no domínio, serão necessárias algumas bibliotecas, que podem ser instaladas com o seguinte comando, no terminal:

sudo aptitude install -y winbind samba smbfs smbclient krb5-user libpam-krb5 krb5-config libkadm55 ntpdate

Agora, para simplificar um pouco o trabalho, vamos criar um alias para o nosso servidor de domínio. Isso simplifica caso seja necessário mudar para um outro controlador de domínio, caso o primário venha a, por exemplo, ficar offline.

Abra o arquivo /etc/hosts e adicione as seguintes linhas no final do arquivo:

#Alias para o controlador de domínio
192.168.0.128 servidor


Kerberos

Agora, para conectarmos no nosso servidor de domínio, há duas alternativas: usando Kerberos e usando o Winbind com o Samba. Na minha opinião, a primeira alternativa é a mais simples de se configurar. No entanto, a segunda opção oferece recursos adicionais, em especial o uso do comando net, bastante conhecido dos administradores de domínio, no entanto, não é necessário na maioria das situações de uso normal do domínio. Portanto, se você possui um domínio Active Directory, a primeira opção é a melhor. No nosso caso, eu estou demonstrando o uso da primeira opção, usando Kerberos.

Como vamos usar o Kerberos para autenticar no Active Directory, vamos às suas configurações. Abra o arquivo /etc/krb5.conf:

Na seção [libdefaults] do arquivo, coloque o nome do seu domínio na opção default_realm, conforme exemplo abaixo:

[libdefaults]
clockskew = 300
default_realm = HEAVEN.BR


A opção clockskew indica o quão sensível à diferenças entre a hora do servidor e a hora da máquina local. Você pode aumentar este tempo, mas é altamente recomendável se assegurar que o cliente e o servidor estão sincronizados, usando um servidor NTP ou, no caso dos PDCs Windows Server a partir da versão 2000, usando o servidor NTP próprio destes.

Na seção [realms] do arquivo, vamos criar uma entrada para nosso domínio, exemplificado abaixo:

[realms]
HEAVEN.BR = {
#voce pode adicionar varios controladores de dominio aqui, relacionando cada um a uma entrada de kdc
#e configurar o principal usando master_kdc
master_kdc = servidor
admin_server = servidor
kpasswd_server = servidor
default_domain = HEAVEN.BR
}


E por último, na seção [domain_realm] mapeamos nosso domínio à uma árvore de busca específica:

[domain_realm]
.heaven.br = HEAVEN.BR
heaven.br = HEAVEN.BR


É necessário respeitar as letras maiúsculas e minúsculas. heaven.br é diferente de HEAVEN.BR.

O nosso arquivo, no final, ficará assim: krb5.conf. Mais informações sobre a configuração do arquivo, vc encontra no FermiLab.

Para testar se a autenticação está funcionando, é só usar o cliente Kinit. Abra um shell e digite kinit. Por padrão, ele vai tentar buscar pelo usuário atualmente logado. Caso queira entrar com um usuário alternativo, pode usar kinit . Para verificar se a autenticação funcionou e o kinit gerou o ticket de usuário, vc pode usar klist para, entre outras coisas, verificar o status do mesmo.

Caso dê um erro dizendo que não é possível encontrar uma máquina que responda pelo AD, adicione no seu arquivo /etc/resolv.conf a seguinte configuração antes de qualquer outra do mesmo tipo:

nameserver servidor

Isso torna o nosso servidor de domínio o nosso servidor de DNS primário, o que resolverá o problema. Tente novamente o kinit.

Samba

Concluído esse passo, é necessário configurar o samba de forma a especificar as ações que devem ser propagadas no sistema local assim que o cliente se conectar através do domínio.

Entre as opções do samba, devemos atentar aos seguintes parâmetros, na seção [global]:

realm = HEAVEN.BR
password server = servidor
workgroup = HEAVEN


O realm é nosso domínio. password server o servidor responsável por fazer a validação do usuário. Normalmente qualquer um dos controladores de domínio. Por último, workgroup é o nome netbios ao qual as máquinas se agruparão. Especial atenção deve ser tomada na opção template homedir. Ela é quem define onde serão criadas as pastas de usuário na máquina local.

template homedir = /home/%D/%U

Desta forma, caso tivéssemos o usuário Vindemiatrix no nosso domínio HEAVEN.BR, o caminho que o samba criaria seria /home/HEAVEN.BR/Vindemiatrix.

Como estamos usando o kerberos para autenticar, podemos fazer com que o samba funcione como um membro do domínio. Para operar neste modo o kerberos precisará estar configurado, como acabamos de mostrar. A opção que faz com que o samba siga esse modo é a seguinte:

security = ads

Finalmente, graças ao subsistema Posix presente nos servidores Windows, todo usuário possui um grupo primário e vários grupos secundários. É possível setar o grupo do usuário no Ubuntu usando um script, que é chamado cada vez que um novo usuário é criado na máquina, pelo samba.

set primary group script = /usr/sbin/usermod -g '%g' '%u'

Sendo %g referente ao usuário e %u ao grupo ao qual o usuário pertence.

Um detalhe interessante que podemos configurar no samba é a opção de omitirmos a necessidade do nome de domínio na hora de logar. Em vez de termos de digitar, por exemplo, vindemiatrix@HEAVEN.BR ou HEAVEN.BR\vindemiatrix, digitamos simplesmente vindemiatrix. Para isso, é só adicionar a seguinte opção em [globals]:

winbind use default domain = yes

O nosso arquivo, no final, ficará assim smb.conf. Mais informações sobre a configuração do arquivo, você encontra no site do Samba.

Ingresso no Domínio

Agora que nossos arquivos estão devidamente configurados, é hora de ingressarmos nossa máquina no domínio. Primeiramente, é necessário que a hora do sistema esteja sincronizada com a hora do servidor. Isso pode ser feito usando-se o comando ntpdate:

ntpdate servidor

Para ingressarmos a máquina no domínio, vamos usar o canivete suíço dos administradores de rede, o net. O comando para ingressar a máquina é o seguinte:

net ads join -U administrador

Lembrando que o usuário que vai adicionar a máquina precisa ter privilégios para tal. Caso a máquina ingresse no domínio, a saída será a seguinte:

Using short domain name -- HEAVEN
Joined 'cliente' to realm 'HEAVEN.BR'


Para testar se a máquina ingressou corretamente, vc pode usar o comando net ads testjoin, que retornará Join is OK em caso positivo.

Para listar os usuários do AD, reinicie o serviço winbind para que ele recarregue as configurações e em seguida use o comando wbinfo:

/etc/init.d/winbind restart
wbinfo -u


Se forem listados os usuários do AD, a máquina está conectada corretamente ao domínio.

Para finalizarmos essa parte, é necessário reiniciar o samba e o winbind, para que eles peguem as configurações dos arquivos que alteramos:

/etc/init.d/winbind stop
/etc/init.d/samba restart
/etc/init.d/winbind start


Configurando o PAM

Depois de tudo configurado, a máquina ingressada no domínio, é necessário fazer com que o sistema reconheça este método como uma alternativa de login na máquina. Para isso, é necessário configurar o PAM para que ele saiba o que fazer e onde procurar estas informações de usuário.

São vários arquivos que devemos alterar: common-account, common-auth, common-session e sudo. Segue abaixo as alterações para cada arquivo:

common-account - /etc/pam.d/common-account

#Arquivo que contêm as definições de autorização para todos os serviços

account sufficient pam_winbind.so
account required pam_unix.so


common-auth - /etc/pam.d/common-auth

#Arquivo que contêm as definições de autenticação para todos os serviços

auth sufficient pam_winbind.so krb5_auth krb5_ccache_type=FILE
auth sufficient pam_unix.so nullok_secure use_first_pass
auth required pam_deny.so
auth optional pam_smbpass.so migrate missingo


common-session - /etc/pam.d/common-session

#Módulos relacionados à sessão comuns à todos os serviços

session required pam_unix.so
session required pam_mkhomedir.so umask=0022 skel=/etc/skel


sudo - /etc/pam.d/sudo

#%PAM-1.0
auth sufficient pam_winbind.so
auth sufficient pam_unix.so use_first_pass
auth required pam_deny.so


@include common-auth
@include common-account

Criando a pasta do domínio e as pastas do usuário

Depois de configurar o PAM para recorrer ao usuário através do winbind, devemos criar uma pasta onde ficará nosso domínio. Conforme configuramos no samba, devemos criar nossa pasta com a mesma sintaxe. Em nosso caso: /home/HEAVEN.BR/

mkdir /home/HEAVEN.BR/

Para evitar problemas com o winbind e com a hora do sistema, vamos colocar para iniciar os dois comandos junto com o sistema operacional. Para isso, abra o arquivo /etc/rc.local e adicione as seguintes linhas:

ntpdate servidor
/etc/init.d/winbind restart


Configurando o NS Switch

Agora que praticamente terminamos de configurar o sistema, é necessário configurar o arquivo /etc/nsswitch.conf para que ele saiba onde procurar as informações de login. É neste arquivo que iremos comunicar ao sistema que ele deve procurar nossas informações de login usando o winbind.

Como estamos lidando com usuários e grupos, nas linhas user e group, altere a configuração para a seguinte:

passwd: compat winbind
group: compat winbind


O arquivo deverá ficar dessa forma: nsswitch.conf.

Finalizando

Agora que o sistema está configurado, para testarmos, reinicie sua máquina e pronto. Você já pode inclusive logar no terminal com seu login de rede e até mesmo usá-lo para se conectar via ssh.

Nota final: É possível utilizar diretamente o kerberos para autenticar, sem que para isso precisemos usar o winbind. No entanto, a implementação atual do kerberos (Heimdal) não dispunha de um módulo que funcionasse corretamente com o PAM, sendo necessário baixar um componente de terceiro. Em vista disso, preferi tomar este rumo e talvez, num futuro próximo, explique como fazer para logarmos usando únicamente o kerberos.

Finalizando, como disse no começo desse post, minha intenção não era fazer só uma receita pronta. Apesar de muitas coisas eu ainda não conhecer e saber seu funcionamento, fiz o possível para que os principais pontos fossem explicados. Espero que este post tenha sido de bastante ajuda.

Fontes:
Windows Networking
Cliente Linux no servidor LDAP
Wiki Seduc Ceará

Sobre o Autor
é um afficcionado por tecnologia. Adora escrever sobre assuntos diversos como programação, misticismo, Rpg e qualquer assunto que desperte seu interesse.

Todos os comentários passam por moderação, ou seja, eles são lidos antes de serem publicados.

Não serão aprovados os comentários que:

* não sejam relacionados ao tema do post;
* contenham pedidos de parceria;
* possuam propagandas (spam);
* possuam link para divulgar seu blog;
* contenham palavrões ou ofensas a pessoas e marcas.

Contatos podem ser feitos pelo formulário de contato ou pelo e-mail.

Postar um comentário

10 comentários:

maximumforma.com disse...

Meu seu blog é espetacular, show, not°10 desejo muito sucesso em sua caminhada e objetivo no seu Hiper blog e que DEUS ilumine seus caminhos e da sua família
Um grande abraço e tudo de bom
Ass:Rodrigo Rocha

eu disse...

Após ter seguido o tutorial, nao consigo mais efetuar login no Ubuntu.
Ja tentei no usuario inserir: dominio\user e a senha definida no Active Directory.
Ja tentei de varias maneiras.

Qdo insiro um usuario cadastrado no proprio Ubuntu ele solicita duas senhas, mas ja tentei de tudo nao. O que pode ser?

Eduardo Rolim disse...

O problema está relacionado com as configurações do pam.d ... Verifique se o arquivo common-account está setado da seguinte maneira:

account sufficient pam_winbind.so
account required pam_unix.so

O primeiro parâmetro da opção account informa se o logon que vc está querendo fazer é necessário para autenticação ou se pode ser pulado ...

Reginaldo disse...

existe um modo mais simples.

sudo apt-get install likewise-open likewise-open-gui

apos o download efetuado procure no menu de aplicativos por domain join. digite o dominio e a senha de administrador, faça logof e no gdm digite nomedodominio\usuario e sua senha.

pronto! vc esta logado no active directory do seu dominio windows!

eduardopy disse...

Cara muito bom teu tutorial, bem obejitvo mas estou com um problema aqui queria ver se tem como tu me ajudar, estou procurando na net alguma solucao tb mas ainda nao achei nada.

segue o erro

root@inlogserver:/# net ads testjoin
[2010/12/12 11:36:23, 0] utils/net_ads.c:279(ads_startup_int)
ads_connect: No logon servers
Join to domain is not valid: No logon servers


VLW!!

tech1 disse...

bom tuturial, vou testar ainda hoje, só uma questão... caso os utilizadores que iniciem sessão tenham uma área configurada, a mesma é mapeada no inicio de sessão??
obrigado

Vindemiatrix disse...

@eduardopy eu acredito que esse erro acontece quando sua configuração de DNS não está apontada para um DNS ligado a um domínio. Tive esse problema em duas situações: uma quando estava em uma rede lógica diferente mas ligada por um roteador que conhece as duas redes, e quando eu tinha minhas entradas no /etc/resolv.conf apontadas para um DNS que não era do domínio.

Acredito que o seu problema pode ser a segunda opção, e nesse caso, crie uma entrada DNS que aponte para ele, já que ele também faz o serviço de DNS para o Active Directory.

Vindemiatrix disse...

@Tech1 eu não testei com pastas existentes. Tudo vai depender das permissões de acesso à pasta, e principalmente do mapeamento do idmap. Se ele mapear um usuário com o mesmo id de sistema, acredito que funcionará.

Não testei sua solução pois não precisei implementar desta maneira. No entanto, vou verificar e ver o que acontece.

Abs!

Kingdownloads disse...

Excelente trabalho!

Meu irmão, tenho uma dúvida. Consegui, através do seu tutorial, ingressar máquinas linux em um domínio Windows (2000). Até aí, tudo bem... Mas, quando a senha do usuário logado está para expirar, o usuário linux não consegue logar na máquina. Dá-se o erro de "x" dias para o senha expirar e a tela do GDM trava, não possibilitando logar-se. O que poderá ser?

Um abraço.

Ezio - eziomribeiro@hotmail.com

Henriqueguitar disse...

Muito trabalhoso... Imagina configurar uma rede com 100 computadores dessa forma! Prefiro usar o CID.