Autenticación Linux cun Controlador de Dominio Windows

De Wiki do Ciclo ASIR do IES de Rodeira

Índice

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