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') || '';
#my $type = 'user';
# 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('gecos');
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:

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