Configurare Samba e LDAP su Ubuntu Server

Dopo settimane di prove nell’installare Samba ed Ldap su una Ubuntu Server Lucid sono arrivato alla soluzione. La documentazione ufficiale non mi ha aiutato molto. Penso di aver ottenuto quello che volevo, visto che questa soluzione è diventata la base del mio server di lavoro in azienda. Col passare del tempo penso che avrò bisogno di modificare questa guida…

Il server come dicevo è basato su una distribuzione Linux Ubuntu Server 10.04 LTS (Lucid).

Il nome di dominio è Feria.it.

La versione del server Ldap è la 10.1.1.5.

Versione di Samba 3.4.7

Installazione di Samba
Create un file smb.conf e copiate dentro questa configurazione:

[global]
# Domain name ..
workgroup = FERIA
# Server name – as seen by Windows PCs ..
netbios name = ROMA
# Be a PDC ..
domain logons = Yes
domain master = Yes
# Be a WINS server ..
wins support = true

obey pam restrictions = Yes
dns proxy = No
os level = 35
log file = /var/log/samba/log.%m
max log size = 1000
syslog = 0
panic action = /usr/share/samba/panic-action %d
pam password change = Yes

# Allows users on WinXP PCs to change their password when they press Ctrl-Alt-Del
unix password sync = no
ldap passwd sync = yes

# Printing from PCs will go via CUPS ..
load printers = yes
printing = cups
printcap name = cups

# Use LDAP for Samba user accounts and groups ..
passdb backend = ldapsam:ldap://localhost

# This must match init.ldif ..
ldap suffix = dc=feria,dc=it
# The password for cn=admin MUST be stored in /etc/samba/secrets.tdb
# This is done by running ‘sudo smbpasswd -w’.
ldap admin dn = cn=admin,dc=feria,dc=it

# 4 OUs that Samba uses when creating user accounts, computer accounts, etc.
# (Because we are using smbldap-tools, call them ‘Users’, ‘Computers’, etc.)
ldap machine suffix = ou=Computers
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap idmap suffix = ou=Idmap
# Samba and LDAP server are on the same server in this example.
ldap ssl = no

# Scripts for Samba to use if it creates users, groups, etc.
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’

# Script that Samba users when a PC joins the domain ..
# (when changing ‘Computer Properties’ on the PC)
add machine script = /usr/sbin/smbldap-useradd -w ‘%u’

# Values used when a new user is created ..
# (Note: ‘%L’ does not work properly with smbldap-tools 0.9.4-1)
logon drive =
logon home =
logon path =
logon script = allusers.bat

# This is required for Windows XP client ..
server signing = auto
server schannel = Auto

[homes]
comment = “L: – Cartella privata di %U, %u”
valid users = %S
read only = No
browseable = No

[netlogon]
comment = Network Logon Service
path = /var/lib/samba/netlogon
admin users = root
guest ok = Yes
browseable = No
logon script = allusers.bat

[Profiles]
comment = Roaming Profile Share
# would probably change this to elsewhere in a production system ..
#path = /var/lib/samba/profiles
path = /dati/profiles
read only = No
profile acls = Yes
browsable = No

[printers]
comment = All Printers
path = /var/spool/samba
use client driver = Yes
create mask = 0600
guest ok = Yes
printable = Yes
browseable = No
public = yes
writable = yes
admin users = root
write list = root

[print$]
comment = Printer Drivers Share
path = /var/lib/samba/printers
write list = root
create mask = 0664
directory mask = 0775
admin users = root

[Feria]
comment = “M: – Feria”
writeable = yes
#path = /var/lib/samba/shared
path = /dati/shared/Feria
public = yes
browseable = yes
directory mask = 0770
create mask = 0770
force create mode = 0770
force directory mode = 6770
security mask = 0770
force security mode = 0
directory security mask = 0770
force directory security mode = 0

[Progetti]
comment = “N: – Progetti”
writeable = yes
#path = /var/lib/samba/shared
path = /dati/shared/Progetti
public = yes
browseable = yes
directory mask = 0770
create mask = 0770
force create mode = 0770
force directory mode = 6770
security mask = 0770
force security mode = 0
directory security mask = 0770
force directory security mode = 0

[Manuali]
comment = “O: – Manuali”
writeable = yes
#path = /var/lib/samba/shared
path = /dati/nobackup/Manuali
public = yes
browseable = yes
directory mask = 0770
create mask = 0770
force create mode = 0770
force directory mode = 6770
security mask = 0770
force security mode = 0
directory security mask = 0770
force directory security mode = 0

[Programmi]
comment = “P: – Programmi”
writeable = yes
#path = /var/lib/samba/shared
path = /dati/nobackup/Programmi
public = yes
browseable = yes
directory mask = 0770
create mask = 0770
force create mode = 0770
force directory mode = 6770
security mask = 0770
force security mode = 0
directory security mask = 0770
force directory security mode = 0

#[archive]
# path = /exports/archive
# browseable = yes
# create mask = 755
# directory mask = 755
# read only = no
Creare una directory samba:

sudo mkdir /etc/samba/

Copiare il nuovo file smb.conf in /etc/samba/smb.conf, modificando i parametri per la propia rete:

~$ sudo cp smb.conf /etc/samba/

Installare Samba:

~$ sudo apt-get install samba samba-doc smbclient

Installare il server LDAP
Ora installiamo il demone del server di OpenLDAP slapd ed ldap-utils, un pacchetto contenente utilità di gestione LDAP:

~$ sudo apt-get install slapd ldap-utils libpam-smbpass smbldap-tools

Note:

Per impostazione predefinita slapd è configurato con le opzioni minime necessarie ad eseguire il demone slapd.

L’esempio di configurazione nelle seguenti sezioni corrisponderà al nome del dominio del server. Per esempio, se Fully Qualified Domain Name della macchina (FQDN) è ldap.feria.it, il suffisso predefinito sarà dc = feria, dc = it.

OpenLDAP utilizza una directory separata che contiene il cn = config Directory Information Tree (DIT). Il cn = config DIT è utilizzato per configurare dinamicamente il demone slapd, permettendo la modifica delle definizioni dello schema, degli indici, dell’ACL, ecc senza interrompere il servizio.

Il backend cn = directory di configurazione ha solo una configurazione minima e avrà bisogno di ulteriori opzioni di configurazione al fine di popolare la directory frontend. L’interfaccia sarà popolata con uno schema “classico”, che sarà compatibile con le applicazioni rubrica e con gli account Unix Posix.

Posix consentirà l’autenticazione di varie applicazioni, quali le applicazioni web, e-mail Mail Transfer Agent (MTA), applicazioni, ecc.

* Per le applicazioni esterne per l’autenticazione tramite il protocollo LDAP ciascuno di essi deve essere specificamente configurato per farlo. Fare riferimento alla documentazione delle singole applicazioni per i dettagli.

Ricordatevi di cambiare “dc = feria, dc = it” negli esempi che seguono per abbinare la vostra configurazione LDAP.

Per prima cosa, carichiamo alcuni file di schema. Da terminale digitare:

~$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
~$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif
~$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif

Poi editiamo questo file LDIF (backend.ldif):

# Load dynamic backend modules

dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
olcModuleload: back_hdb

# Database settings
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=feria,dc=it
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=feria,dc=it
olcRootPW: mypassword
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcAccess: to attrs=userPassword by dn=”cn=admin,dc=feria,dc=it” write by anonymous auth by self write by * none
olcAccess: to attrs=shadowLastChange by self write by * read
olcAccess: to dn.base=”” by * read
olcAccess: to * by dn=”cn=admin,dc=feria,dc=it” write by * read
Modificate il file per cambiare “dc = feria, dc = it” e “mypassword” in base alle vostre informazioni di dominio.

SUGGERIMENTO:

Un modo rapido per farlo è di utilizzare sed:
sed -is/dc=feria,dc=it/dc=example,dc=net/g backend.ldif

Ora aggiungete la LDIF alla directory LDAP:

~$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f ~/backend.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry “cn=module,cn=config”

adding new entry “olcDatabase=hdb,cn=config”

Samba ha bisogno di conoscere la password di amministrazione di LDAP, possiamo farlo con questo comando:

~$ sudo smbpasswd -W
Setting stored password for “cn=admin,dc=feria,dc=it” in secrets.tdb
New SMB password:
Retype new SMB password:

Nota:

Utilizzare la password che hai inserito nel file backends.ldif di prima.

E infine, riavviamo samba:

~$ sudo service smbd restart

È possibile verificare che samba funziona utilizzando il client samba (quando chiede la password di root basta premere Invio);

~$ sudo smbclient -L localhost

Si dovrebbe vedere qualcosa del genere:

~$ sudo smbclient -L localhost
Enter root’s password:
Anonymous login successful
Domain=[SAMBA] OS=[Unix] Server=[Samba 3.4.7]

Sharename Type Comment
——— —- ——-
print$ Disk Printer Drivers Share
shared Disk
archive Disk
IPC$ IPC IPC Service (Samba 3.4.7)
Anonymous login successful
Domain=[SAMBA] OS=[Unix] Server=[Samba 3.4.7]

Server Comment
——— ——-
MYSAMBASERVER Samba 3.4.7

Workgroup Master
——— ——-
MYSAMBAWORKGROUP MYSAMBASERVER

Partiamo quindi a fornire ai nostri utenti samba il profilo e le directory netlogon,creiamoli cosi:

~$ sudo mkdir -v -m 777 /var/lib/samba/profiles
~$ sudo mkdir -v -p -m 777 /var/lib/samba/netlogon

Ora dobbiamo aggiungere gli schemi samba al server LDAP. Questi schemi fanno parte del pacchetto samba-doc che abbiamo installato nella prima parte della procedura.

Copiare gli schemi nella posizione appropriata:

~$ sudo cp /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz /etc/ldap/schema/
~$ sudo gzip -d /etc/ldap/schema/samba.schema.gz
Questi schemi devono essere convertiti nel formato “LDIF” prima di poterli utilizzare.

Creare un file denominato schema_convert.conf

~$ vi ~/schema_convert.conf

e incollare le seguenti righe:

include /etc/ldap/schema/core.schema
include /etc/ldap/schema/collective.schema
include /etc/ldap/schema/corba.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/duaconf.schema
include /etc/ldap/schema/dyngroup.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/java.schema
include /etc/ldap/schema/misc.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/openldap.schema
include /etc/ldap/schema/ppolicy.schema
include /etc/ldap/schema/samba.schema

Successivamente, utilizzare slapcat per convertire gli schemi:

~$ slapcat -f ~/schema_convert.conf -F ~ -n0 -s “cn={12}samba,cn=schema,cn=config” > ~/cn=samba.ldif

slapcat genererà un file “~ / cn \ = samba.ldif”.

Modificare questo file:

~$ vi ~/cn\=samba.ldif

e cambiare i seguenti attributi:

dn: cn={12}samba,cn=schema,cn=config

cn: {12}samba

in

dn: cn=samba,cn=schema,cn=config

cn: samba

Inoltre, rimuovere tutte queste righe dalla fine del file:

structuralObjectClass: olcSchemaConfig
entryUUID: 99e797a8-07cb-102f-8c5c-739a8467e607
creatorsName: cn=config
createTimestamp: 20100609043122Z
entryCSN: 20100609043122.188753Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20100609043122Z

Aggiungete lo schema al server:

~$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f ~/cn\=samba.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry “cn=samba,cn=schema,cn=config”

Si dovrebbe vedere la seguente riga senza errori segnalati:

adding new entry “cn=samba,cn=schema,cn=config”

Vediamo come vanno le cose con la seguente query (utilizzare una password vuota):

~$ sudo ldapsearch -Y EXTERNAL -H ldapi:/// -D cn=admin,cn=config -b cn=config -W olcDatabase={1}hdb

Si dovrebbe vedere qualcosa come questo:

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Se vedete un output simile a sopra allora il server LDAP funziona, ma abbiamo ancora bisogno di completare la configurazione di samba.

Decomprimere il samba-ldap-tools (lo abbiamo scaricato in precedenza)

~$ sudo gzip -d /usr/share/doc/smbldap-tools/configure.pl.gz

Ora stiamo per eseguire uno script perl che istituirà samba per noi. Per quasi ogni richiesta si deve solo premere Invio. Ci sono un paio di eccezioni però. Quando è stato chiesto il “logon home” e “il percorso di accesso” inserire “.” e nient’altro. Quando viene richiesta una password (ldap master / slave password di bind) utilizzare la password per l’account “admin” che hai inserito in precedenza. Ricordate di lasciare il valore di default per tutto il resto!

Eseguire lo script:

~$ sudo perl /usr/share/doc/smbldap-tools/configure.pl

Ora che lo script ha creato la nostra configurazione, lo si può utilizzare per popolare il server:

~$ sudo smbldap-populate
Populating LDAP directory for domain FERIA (S-1-5-21-3403240416-131340500-4256605436)
(using builtin directory structure)

adding new entry: dc=feria,dc=it
adding new entry: ou=Users,dc=feria,dc=it
adding new entry: ou=Groups,dc=feria,dc=it
adding new entry: ou=Computers,dc=feria,dc=it
adding new entry: ou=Idmap,dc=feria,dc=it
adding new entry: uid=root,ou=Users,dc=feria,dc=it
adding new entry: uid=nobody,ou=Users,dc=feria,dc=it
adding new entry: cn=Domain Admins,ou=Groups,dc=feria,dc=it
adding new entry: cn=Domain Users,ou=Groups,dc=feria,dc=it
adding new entry: cn=Domain Guests,ou=Groups,dc=feria,dc=it
adding new entry: cn=Domain Computers,ou=Groups,dc=feria,dc=it
adding new entry: cn=Administrators,ou=Groups,dc=feria,dc=it
adding new entry: cn=Account Operators,ou=Groups,dc=feria,dc=it
adding new entry: cn=Print Operators,ou=Groups,dc=feria,dc=it
adding new entry: cn=Backup Operators,ou=Groups,dc=feria,dc=it
adding new entry: cn=Replicators,ou=Groups,dc=feria,dc=it
adding new entry: sambaDomainName=FERIA,dc=feria,dc=it

Please provide a password for the domain root:
Changing UNIX and samba passwords for root
New password:
Retype new password:

Nota:

La “password UNIX e la password samba per root” possono essere qualsiasi cosa, non è necessario utilizzare la password di amministrazione di LDAP qui.

Gli ultimi ritocchi:

~$ sudo /etc/init.d/slapd stop
~$ sudo slapindex

WARNING!
Runnig as root!
There’s a fair chance slapd will fail to start.
Check file permissions!

Ignorare l’avviso!
~$ sudo chown openldap:openldap /var/lib/ldap/*
~$ sudo /etc/init.d/slapd start

Rendi “root” l’amministratore del dominio:

~$ sudo smbldap-groupmod -m ‘root’ ‘Administrators’
adding user root to group Administrators

Se questa ritorna:

adding user root to group Administrators

senza errori allora va tutto bene!

Ora, dobbiamo consentire ai client di autenticarsi tramite LDAP. Per fare questo abbiamo bisogno di installare un pacchetto:

~$ sudo apt-get –yes install ldap-auth-client

Durante questo processo inseriamo i seguenti dati:

ldapi:///127.0.0.1:389/

dc=feria,dc=it

3

Yes

No

cn=admin,dc=feria,dc=it

mypassword

Abbiamo anche bisogno di dire a PAM ed al servizio”Name Service Switch” (NSS) di utilizzare LDAP per l’autenticazione:

~$ sudo auth-client-config -t nss -p lac_ldap
~$ sudo pam-auth-update ldap

Se tutto è andato bene, dovreste ora essere in grado di aggiungere un utente al database:

~$ sudo smbldap-useradd -a -m -P brettg
Cannot confirm uidNumber 1000 is free: checking for the next one
Changing UNIX and samba passwords for brett
New password:
Retype new password:

È possibile controllare il nuovo utente con questo commando:

~$ ldapsearch -xLLL -b “dc=feria,dc=it” uid=gianluca
dn: uid=gianluca,ou=Users,dc=feria,dc=it
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: sambaSamAccount
cn: gianluca
sn: gianluca
givenName: gianluca
uid: gianluca
uidNumber: 1001
gidNumber: 513
homeDirectory: /home/gianluca
loginShell: /bin/bash
gecos: System User
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
displayName: gianluca
sambaSID: S-1-5-21-3403240416-131340500-4256605436-3002
sambaPrimaryGroupSID: S-1-5-21-3403240416-131340500-4256605436-513
sambaLogonScript: allusers.bat
sambaLMPassword: 157FBB24ACBE1A68AAD3B435B51404EE
sambaAcctFlags: [U]
sambaNTPassword: 8462E3FFE0BA1C8CED841873EC989A29
sambaPwdLastSet: 1308795478
sambaPwdMustChange: 1312683478
shadowLastChange: 15148
shadowMax: 45

Se si ottiene un output come questo allora congratulazioni, avete configurato correttamente il server Samba / LDAP!
Successivamente, si dovrebbe vedere come configurare un client.