quarta-feira, 29 de julho de 2009

Autenticação NTLM e Basic no Apache, com o mesmo módulo, em GNU/Linux

Continuamente há a necessidade de se integrar um novo ambiente, em um dado CCD, ao sistema de autenticação corrente. Fato é fato: o serviço de autenticação foi implementado antes deste e não vai mudar por causa dele. Ou se integre ou...

No meu caso; um serviço de controle de versão SVN provido por Apache2+SSL. Não falarei aqui sobre o serviço de controle de versão, mas sim de como este é autorizado através da autenticação NTLM. Esta é outra história. Pense apenas em um serviço X. O sistema de autenticação? MS Active Directory do Windows Server 2008 com 33 domínios de confiança e uma floresta de logins e recursos enorme.

Depois de testar várias alternativas, cheguei ao mod_auth_ntlm_winbind. Ótima opção!

Primeiramente o seu servidor GNU/Linux deve fazer parte do domínio AD, como qualquer máquina MS Windows. Para tanto, você precisará instalar e configurar o samba e o winbind. Outra coisa, levo em consideração a distribuição Debian GNU/Linux 5.0.2 (Lenny). Mas é possível para qualquer Unix-like.

svn@poe:~$ sudo apt-get install samba smbclient winbind krb5-clients ntpdate apache2-mpm-worker apache2-threaded-dev
...


Rede

Deve-se saber algumas informações sobre a rede. Para tanto execute os passos a seguir:

svn@poe:~$ nslookup sufixo_dns

Server: 10.8.X.Y
Address: 10.8.X.Y#53

Name: sufixo_dns
Address: 10.8.N.M
Name: sufixo_dns
Address: 10.8.I.J
...

svn@poe:~$ nslookup 10.8.N.M
Server: 10.8.I.J
Address: 10.8.I.J#53

N.M.8.10.in-addr.arpa name = svr0001.sufixo_dns.
...


No meu caso, os servidores de DNS também são os servidores KDC. Como fiquei sabendo disso?

svn@poe:~$ telnet svr0001 88
Trying 10.8.N.M...
Connected to svr0001.sufixo_dns (10.8.N.M).
Escape character is '^]'.
Connection closed by foreign host.
...



Kerberos

svn@poe:~$ sudo mv /etc/krb5.conf /etc/krb5.conf_ORIG

svn@poe:~$ sudo vi /etc/krb5.conf

[logging]
default = FILE:/var/log/krb5.log

[libdefaults]
clockskew = 300
default_realm = SUFIXO_DNS_EM_LETRAS_MAIÚSCULAS
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true

[realms]
SUFIXO_DNS_EM_LETRAS_MAIÚSCULAS = {
kdc = svr0001:88
kdc = svr0002:88
kdc = svr0003:88
kdc = svr0004:88

default_domain = SUFIXO_DNS_EM_LETRAS_MAIÚSCULAS
}

[domain_realm]
.sufixo_dns_em_letras_minúsculas = SUFIXO_DNS_EM_LETRAS_MAIÚSCULAS
sufixo_dns_em_letras_minúsculas = SUFIXO_DNS_EM_LETRAS_MAIÚSCULAS



Execute os comandos como no quadro abaixo e se a saída for parecida com a ali apresentada, tudo está correto.

svn@poe:~$ kinit cperpetuo@SUFIXO_DNS_EM_LETRAS_MAIÚSCULAS
Password for cperpetuo@SUFIXO_DNS_EM_LETRAS_MAIÚSCULAS:
svn@sac0344:~$ klist
Ticket cache: FILE:/tmp/krb5cc_1001
Default principal: cperpetuo@SUFIXO_DNS_EM_LETRAS_MAIÚSCULAS

Valid starting Expires Service principal
07/29/09 13:47:52 07/30/09 01:48:00 krbtgt/SUFIXO_DNS_EM_LETRAS_MAIÚSCULAS@SUFIXO_DNS_EM_LETRAS_MAIÚSCULAS
renew until 07/30/09 13:47:52


Kerberos 4 ticket cache: /tmp/tkt1001
klist: You have no tickets cached
...


Samba

svn@poe:~$ sudo mv /etc/samba/smb.conf /etc/samba/smb.conf_ORIG

svn@poe:~$ sudo vi /etc/samba/smb.conf

[global]
workgroup = DOMÍNIO
server string = SVN Server
realm = SUFIXO_DNS_EM_LETRAS_MAIÚSCULAS
security = ADS
password server = *
restrict anonymous = 2
client NTLMv2 auth = Yes
printcap name = /dev/null
idmap uid = 10000-200000
idmap gid = 10000-200000
template homedir = /tmp
template shell = /bin/false
winbind separator = \\
idmap backend = ad
winbind enum users = Yes
winbind enum groups = Yes
printing = bsd
printcap name = /dev/null
~


NTP

Também no meu caso, os servidores de DNS também são servidores NTP.

svn@poe:~$ mv /etc/default/ntpdate /etc/default/ntpdate_ORIG

svn@poe:~$ vi /etc/default/ntpdate

# The settings in this file are used by the program ntpdate-debian, but not
# by the upstream program ntpdate.

# Set to "yes" to take the server list from /etc/ntp.conf, from package ntp,
# so you only have to keep it in one place.
NTPDATE_USE_NTP_CONF=no

# List of NTP servers to use (Separate multiple servers with spaces.)
# Not used if NTPDATE_USE_NTP_CONF is yes.
NTPSERVERS="svr0001 svr0002 svr0003 svr0004"

# Additional options to pass to ntpdate
NTPOPTIONS="-s"
~

svn@poe:~$ sudo ln -s /usr/sbin/ntpdate-debian /etc/cron.daily/


Inserção da máquina no domínio

svn@poe:~$ sudo invoke-rc.d samba start
svn@poe:~$ sudo invoke-rc.d winbind start
svn@poe:~$ sudo net -W DOMÍNIO -S svr0001 -U administrador_de_domínio


Se tudo está correto:
klaux@poe:~$ sudo net ads testjoin
Join is OK

klaux@poe:~$ sudo net rpc testjoin
Join to 'DOMÍNIO' is OK

klaux@poe:~$ wbinfo -i DOMÍNIO\\cperpetuo
DOMÍNIO\cperpetuo:*:10000:10000:Clauzio 'KlauX' Perpétuo:/tmp:/bin/false


mod_auth_ntlm_winbind

A segunda parte é justamente baixar o mod_auth_ntlm_winbind, compilá-lo, instalá-lo e configurá-lo.
klaux@poe:~$ svn co svn://svnanon.samba.org/lorikeet/trunk/mod_auth_ntlm_winbind \
> mod_auth_ntlm_winbind
...

Sugiro a aplicação do diff abaixo, pois os valores padrões para algumas flags do módulo estão sem o path absoluto e no meu caso isso foi um problema. Isso também evita a necessidade de se passar valores para as flags PlaintextAuthHelper e NTLMAuthHelper.
klaux@poe:~/mod_auth_ntlm_winbind_svn$ svn diff mod_auth_ntlm_winbind.c
Index: mod_auth_ntlm_winbind.c
===================================================================
--- mod_auth_ntlm_winbind.c (revisão 801)
+++ mod_auth_ntlm_winbind.c (cópia de trabalho)
@@ -884,9 +884,9 @@
crec->negotiate_on = 0;
crec->ntlm_basic_on = 0;
crec->ntlm_basic_realm = "REALM";
- crec->ntlm_auth_helper = "ntlm_auth --helper-protocol=squid-2.5-ntlmssp";
- crec->negotiate_ntlm_auth_helper = "ntlm_auth --helper-protocol=gss-spnego";
- crec->ntlm_plaintext_helper = "ntlm_auth --helper-protocol=squid-2.5-basic";
+ crec->ntlm_auth_helper = "/usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp";
+ crec->negotiate_ntlm_auth_helper = "/usr/bin/ntlm_auth --helper-protocol=gss-spnego";
+ crec->ntlm_plaintext_helper = "/usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic";

return crec;
}


klaux@poe:~$ sudo apxs2 -DAPACHE2 -c -i mod_auth_ntlm_winbind.c
...

klaux@poe:~$ sudo echo "LoadModule \
> auth_ntlm_winbind_module \
> /usr/lib/apache2/modules/mod_auth_ntlm_winbind.so" >\
> /etc/apache2/mods-available/auth_ntlm_winbind.load
...

klaux@poe:~$ sudo a2enmod auth_ntlm_winbind
...

klaux@poe:~$ sudo vi /etc/apache2/conf.d/pasta
<Location /pasta>
AuthName "SVN - ECT"

NTLMAuth on
NTLMBasicAuth on
NTLMBasicAuthoritative on
AuthType NTLM

SSLRequireSSL

Require valid-user
</Location>
~

klaux@poe:~$ sudo invoke-rc.d apache2 restart

Pronto! Agora é só acessar http(s)://localhost/pasta por um cliente, MS IE, TortoiseSVN etc., em máquinas MS Windows, que suporte o tipo de autenticação NTLM. Neste serão utilizadas as mesmas ACLs do login no SO, ou seja, não será solicitada senha alguma.

No caso dos clientes que não suportem o tipo de autenticação NTLM, o próprio módulo, através da flag 'NTLMBasicAuth on', providenciará a autenticação pelo método Basic. Muita atenção aqui: o método de autenticação Basic passa suas informações em texto plano, ou seja, instale o módulo SSL no Apache.

Fonte:www.debian-administration.org, adldap.sourceforge.net

segunda-feira, 6 de julho de 2009

VMWare e os caracteres "/" e "?" no teclado ABNT2

Quem utiliza tanto o VMWare Workstation quanto o VMWare Player, instalado em um GNU/Linux com teclado ABNT2, deve ter percebido que a tecla responsável pelos caracteres "/" e "?" não funciona.

Pois bem, seguem os passos necessários para corrigir esse problema.

Abra o arquivo /usr/lib/vmware/config para edição:
sudo vi /usr/lib/vmware/config

Acrescente a seguinte linha no final do arquivo:
xkeymap.keycode.211 = 0x073

Reinicie o vmware:
/etc/init.d/vmware restart

Pronto, agora é só entrar na(s) máquina(s) guest que a tecla estará funcionando!

Fonte: hamacker.wordpress.com