Table des matières

Suppression de LDAP pour revenir vers une SME de base

Cette page représente juste une prise de note pour une opération très particulière (suppression des paquets e-smith-base+ldap sur un serveur en production), ne suivez pas ces instructions à moins de savoir exactement ce que vous faites.

Suppression des paquets expérimentaux e-smith-base+ldap et e-smith-samba+ldap

Re-construction des "flat files"

Parse LDIF

La première étape est la reconstruction des fichiers /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow et /etc/samba/smbpasswd à partir des informations contenues dans LDAP. Ces informations sont disponibles sous forme de ldif:

sv t /service/ldap
cp -a /home/e-smith/db/ldap/domain.tld.ldif /root/
cd

Copier le script suivant:

#!/usr/bin/perl -w

use Net::LDAP::LDIF;
use Net::LDAP::Entry;
use esmith::AccountsDB;

my $ldifin = Net::LDAP::LDIF->new("domain.tld.ldif");
my $adb = esmith::AccountsDB->open_ro();

# /etc/passwd
# root:x:0:0:root:/root:/bin/bash
# login:x:uid:gid:comment:home:shell

open(PASSWD,'>','passwd');

# /etc/shadow
# dani:$1$i5ClE7rs$lnPBabdgteuy..bRML1:14040:0:99999:7:::
# login:cryptpass:shadowLastChange:0:99999:7:::

open(SHADOW,'>','shadow');

# /etc/group
# prive:x:5024:dani,jenny,admin,www
# groupname:x:gid:member1,member2

open(GROUP,'>','group');

# /etc/gshadow
# prive:!::dani,jenny,admin,www
# groupname:!::member1,member2

open(GSHADOW,'>','gshadow');

# /etc/samba/smbpasswd
# dani:5000:670056A568475A67BECA51:DEBEF5F77A35A7A6CA181647AB7C62:[U          ]:LCT-484E8E73:
# login:uid:sambaLMPassword:sambaNTPassword:sambaAcctFlags:LCT-00000000:

open(SMBPASSWD,'>','smbpasswd');

# On parse
while(! $ldifin->eof()){
	my $entry = $ldifin->read_entry();

	# On ne traite que les entrées type users ou computers (compte UNIX)
	# Attention, l'uid peut contenir le caractère "-"
	if ($entry->dn =~ /uid=(\w+-?(\w+)?\$?),ou=(Users|Computers)/){

		my $login = $1;
		my $machine = $3;

		my $acc = $adb->get("$login") || $adb->get("admin");
		my $type = $acc->prop('type') || '';
		print "Checking $login\n";

		# Si l'entrée est de type user, ou est l'entrée speciale admin (type system)
		#if ($type eq "user" || $login eq "admin"){
		if ($type ne 'group'){
			my $comment = $entry->get_value('cn');
			my $gid = $entry->get_value('gidNumber');
			my $uid = $entry->get_value('uidNumber');
			my $pass = $entry->get_value('userPassword');
			my $lmpass = $entry->get_value('sambaLMPassword') || 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
			my $ntpass = $entry->get_value('sambaNTPassword') || 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
			my $home = $entry->get_value('homeDirectory');
			my $shell = $entry->get_value('loginShell');
			my $sambaflag = $entry->get_value('sambaAcctFlags');
			my $shadowchange = $entry->get_value('shadowLastChange');

			# On supprime {CRYPT} du champ pass
			$pass =~ s/\{crypt\}//gi;

			# Hack pour ne pas duppliquer le compte ntp
			$comment = '' if ($comment eq 'no comment');

			print PASSWD "$login:x:$uid:$gid:$comment:$home:$shell\n";
			print SHADOW "$login:$pass:$shadowchange:0:99999:7:::\n";
			print GROUP "$login:x:$gid:\n";
			print GSHADOW "$login:x:!::\n";
			if (($type eq 'user' || $login eq 'admin') || $machine eq 'Computers'){
				print SMBPASSWD "$login:$uid:$lmpass:$ntpass:$sambaflag:LCT-00000010:\n";
			}
		}
	}
	elsif ($entry->dn =~ /cn=(\w+-?(\w+)?),ou=Groups/){
		my $login = $1;

		my $acc = $adb->get("$login") || next;
		my $type = $acc->prop('type');

		if ($type eq "group"){
			my $gid = $entry->get_value('gidNumber');
			my $members = join (',',$entry->get_value('memberUid'));

			print GROUP "$login:x:$gid:$members\n";
			print GSHADOW "$login:x:!::$members\n";
		}
	}

}

Puis lancer la moulinette

perl ./flat_rebuild

On se retrouve avec les fichiers /root/passwd, /root/shadow, /root/group, /root/gshadow et /root/smbpasswd. Il faut maintenant faire un merge de ces fichiers avec les existants.

Merge des fichiers

mkdir old
mkdir new
cp -a /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/samba/smbpasswd ./old
for F in passwd shadow group gshadow; do
    cat $F old/$F | sort | uniq > new/$F
done
cat smbpasswd > new/smbpasswd

Une fois tout vérifié, on copie les nouveaux fichiers à la place des anciens:

for F in passwd shadow group gshadow; do
   cp -a /etc/$F /etc/$F.old2
   cat new/$F > /etc/$F
done
cp -a /etc/samba/smbpasswd /etc/samba/smbpasswd.old2
cat new/smbpasswd > /etc/samba/smbpasswd

Ré-installation de e-smith-base

Pour remettre les paquets de base, la commande suivante devrait suffire:

db configuration setprop ldap Authentication disabled
yum install e-smith-base e-smith-samba e-smith-ldap

Ils remplaceront automatiquement leurs homologues +ldap (même si avant de confirmer, yum ne l'indique pas).

Flush de la base LDAP

La base LDAP doit être vidée pour être ré-initialisée avec les valeurs par défaut par le couple post-upgrade/reboot

sv d /service/ldap
cd /var/lib/ldap
tar cvzf ~/ldap_pre_modif.tar.gz ./* /home/e-smith/db/ldap/*
rm -f /var/lib/ldap/*
expand-template /home/e-smith/db/ldap/ldif
expand-template /etc/nsswitch.conf
expand-template /etc/pam.d/system-auth