Le script principal « gestion_ldap » est donné ci-dessous :
#!/bin/bash
# Script permet de lister, creer, modifier ou detruire des utilisateurs
# dans un annuaire LDAP
# Copyright marc.boget@gendarmerie.org
# Definition des valeurs par defaut
if [ "$BASEDN" == "" ]; then export BASEDN="ou=Maquette de test,o=sga";fi
if [ "$OU_USERS" == "" ]; then export OU_USERS="ou=People";fi
if [ "$OU_MACHINES" == "" ]; then export OU_MACHINES="ou=Ordinateurs";fi
if [ "$OU_GROUPS" == "" ]; then export OU_GROUPS="ou=Group";fi
#if [ "$BINDDN" == "" ]; then export BINDDN="uid=esentry,ou=Special Users,ou=Maquette de test,o=sga";fi
if [ "$BINDDN" == "" ]; then export BINDDN="cn=admin,ou=Maquette de test,o=sga";fi
if [ "$SERVEUR" == "" ]; then export SERVEUR="localhost";fi
if [ "$PORT" == "" ]; then export PORT="389";fi
if [ "$PASSWORD" == "" ]; then export PASSWORD="sga";fi
CHAMPS=""
if [ "$LDAPSEARCH" == "" ]; then LDAPSEARCH="/usr/bin/ldapsearch";fi
if [ "$LDAPDELETE" == "" ]; then LDAPDELETE="/usr/bin/ldapdelete";fi
if [ "$LDAPADDUSER" == "" ]; then LDAPADDUSER="./ldapadduser";fi
if [ "$LDAPADDALLUSERS" == "" ]; then LDAPADDALLUSERS="./ldapaddallusers";fi
if [ "$LDAPADDGROUP" == "" ]; then LDAPADDGROUP="./ldapaddgroup";fi
if [ "$OUT" == "" ]; then OUT="/dev/stdout";fi
if [ "$MK_NTPASSWD" == "" ]; then export MK_NTPASSWD="./mkntpwd";fi
SMB_HOME_TEMP="\\\\$(uname -n)"
if [ "$SMB_HOME" == "" ]; then export SMB_HOME="${SMB_HOME_TEMP}\homes";fi
if [ "$SMB_PROFILE" == "" ]; then export SMB_PROFILE="${SMB_HOME_TEMP}\profiles";fi
if [ "$SMB_DRIVE" == "" ]; then export SMB_DRIVE="Z:";fi
export TYPE_CREATION=""
ALL_USERS="no"
INTERACTIF="no"
PASS_MODE="no"
# Definition fichier de travail temporaire
export FICHIER_TEMP_USERS="personnel.tmp"
export FICHIER_TEMP_GROUPS="groups.tmp"
#Recuperation des arguments de la ligne de commande
ARGS=$(getopt -o k:ihlgamdf:as:D:b:w::p:t: --longoptions type:,interactif,help,list,append,modify,delete,groups,file:,server:,binddn:,basedn:,password::,port:,path_ldapsearch:,ou_users:,ou_groups:,ou_machines:,out:,ldapadduser:,ldapallusers:,ldapdelete:,allusers,gid:,pass,mkntpwd,smbhome:,smbprofile:,smbdrive:,uid:,ag -- "$@")
eval set -- "$ARGS"
while true
do
case "$1" in
-l|--list) OPT="List";
shift ;;
-g|--groups) OPT="Listgroups";
shift ;;
-a|--append) OPT="Append";
shift ;;
-m|--modify) OPT="Modify";
shift ;;
-d|--delete) OPT="Delete";
shift ;;
--ag) OPT="AddGroup";
shift ;;
-s|--server) SERVEUR=$2;
shift 2 ;;
-p|--port) PORT=$2;
shift 2 ;;
-b|--basedn) BASEDN=$2;
shift 2 ;;
-D|--binddn) BINDDN=$2;
shift 2 ;;
-w|--password) case "$2" in
"") echo -n "Mot de passe de connexion : " ;
read PASSWORD ;
shift 2 ;;
*) PASSWORD=$2 ; shift 2 ;;
esac ;;
--gid) GIDNUMBER=$2;
shift 2 ;;
--uid) UIDNUMBER=$2;
shift 2 ;;
--ldapsearch) LDAPSEARCH=$2;
shift 2 ;;
--ldapadduser) LDAPADDUSER=$2;
shift 2 ;;
--ldapallusers) LDAPADDALLUSERS=$2;
shift 2 ;;
--ldapaddgroup) LDAPADDGROUP=$2;
shift 2 ;;
--ou_users) OU_USERS=$2;
shift 2 ;;
--ou_groups) OU_GROUPS=$2;
shift 2 ;;
--ou_machines) OU_MACHINES=$2;
shift 2 ;;
--out) OUT=$2;
shift 2 ;;
-f|--file) FICHIER=$2;
shift 2 ;;
-i|--interactif) INTERACTIF="yes";
shift;;
-t|--type) TYPE_CREATION=$2;
shift 2 ;;
-k|--mkntpwd) MK_NTPASSWD=$2;
shift 2 ;;
--smbhome) SMB_HOME=$2;
shift 2 ;;
--smbprofile) SMB_PROFILE=$2;
shift 2 ;;
--smbdrive) SMB_DRIVE=$2;
shift 2 ;;
--allusers) ALL_USERS="yes";
shift ;;
--pass) PASS_MODE="yes";
shift ;;
--) shift ; break ;;
-h|--help) echo "Gestion des utilisateurs sur un annuaire LDAP" ;
echo "Usage : [l|gamdfsDbwp] [champs_recherches][utilisateur][mot_passe]" ;
echo " -l|--list : liste des utilisateurs" ;
echo " -g|--groups : liste des groupes d'utilisateurs" ;
echo " -a|--append : ajout d'utilisateur" ;
echo " -m|--modify : modification d'utilisateur" ;
echo " -d|--delete : destruction d'utilisateur" ;
echo " -f|--file : fichier de definition des utilisateurs" ;
echo " -i|--interactif: lancement en mode interactif" ;
echo " -s|--server : serveur LDAP a contacter" ;
echo " -D|--binddn : utilisateur a utiliser pour se connecter" ;
echo " -w|--password : mot de passe a utiliser pour se connecter" ;
echo " -p|--port : port d'ecoute du serveur LDAP" ;
echo " -k|--mkntpwd : utilitaire mkntpwd a utiliser (avec chemin complet)" ;
echo " -t|--type : type d'utilisateur/machine a creer : " ;
echo " - person : utilisateur de type personnel " ;
echo " - unix : utilisateur pouvant se connecter sur Unix" ;
echo " - samba : utilisateur pouvant se connecter sur Samba" ;
echo " - sambix : utilisateur pouvant se connecter sur Unix + Samba (Defaut)" ;
echo " - machine: machine faisant partie du domaine Samba" ;
echo " --gid : Numero du groupe a utiliser" ;
echo " --uid : Numero de l'utilisateur a utiliser" ;
echo " --ldapsearch : utilitaire ldapsearch a utiliser (avec chemin complet)" ;
echo " --ldapdelete : utilitaire ldapdelete a utiliser (avec chemin complet)" ;
echo " --ldapadduser : script perl pour ajout utilisateurs (avec chemin complet)" ;
echo " --ldapallusers : script perl pour ajout /etc/paswd (avec chemin complet)" ;
echo " --ldapaddgroup : script perl pour ajout groupes (avec chemin complet)" ;
echo " --ou_users : OU contenant les utilisateurs (ou=People par defaut)" ;
echo " --ou_groups : OU contenant les groupes (ou=Group par defaut)" ;
echo " --ou_machines : OU contenant les ordinateurs du domaine Samba (ou=Ordinateurs par defaut)" ;
echo " --out : Fichier de sortie des resultats (stdout par defaut)" ;
echo " --smbhome : Repertoire home utilisateurs samba" ;
echo " ($SMB_HOME par defaut)" ;
echo " --smbprofile : Repertoire profils utilisateurs samba" ;
echo " ($SMB_PROFILE par defaut)" ;
echo " --smbdrive : Lecteur reseau repertoire utilisateur samba (Z: par defaut)" ;
echo " --allusers : incorporation de l'ensemble des utilisateurs de /etc/passwd" ;
echo " --pass : changement du mot de passe" ;
echo ""
echo " champs_recherches : option utilisée avec options 'l' et 'g'"
echo " - tous les champs par defaut"
echo " - peuvent etre definis sous la forme champ1 champ2 ... champn"
echo ""
echo " utilisateur : nom utilisateur a creer/detruire"
echo ""
echo " mot_passe : mot de passe en clair de l'utilisateur a creer"
exit 1 ;;
*) echo "Aide";
exit 1 ;;
esac
done
# Recuperation du dn d'un utilisateur donné
function recuperation_dn()
{
variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_USERS,$BASEDN" "uid=$NOM_UTILISATEUR" dn|grep "^dn:"|cut -c "5-")
}
# Traitement du changement de mot de passe
if [ "$PASS_MODE" == "yes" ]
then
NOM_UTILISATEUR=$1
if [ "$NOM_UTILISATEUR" == "" ]
then
NOM_UTILISATEUR=$(whoami)
fi
recuperation_dn
export DN_UTILISATEUR=$variable
echo -n "Entrer l'ancien mot de passe pour utilisateur $NOM_UTILISATEUR : "
# Desactivation de l'echo local
stty -echo
read OLD_PASSWORD_USER
# Reactivation de l'echo local
stty echo
echo ""
echo -n "Entrer le nouveau mot de passe pour utilisateur $NOM_UTILISATEUR : "
# Desactivation de l'echo local
stty -echo
read NEW_PASSWORD_USER1
# Reactivation de l'echo local
stty echo
echo ""
echo -n "Retaper le mot de passe pour verification : "
# Desactivation de l'echo local
stty -echo
read NEW_PASSWORD_USER2
echo ""
# Reactivation de l'echo local
stty echo
if [ "$NEW_PASSWORD_USER1" != "$NEW_PASSWORD_USER2" ]
then
echo "Les deux mots de passe ne sont pas indentiques !!!"
exit -1
fi
export TYPE_CREATION="password"
export NEW_PASSWORD_USER1
$LDAPSEARCH -x -w "$OLD_PASSWORD_USER" -D "uid=$NOM_UTILISATEUR,$OU_USERS,$BASEDN" -b "$OU_USERS,$BASEDN" "uid=$NOM_UTILISATEUR" > /dev/null 2>&1 && $LDAPADDUSER && echo "Changement mot de passe effectue ..." || echo "Mot de passe incorrect !!!"
fi
# Traitement du mode interactif
if [ "$INTERACTIF" == "yes" ]
then
while [ "$OPT" == "" ]
do
echo -n "Option de lancement (List/Listgroups/Append/Modify/Delete/AddGroup) : "
read OPT
if [ "$OPT" != "List" ] && [ "$OPT" != "Listgroups" ] \
&& [ "$OPT" != "Append" ] && [ "$OPT" != "Modify" ] \
&& [ "$OPT" != "Delete" ] && [ "$OPT" != "AddGroup" ]
then
OPT=""
fi
done
while [ "$TYPE_CREATION" == "" ]
do
echo -n "Type d'utilisateur/machine a creer (person/unix/samba/sambix/machine) : "
read TYPE_CREATION
if [ "$TYPE_CREATION" != "person" ] && \
[ "$TYPE_CREATION" != "unix" ] && \
[ "$TYPE_CREATION" != "samba" ] && \
[ "$TYPE_CREATION" != "sambix" ] && \
[ "$TYPE_CREATION" != "machine" ]
then
TYPE_CREATION=""
fi
done
echo -n "Fichier de definition des utilisateurs (personnel.lst) : "
read FICHIER
if [ "$FICHIER" == "" ]; then FICHIER="personnel.lst"; fi
echo -n "Utilitaire ldapsearch (/usr/bin/ldapsearch) : "
read LDAPSEARCH
if [ "$LDAPSEARCH" == "" ]; then LDAPSEARCH="/usr/bin/ldapsearch"; fi
echo -n "Utilitaire ldapdelete (/usr/bin/ldapdelete) : "
read LDAPDELETE
if [ "$LDAPDELETE" == "" ]; then LDAPDELETE="/usr/bin/ldapdelete"; fi
echo -n "Script perl pour ajout utilisateurs (./ldapadduser) : "
read LDAPADDUSER
if [ "$LDAPADDUSER" == "" ]; then LDAPADDUSER="./ldapadduser"; fi
echo -n "Script perl pour ajout groupes (./ldapaddgroup) : "
read LDAPADDGROUP
if [ "$LDAPADDGROUP" == "" ]; then LDAPADDGROUP="./ldapaddgroup"; fi
echo -n "Script perl pour ajout /etc/passwd (./ldapaddallusers) : "
read LDAPADDALLUSERS
if [ "$LDAPADDALLUSERS" == "" ]; then LDAPADDALLUSERS="./ldapaddallusers"; fi
echo -n "Fichier de sortie des resultats (/dev/stdout) : "
read OUT
if [ "$OUT" == "" ]; then OUT="/dev/stdout"; fi
echo -n "Serveur LDAP (localhost) : "
read SERVEUR
if [ "$SERVEUR" == "" ]; then SERVEUR="localhost"; fi
echo -n "Port LDAP (389) : "
read PORT
if [ "$PORT" == "" ]; then PORT="389"; fi
echo -n "Racine LDAP (ou=Maquette de test,o=sga) : "
read BASEDN
if [ "$BASEDN" == "" ]; then BASEDN="ou=Maquette de test,o=sga"; fi
echo -n "Unite d'organisation LDAP contenant les utilisateurs (ou=People) : "
read OU_USERS
if [ "$OU_USERS" == "" ]; then OU_USERS="ou=People"; fi
echo -n "Unite d'organisation LDAP contenant les groupes (ou=Group) : "
read OU_GROUPS
if [ "$OU_GROUPS" == "" ]; then OU_GROUPS="ou=Group"; fi
echo -n "Unite d'organisation LDAP contenant les ordinateurs (ou=Ordinateurs) : "
read OU_MACHINES
if [ "$OU_GROUPS" == "" ]; then OU_GROUPS="ou=Group"; fi
echo -n "Utilisateur LDAP pour se connecter (uid=esentry,ou=Special Users,ou=Maquette de test,o=sga) : "
read BINDDN
if [ "$BINDDN" == "" ]; then BINDDN="uid=esentry,ou=Special Users,ou=Maquette de test,o=sga"; fi
fi
# Verification du type d'utilisateur a creer
if [ "$TYPE_CREATION" == "" ]; then TYPE_CREATION="sambix"; fi
# Recuperation des champs a visualiser ou des utilisateurs a creer/detruire
CHAMPS="$1"
if [ "$OPT" == "Append" ] || [ "$OPT" == "Modify" ]
then
if [ "$FICHIER" == "" ] && [ "TYPE_CREATION" != "machine" ]
then
if [ "ALL_USERS" == "" ]
then
if [ "$GIDNUMBER" == "" ]
then
echo ""
echo "Le numero de groupe d'appartenance de l'utilisateur est requis !!!"
exit -1
fi
NOM_UTILISATEUR=$1
PASSWORD_UTILISATEUR=$2
fi
fi
fi
# Definition des fonctions de calcul
# Recuperation du premier uid machine libre
function new_uid_machine()
{
variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_MACHINES,$BASEDN" uidNumber |grep "^uidNumber" |cut -d':' -f2|grep -v "65534"|sort -n|tail -1|cut -d' ' -f2)
# Cas ou il n'existe aucun utilisateur ds l'annuaire
if [ "$variable" == "" ]
then
variable="1000"
else
variable="$(expr $variable + 1 )"
fi
return $variable;
}
# Recuperation du premier uid utilisateur libre
function new_uid()
{
variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_USERS,$BASEDN" uidNumber |grep "^uidNumber" |cut -d':' -f2|grep -v "65534"|sort -n|tail -1|cut -d' ' -f2)
# Cas ou il n'existe aucun utilisateur ds l'annuaire
if [ "$variable" == "" ]
then
variable="1000"
else
variable="$(expr $variable + 1 )"
fi
return $variable;
}
# Recuperation du premier gid libre
function new_gid()
{
variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_GROUPS,$BASEDN" gidNumber |grep "^gidNumber" |cut -d':' -f2|grep -v "65534"|sort -n|tail -1|cut -d' ' -f2)
# Cas ou il n'existe aucun groupe ds l'annuaire
if [ "$variable" == "" ]
then
variable="1000"
else
variable="$(expr $variable + 1 )"
fi
return $variable;
}
# Recherche du gidNumber correspondant a un groupe donne
function recherche_gid()
{
variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_GROUPS,$BASEDN" "cn=$USER_GROUPE" |grep "^gidNumber" |cut -d':' -f2|cut -d' ' -f2)
return $variable;
}
# Remise a zero des champs utilisateur
function raz_champs()
{
USER_CN=""
USER_GROUPE=""
USER_PASSWORD=""
USER_SN=""
USER_HOME=""
USER_LOGIN=""
}
# Fonction de creation de groupe si besoin est
function creation_groupe()
{
# Si le GIDNUMBER n'est pas fixe dans la ligne de commande
# Recherche du gidNumber correspondant au groupe demandé
# Si existe pas alors creation nouveau groupe
if [ "$GIDNUMBER" == "" ]
then
recherche_gid
GID=$variable
else
GID=$GIDNUMBER
fi
if [ "$GID" == "" ]
then
new_gid
GID=$variable
echo "$USER_GROUPE:$GID" >> $FICHIER_TEMP_GROUPS
fi
}
# Fonction ajout de machines au domaine
function ajout_machines()
{
# Effacement des fichiers de travail temporaires
rm -f $FICHIER_TEMP_USERS
rm -f $FICHIER_TEMP_GROUPS
# Calcul du numero uid de depart
if [ "$UIDNUMBER" == "" ]
then
new_uid_machine
USER_ID=$variable
else
USER_ID=$UIDNUMBER
fi
# Destruction prealable de la machine si modification demandée
if [ "$AJOUT" == "0" ]; then destruction_machine; fi
NOM_UTILISATEUR="${CHAMPS}$"
USER_CN=$NOM_UTILISATEUR
USER_PASSWORD=$PASSWORD_UTILISATEUR
USER_SN=$NOM_UTILISATEUR
USER_HOME="/dev/null"
USER_LOGIN="/bin/false"
USER_GROUPE="users"
creation_groupe
# Ecriture du fichier de definition des machines
# sous la forme cn;uid;gid;password;sn;home;login shell
echo "$USER_CN:$USER_ID:$GID:$USER_PASSWORD:$USER_SN:$USER_HOME:$USER_LOGIN" >> $FICHIER_TEMP_USERS
# Appel du script perl permettant de creer la machine
$LDAPADDUSER
# Appel du script perl permettant de creer les nouveaux groupes
# Test : FICHIER_TEMP_GROUPS present
if test -f $FICHIER_TEMP_GROUPS
then
$LDAPADDGROUP
fi
return 0
}
# Fonction permettant d'ajouter des utilisateurs
function ajout_utilisateurs()
{
# Effacement des fichiers de travail temporaires
rm -f $FICHIER_TEMP_USERS
rm -f $FICHIER_TEMP_GROUPS
# Sauvegarde du contexte
OLD_IFS=$IFS
IFS=$'\n'
# Calcul du numero uid de depart
if [ "$UIDNUMBER" == "" ]
then
new_uid
USER_ID=$variable
else
USER_ID=$UIDNUMBER
fi
# Explosion des lignes du fichier $FICHIER
# les lignes sont sous la forme :
# nom_utilisateur;groupe;password;sn;home;login shell
# Cas ou option all_users selectionnee
if [ "$ALL_USERS" == "yes" ]
then
FICHIER=/etc/passwd
fi
# Traitement du cas ou le nom de l'utilisateur est donne en ligne de commande
if [ "$FICHIER" == "" ]
then
# Destruction prealable de l'utilisateur si modification demandée
if [ "$AJOUT" == "0" ]; then destruction_utilisateur; fi
NOM_UTILISATEUR=$CHAMPS
USER_CN=$NOM_UTILISATEUR
USER_PASSWORD=$PASSWORD_UTILISATEUR
USER_SN=$NOM_UTILISATEUR
USER_HOME="/home/$NOM_UTILISATEUR"
USER_LOGIN="/bin/bash"
USER_GROUPE="$NOM_UTILISATEUR"
creation_groupe
# Ecriture du fichier de definition des utilisateurs
# sous la forme cn;uid;gid;password;sn;home;login shell
echo "$USER_CN:$USER_ID:$GID:$USER_PASSWORD:$USER_SN:$USER_HOME:$USER_LOGIN" >> $FICHIER_TEMP_USERS
# Appel du script perl permettant de creer l'utilisateur
$LDAPADDUSER
# Appel du script perl permettant de creer les nouveaux groupes
# Test : FICHIER_TEMP_GROUPS present
if test -f $FICHIER_TEMP_GROUPS
then
$LDAPADDGROUP
fi
return 0
fi
for LIGNE in $(cat $FICHIER|grep -v "^#"|grep [:alnum:])
do
IFS=":"
set $LIGNE
# Mise a zero et initialisation des champs de l'utilisateur
raz_champs
# Cas ou option all_users selectionnee
if [ "$ALL_USERS" == "yes" ]
then
USER_CN=$1
USER_PASSWORD=$(grep "^$USER_CN:" /etc/shadow|cut -d':' -f2)
USER_ID=$3
GID=$4
USER_SN=$5
USER_HOME=$6
USER_LOGIN=$7
else
USER_CN=$1
USER_GROUPE=$2
USER_PASSWORD=$3
USER_SN=$4
USER_HOME=$5
USER_LOGIN=$6
creation_groupe
fi
# Mise a jour du sn au cn par defaut
if [ "$USER_SN" == "" ]
then
USER_SN="$USER_CN"
fi
# Destruction prealable de l'utilisateur si modification demandée
if [ "$AJOUT" == "0" ]
then
CHAMPS=$USER_CN
destruction_utilisateur
fi
# Ecriture du fichier de definition des utilisateurs
# sous la forme cn;uid;gid;password;sn;home;login shell
echo "$USER_CN:$USER_ID:$GID:$USER_PASSWORD:$USER_SN:$USER_HOME:$USER_LOGIN" >> $FICHIER_TEMP_USERS
USER_ID="$(expr $USER_ID + 1 )"
done
# Restauration du contexte
IFS=$OLD_IFS
# Appel du script perl permettant de creer les utilisateurs
if [ "$ALL_USERS" == "yes" ]
then
$LDAPADDALLUSERS
else
$LDAPADDUSER
fi
# Appel du script perl permettant de creer les nouveaux groupes
# Test : FICHIER_TEMP_GROUPS present
if test -f $FICHIER_TEMP_GROUPS
then
$LDAPADDGROUP
fi
}
# Fonction permettant de detruire une machine
function destruction_machine()
{
$LDAPDELETE -x -w "$PASSWORD" -D "$BINDDN" "uid=$CHAMPS,$OU_MACHINES,$BASEDN"
}
# Fonction permettant de detruire un utilisateur
function destruction_utilisateur()
{
$LDAPDELETE -x -w "$PASSWORD" -D "$BINDDN" "uid=$CHAMPS,$OU_USERS,$BASEDN"
}
# Traitement des commandes
case $OPT in
List)
$LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_USERS,$BASEDN" $CHAMPS > $OUT ;
;;
Listgroups)
$LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_GROUPS,$BASEDN" $CHAMPS > $OUT ;
;;
Append) AJOUT=1
if [ "$TYPE_CREATION" != "machine" ]
then
ajout_utilisateurs
else
ajout_machines
fi
;;
Delete) if [ "$CHAMPS" == "" ]
then
echo "Nom de l'utilisateur a detruire manquant"
exit 1
fi
destruction_utilisateur
;;
Modify) AJOUT=0
ajout_utilisateurs
;;
AddGroup) USER_GROUPE=$CHAMPS
creation_groupe
if test -f $FICHIER_TEMP_GROUPS
then
$LDAPADDGROUP
fi
;;
esac
rm -f $FICHIER_TEMP_USERS
rm -f $FICHIER_TEMP_GROUPS
NB : Ce script accepte les options ci-dessous :
Usage : [l|gamdfsDbwp] [champs_recherches][utilisateur][mot_passe]
-l|--list : liste des utilisateurs
-g|--groups : liste des groupes d'utilisateurs
-a|--append : ajout d'utilisateur
-m|--modify : modification d'utilisateur
-d|--delete : destruction d'utilisateur
-f|--file : fichier de definition des utilisateurs
-i|--interactif : lancement en mode interactif
-s|--server : serveur LDAP a contacter
-D|--binddn : utilisateur a utiliser pour se connecter
-w|--password : mot de passe a utiliser pour se connecter
-p|--port : port d'ecoute du serveur LDAP
-k|--mkntpwd : utilitaire mkntpwd a utiliser (avec chemin complet)
-t|--type : type d'utilisateur/machine a creer :
- person : utilisateur de type personnel
- unix : utilisateur pouvant se connecter sur Unix
- samba : utilisateur pouvant se connecter sur Samba
- sambix : utilisateur pouvant se connecter sur Unix + Samba (Defaut)
- machine : machine faisant partie du domaine Samba
--gid : Numero du groupe a utiliser
--uid : Numero de l'utilisateur a utiliser
--ldapsearch : utilitaire ldapsearch a utiliser (avec chemin complet)
--ldapdelete : utilitaire ldapdelete a utiliser (avec chemin complet)
--ldapadduser : script perl pour ajout utilisateurs (avec chemin complet)
--ldapallusers : script perl pour ajout /etc/paswd (avec chemin complet)
--ldapaddgroup : script perl pour ajout groupes (avec chemin complet)
--ou_users : OU contenant les utilisateurs (ou=People par defaut)
--ou_groups : OU contenant les groupes (ou=Group par defaut)
--ou_machines : OU contenant les ordinateurs du domaine Samba (ou=Ordinateurs par defaut)
--out : Fichier de sortie des resultats (stdout par defaut)
--smbhome : Repertoire home utilisateurs samba
(\\GrandeOurse\homes par defaut)
--smbprofile : Repertoire profils utilisateurs samba
(\\GrandeOurse\profiles par defaut)
--smbdrive : Lecteur reseau repertoire utilisateur samba (Z: par
defaut)
--allusers : incorporation de l'ensemble des utilisateurs de
/etc/passwd
--pass : changement du mot de passe
champs_recherches : option utilisée avec options 'l' et 'g'
- tous les champs par defaut
- peuvent etre definis sous la forme champ1 champ2 ... champn
utilisateur : nom utilisateur a creer/detruire
mot_passe : mot de passe en clair de l'utilisateur a creer
Il peut s’appuyer sur un fichier de définition dont un exemple est donné ci-dessous :
# Fichier de definition des utilisateurs a creer dans l'annuaire LDAP
# Ce fichier sert de base pour gestion_ldap
# Les lignes doivent etre de la forme :
# nom:nom_groupe:mot_passe:nom_complet:home_directory:login_shell
user_test:groupe_test:sga:Utilisateur de Test:/home/user_test:/bin/bash
Il s’appuie sur les scripts perl « ldapadduser » « ldapaddgroup » et « ldapaddallusers » donnés ci-dessous :
#!/usr/bin/perl -w
#
# Script permettant de creer les utilisateurs dans l'annuaire LDAP
# Copyright marc.boget@gendarmerie.org
# Script fonctionnant de pair avec le script maitre gestion_ldap
#use strict;
use Net::LDAP;
# Recuperation des variables environnements exportes par gestion_ldap
my $serveur=$ENV{"SERVEUR"};
my $binddn=$ENV{"BINDDN"};
my $basedn=$ENV{"BASEDN"};
my $password=$ENV{"PASSWORD"};
my $ou_users=$ENV{"OU_USERS"};
my $ou_machines=$ENV{"OU_MACHINES"};
my $fichier_travail=$ENV{"FICHIER_TEMP_USERS"};
my $shadow_lastchange="11111";
my $shadow_max="99999";
my $shadow_warning="7";
my $type_creation=$ENV{"TYPE_CREATION"};
my $mk_ntpasswd=$ENV{"MK_NTPASSWD"};
my $home_rep_samba=$ENV{"SMB_HOME"};
my $home_drive_samba=$ENV{"SMB_DRIVE"};
my $profile_rep_samba=$ENV{"SMB_PROFILE"};
# Ouverture de la connexion sur l'annuaire LDAP
my $ldap = Net::LDAP->new($serveur, async => 1) or die "$@";
# on se connecte avec le BINDDN
$ldap->bind(dn=>$binddn,
password=>$password) or die "$@";
# Traitement du changement du mot de passe
if ($type_creation =~ "password")
{
# Generation du mot de passe chiffré
my $pass=$ENV{"NEW_PASSWORD_USER1"};
my $dn =$ENV{"DN_UTILISATEUR"};
$salt=substr(rand 100,0,2);
$pw=crypt($pass,$salt);
my $userpassword="{crypt}$pw";
# Calcul du mot de passe LanManager et du mot de passe NT
# a l'aide de l'outil mkntpasswd (source LophtCrack)
my $ntpwd=`$mk_ntpasswd '$pass'`;
chomp(my $lmpassword=substr($ntpwd,0,index($ntpwd,':')));
chomp(my $ntpassword=substr($ntpwd,index($ntpwd,':')+1));
my $res = $ldap->modify(dn=>$dn,
changes => [
replace => [ "userPassword" => [ $userpassword ]
]
]
);
$res->code && warn "Erreur lors de la modification du mot de passe : ", $res->error ;
$res = $ldap->modify(dn=>$dn,
changes => [
replace => [ "lmPassword" => [ $lmpassword ]
]
]
);
$res->code && warn "Erreur lors de la modification du mot de passe : ", $res->error ;
$res = $ldap->modify(dn=>$dn,
changes => [
replace => [ "ntPassword" => [ $ntpassword ]
]
]
);
$res->code && warn "Erreur lors de la modification du mot de passe : ", $res->error ;
exit;
}
# on lit un fichier qui contient les personnes à créer dans l'annuaire
open (FILE, "<$fichier_travail");
my $line;
while (defined ($line = <FILE>))
{
chomp($line);
if ($line =~ /^\s*$/)
{
next;
}
my ($uid, $uidNumber, $gidNumber, $pass, $sn, $home_rep, $login_shell) = split(/:/, $line);
my $dn = "uid=$uid,$ou_users,$basedn";
# Generation du mot de passe chiffré
$salt=substr(rand 100,0,2);
$pw=crypt($pass,$salt);
my $userpassword="{crypt}$pw";
SWITCH:
{
if ($type_creation =~ "person")
{
my $res = $ldap->add(dn=>$dn,
attrs =>
[ "objectclass" => [ 'InetOrgPerson' ],
"uid" => [ $uid ],
"cn" => [ $uid ],
"sn" => [ $sn ]]);
$res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
last SWITCH;
}
if ($type_creation =~ "sambix")
{
my $winmagic=2147483647;
# Calcul du rid de l'utilisateur et du primaryGroupId
# userRid=2*uidNumber + 1000
# groupId=2*gidNumber + 1001
my $userRid = 2 * $uidNumber + 1000;
my $userGroupRid = 2 * $gidNumber + 1001;
# Calcul du mot de passe LanManager et du mot de passe NT
# a l'aide de l'outil mkntpasswd (source LophtCrack)
my $ntpwd=`$mk_ntpasswd '$pass'`;
chomp(my $lmpassword=substr($ntpwd,0,index($ntpwd,':')));
chomp(my $ntpassword=substr($ntpwd,index($ntpwd,':')+1));
# Mise a jour du samba home
$home_rep_samba="$home_rep_samba\\$uid";
print("home_rep=$home_rep_samba\n");
my $res = $ldap->add(dn=>$dn,
attrs =>
[ "objectclass" => [ 'InetOrgPerson', 'account', 'posixAccount', 'top', 'shadowaccount', 'sambaAccount' ],
"uid" => [ $uid ],
"cn" => [ $uid ],
"sn" => [ $sn ],
"userPassword" => [ $userpassword ],
"shadowLastChange" => [ $shadow_lastchange ],
"shadowMax" => [ $shadow_max ],
"shadowWarning" => [ $shadow_warning ],
"loginShell" => [ $login_shell ],
"uidNumber" => [ $uidNumber ],
"gidNumber" => [ $gidNumber ],
"homeDirectory" => [ $home_rep ],
"gecos" => [ $uid ],
"description" => [ "Utilisateur SAMBA $sn" ],
"pwdLastSet" => [ '0' ],
"logonTime" => [ '0' ],
"logoffTime" => [ $winmagic ],
"kickoffTime" => [ $winmagic ],
"pwdCanChange" => [ '0' ],
"pwdMustChange" => [ $winmagic ],
"displayName" => [ $uid ],
"acctFlags" => [ '[UX ]' ],
"rid" => [ $userRid ],
"primaryGroupID" => [ $userGroupRid ],
"smbHome" => [ $home_rep_samba ],
"lmPassword" => [ $lmpassword ],
"ntPassword" => [ $ntpassword ],
"homeDrive" => [ $home_drive_samba ],
"profilePath" => [ $profile_rep_samba ]
]);
$res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
last SWITCH;
}
if ($type_creation =~ "machine")
{
my $dn = "uid=$uid,$ou_machines,$basedn";
my $winmagic=2147483647;
my $userRid = 2 * $uidNumber + 1000;
my $userGroupRid = 2 * $gidNumber + 1001;
# Calcul du mot de passe LanManager et du mot de passe NT
# a l'aide de l'outil mkntpasswd (source LophtCrack)
my $pass=$uid;
$pass=~ s/.$//s;
print("pass=$pass\n");
my $ntpwd=`$mk_ntpasswd '$pass'`;
chomp(my $lmpassword=substr($ntpwd,0,index($ntpwd,':')));
chomp(my $ntpassword=substr($ntpwd,index($ntpwd,':')+1));
# Mise a jour du samba home
$home_rep_samba="$home_rep_samba\\nobody";
print("home_rep=$home_rep_samba\n");
# Mise a jour du samba profile
$profile_rep_samba="$profile_rep_samba\\nobody\\profile";
print("home_rep=$profile_rep_samba\n");
my $res = $ldap->add(dn=>$dn,
attrs =>
[ "objectclass" => [ 'posixAccount', 'top', 'sambaAccount' ],
"uid" => [ $uid ],
"cn" => [ $uid ],
"loginShell" => [ $login_shell ],
"uidNumber" => [ $uidNumber ],
"gidNumber" => [ $gidNumber ],
"homeDirectory" => [ $home_rep ],
"description" => [ "Ordinateur SAMBA $pass" ],
"pwdLastSet" => [ '0' ],
"logonTime" => [ '0' ],
"logoffTime" => [ $winmagic ],
"kickoffTime" => [ $winmagic ],
"pwdCanChange" => [ '0' ],
"pwdMustChange" => [ $winmagic ],
"acctFlags" => [ '[W ]' ],
"rid" => [ $userRid ],
"primaryGroupID" => [ $userGroupRid ],
"smbHome" => [ $home_rep_samba ],
"lmPassword" => [ $lmpassword ],
"ntPassword" => [ $ntpassword ],
"profilePath" => [ $profile_rep_samba ]
]);
$res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
last SWITCH;
}
if ($type_creation =~ "samba")
{
my $winmagic=2147483647;
# Calcul du rid de l'utilisateur et du primaryGroupId
# userRid=2*uidNumber + 1000
# groupId=2*gidNumber + 1001
my $userRid = 2 * $uidNumber + 1000;
my $userGroupRid = 2 * $gidNumber + 1001;
# Calcul du mot de passe LanManager et du mot de passe NT
# a l'aide de l'outil mkntpasswd (source LophtCrack)
my $ntpwd=`$mk_ntpasswd '$pass'`;
chomp(my $lmpassword=substr($ntpwd,0,index($ntpwd,':')));
chomp(my $ntpassword=substr($ntpwd,index($ntpwd,':')+1));
my $res = $ldap->add(dn=>$dn,
attrs =>
[ "objectclass" => [ 'InetOrgPerson', 'account', 'posixAccount', 'top', 'shadowaccount', 'sambaAccount' ],
"uid" => [ $uid ],
"cn" => [ $uid ],
"sn" => [ $sn ],
"gecos" => [ $uid ],
"description" => [ "Utilisateur SAMBA $sn" ],
"pwdLastSet" => [ '0' ],
"logonTime" => [ '0' ],
"logoffTime" => [ $winmagic ],
"kickoffTime" => [ $winmagic ],
"pwdCanChange" => [ '0' ],
"pwdMustChange" => [ $winmagic ],
"displayName" => [ $uid ],
"acctFlags" => [ '[UX ]' ],
"rid" => [ $userRid ],
"primaryGroupID" => [ $userGroupRid ],
"smbHome" => [ $home_rep_samba ],
"lmPassword" => [ $lmpassword ],
"ntPassword" => [ $ntpassword ],
"homeDrive" => [ $home_drive_samba ],
"profilePath" => [ $profile_rep_samba ]
]);
$res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
last SWITCH;
}
if ($type_creation =~ "unix")
{
my $res = $ldap->add(dn=>$dn,
attrs =>
[ "objectclass" => [ 'InetOrgPerson', 'account', 'posixAccount', 'top', 'shadowaccount' ],
"uid" => [ $uid ],
"cn" => [ $uid ],
"sn" => [ $sn ],
"userPassword" => [ $userpassword ],
"shadowLastChange" => [ $shadow_lastchange ],
"shadowMax" => [ $shadow_max ],
"shadowWarning" => [ $shadow_warning ],
"loginShell" => [ $login_shell ],
"uidNumber" => [ $uidNumber ],
"gidNumber" => [ $gidNumber ],
"homeDirectory" => [ $home_rep ],
"gecos" => [ $uid ]]);
$res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
last SWITCH;
}
}
}
close(FILE);
#!/usr/bin/perl -w
#
# Script permettant de creer les groupes utilisateurs dans l'annuaire LDAP
# Copyright marc.boget@gendarmerie.org
# Script fonctionnant de pair avec le script maitre gestion_ldap
#use strict;
use Net::LDAP;
# Recuperation des variables environnements exportes par gestion_ldap
my $serveur=$ENV{"SERVEUR"};
my $binddn=$ENV{"BINDDN"};
my $basedn=$ENV{"BASEDN"};
my $password=$ENV{"PASSWORD"};
my $ou_groups=$ENV{"OU_GROUPS"};
my $fichier_travail=$ENV{"FICHIER_TEMP_GROUPS"};
# Ouverture de la connexion sur l'annuaire LDAP
my $ldap = Net::LDAP->new($serveur, async => 1) or die "$@";
# on se connecte avec le BINDDN
$ldap->bind(dn=>$binddn,
password=>$password) or die "$@";
# on lit un fichier qui contient les groupes à créer dans l'annuaire
open (FILE, "<$fichier_travail");
my $line;
while (defined ($line = <FILE>))
{
chomp($line);
if ($line =~ /^\s*$/)
{
next;
}
my ($gid, $gidNumber) = split(/:/, $line);
my $dn = "cn=$gid,$ou_groups,$basedn";
my $res = $ldap->add(dn=>$dn,
attrs =>
[ "objectclass" => [ 'posixGroup', 'top' ],
"cn" => [ $gid ],
"gidNumber" => [ $gidNumber ]]);
$res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
}
close(FILE);
#!/usr/bin/perl -w
#
# Script permettant de creer les utilisateurs de /etc/passwd
# dans l'annuaire LDAP
# Copyright marc.boget@gendarmerie.org
# Script fonctionnant de pair avec le script maitre gestion_ldap
#use strict;
use Net::LDAP;
# Recuperation des variables environnements exportes par gestion_ldap
my $serveur=$ENV{"SERVEUR"};
my $binddn=$ENV{"BINDDN"};
my $basedn=$ENV{"BASEDN"};
my $password=$ENV{"PASSWORD"};
my $ou_users=$ENV{"OU_USERS"};
my $fichier_travail=$ENV{"FICHIER_TEMP_USERS"};
my $shadow_lastchange="11111";
my $shadow_max="99999";
my $shadow_warning="7";
# Ouverture de la connexion sur l'annuaire LDAP
my $ldap = Net::LDAP->new($serveur, async => 1) or die "$@";
# on se connecte avec le BINDDN
$ldap->bind(dn=>$binddn,
password=>$password) or die "$@";
# on lit un fichier qui contient les personnes à créer dans l'annuaire
open (FILE, "<$fichier_travail");
my $line;
while (defined ($line = <FILE>))
{
chomp($line);
if ($line =~ /^\s*$/)
{
next;
}
my ($uid, $uidNumber, $gidNumber, $pass, $sn, $home_rep, $login_shell) = split(/:/, $line);
my $dn = "uid=$uid,$ou_users,$basedn";
my $userpassword="{crypt}$pass";
my $res = $ldap->add(dn=>$dn,
attrs =>
[ "objectclass" => [ 'InetOrgPerson', 'account', 'posixAccount', 'top', 'shadowaccount' ],
"uid" => [ $uid ],
"cn" => [ $uid ],
"sn" => [ $sn ],
"userPassword" => [ $userpassword ],
"shadowLastChange" => [ $shadow_lastchange ],
"shadowMax" => [ $shadow_max ],
"shadowWarning" => [ $shadow_warning ],
"loginShell" => [ $login_shell ],
"uidNumber" => [ $uidNumber ],
"gidNumber" => [ $gidNumber ],
"homeDirectory" => [ $home_rep ],
"gecos" => [ $uid ]]);
$res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
}
close(FILE);