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.
...
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.
...
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
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
...
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
~
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/
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
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
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
...
> 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
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
klaux@poe:~$ sudo invoke-rc.d apache2 restart
...
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
Nenhum comentário:
Postar um comentário