====== Migrando Samba3 a Samba4 ====== ===== Preparación ===== Es importante tener en cuenta que la migracion en lo posible se debe hacer en otro servidor y las pruebas se deben hacer en otra red, ya que una vez que las maquinas se conecten al Samba4, nunca volveran a conectarse a Samba 3. La migración del dominio es UNIDIRECCIONAL!!! ===== Preparacion de servidor de pruebas (Minimizacion del downtime) ===== * Instalacion de SO con las mismas caracteristicas del de produccion. * Instalacion de samba3 (samba3, samba3-client, samba3-utils, samba3-docs, smbldap-tools) * Instalacion de Openldap (openldap-servers, openldap-client.) ===== Migracion de Samba3 al server de pruebas ===== * Migre /etc/samba y /var/lib/samba a donde corresponda segun el backend que este usando. Esta es la guia de migracion official: https:%%//%%www.samba.org/samba/docs/man/Samba3-ByExample/upgrades.html#id2600749 * Si su backend es ldapsam, migre openldao como se indica a continuacion. ===== Migracion de OpenLDAP ===== Exportar arbol LDAP desde servidor de produccion: # slapcat > ldap.backup.ldif Copie el archivo generado al nuevo servidor de pruebas\\ \\ Pare el servicio de LDAP\\ \\ Importe el LDIF # slapadd -l ldap.backup.ldif  SI tiene problemas con arrancar el servicio, verifique los permisos de /var/lib/ldap. chown -R ldap:ldap /var/lib/ldap/ \\ Copie el slapd.conf del servidor de produccion al de pruebas.\\ \\ Inicie el servicio LDAP\\   ===== Como evitar problemas comunes ===== ==== slapd.conf sizelimit ==== SI tiene muchos elementos en el arbol LDAP es necesario configurar la siguiente linea:\\   sizelimit unlimited \\ Reinicie el servicio LDAP   ==== Nombres comunes de usuarios y grupos ==== \\ SI tiene usuarios que tengan el mismo nombre de un grupo, renombrelos, porque sino el provisionamiento va a fallar. Use los siguientes comandos para buscar similitud:\\   pdbedit -Lv\\ net groupmap list   ==== Grupos no incluidos en samba (solo en LDAP) ==== En algunas ocasiones se han creado grupos, pero estos solo son visibles desde LDAP (Unix) y no tienen ningun significado para el PDC, en este caso, porte los grupos a Samba siguiendo los sigueintes pasos:\\ \\ Verifique los grupos actualmente incluidos en el PDC:\\ \\ net groupmap list\\ \\ Si no encuentra todos los grupos deseados agreguelos de la siguiente forma:\\ \\ -> Liste todos los grupos reconocidos y exportelos a un archivo temporal:\\ \\ getent group > /tmp/group\\ \\ -> Edite el archivo /tmp/group y borre todas las lineas de los grupos que ya estan incluidos o que no desea importar a SMB\\ \\ vim /tmp/group\\ \\ -> Instale (si no tiene) smbldap-tools\\ \\ -> Verifique que el smbldap.conf tenga el SID de dominio correcto antes de incluir los grupos.\\ -> Ubique el script de migracion smbldap-migrate-unix-groups y coloque permisos de ejecución:\\ \\ chmod +x smbldap-migrate-unix-groups \\ -> Corra el script y alimentelo con el archivo que edito anterioirmente:\\ \\ ./smbldap-migrate-unix-groups -a -G /tmp/group\\ \\ -> Verifique que los grupos quedaron agregados con \\ \\ net groupmap list\\   ==== Quitar SID duplicados ==== Para comprobar si existen duplicados use el script duplicateSIDCheck.py. Para quitar los duplicados y solucionar conflictos, utilice el script duplicateSIDFix.py\\ \\ \\ ============== duplicateSIDCheck.py. ==================\\ \\ #!/usr/bin/python\\ # A quick and dirty python script that checks for duplicate SID's using slapcat.\\ import os\\ \\ data = os.popen("slapcat 2>&1 | grep sambaSID", 'r')\\ line = []\\ \\ def anydup(thelist):\\         dups = list(set([x for x in thelist if thelist.count(x) > 1]))\\         for i in dups:\\                 print "Duplicate id: ", i\\ \\ for each_line in data:\\         line.append(each_line.strip())\\ \\ anydup(line)\\ \\ ================================================== Obtenga el maxrid que se le solicitara en el script de la siguiente forma:\\ \\ net maxrid\\ \\ \\ ============== duplicateSIDFix.py. ==================\\ \\ #!/usr/bin/python\\ # A quick and dirty python script that checks for duplicate SID's using slapcat.\\ import os\\ import sys\\ import time\\ from time import strftime\\ \\ \\ data = os.popen("slapcat 2>&1 | grep sambaSID", 'r')\\ line = []\\  \\ def anydup(thelist):\\ \\     print "*"*70\\     print "."*20+" Duplicate and actions report "+"."*20\\     print "*"*70\\ \\     print "+"*70\\     print "."*20+" Backup LDAP database "+"."*20\\     print "+"*70\\ \\     backupName = "ldapPlatonBackup"+strftime("%Y%m%d-%H_%M")+".ldif"\\     \\     print "Saving backup in..."+backupName\\ \\     backup = os.popen('slapcat -v -b "dc=codema,dc=com,dc=co" -l '+backupName, 'r')\\     print "Generate backup..."\\     \\     for i in range(100):\\         time.sleep(0.01)\\         sys.stdout.write("\\r%d%%" % i)\\         sys.stdout.flush()\\     print "\Backup finished."\\ \\     # Read max rid\\     print "+"*70\\     print "."*20+" Define MAX RID "+"."*20\\     print "+"*70\\     maxrid = int(raw_input("Please enter max RID: ")) + 1\\     print "MAX RID used: ", maxrid\\ \\         dups = list(set([x for x in thelist if thelist.count(x) > 1]))\\         for i in dups:\\         counterPerson = 0\\         print "\"\\         print "+"*70\\         print "="*70\\                 print "Duplicate id: ", i\\         print "="*70\\         dataDetail = os.popen('ldapsearch -xLLL -h localhost -b "dc=codema,dc=com,dc=co" "(sambaSID='+i[10:]+')" | grep dn:', "r")\\         for each_line in dataDetail:\\             # Extract uid\\             uid = each_line.split(',', 1 )\\             name = uid[0].split('=', 1 )\\ \\             if name[1].endswith('$'):\\                 type = "M"\\                 # Remove machine\\                 print "Remove machine: "+name[1]\\                 cmd = "pdbedit -x -m "+name[1][:-1]\\                                 os.popen(cmd, 'r')\\                 print cmd\\             else:\\                 type = "P"\\                 counterPerson += 1\\                 if counterPerson > 1:\\                     print "Update SID user: "+name[1]\\                     cmd = "pdbedit -U "+str(maxrid)+" -u "+name[1]\\                                     os.popen(cmd, 'r')\\                     print cmd\\                     maxrid += 1\\ \\             print i, name[1], type\\         \\     print "="*70\\         print " END "\\     print "="*70\\ \\ for each_line in data:\\         line.append(each_line.strip())\\ \\ anydup(line)\\ \\ ==================================================\\ \\   ===== Instalacion de Samba4 RHEL 5 ===== Instalacion Prerequisitos:\\ \\ yum install perl gcc libacl-devel libblkid-devel gnutls-devel    readline-devel python-devel gdb pkgconfig krb5-workstation    zlib-devel setroubleshoot-server libaio-devel    setroubleshoot-plugins policycoreutils-python    libsemanage-python setools-libs-python setools-libs    popt-devel libpcap-devel sqlite-devel libidn-devel    libxml2-devel libacl-devel libsepol-devel libattr-devel    keyutils-libs-devel cyrus-sasl-devel cups-devel bind-utils    libxslt docbook-style-xsl\\ \\ yum install autoconf automake gcc gdb krb5-devel krb5-workstation openldap-devel make pam-devel python-devel docbook-style-xsl libacl-devel libattr-devel libxslt\\ \\ La ultima version a instalar para este momento de samba4 es la 4.1.6, que necesita Python 2.5+, por tanto, instalaremos python2.7\\ \\   ===== Instalacion de python2.7 ===== \\ wget https:%%//%%www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz\\ tar -xzvf Python-2.7.9.tgz\\ cd Python-2.7.9\\ \\ ./configure --enable-shared\\ make\\ make install\\ \\ Cuando se compila con la opcion --enable-shared (Necesaria para  Samba4), da un error con la carga de una libreria, para lo cual es necesario:\\ \\ Crear el archivo /etc/ld.so.conf.d/python.conf y en el colocar:\\ \\ /usr/local/lib\\ \\ Luego ejecutar:\\ \\ ldconfig ===== Instalacion Samba4   ===== wget https:%%//%%www.samba.org/samba/ftp/stable/samba-4.1.16.tar.gz\\ tar -xzvf samba-4.1.16.tar.gz\\ cd samba-4.1.16\\ ./configure\\ make\\ make install\\ \\ Todo queda instalado en /usr/local/samba.\\   ==== Agregar path ==== echo 'pathmunge /usr/local/samba/bin' > /etc/profile.d/samba.sh\\ echo 'pathmunge /usr/local/samba/sbin' >> /etc/profile.d/samba.sh\\ \\ chmod +x /etc/profile.d/samba.sh\\ \\ Recargue el profile con:\\ \\ . /etc/profile\\ \\ Verifique version de samba:\\ \\ samba --version\\   ===== Classic Upgrade NT4 -> AD DC ===== Bajar servicios de Samba NT4\\ \\ /etc/init.d/smb stop\\ \\ Mover las DB de samba para evitar ejecucion accidental\\ \\ mv /var/lib/samba /var/lib/samba.PDC\\ \\ Renombrar el archivo de configuracion de samba3\\ \\ mv /etc/samba/ /etc/samba.PDC\\ \\ Deshabilitar inicio automatico de samba\\ \\ ntsysv\\ \\ Centralizar DB de samba para facilitar la migracion:\\ \\ mkdir /var/lib/samba.PDC/dbdir/\\ cp -p /etc/samba.PDC/secrets.tdb /var/lib/samba.PDC/dbdir/\\ cp -p /etc/samba.PDC/schannel_store.tdb /var/lib/samba.PDC/dbdir/\\ cp -p /etc/samba.PDC/passdb.tdb /var/lib/samba.PDC/dbdir/\\ cp -p /var/lib/samba.PDC/gencache_notrans.tdb /var/lib/samba.PDC/dbdir/\\ cp -p /var/lib/samba.PDC/account_policy.tdb /var/lib/samba.PDC/dbdir/\\   ===== Migración   ===== samba-tool domain classicupgrade --option="interfaces=lo eth0" --dbdir=/var/lib/samba.PDC/dbdir/ --use-xattrs=yes --realm=codema.com.co --dns-backend=SAMBA_INTERNAL /etc/samba.PDC/smb.conf 2>&1 | tee /tmp/output_samba4_4.txt Si todo sale bien, ya tendra el dominio migrado. Revise el log de migración ubicado en /tmp, ubique la contraseña del administrador.\\ \\ Pare el servicio de LDAP.\\ \\ Desactive el arranque automatico de los servicios LDAP y Samba3\\   ===== Probando samba4 ===== Verifique el estado general del dominio: [root@platon ~]# smbclient -L localhost -U%\\ Domain=[CODEMA-VISTA] OS=[Unix] Server=[Samba 4.1.16]\\ \\     Sharename       Type      Comment\\     ---------       ----      -------\\     netlogon        Disk      \\     sysvol          Disk      \\     IPC$            IPC       IPC Service (Samba 4.1.16)\\ Domain=[CODEMA-VISTA] OS=[Unix] Server=[Samba 4.1.16]\\ \\     Server               Comment\\     ---------            -------\\ \\     Workgroup            Master\\     ---------            -------\\ \\ \\ Login con administrador:\\ \\ [root@platon ~]# smbclient %%//%%localhost/netlogon -UAdministrator -c 'ls'\\ Enter Administrator's password:\\ Domain=[CODEMA-VISTA] OS=[Unix] Server=[Samba 4.1.16]\\   .                                   D        0  Thu Feb 19 18:26:33 2015\\   ..                                  D        0  Thu Feb 19 18:26:51 2015\\ \\         51330 blocks of size 262144. 38461 blocks available\\ \\   ===== Configuracion DNS ===== En el archivo de configuracion agregue el DNS para el FWD de peticiones DNS en la seccion global.\\ \\ dns forwarder = ip.ip.ip.ip\\ \\ Configure el archivo /etc/resolv.conf\\ \\ domain codema.com.co\\ nameserver 192.168.10.6\\ \\ Probando DNS\\ \\  [root@platon ~]# host -t SRV _ldap._tcp.codema.com.co.\\ _ldap._tcp.codema.com.co has SRV record 0 100 389 platon.codema.com.co.\\ \\ [root@platon ~]# host -t SRV _kerberos._udp.codema.com.co.\\ _kerberos._udp.codema.com.co has SRV record 0 100 88 platon.codema.com.co.\\ \\ [root@platon ~]# host -t A platon.codema.com.co.\\ platon.codema.com.co has address 192.168.10.6\\ \\ \\ Configurando kerberos\\ \\ Reemplace el archivo de configuracion por el generado en la migración. **ln -sf /usr/local/samba/private/krb5.conf /etc/krb5.conf** ===== Probando kerberos ===== Usando kinit para obtener un ticket de kerberos:\\ \\ NOTA: Coloque el REALM en MAYUSCULA!\\ \\ [root@platon ~]# kinit administrator@CODEMA.COM.CO\\ Password for administrator@CODEMA.COM.CO:\\ Warning: Your password will expire in 59 days on Mon Jun 22 23:55:27 2015\\ \\ \\ Verifique que kerberos esta corriendo y que se tiene un tiquete.\\ \\ \\ [root@platon ~]# klist\\ Ticket cache: FILE:/tmp/krb5cc_0\\ Default principal: administrator@CODEMA.COM.CO\\ \\ Valid starting     Expires            Service principal\\ 04/24/15 00:14:58  04/24/15 10:14:58  krbtgt/CODEMA.COM.CO@CODEMA.COM.CO\\     renew until 04/25/15 00:14:18\\ \\ \\ Kerberos 4 ticket cache: /tmp/tkt0\\ klist: You have no tickets cached\\ \\ \\ Finalmente logueese con algun usuario y posterioirmente con el administrador, para abrir las herramientas administrativas de Windows y configurar lo que haga falta.\\ ===== Ups, algo salio mal!! ===== \\ \\ En ese caso: rm -f /usr/local/samba/etc/smb.conf rm -rf /usr/local/samba/private/*\\   samba-tool domain classicupgrade --option="interfaces=lo eth0" --dbdir=/var/lib/samba.PDC/dbdir/ --use-xattrs=yes --realm=codema.com.co --dns-backend=SAMBA_INTERNAL /etc/samba.PDC/smb.conf 2>&1 | tee /tmp/output_samba4_4.txt \\ \\ \\ \\ \\   ---- __**Advertencia**__ Este documento es privado y es de u so exclusivo de sus autores y de SKINA TECH. Cualquier uso sin una autorización escrita es contra la ley de derechos de autor y de propiedad intelectual, y será motivo de una acción legal. ---- ============================================================== 19-Enero-2015 J.C. Pineros C. v1.0 Primera version