====== 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