Script per la comunicazione agli utenti della scadenza dell’account su un server basato su LDAP


Uno dei problemi più annosi nella gestione di server è quello della scadenza delle utenze.
In molti contesti vengono creati utenti temporanei (magari dipendenti a tempo determinato o stagisti).
LDAP molto agevolemente permette di gestire la scadenza dell’account.
Il problema resta quello di notificare all’utente che il suo account sta per scadere.
Questo è possibile effettuarlo tramite uno script da mettere in crontab …

#!/bin/bash

########################################################
#
# Script per la comunicazione via mail agli utenti
# della scadenza dell’account
#
# BoB 20-01-2010
# Rel. 1.200
########################################################

#############################
# Variabili
#############################
# A chi invio la mail per conoscenza (bcc) ?
bcc=”area-ict@dominio.it”

# variables for LDAP search
ldapHost=”localhost”
ldapContext=”dc=dominio,dc=it”
ldapUser=”cn=admin,dc=dominio,dc=it”
ldapPasswd=”password_server_ldap”
checkTime=”7 days”
checkTimeITA=”7 giorni”
expireDate=”8 days”

# Files di appoggio temporanei
tmpMsg=/root/passwordsToExpireMsg
tmpLdapResult=/root/passwordsToExpire

# Calcolo delle date
# datenow = data odierna + il checktime in formato gg/mm/aa
datenow=`date -d “$checkTime” “+%d/%m/%y”`
# unixtime_datenow = data odierna + il checktime in formato Unix
unixtime_datenow=`date -d “$checkTime” +%s`
# epoch = data di partenza dello UnixTime
epoch=’01/01/1970′
# unixtime_epoch = data di partenza dello UnixTime in formato Unix
unixtime_epoch=`date -d ‘Jan 01 1970 01:00:00’ +%s`

# Inizio della procedura di calcolo delle date
# e stampa a video delle informazioni
clear
echo “Epoch in data (data di nascita dello UNIXtime): “$epoch
echo “Epoch in UNIXtime (data di nascita dello UNIXtime): “$unixtime_epoch
echo “Data odierna: “$datenow
echo “Data odierna in UNIXtime: “$unixtime_datenow
echo “”
echo “Calcolo della differenze tra le date:”
echo “————————————-”
datediff=”$(( ($unixtime_datenow-$unixtime_epoch)/( 60*60*24) ))”
echo “Data arrivo:”$unixtime_epoch “- Data partenza:”$unixtime_datenow
echo “Risultato in giorni: ” $(( ($unixtime_datenow-$unixtime_epoch)/( 60*60*24) ))
echo “Data di riferimento della scadenza password: “$datediff

# Ricerca della data di scandenza delle utenze
# con riferimento ai parametri CN e UID
# cn = common name
# uid = user id
ldapsearch -x -D $ldapUser -w $ldapPasswd -b $ldapContext “(&(objectclass=posixAccount)(shadowExpire=$datediff))” cn uid > $tmpLdapResult

# Estrazione delle informazioni dal file di appoggio
# tmpLdapResult=/root/passwordsToExpire
# Estrai i dati UID e CN.
# Nel caso di “ldap_mail” aggiunge il dominio di riferimento
ldap_uid=`less $tmpLdapResult | gawk ‘/uid:/’`
ldap_mail=`less $tmpLdapResult | gawk ‘/uid:/ {print $2″@dominio.it”}’`
ldap_cn=`/usr/bin/less $tmpLdapResult | gawk ‘/cn:/ {print $2″ ” $3″ ” $4″ ” $5″ “}’`

# Per ogni UID trovato nel file manda una email all’utente
# ed una mail in ccn all’utenza definita come BCC all’inizio del file
for user in $ldap_mail; do
echo;
echo “Gentile utente,” >>$tmpMsg;
echo “si comunica che il tuo account di posta elettronica: $user scadra’ il giorno $datenow.”>>$tmpMsg;
echo “Si prega contattare l’Area servizi ICT aziendale entro $checkTimeITA dal `date +%d/%m/%y` per maggiori informazioni.” >>$tmpMsg;
echo “In caso contrario l’account sara’ sospeso a partire dalle ore 00:00 del `date -d “$expireDate” +%d/%m/%y`.”>>$tmpMsg;
echo “Cordiali saluti.”>>$tmpMsg;
echo>>$tmpMsg;
echo “Questa e’ una mail generata automaticamente dal sistema”>>$tmpMsg;
echo “———————————————————–“>>$tmpMsg;
echo “Area servizi ICT – famosa azienda informatica …”>>$tmpMsg;
echo “Riferimenti telefonici: 091/xxxxxxxxx – 335/xxxxxxxx”>>$tmpMsg;
echo “———————————————————–“>>$tmpMsg;
# Invia la mail preparata e manda una copia in BCC …
cat $tmpMsg | /bin/mail -s “Comunicazione scadenza account [Area ICT/$user]” $user -b $bcc;
# Rimuove il messaggio …
rm $tmpMsg
# Stampa a video le informazioni sugli account scaduti
echo $ldap_uid “- Nome utente: “$ldap_cn;
done

# Rimuove i risultati …
rm $tmpLdapResult

exit 0

Annunci

Recovery di OpenLDAP se il db bdb si corrompe/è in sola lettura


Può capitare che, riavviando il servizio LDAP di un server, compaia questo messaggio di errore:

Controllo file di configurazione per slapd: bdb_db_open: unclean shutdown detected; attempting recovery.
bdb_db_open: Recovery skipped in read-only mode. Run manual recovery if errors are encountered.
config file testing succeeded

In questo caso basta digitare:

cp /etc/openldap/DB_CONFIG.example DB_CONFIG
service ldap restart

… e il problema scompare !

Aggiungere/modificare utenti ad un PDC realizzato con Samba e OpenLDAP


Aggiungere un utente:

… come “Administrator”
smbldap-useradd -N “Nome” -S “Cognome” -P -a -m -c “Nome Cognome” username_assegnato -s /bin/bash -g “Domain Admins” -u 500 Administrator

… come utente normale
smbldap-useradd -N “Nome” -S “Cognome” -P -a -m -c “Nome Cognome” username_assegnato

Aggiungere un gruppo all’utente:

Aggiungere l’utente “username_asegnato” al gruppo “Amministratori” (oltre al gruppo principale di appartenenza)
smbldap-usermod -G “Domain Admins” username_assegnato

Vedere chi appartiene ad un determinato gruppo:

smbldap-groupshow “Domain Admins”

Ottenere una lista degli utenti presenti sul sistema:

smbldap-userlist

Realizzare un PDC con CentOS e OpenLDAP come backend


Premessa (1): questo how to funziona con la release 5.x di Centos
Premessa (2): per il corretto funzionamento di questo how to è necessario disinstallare samba (ramo 3.0.x) ed installare samba3x (ramo 3.5.x)
Premessa (3): per il corretto funzionamento di questo how to è necessario installare smbldap-tools

Dopo avere aggiornato il sistema e installati gli aggiornamenti di cui all’articolo http://opuntia.biz/2009/07/07/aggiornare-centos-in-un-sol-colpo/ editiamo il file /etc/hosts

127.0.0.1 localhost.localdomain localhost
(IP_SERVER) serverpdc.azienda.it serverpdc

Ora iniziamo a lavorare su OpenLDAP.
Editiamo il file /etc/openldap/ldap.conf ed inseriamo:

BASE dc=serverpdc, dc=local
URI ldap://127.0.0.1

Editiamo il file /etc/openldap/slapd.conf ed andiamo a modificare i campi:

include /etc/openldap/schema/samba.schema

suffix “dc=serverpdc,dc=local”
rootdn “cn=admin,dc=serverpdc,dc=local”
rootpw (PASSWORD)

index sambaSID eq
index sambaPrimaryGroupSID eq
index sambaDomainName eq

#access to attrs=userPassword,shadowLastChange,sambaNTPassword,sambaLMPassword

Digitiamo i seguenti comandi:

cp /usr/share/doc/samba3x-3.5.4/LDAP/samba.schema /etc/openldap/schema/

cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap /var/lib/ldap/DB_CONFIG
chmod 600 /var/lib/ldap/DB_CONFIG

service ldap restart

Digitiamo il comando …

slappasswd

che, dopo avere inserito la password restituirà la stessa criptata …

{SSHA}wU7yzn+xv4fHfLTMceg0fgmOa40LcRfC

Creiamo con il nostro editor di testo preferito un file che chiameremo “admin.ldif” compilato nel seguente modo:

# Voce 1: dc=serverpdc,dc=local
dn: dc=serverpdc,dc=local
dc: serverpdc
o: serverpdc.local
objectclass: top
objectclass: dcObject
objectclass: organization

# Voce 2: cn=admin,dc=serverpdc,dc=local
dn: cn=admin,dc=serverpdc,dc=local
cn: admin
objectclass: organizationalRole
objectclass: simpleSecurityObject
objectclass: top
userpassword: {SSHA}wU7yzn+xv4fHfLTMceg0fgmOa40LcRfC

Digitiamo il comando:

ldapadd -x -D “cn=admin,dc=serverpdc,dc=local” -w [PASSWORD_IN_CHIARO] -f /root/admin.ldif

Recuperiamo il SID della macchina …

[root@serverpdc html]# net getlocalsid
SID for domain SERVERPDC is: S-1-5-21-3901001746-2498536636-3303555514

… ed editiamo il file /etc/smbldap-tools/smbldap.conf in questo modo:

SID=”S-1-5-21-3901001746-2498536636-3303555514″
sambaDomain=”SERVERPDC.LOCAL”
#slaveLDAP=”ldap.iallanis.info”
#slavePort=”389″
masterLDAP=”127.0.0.1″
suffix=”dc=serverpdc,dc=local”
ldapTLS=”0″
userSmbHome=”\\SERVERPDC\%U”
userProfile=”\\SERVERPDC\profiles\%U”
mailDomain=”DOMINIO_DI_POSTA.IT”

Altresì editiamo il file /etc/smbldap-tools/smbldap_bind.conf

slaveDN=”cn=admin,dc=serverpdc,dc=local”
slavePw=”(PASSWORD)”
masterDN=”cn=admin,dc=serverpdc,dc=local”
masterPw=”(PASSWORD)”

Editiamo il file /etc/samba/smb.conf in questo modo:

[global]
workgroup = SERVERPDC.LOCAL
server string = Samba PDC Server Version %v
obey pam restrictions = Yes
passdb backend = ldapsam:ldap://127.0.0.1
passwd program = /usr/sbin/smbldap-passwd %upasswd chat = *New*password* %n\n *Retype*new*password* %n\n *all*authentication*tokens*updated*
add user script = /usr/sbin/smbldap-useradd -m “%u”
delete user script = /usr/sbin/smbldap-userdel “%u”
add group script = /usr/sbin/smbldap-groupadd -p “%g”
delete group script = /usr/sbin/smbldap-groupdel “%g”
add user to group script = /usr/sbin/smbldap-groupmod -m “%u” “%g”
delete user from group script = /usr/sbin/smbldap-groupmod -x “%u” “%g”
set primary group script = /usr/sbin/smbldap-usermod -g “%g” “%u”
add machine script = /usr/sbin/smbldap-useradd -w “%u”
logon path = \\%N\profiles\%U
logon drive = H:
domain logons = Yes
domain master = Yes
dns proxy = No
wins support = Yes
ldap admin dn = cn=admin,dc=serverpdc,dc=local
ldap delete dn = Yes
ldap group suffix = ou=Groups
ldap idmap suffix = ou=Idmap
ldap machine suffix = ou=Computers
ldap passwd sync = Yes
ldap suffix = dc=serverpdc,dc=local
ldap user suffix = ou=Users
ldap ssl = off
# invalid users = root
cups options = raw
time server = yes
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=8192 SO_RCVBUF=8192

[homes]
comment = Home Directories
read only = No
create mask = 0700
directory mask = 0700
browseable = No

[printers]
comment = All Printers
path = /var/spool/samba
printable = Yes
browseable = No

[netlogon]
comment = Network Logon Service
path = /home/netlogon
guest ok = Yes
share modes = No

[profiles]
path = /home/profiles
read only = No
create mask = 0600
directory mask = 0700
hide files = /desktop.ini/outlook*.lnk/*Briefcase*/
veto files = /*.mp3/ /*.wav/ /*.mpeg/ /*.avi/

Digitiamo i comandi:

mkdir /home/profiles
mkdir /home/netlogon
chmod 0775 /home/profiles

smbpasswd -w (PASSWORD IN CHIARO)

smbldap-populate -a Administrator -k 0

service smb restart
service nmb restart

Contestualmente modifichiamo il file /etc/nsswitch.conf aggiungendo “ldap” al file in questo modo:

da
passwd: files
shadow: files
group: files
a
passwd: files ldap
shadow: files ldap
group: files ldap

Contestualmente utilizzare il comando “authconfig-tui” flaggando i campi “Usa LDAP”, “Usa Password MD5”, “Usa password Shadow”, “Usa autenticazione LDAP” e specificando (dopo avere premuto il tasto “Avanti”) i parametri “Server: ldap://127.0.0.1/” e “Base DN: dc=serverpdc,dc=local”

Creiamo il primo utente con il comando:

smbldap-useradd -N “Roberto” -S “Pennolino” -P -a -m -c “BoB” bob

—–
cd /var/www/html/
wget http://downloads.sourceforge.net/project/phpldapadmin/phpldapadmin-php5/1.2.0.5/phpldapadmin-1.2.0.5.tgz
tar -zxvf phpldapadmin-1.2.0.5.tgz
mv phpldapadmin-1.2.0.5 phpldapadmin
cp /var/www/html/phpldapadmin/config/config.php.example /var/www/html/phpldapadmin/config/config.php
vi /etc/php.ini
memory_limit = 32M
service httpd restart
—–

Postfix e LDAP-aliases


Molto spesso risulta comodo gestire gli aliases di posta elettronica direttamente tramite LDAP.
Assunto che gli aliases di posta elettronica siano stati migrati da un precedente sistema tramite lo script migrate-aliases e che all’interno dell’albero LDAP sia stata creata la UO “Aliases” …
Queste sono le modifiche da apportare:

/etc/postfix/main.conf

alias_maps = hash:/etc/aliases, ldap:/etc/postfix/ldap-aliases.cf

/etc/postfix/ldap-aliases.conf

server_host = 127.0.0.1
search_base = ou=Aliases, dc=miosito, dc=it
bind_dn = cn=admin, dc=server, dc=miosito, dc=it
bind_pw = pappapronta
query_filter = (&(objectClass=nisMailAlias)(cn=%u))
result_attribute = rfc822MailMember
#result_format = %s
scope = sub
#cache = yes
bind = yes

Script per la creazione di un utente tramite CPU(Change Password Utility)/OpenLDAP


#!/bin/sh
#
# Nome utente …
echo -e “Immettere nome utente: \c ”
read USER_NAME
#
# Password utente
echo -e “Introdurre password: \c ”
read PASSWORD
#
# Oggetto dell’email
SUBJECT=”Creazione account utente”
#
# Invia l’email all’utente appena creato …
EMAIL=$USER_NAME
#
# Aggiunge l’utente all’albero LDAP
/usr/sbin/cpu useradd –password=$PASSWORD $USER_NAME –makehome –directory=/home/$USER_NAME –skel=/etc/skel/ –shell=/sbin/nologin –gid=100
#
# Testo dell’email da inviare all’utente
EMAILMESSAGE=”/tmp/emailmessage.txt”
echo “Gentile utente” $USER_NAME”,”> $EMAILMESSAGE
echo “si comunica che il suo account e’ stato attivato. Il suo indirizzo di posta e’: “$USER_NAME”@server.it” >>$EMAILMESSAGE
echo “Si ricorda che la password (che deve essere tenuta nascosta) e’: ” $PASSWORD >>$EMAILMESSAGE
echo “Cordiali saluti.” >>$EMAILMESSAGE
echo ” ” >>$EMAILMESSAGE
echo “Area ICT – server.it” >>$EMAILMESSAGE
echo ” ” >>$EMAILMESSAGE
echo “– Questo messaggio e’ stato generato automaticamente dal sistema –” >>$EMAILMESSAGE
#
# Invia l’email di comunicazione creazione account all’utente
/bin/mail -s “$SUBJECT” “$EMAIL” $EMAILMESSAGEITADMIN
echo “si comunica che l’account dell’utente ‘”$USER_NAME”‘ e’ stato attivato. E’ stato attivato, altresi’, l’indirizzo di posta: “$USER_NAME”@server.it” >>$EMAILMESSAGEITADMIN
echo “Si ricorda che per l’inserimento dei dati telefonici all’interno della rubrica centralizzata e’ necessario utilizzare PHPldapADMIN.” >>$EMAILMESSAGEITADMIN
echo “Cordiali saluti.” >>$EMAILMESSAGEITADMIN
echo ” ” >>$EMAILMESSAGEITADMIN
echo “Il vostro umile ed indefesso servo – server.it” >>$EMAILMESSAGEITADMIN
echo ” ” >>$EMAILMESSAGEITADMIN
echo “– Questo messaggio e’ stato generato automaticamente dal sistema –” >>$EMAILMESSAGEITADMIN
#
# Invia l’email di comunicazione creazione account all’amministratore di sistema
/bin/mail -s “$SUBJECT” area-ict@localhost < $EMAILMESSAGEITADMIN
# Aggiunge l’utente all’albero LDAP
#/usr/sbin/cpu useradd –password=$PASSWORD $USER_NAME –makehome –directory=/home/$USER_NAME –skel=/etc/skel/ –shell=/sbin/nologin –gid=100

Aggungere un utente su un server LDAP


Dopo avere installato, configurato ed abbondantemente testato un server LDAP sorge generalmente un “piccolo” problema: per aggiungere un utente fino ad oggi siamo stati abituati a digitare …

useradd nome utente

Con questo comando, però, aggiungiamo un utente al sistema.
Per aggiungere un utente all’albero LDAP abbiamo diverse scelte. Possiamo farlo via web (PHPldapAdmin) e da shell (utilizzando il comando ldapadd).
In quest’ultimo caso, però, dovremmo creare una struttura ldif, cosa che magari non è di immediato utilizzo.
Siccome Linux=semplicità …
La soluzione si chiama: CPU (Change Password Utility) !!!
Basterà scaricare da qui la versione più adatta alla propria distribuzione Linux (per CentOS io ho sempre utilizzato questo rpm) e digitare il comando:

rpm -Uvh cpu-1.4.3-0.2.el4.rf.i386.rpm

Una volta effettuata l’installazione potremo aggiungere un nuovo utente digitando il comando:

cpu useradd –password=passowrd_utente nome_utente –makehome –directory=/home/nome_utente –skel=/etc/skel/ –shell=/sbin/nologin –exec=/root/mandamail.sh –gid=100 –firstname=”Utente” –lastname=”Fittizio”

dove:
–password = password dell’utente
–makehome = crea la home dell’utente
–directory = home directory dell’utente
–skel = quando viene creata la home directory di un nuovo utente, viene inizializzata con i file dalla directory /etc/skel . L’amministratore di sistema può creare dei file in /etc/skel che daranno un ambiente di default per gli utenti. Ad esempio può creare un file /etc/skel/.profile che imposta la variabile d’ambiente EDITOR ad un editor facile da usare.
–shell = shell di default del nuovo utente
–exec = file batch da eseguire alla creazione del nuovo utente
–gid = gruppo di afferenza dell’utente
–firstname/–lastname = dati dell’utente

CPU può essere finemente parametrizzato tramite il file /etc/cpu.conf
Ecco un esempio del file …

# See cpu.conf(5) for documentation

[GLOBAL]
DEFAULT_METHOD = ldap
CRACKLIB_DICTIONARY = /usr/lib/cracklib_dict

[LDAP]
LDAP_HOST = 127.0.0.1
LDAP_PORT = 389
# Can also use LDAP_URI = ldaps://localhost:389 for TLS support
BIND_DN = cn=admin,dc=ldap,dc=server,dc=it
BIND_PASS = password_amministrazione_ldap_server
USER_BASE = ou=People,dc=ldap,dc=server,dc=it
# replace account with inetOrgPerson if you want first or last name
GROUP_BASE = ou=group,dc=ldap,dc=server,dc=it
USER_OBJECT_CLASS = account,posixAccount,shadowAccount,top
GROUP_OBJECT_CLASS = posixGroup,top
USER_FILTER = (objectClass=posixAccount)
GROUP_FILTER = (objectClass=posixGroup)
USER_CN_STRING = uid
GROUP_CN_STRING = cn
SKEL_DIR = /etc/skel
DEFAULT_SHELL = /sbin/nologin
HOME_DIRECTORY = /home
MAX_UIDNUMBER = 10000
MIN_UIDNUMBER = 2000
MAX_GIDNUMBER = 10000
MIN_GIDNUMBER = 100
ID_MAX_PASSES = 1000
USERGROUPS = yes
USERS_GID = 100
RANDOM = “false”
PASSWORD_FILE = “/etc/passfile”
SHADOW_FILE = “/etc/shadowfile”
HASH = “md5”
#ADD_SCRIPT = “contrib/postaddscript.sh”
#DEL_SCRIPT = “foo”
SHADOWLASTCHANGE = 11192
SHADOWMAX = 99999
SHADOWWARING = 7
SHADOWEXPIRE = -1
SHADOWFLAG = 134538308
SHADOWMIN = -1
SHADOWINACTIVE = -1

[PASSWD]
# Broken
GROUP = 1000
HOME = /home
INACTIVE = -1
#EXPIRE =
SHELL = /bin/bash
SKEL = /etc/skel
COMMENT = “Default Gecos”
PASSWORD = /etc/passwd
SHADOW = /etc/shadow