Ontem passei por maus bocados tentando colocar um box linux (Ubuntu 7.04) pra funcionar fazendo logon em um Active Directory, e de quebra ainda fazer ele navegar passando pelo proxy autenticado do ISA server.
Encontrei alguns artigos e tutoriais no nosso querido amigo Google. O que mais me interessou foi este, por se tratar de instalação no ubuntu, e também pela linguagem bem simplificada. Gosto muito de ver pessoas que trabalham com software livre interessadas também na qualidade do material passado à comunidade.
Como o artigo está em inglês (e nem todo mundo tem intimidade com o idioma), vou fazer um resumão do howto aqui no blog.
Ao final desse post, tudo vai estar funcionando após termos cumprido estes passos:
- Checar a conectividade com os servidores
- Acertar a hora da máquina
- Definir um nome para a máquina cliente
- Instalar e configurar os pacotes necessários
- Testar a configuração
- Ver tudo funcionando =)
Considerações Iniciais
Para os que não sabem, o Microsoft® ActiveDirectory é um serviço de diretório, combinado com um sistema de autenticação baseada em tickets. Em outras palavras, é uma implementação do serviço de diretórios LDAP com o Kerberos, do MIT. É importante separarmos serviço de diretório e autenticação, pois utilizaremos estes itens separadamente na hora da implementação do serviço no linux.Termos Utilizados
- AD: Active Directory
- DC: Domain Controller (Controlador de Domínio)
- lab.exemplo.com: domínio AD
- LAB: domínio AD (formato simplificado, utilizado como 'nome do domínio' no logon das máquinas windows.
- win2k3.lab.exemplo.com: FQDN do DC
- 10.0.0.1: Endereço IP do DC
- linuxwork: Nome da máquina que será cliente windows
- LAB.EXEMPLO.COM: Realm (domínio) do Kerberos
- linuxwork.lab.exemplo.com: FQDN da máquina linux
- ntp.exemplo.com: Servidor de Horário (NTP)
Checando a Conectividade
O primeiro passo para configurar a máquina linux é checar se há conectividade entre ele e o DC. Uma maneira simples de fazer isso é 'pingar' o host, dessa maneira:
root@linuxwork:~# ping win2k3.lab.exemplo.com
PING win2k3.lab.exemplo.com (10.0.0.1) 56(84) bytes of data.
64 bytes from win2k3.lab.example.com (10.0.0.1): icmp_seq=1 ttl=128 time=0.176ms
É importante checar a conectividade usando o FQDN do DC, pois o AD é dependente do bom funcionamento do DNS (um AD DC sempre tem um servidor DNS instalado).
Servidor de Horário (NTP)
O Tempo é fundamental para o Kerberos, logo devemos estar com o relógio acertado com o AD DC. Não se preocupe, todo AD DC é por si só um servidor de horário =).
Para mantar o relógio sincronizado, vamos instalar o ntp e configurá-lo para buscar a hora no DC:
root@linuxwork:~# apt-get install ntp
No arquvo de configuração do NTP, coloque o FQDN do DC como servidor de horário:
Arquivo: /etc/ntp.conf
...
# You do need to talk to an NTP server or two (or three).
server win2k3.lab.exemplo.com
...
Feito isso, basta reiniciar o servidor ntp:
root@linuxwork:~# /etc/init.d/ntp restart
FQDN
É preciso definir um FQDN para a máquina linux para fazer tudo funcionar com Kerberos e LDAP. Para isso, edite o arquivo /etc/hosts para que a máquina possa reconhecer a si própria:Arquivo: /etc/hosts
127.0.0.1 linuxwork.lab.exemplo.com localhost linuxwork
Você pode testar a configuranção 'pingando' seu próprio FQDN. o PING deve ser direcionado para o IP 127.0.0.1.
Instalando e Configurando o Kerberos
A primeira coisa a se fazer é instalar os pacotes necessários:root@linuxwork:~# apt-get install krb5-user libpam-lrb5
Este comando também irá instalar o pacote krb5-config, entre outros.
Na configuração do krb5-config, você será questionado sobre alguns dados. Responda da seguinte forma:
Quais são os servidores Kerberos para o seu domínio?
win2k3.lab.exemplo.com
Qual é o servidor administrativo para seu domínio Kerberos?
win2k3.lab.exemplo.com
Testando
Requisite um 'ticket-granting-ticket' utilizando o kinit:
root@linuxwork:~# kinit Administrador@LAB.EXEMPLO.COM
Password for Administrator@LAB.EXAMPLE.COM: ****
Se nenhuma mensagem for mostrada, é sinal que tudo deu certo! =D
Você pode checar os tickets ativos a qualquer hora através do klist:
root@linuxwork:~# klistA partir deste momento o Kerberos já está configurado corretamente. Você pode se desfazer do ticket utilizando o kdestroy.
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: Administrator@LAB.EXEMPLO.COM
Valid starting Expires Service principal
01/21/05 10:28:51 01/21/05 20:27:43 krbtgt/LAB.EXEMPLO.COM@LAB.EXEMPLO.COM
renew until 01/21/05 20:28:51
Entrando no Domínio do ActiveDirectory
Antes de tudo, vamos instalar o software necessário:
root@linuxwork:~# apt-get install samba winbind smbclient smbfs
Configuração
Salve o arquivo /etc/samba/smb.conf como /etc/samba/smb.conf.default. Edite um novo arquivo smb.conf:Arquivo: /etc/samba/smb.conf
Nota: Esta configuração é feita para o logon em apenas um domínio. Caso a máquina faça logons em mais de um domínio, você deve descomentar a linha 'winbind separator' e comentar a linha 'winbind use default domain'
[global]
security = ads
realm = LAB.EXEMPLO.COM
password server = 10.0.0.1
workgroup = LAB
# winbind separator = +
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
template homedir = /home/%D/%U
template shell = /bin/bash
client use spnego = yes
client ntlmv2 auth = yes
encrypt passwords = yes
winbind use default domain = yes
restrict anonymous = 2
# to avoid the workstation from
# trying to become a master browser
# on your windows network add the
# following lines
domain master = no
local master = no
preferred master = no
os level = 0
Agora, é preciso reiniciar os serviços do winbind e samba:
root@linuxwork:~# /etc/init.d/winbind stopPara entrar no domínio, requisite um TGT (Ticket-Granting-Ticket) para o servidor Kerberos (usando kinit). Após isto, faça:
root@linuxwork:~# /etc/init.d/samba restart
root@linuxwork:~# /etc/init.d/winbind start
root@linuxwork:~# net ads joinNota: O primeiro logon da máquina deve ser feito por um usuário que tenha permissões para adição de máquinas no domínio.
Using short domain name – LAB
Joined 'linuxwork' to realm 'LAB.EXAMPLE.COM'
Testando
Para testar se tudo deu certo até então, vamos usar o wbinfo:root@linuxwork:~# wbinfo -uEste comando deve exibir os usuários constantes no domínio.
root@linuxwork:~# wbinfo -gEste comando deve exibir os grupos (security groups) constantes no domínio.
Autenticação
Agora é preciso configurar o sistema para fazer logon de usuários executando a pesquisa na base de dados AD do DC.nsswitch
Edite o arquivo /etc/nsswitch.conf:passwd: compat winbind
group: compat winbind
shadow: compat
Testando
root@linuxwork:~# getent passwdNota: se o samba foi configurado com a opção winbind use default domain = yes, o domínio (LAB) não será exibido antes do nome de usuário.
root:x:0:0:root:/root:/bin/bash
...
LAB+administrator:x:10000:10000:Administrator:/home/LAB/administrator:/bin/bash
LAB+gast:x:10001:10001:Gast:/home/LAB/gast:/bin/bash
...
PAM
Com esta configuração, você pode acessar o computador com contas locais ou com contas de usuário de domínio.
No primeiro login de uma conta de usuário e domínio, seu diretório home será criado. Esta configuração do PAM considera que o sistema primário de autenticação será baseado em contas de domínio e, em segundo lugar, serão usadas as contas de usuários locais. Se a configuração desejada for inversa (se o sistema usar primeiramente as contas locais, por exemplo), a ordem de pam_winbind.so e pam_unix.so deve ser trocada. Quando usada com contas locais, a configuração mostrada aqui irá resultar em falha na autenticação para todas as contas Windows/Samba DC que fizeram login ou usarem o sudo.
Vamos então à configuração:
Arquivo: /etc/pam.d/common-account
account sufficient pam_winbind.so
account required pam_unix.so
Arquivo: /etc/pam.d/common-auth
auth sufficient pam_winbind.soArquivo: /etc/pam.d/sudo
auth sufficient pam_unix.so nullok_secure use_first_pass
auth required pam_deny.so
auth sufficient pam_winbind.so
auth sufficient pam_unix.so use_first_pass
auth required pam_deny.so
@include common-account
Configuração Final
Para fazer tudo funcionar, agora basta criar o diretório /home/LAB:
root@linuxwork:~# mkdir /home/LABIsto porque configuramos o arquivo /etc/samba/smb.conf para apontar a pasta home das contas de usuário do domínio para /home/%D/%U (%D = domínio, %U = usuário)
Agora basta fazer o logon na máquina:
login: manuel
Password: *****
...
LAB+manuel@linuxwork:~$
Se a opção winbind use default domain = yes estiver setada, então o usuário deverá fazer logon utilizando o formato DOMINIO+usuario, desta forma: LAB+manuel.
Desta forma, tudo deve funcionar perfeitamente, durante o login e navegação na rede. A partir de agora, vamos apenas fazer as configurações para os aplicativos funcionarem com a autenticação do ISA server.
Proxy
Estava tudo lindo até então... tudo funcionou perfeitamente até aí! A autenticação do sistema com o domínio funcionou perfeitamente. A única coisa que achei um pouco redundante foi o fato de após o logon, ainda precisamos abrir uma tela de terminal, pegarmos o TGT, e entrar na rede com net ads join. Vou estudar uma forma de automatizar o processo, e logo estarei postando aqui.
Mas o que eu imaginava não dar trabalho, me tirou algumas horas pra estudar uma solução. O proxy do ISA server utiliza uma tecnologia proprietária para autenticação, o NTLM (NT LAN Manager), que não funciona como a autenticação de proxy que vemos no squid, por exemplo. Não tive problemas de navegação no Firefox, pois o mesmo tem suporte à autenticação NTLM (inclusive, Ele integra-se com o Kerberos, não necessitando de login/senha no browser, uma vez que o usuário já possua um TGT válido), mas as demais aplicações (como o APT, por exemplo), não funcionavam, mesmo setando a variável $http_proxy no profile do usuário. Mas o 'sofrimento' foi cessado quando encontrei o ntlmaps, ou 'NTLM Authentication Proxy Server', um daemon que funciona como 'proxy do proxy'. Ele se autentica no proxy da Microsoft, e provê o acesso através da porta 5865.
A instalação é tranquila, pois o software já está no respositório do Ubuntu. Para instalar, usamos o bom e velho apt-get:
root@linuxwork:~# apt-get install ntlmapsEu recomendo que seja criado um usuário exclusivo para acesso ao ntlmaps no domínio windows (eu o nomeei como 'apt-user', e coloquei-o com permissões de acesso à internet pelo ISA server). As informações deste usuário devem ser colocadas nas configurações do ntlmaps. No prompt de configuração, responda:
Listen Port
5865
Parent Proxy
[IP d ISA]
NT Windows Username:
apt-user
NT Windows Password:
[senha]
Feito isso, basta colocar esta configuração no arquivo /etc/profiles:
...
export http_proxy="http://127.0.0.1:5665/"
...
Nota: o ntlmaps só funciona com HTTP. Mas se você quiser fazer download de arquivos em sites FTP, não se preocupe! o curl tem suporte a autenticação NTLM. Para facilitar o trabalho, criei um script que 'faz o trabalho'. Utilizei-o também no FreeBSD, pra instalar ports, basta substituir o comando 'fetch' por este script. Aqui está fonte do script:
#!/bin/sh
URL=$(echo "$@" | awk -F" " '/^.*[a-z]:\/\/.*/{ \
split($0, args, " "); \
for(i in args){ \
if(args[i] ~ /[a-z]:\/\//){ \
print args[i]; break; \
} \
} \
}')
echo "fetching $URL..."
/usr/local/bin/curl -O \
--proxy-ntlm \
--proxy http://[ip do ISA]:8080 \
--proxy-user LAB\\apt-user:password $URL
Bem, depois disso, as coisas funcionaram bem bem melhor.
Futuramente, vou postar outro artigo, mostrando como fazer um servidor linux ser um controlador de domínio para máquinas Windows. Até breve!