Un Domain Controller in CentOS/Fedora per la piccola e media impresa

In questo articolo viene proposto un modo facile e veloce di creare un DC (Domain Controller) per ambienti Windows utilizzando Samba.
Va detto che la soluzione è dimensionata per la piccola e media impresa, dove il numero di utenti generalmente non supera le cento unità.
Facile e veloce perché impiega un solo server e non prevede ridondanza.
Per l’articolo ho scelto di utilizzare CentOS ma dovrebbe funzionare anche con Fedora.

Prerequisiti
La soluzione prevede il deployment all’interno di una rete locale (LAN); si presuppone dunque che i servizi di DNS (per la risoluzione dei nomi) e DHCP (per l’assegnazione automatica degli indirizzi IP) funzionino a dovere.
La lista della spesa Per far girare “il tutto” è necessario installare sulla macchina alcuni pacchetti fondamentali di samba. Per verificare i pacchetti già installati è sufficiente usare yum:

[root@myserver ~]# yum list *samba*
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.fastbull.org
 * updates: centos.fastbull.org
 * addons: centos.fastbull.org
 * extras: centos.kiewel-online.ch base
Installed Packages
 samba.i386	3.0.33-3.7.el5_3.1	installed
 samba-client.i386		3.0.33-3.7.el5_3.1	installed
 samba-common.i386		3.0.33-3.7.el5_3.1	installed
 system-config-samba.noarch	1.2.41-3.el5		installed
 Available Packages
 samba-swat.i386		3.0.33-3.7.el5_3.1	updates
 sblim-cmpi-samba.i386		0.5.2-31.el5_2.1	base
 sblim-cmpi-samba-devel.i386	1-31.el5_2.1		base
 sblim-cmpi-samba-test.i386	1-31.el5_2.1		base

Nel nostro caso samba è già installato. Nel caso in cui fosse necessario installare il software possiamo sempre utilizzare yum:

yum install samba

I pacchetti fondamentali sono:

samba.i386 samba-common.i386system-config-samba.noarch

Degli altri possiamo anche farne a meno.

Personalizzare il servizio
Nel nostro caso, Samba dovrà funzionare come DC, per questo motivo è necessario editare il file /etc/samba/smb.conf indicando le corrette impostazioni. Di seguito un esempio di configurazione possibile:

[global]
        workgroup = MORZELLO
        server string = Samba Server Version %v
        netbios name = MYSERVER
        security = user
        passdb backend = tdbsam
        domain master = yes
        domain logons = yes
        logon script = %m.bat
        logon script = %u.bat
        logon path =
        add user script = /usr/sbin/useradd "%u" -n -g users
        add group script = /usr/sbin/groupadd "%g"
        add machine script = /usr/sbin/useradd -n -c "Workstation (%u)" -M -d /nohome -s /bin/false "%u"
        delete user script = /usr/sbin/userdel "%u"
        delete user from group script = /usr/sbin/userdel "%u" "%g"
        delete group script = /usr/sbin/groupdel "%g"
        username map = /etc/samba/smbusers
        lanman auth = no
        ntlm auth = Yes
        client NTLMv2 auth = Yes
        client lanman auth = no
        client plaintext auth = no
        winbind enum groups = yes
        winbind enum users = yes
        wins support = yes

[homes]
        comment = Home Directories
        browseable = no
        writable = yes

Il file di configurazione contiene solo ed esclusivamente i dati strettamente necessari per far funzionare il servizio come PDC (Primary Domain Controller). Probabilmente il lettore vorrà successivamente attivare altre voci come ad esempio le stampanti di rete e le cartelle di rete. Queste informazioni non sono strettamente necessarie e per questo motivo non sono trattate in questa sede. Per dare un senso al nostro operato cerchiamo di capire il significato delle voci principali che compongono il nostro file di configurazione:

  • workgroup: indica il nome del nostro dominio;
  • passdb backend: indica come samba gestirà le utenze windows. specificando tdbsam samba autenticherà gli utenti e le macchine appartenenti al dominio mediante il proprio database, senza utilizzare servizi esterni come ad esempio LDAP oppure un altro DC;
  • *script: sono le voci che indicano quali script eseguire per gestire gli utenti ed i gruppi;
  • logon path: è il percorso della cartella che contiene informazioni di netlogon di Windows. Nell’esempio si è deciso di non fornire questo servizio;
  • domain logons: indica se il server agirà come DC oppure no;
  • domain master: indica se il server agirà come PDC oppure no.

Per capire se la nostra configurazione è valida o meno possiamo usare il comando testparm:

[root@myserver ~]# testparm -s
Load smb config files from /etc/samba/smb.conf
Processing section "[homes]"
Loaded services file OK.
Server role: ROLE_DOMAIN_PDC
[global]
        workgroup = MORZELLO
        server string = Samba Server Version %v
        passdb backend = tdbsam
        username map = /etc/samba/smbusers
        lanman auth = No
        client NTLMv2 auth = Yes
        client lanman auth = No
        client plaintext auth = No
        log level = 2
        log file = /var/log/samba/%m.log
        add user script = /usr/sbin/useradd "%u" -n -g users
        delete user script = /usr/sbin/userdel "%u"
        add group script = /usr/sbin/groupadd "%g"
        delete group script = /usr/sbin/groupdel "%g"
        delete user from group script = /usr/sbin/userdel "%u" "%g"
        add machine script = /usr/sbin/useradd -n -c "Workstation (%u)" -M -d /nohome -s /bin/false "%u"
        logon script = %u.bat
        logon path =
        domain logons = Yes
        domain master = Yes
        wins support = Yes
        winbind enum users = Yes
        winbind enum groups = Yes

[homes]
        comment = Home Directories
        read only = No
        browseable = No

È fondamentale che la voce server role sia quella corretta.

L’utenza amministrativa
Per poter gestire il dominio è necessario aggiungere nel database di samba l’utente amministratore:

[root@myserver samba]# smbpasswd -a root
New SMB password:
Retype new SMB password:
tdbsam_open: Converting version 0 database to version 3....
Added user root.

Gli utenti di dominio
Gli utenti samba sono in realtà utenti linux e bisogna dare una regola per convertire correttamente gli utenti tra linux e windows. Per fare questo personalizziamo il file /etc/samba/smbusers:

# Unix_name = SMB_name1 SMB_name2 ...
root = administrator admin
nobody = guest pcguest smbguest

Nel nostro caso ci limitiamo a dire che l’utente administrator equivale a root e che l’utente guest equivale a nobody. Aggiungiamo anche i gruppi di utenti windows che non esistono ancora in linux:

# Map Windows Domain Groups to UNIX groups
net groupmap add rid=514 ntgroup="Domain Guests" unixgroup="nobody" type=d
net groupmap add rid=513 ntgroup="Domain Users" unixgroup="users" type=d
net groupmap add rid=512 ntgroup="Domain Admins" unixgroup="root" type=d

Si possono aggiungere anche altri gruppi di utenti, quelli specificati in alto sono quelli “canonici”. Per verificare che i gruppi siano stati creati possiamo usare il comando wbinfo:

[root@myserver samba]# wbinfo -g
domain users
domain admins
domain guests

Aggiungendo gli utenti di dominio ricordiamo sempre che questi sono anche utenti Linux. È probabile però che non tutti gli utenti dovranno avere accesso al server come utenti locali. Per inibire l’accesso alla console del server specificheremo una shell non valida. Su CentOS possiamo creare un utente con queste caratteristiche usando il comando adduser:

[root@myserver samba]# adduser -m -s /sbin/nologin testuser
[root@myserver samba]# passwd testuser
[root@myserver samba]# smbpasswd -a testuser

Con precedenti comandi abbiamo creato un utente, assegnato una password per linux ed una per samba.
Un metodo alternativo per creare gli utenti è quello di accodare direttamente gli utenti nel file /etc/passwd senza assegnare la password all’utente.
A pensarci bene non è necessario assegnare una password ad un utente che non può fare il logon. Se invece l’utente deve comunque avere l’accesso al server è sufficiente omettere il parametro “–s”.
Comunque sia per abilitare l’utente al dominio è necessario inserirlo nel database di samba con il comando smbpasswd.
Da notare che la password per linux può essere diversa da quella specificata in samba. Eseguire il servizio all’avvio In CentOS i servizi possono essere gestiti facilmente mediante il comando chkconfig.
Le righe seguenti assicurano l’avvio del servizio all’accensione del nostro server:

chkconfig smb on

Ultimi ritocchi: iptables e selinux
Samba necessita di alcune porte tcp ed udp per poter funzionare correttamente. Queste porte sono chiude per default da iptables. Di seguito le righe da inserire nel file /etc/sysconfig/iptables:

-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 137 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 138 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT

Le righe devono essere inserite nel file prima delle ultime due stringhe:

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

Per quanto concerne selinux invece bisogna consentire a samba l’uso dei comandi necessari per svolgere alcuni task:

# Se si intende usare useradd/groupadd è necessario eseguire:
setsebool -P samba_domain_controller on
#
# Se si vuole condividere la home degli utenti eseguire:
setsebool -P samba_enable_home_dirs on

Per condividere una cartella di rete bisogna assegnare alla stessa l’etichetta “samba-share_t”. Evitate le cartelle di sistema perché queste probabilmente hanno una etichetta diversa già applicata. Per verificare i dettagli di una cartella relativa a selinux è possibile usare il comando ls specificando il paramentr “–Z”:

ls -ldZ /percorso_completo

Aggiungere una workstation al dominio
La procedura di Join è totalmente trasparente in windows.
Per aggiungere una macchina al dominio possiamo cliccare con il tasto destro del mouse su “Gestione Risorse” quindi selezionare il percorso :“Proprietà->Nome Computer->Cambia”. Specificare MORZELLO nella casella “dominio” e procedere al logon di root con la password indicata in samba (mediante il comando smbpasswd).

Alla prossima.

OmniFind e Fedora Core 6

Tempo fa ho comprato un hard disk da mezzo tera in un centro commerciale della mia città.
Piano piano l’ho riempito di files di ogni genere: backup, posta, sorgenti, progetti, distribuzioni linux, …

In breve tempo non ero più in grado di trovare facilmente i files che mi servivano.
Così le soluzioni al problema erano due:

- Mettere in ordine l’archivio e darsi un metodo per copiare i files

- Trovare un piccolo crowler a cui richiedere i files quando servono.

Forse non tutti sanno cos’è un crowler. In parole povere si tratta di un software che indicizza le risorse in rete e le rende disponibili ad un motore di ricerca.

Ovviamente ho optato per la seconda opzione.

Durante una delle tante presentazioni sul software alle quali assisto per lavoro, sono venuto a conoscenza di Google Mini, un motore di ricerca per le aziende mantenuto da Google.
Non si tratta di un pacchetto gratuito anche perchè viene venduto insieme all’hardware su cui “gira” il motore di ricerca.

Dopo varie ricerche sono incappato su una soluzione di IBM e Yahoo! Search.

Sto parlando di OmniFind, un crowler scritto in Java e disponibile per Windows e Linux.

Ho deciso di provarlo subito ma purtroppo il supporto per Linux è limitato alla distribuzione di Red Hat Enterprise.

Questo significa che è possibile eseguire OmniFind su altre distribuzioni ma è necessario apportare le dovute modifiche al processo di installazione.

La prima cosa da fare in assoluto è disabilitare Selinux in caso sia attivo nell’ambiente operativo altrimenti l’installazione non si concluderà correttamente. Provvederemo in un secondo momento a riabilitarlo.
Chi non avesse impostato Selinux all’avvio del SO può tranquillamente ignorare i comandi che seguono.
Fedora Core mette a disposizione un semplice modo per disabilitare temporaneamente Selinux:

setenforce 0

Per verificare che il comando abbia sortito l’effetto desiderato, procediamo con una verifica:

cat /selinux/enforce

Il comando precedente dovrà restituire 0.

A questo punto è utile creare un utente di sistema con il quale eseguiremo il programma (non è consigliabile eseguire il crowler con le credenziali di root anche perchè non c’è ne la necessità):

groupadd omnifind
useradd -g omnifind omnifind
passwd omnifind

Una volta definita la password per l’utente omnifind procediamo oltre.

OmniFind utilizza una propria Java Virtual Machine, di conseguenza non è necessario installare Java sul SO. Tuttavia il crowler fa uso di librerie condivise, in particolare è necessario disporre di libstc++. Un semplice comando yum list dovrebbe essere sufficiente per fare un controllo. Per installare le librerie possiamo impartire il seguente comando:

yum install compat-libstdc++*

Adesso è possibile procedere con l’installazione di OmniFind seguendo le istruzioni incluse nel manuale del software. Prima di procedere però sostituiamo l’utente omnifind all’utente root.

su omnifind
./setuplinux_i586.bin -console

Il comando precedente prevede una installazione per la riga di comando. Chi volesse procedere in ambiente X può omettere il parametro -console.
Nel caso in cui l’installazione non andasse a buon fine, verificare che l’utente omnifind abbia i permessi di scrittura nella cartella prescelta per l’installazione.

Utilizzando i parametri di default, la directory di installazione dovrebbe essere: /opt/ibm/OmniFindYahooEdition, di conseguenza questa sarà la directory a cui faremo riferimento nei comandi successivi.

Qualora l’applicativo funzionasse alla fine dell’installazione, ritenetevi persone molto fortunate, nel mio caso infatti sono stati necessari altri passaggi.

Nel caso in cui l’esecuzione del programma non vada a buon fine, procediamo con alcune verifiche.
In primo luogo verifichiamo che tutte le librerie siano collegate correttamente:

ldd /opt/ibm/OmniFindYahooEdition/stellent.linux32/tsmanager

L’output dovrebbe essere simile al seguente:

linux-gate.so.1 => (0×00110000)
libpthread.so.0 => /lib/libpthread.so.0 (0x491c2000)
libACE.so.5.5.1 => /opt/…/stellent.linux32/libACE.so.5.5.1 (0×00125000)
libboost_date_time-gcc-mt-1_33_1.so.1.33.1 => /opt/…/stellent.linux32/libboost_date_time-gcc-mt-1_33_1.so.1.33.1 (0x0029b000)
libboost_filesystem-gcc-mt-1_33_1.so.1.33.1 => /opt/…/stellent.linux32/libboost_filesystem-gcc-mt-1_33_1.so.1.33.1 (0x002a9000)
libboost_program_options-gcc-mt-1_33_1.so.1.33.1 => /opt/…/stellent.linux32/libboost_program_options-gcc-mt-1_33_1.so.1.33.1 (0x002b9000)
libboost_regex-gcc-mt-1_33_1.so.1.33.1 => /opt/…/stellent.linux32/libboost_regex-gcc-mt-1_33_1.so.1.33.1 (0x002fd000)
libboost_serialization-gcc-mt-1_33_1.so.1.33.1 => /opt/…/stellent.linux32/libboost_serialization-gcc-mt-1_33_1.so.1.33.1 (0x0038f000)
libboost_signals-gcc-mt-1_33_1.so.1.33.1 => /opt/…/stellent.linux32/libboost_signals-gcc-mt-1_33_1.so.1.33.1 (0×00408000)
libdl.so.2 => /lib/libdl.so.2 (0x4cfdb000)
libts_utils.so => /opt/…/stellent.linux32/libts_utils.so (0x0041a000)
libts_logging_facility.so => /opt/…/stellent.linux32/libts_logging_facility.so (0×00431000)
libts_components.so => /opt/…/stellent.linux32/libts_components.so (0×00451000)
libts_soap_ext.so => /opt/…/stellent.linux32/libts_soap_ext.so (0×00461000)
libts_soap_ts_server.so => /opt/…/stellent.linux32/libts_soap_ts_server.so (0x004c9000)
libts_soap_ta_server.so => /opt/…/stellent.linux32/libts_soap_ta_server.so (0x0052f000)
libts_soap_ts_client.so => /opt/…/stellent.linux32/libts_soap_ts_client.so (0x0059e000)
libts_soap_std.so => /opt/…/stellent.linux32/libts_soap_std.so (0×00604000)
libts_soap_tss.so => /opt/…/stellent.linux32/libts_soap_tss.so (0×00687000)
libts_soap_ta_client.so => /opt/…/stellent.linux32/libts_soap_ta_client.so (0x006ea000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0×00758000)
libm.so.6 => /lib/libm.so.6 (0x4cfe1000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x4d149000)
libc.so.6 => /lib/libc.so.6 (0x4ce99000)
/lib/ld-linux.so.2 (0x4ce7c000)
librt.so.1 => /lib/librt.so.1 (0x4447d000)

Nel caso in cui qualche libreria dovesse mancare, verifichiamo che selinux sia disabilitato e che libstc++ sia installato sul SO; quindi seguiamo le istruzioni riportate nel manuale per reinstallare OmniFind.

Se il servizio iptables è in uso da Linux, verifichiamo che la porta definita per contattare OmniFind sia accessibile. Di seguito le impostazioni da aggiungere al file /etc/sysconfig/iptables per abilitare i client a contattare il servizio sulla porta di default proposta dall’installazione (inserire prima del COMMIT):

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 8080 -j ACCEPT

Se anche in questo caso l’applicativo non parte, assicuriamoci che nel file /etc/hosts sia indicata la voce localhost:

::1 mycomputer.mydomain mycomputer localhost.localdomain localhost
127.0.0.1 localhost.localdomain localhost

Se il problema persiste, scrivete due righe sul problema, tenteremo insieme una soluzione.

Una volta che il servizio “parte” senza problemi, è necessario modificare le policy di selinux.
Chi avesse impostato selinux in modalità permissive può trovare tutte le modifiche da apportare dando uno sguardo ai log di sistema:

cat /var/log/messages | grep audit

chi avesse impostato Selinux in modalità enforced dovrà invece procedere per tentativi successivi.
In pratica si tratta di abilitare l’utente omnifind alla esecuzione delle librerie java. Evidenziamo di seguito i comandi impratiti da console per una singola libreria:

semanage fcontext -a -t textrel_shlib_t
/opt/ibm/OmniFindYahooEdition/_jvm/jre/bin/headless/LIBRERIA.so
restorecon /opt/ibm/OmniFindYahooEdition/_jvm/jre/bin/headless/LIBRERIA.so

Dove LIBRERIA è il nome del file inibito da Selinux.

A questo punto possiamo ripristinare selinux:

setenforce 1

Fare partire il servizio all’avvio:
Di seguito riportiamo una possibile soluzione per chi volesse far partire il crowler all’avvio di Linux:

cat > /etc/rc.d/init.d/omnifind <<EOF
#!/bin/sh
#
# chkconfig: – 99 31
# description: Starts and stops the Omnifind daemon \
#

# Source function library.
if [ -f /etc/init.d/functions ] ; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi

# Avoid using root’s TMPDIR
unset TMPDIR

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

RETVAL=0

start() {
   KIND=”Omnifind”
   echo -n $”Starting $KIND service: “
   su -c /opt/ibm/OmniFindYahooEdition/bin/startup.sh omnifind
   RETVAL=$?
   echo
   return $RETVAL
}

stop() {
   KIND=”Omnifind”
   echo -n $”Shutting down $KIND services: “
   su -c /opt/ibm/OmniFindYahooEdition/bin/shutdown.sh omnifind
   RETVAL=$?
   echo
   return $RETVAL
}

restart() {
   stop
   start
}

case “$1″ in
start)
   start
   ;;
stop)
   stop
   ;;
restart)
   restart
   ;;
*)
   echo $”Usage: $0 {start|stop|restart}”
   exit 1
esac

exit $?
EOF

Il precedente comando consente di gestire Omnifind tramite chkconfig.
Per installare lo script è sufficiente impartire i seguenti comandi:

chmod 755 /etc/rc.d/init.d/omnifind
chkconfig –add omnifind
chkconfig –level 345 omnifind on

Considerazioni finali:
Secondo me OmniFind è un tool utile per le piccole aziende, almeno nella sua versione free.
Da tenere in considerazione che questa versione non gestisce la segregazione dei dati a nessun livello, di conseguenza, chi riesce a contattare il motore di ricerca, può ottenere tutti i dati indicizzati, senza discriminazioni.
E’ molto comodo da usare e riesce a tracciare il contenuto di: file PDF, files Word, files Compressi e siti web interni ed esterni alla rete locale.

Per saperne di più:
OmniFind Home Page
Cos’è un crowler