Autenticación Linux cun Controlador de Dominio Windows
INTRODUCCIÓN
O obxectivo deste tutorial é explicar como se pode configurar unha equipa Linux pra que realice a autenticación dos usuarios mediante un PDC (Primary Domain Controller), xa sexa un ordenador Windows 2000/NT ou un Linux/Unix con samba. A autenticación en rede pode realizarse de varios xeitos, como NIS, NIS+ ou Kerberos, aínda que este documento únicamente trata a autenticación mediante PDC. Nos seguintes apartados se comentará como configurar unha equipa con Linux pra que autentifique os seus usuarios mediante un PDC si o usuario non está de alta no sistema local (/etc/passwd e /etc/shadow), xa que en ese caso se realizará unha autenticación tradicional. Tamén se comentará o xeito de mapear os usuarios do PDC a usuarios locais UNIX asignándolles un UID (número de usuario) e un GID (número de grupo) e como crear automáticamente os homes dos usuarios.
WINBIND.
O demo winbindd permite a unha equipa Linux formar parte dun dominio Windows NT/2000, e como membro do dominio ver os usuarios e grupos NT/2000 como si fosen usuarios Linux. O resultado final é que cando un programa no sistema Linux (por exemplo login) necesita autenticación de usuario, o sistema operativo pode realizala mediante o PDC. Os nomes de usuario terán a forma DOMINIO/usuario e DOMINIO/grupo, sendo posible elexir o caracter pra separar o dominio do nome de usuario ou grupo (neste caso /). A equipa de programación de Samba implementou as chamadas RPC (Remote Procedure Call) de Windows necesarias pra manexo remoto, autenticación e spool de impresión, esto permite listar os usuarios e grupos, obter información detallada sobre os mesmos, autenticar usuarios contra o PDC e cambiar a password dos usuarios do PDC dende unha máquina Linux. Winbind mapea automáticamente a información das contas no NT/2000 a usuarios e grupos Linux.
NSS (Name Service Switch).
NSS (Name Service Switch) é unha característica de moitos sistemas UNIX que permite obter información sobre nomes de hosts, alias de correo e información sobre os usuarios a partir de distintas fontes de información, por exemplo dende ficheiros de texto no sistema local, dun servidor NIS ou dun servidor DNS. NSS permite polo tanto a winbind actuar coma un proveedor de información NSS que resolve nomes de usuarios e grupos. Gracias a esto é posible obter os usuarios e grupos mediante chamadas UNIX estándar como si se tratara de usuarios e grupos locais. O ficheiro de configuración de NSS é /etc/nsswitch.conf. Cando un sistema UNIX fai unha petición búscase en este ficheiro unha liña que coincida co servicio solicitado, por exemplo passwd cando se buscan usuarios ou grupos. Esta liña especifica que proveedor de información vai a resolver a petición e en qué orde. Por exemplo:
passwd files example
Con esta liña se intentará a carga de /lib/libnss_files.so pra realizar a autenticación, e se falla o intentará con /lib/libnss_example.so. Winbind proporciona o módulo libnss_winbind.so que ten que estar situado no directorio /lib.
PAM (Pluggable Authenticate Modules).
Mediante os módulos PAM é posible especificar distintos métodos de autenticación pra diferentes aplicacións do sistema sen necesidade de recompilalas, ademáis da ofrecer a posibilidade de elexir entre varias políticas de autorización. Por exemplo pódese configurar o sistema pra permitir logins na consola so ós usuarios que estén en /etc/passwd, e acceder mediante telnet únicamente ós usuarios autenticados mediante NIS. Winbind utiliza o interface PAM pra integrar ós usuarios NT no sistema Linux permitindo a autenticación contra un PDC ou cambiar a password dos usuarios no PDC. Pra facer esto Winbind proporciona un módulo chamado pam_winbind.so que debe estar situado no directorio /lib/security.
MANEXO DOS UIDs e GIDs.
Os usuarios e grupos NT usan un identificador numérico chamado RID que é distinto do rango de números utilizado polos sistemas Linux/Unix para os usuarios e os grupos. É responsabilidade de winbind a conversión entre os RIDs de Windows e os UIDs e GIDs Linux. No momento da configuración é necesario especificar un conxunto de IDs numéricas entre os que escollerá winbind pra facer o mapeo de usuarios. Este mapeo de usuarios vaise facendo dun xeito secuencial según van iniciando sesión os usuarios por primeira vez, e se almacena nunha base de datos local. Pra optimizar o uso do ancho de banda da rede a información dos usuarios (como a password) almacénase nunha caché local utilizando unha clave suministrada polo PDC. Cando a información do usuario cambia o PDC incrementa esa clave. Winbind compara as claves local e a enviada polo PDC pra detectar cando expira a caché coa información dos usuarios.
INSTALACIÓN.
Pra facer uso de winbind é necesario ter instalado e funcionando samba no equipo.
Configuración NSS
O arquivo libnss_winbind.so ten que estar situado no directorio /lib e con permiso de execución universal. Tamén pode ser necesario un enlace simbólico ([link|L) chamado libnss_winbind.so.2 correspondendo o 2 á versión de glibc que se esté a utilizar (si se estivera usando glibc 1, o enlace sería libnss_wonbind.so.1). No ficheiro /etc/nsswitch.conf é necesario modificar as liñas axeitadas pra que queden do seguinte modo:
passwd: files winbind
shadow: files
group: files winbind
Configuración de smb.conf
No arquivo smb.conf situado normalmente en /etc/samba é necesario poñer as seguintes liñas na sección [global]:
winbind separator = +
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
template homedir = /home/%D/%U
template shell = /bin/bash
winbind separator especifica o separador a utilizar entre o dominio é o nome de usuario. Neste caso o usuario tomará a forma DOMINIO/usuario.
winbind uid e winbind gid indican o rango de valores que se colle pra facer o mapeo de usuarios entre o RID e o UID e GID.
winbind enum users e winbind enum groups indica si se permite o listado dos usuarios e grupos do PDC. Pode desactivarse pra mellora-lo rendemento.
template homedir e template shell especifican respectivamente o home dos usuarios e o [modules.php?op=modload&name=phpWiki&file=index&pagename=S shell] a utilizar nas sesións interactivas (ssh, telnet, login ...).
Unión o PDC (Primary Domain Controller).
Pra unir o equipo ó dominio servido polo PDC se utiliza o seguinte comando:
smbpasswd -j DOMINIO -r PDC -U Administrador
Donde Administrador é un usuario do dominio con permiso pra engadir equipos ó dominio DOMINIO, e sendo DOMINIO o nome do dominio. Se todo funciona correctamente amosarase unha mensaxe Joined the domain DOMINIO.
Proba do Winbind.
Agora podemos probar o sistema. Pra esto é necesario arrancar o demo winbind. En RedHat hay un script de arranque do servicio en /etc/init.d/ chamado winbind, co que bastará con escribir /etc/init.d/winbind start . Tamén é posible chamar directamente á aplicación winbindd. Unha vez arrancado o servicio é posible realizar as seguintes accións:
- wbinfo -u: Obtén unha lista dos usuarios do PDC.
- wbinfo -g: Obtén unha lista dos grupos do PDC.
- getent passwd: Obtén unha lista dos usuarios do PDC e dos usuarios locais.
- getent group: Obtén unha lista dos grupos do PDC e dos grupos locais.
Configuración PAM.
É necesario configurar PAM pra permitir a autenticación para os servicios de acceso (por exemplo ssh e login). Pra esto precisamos que o arquivo pam_winbind.so esté situado no directorio /lib/security e posteriormente configurar o ficheiro de /etc/pam.d axeitado para o servicio de acceso. Seguidamente veremos un exemplo de configuración pra login e pra ssh:
- login
#%PAM-1.0 auth required /lib/security/pam_securetty.so auth sufficient /lib/security/pam_winbind.so auth required /lib/security/pam_stack.so service=system_auth auth required /lib/security/pam_nologin.so account sufficient /lib/security/pam_winbind.so account required /lib/security/pam_stack.so service=system_auth password required /lib/security/pam_stack.so service=system_auth session required /lib/security/pam_stack.so service=system_auth session optional /lib/security/pam_console.so
- sshd
#%PAM-1.0 auth required /lib/security/pam_stack.so service=system_auth auth sufficient /lib/security/pam_winbind.so auth required /lib/security/pam_nologin.so account sufficient /lib/security/pam_winbind.so account required /lib/security/pam_stack.so service=system_auth password required /lib/security/pam_stack.so service=system_auth session required /lib/security/pam_stack.so service=system_auth session required /lib/security/pam_limits.so session optional /lib/security/pam_console.so
Tamén é posible configurar PAM para samba de xeito que se creen automáticamente os homes dos usuarios:
#%PAM-1.0 auth required pam_nologin.so auth required pam_stack.so service=system_auth account required pam_stack.so service=system_auth session required pam_mkhomedir.so skel=/etc/sambaskel umask=0022 session required pam_stack.so service=system_auth password required /lib/security/pam_stack.so service=system_auth
NOTAS ADICIONAIS.
Para o correcto funcionamento da autenticación hay que ter en conta os seguintes puntos:
- O workgroup de samba debe ser o mesmo que o dominio do PDC
- security debe ser domain
- domain master debe ser no
- Deberíase poñer en /etc/hosts o dominio coa IP do PDC
- Conven engadir ós ficheiros pam axeitados (coma login) a liña para crear automáticamente os directorios home:
session required /lib/security/pam_mkhomedir.so skel=/etc/skel umask=0022
- :* Non funciona si o directorio home do usuario está dentro de outro directorio sin crear. Por exemplo si o home está en /home/dominio/usuario e non temos creado antes o directorio dominio non funciona.
- Elexir / como separador no ficheiro smb.conf fai que non arranquen as X cun error de falta de permisos sobre a consola.
- Ollo coas maiúsculas e minúsculas no nome de usuario. Winbind autenticará de todos modos, pero logo non funcionarán correctamente algunhas cousas como as X.
SCRIPT DE CONFIGURACIÓN
Este script está pensado para o IES de Rodeira e unha configuración baseada en unha rede de clase B na que os dous últimos números da IP utilíizanse para nomear o aula e o equipo respectivamente. Sen embargo, é moi fácil modificar o script para adaptalo a outras necesidades máis ou menos complexas.
#!/bin/sh # # winbindea v1.0 beta # # (Cl) FJTA 2003 # # Prepara o sistema para autenticarse contra un servidor Windows2000 # # A primeira parte nomea os equipos como LINUXAnºaula_nºequipo # collendo o número de aula e de equipo dos parámetros # fácilmente modificable pra coller o nome de equipo directamente dos parámetros # sería un so parámetro e facer HN=$1 # # # Cambiar estas liñas para outra situación # # adminPDC debe ser un usuario do dominio con permiso para agregar equipos. # NAMEPDC=IESRODEIRA IPPDC=172.16.2.2 PREHN=LINUXA PREIPHOST=172.16. GATEWAY=172.16.2.1 DNS=172.16.2.1 GRUPO=domainusers ADMIN=adminPDC # if [ $# -eq 2 ]; then NUMHOST=`echo $2|sed 's/^0*//'` NUMAULA=`echo $1|sed 's/^0*//'` LNUMIP=$NUMHOST if [ `expr length $NUMHOST` -le 1 ]; then NUMHOST=0"$NUMHOST" fi if [ `expr length $LNUMIP` -ge 3 ]; then LNUMIP=100 fi # echo "Parando firewall....." /etc/init.d/iptables stop # # Facendo copias de seguridade # if [ ! -d .winbinded ]; then mkdir .winbinded cp -f /etc/sysconfig/network-scripts/ifcfg-eth0 .winbinded/ cp -f /etc/sysconfig/network .winbinded/ cp -f /etc/hosts .winbinded/ cp -f /etc/samba/smb.conf .winbinded/ cp -f /etc/nsswitch.conf .winbinded/ cp -f /etc/pam.d/login .winbinded/ cp -f /etc/resolv.conf .winbinded/ cp -f /etc/group .winbinded/ else echo "Equipo xa configurado con anterioridade" echo "executa:" echo " winbindea restore" echo "antes de intentalo de novo." exit fi echo "Parcheando archivos...." HN=$PREHN$NUMAULA\_$NUMHOST IPHOST=$PREIPHOST$NUMAULA.$LNUMIP # if [ -z "`grep $GRUPO /etc/group`" ]; then sed '$a\ GRUPO:x:10000:' /etc/group | sed "s/GRUPO/$GRUPO/" > group.new fi # if [ -z "`grep $GATEWAY /etc/resolv.conf`" ]; then sed '1 i\ nameserver DNS' etc/resolv.conf | sed "s/DNS/$DNS/" > resolv.conf.new fi sed "s/HOSTNAME=.*/HOSTNAME=$HN/" /etc/sysconfig/network > network.new.tmp if [ -z "`/sbin/route|grep default`" ]; then echo "Poñendo a ruta por defecto...." /sbin/route add default gw $GATEWAY sed "s/GATEWAY=.*/GATEWAY=$GATEWAY" network.new.tmp > network.new rm -f network.new.tmp else mv -f network.new.tmp network.new fi hostname $HN # sed -e "s/IPADDR/#IPADDR/" -e '/NETMASK/i\ NOVOHOST' /etc/sysconfig/network-scripts/ifcfg-eth0 | sed "s/NOVOHOST/IPADDR=$IPHOST/" > ifcfg-eth0.new /sbin/ifconfig eth0 $IPHOST sed -e '$a\ NOVOHOST\ NOVONOME' /etc/hosts |\ sed -e "s/NOVOHOST/$IPPDC $NAMEPDC/" -e\ "s/127\.0\.0\.1/#127\.0\.0\.1/" -e\ "s/NOVONOME/127\.0\.0\.1 $HN localhost\.localdomain localhost/" > hosts.new # sed -e 's/workgroup/#workgroup/' -e\ 's/server string/#server string/' -e\ 's/security/#security/' -e\ 's/netbios name/#netbios name/' -e\ 's/domain master/#domain master/' -e\ 's/encrypt passwords/#encrypt passwords/' -e\ '/global/a\ workgroup = NOVOPDC\ netbios name = NOVOHOST\ server string = NOVOHOST\ security = domain\ domain master = no\ encrypt passwords = yes' -e '/homes/i\ # #Engadido para autenticar contra w2000\ # winbind separator = +\ winbind uid = 10000-20000\ winbind gid = 10000-20000\ winbind enum users = yes\ winbind enum groups = yes\ template homedir = /home/%D/%U\ template shell = /bin/bash' /etc/samba/smb.conf | sed -e "s/NOVOHOST/$HN/" -e "s/NOVOPDC/$NAMEPDC/"> smb.conf.new sed 's/^passwd:.*/passwd: files winbind/' /etc/nsswitch.conf|\ sed 's/^shadow:.*/shadow: files/'|sed 's/^group:.*/group: files winbind/' > nsswitch.conf.new if [ ! -f /home/IESRODEIRA ]; then mkdir /home/IESRODEIRA fi echo '#%PAM-1.0' > login.new echo "auth required /lib/security/pam_securetty.so" >> login.new echo "auth sufficient /lib/security/pam_winbind.so" >> login.new echo "auth required /lib/security/pam_stack.so service=system-auth" >> login.new echo "auth required /lib/security/pam_nologin.so" >> login.new echo "account sufficient /lib/security/pam_winbind.so" >> login.new echo "account required /lib/security/pam_stack.so service=system-auth" >> login.new echo "password required /lib/security/pam_stack.so service=system-auth" >> login.new echo "session required /lib/security/pam_stack.so service=system-auth" >> login.new echo "session required /lib/security/pam_mkhomedir.so skel=/etc/skel umask=0022" >> login.new echo "session optional /lib/security/pam_console.so" >> login.new # #TODO: Parchear os arquivos rc.d axeitados para non necesitar facer o setup a mano. # echo "Copiando archivos parcheados...." mv -f ifcfg-eth0.new /etc/sysconfig/network-scripts/ifcfg-eth0 mv -f network.new /etc/sysconfig/network mv -f hosts.new /etc/hosts mv -f smb.conf.new /etc/samba/smb.conf mv -f nsswitch.conf.new /etc/nsswitch.conf mv -f login.new /etc/pam.d/login mv -f resolv.conf.new /etc/resolv.conf mv -f group.new /etc/group # echo "Reiniciando servicios e engadíndome ó dominio...." /etc/init.d/smb restart /etc/init.d/winbind restart smbpasswd -j IESRODEIRA -r 172.16.2.2 -U $ADMIN # echo "OK!..." echo "ATENCION!!!: RECORDA MODIFICAR O FIREWALL E INICIAR SMB E WINBIND AUTOMÁTICAMENTE (setup)" echo "unha vez feito esto podes saír do sistema e reiniciar a tua sesión" echo "escribindo como login IESRODEIRA+usuario e como password a tua password no" echo "servidor Windows 2000. Recorda desactivar o salvapantallas nas X". elif [ $1 ] && [ $1 = "restore" ]; then if [ -d .winbinded ]; then cp -f .winbinded/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0 cp -f .winbinded/network /etc/sysconfig/network cp -f .winbinded/hosts /etc/hosts cp -f .winbinded/smb.conf /etc/samba/smb.conf cp -f .winbinded/nsswitch.conf /etc/nsswitch.conf cp -f .winbinded/login /etc/pam.d/login cp -f .winbinded/resolv.conf /etc/resolv.conf cp -f .winbinded/group /etc/group rm -Rf .winbinded fi else echo winbindea aula host echo winbindea restore fi