Questa guida può essere vista come un aggiornamento della vecchia guida Realizzare un dominio Windows con Linux: Samba come PDC, ma la procedura è cambiata sostanzialmente, soprattutto per l'aggiornamento del server LDAP. Ho testato il tutto su Ubuntu 8.04 e 8.10.

Si può "ciecamente" seguire i vari passaggi per ottenere un dominio funzionante in pochi minuti, volendo invece approfondire si può leggere i due link principali che ho seguito: OpenLDAP è stato installato seguendo questa guida e configurato per l'autenticazione seguendo quest'altra guida. Al termine dell'articolo ho comunque riportato tutta una serie di link che ho visitato.

Prima di iniziare scegliete il nome del dominio. Può essere un semplice TOMMYBLUE oppure un più complesso BASE.TOMMYBLUE.IT. Non cambia molto, basta "tradurre" correttamente il tutto in ldappese, quindi TOMMYBLUE sarà dc=tommyblue mentre BASE.TOMMYBLUE.IT diventa dc=base,dc=tommyblue,dc=it. Io per semplicità ho usato soltanto DOMAIN, fate le opportune sostituzioni. Scegliete anche una password e sostituitela dove io ho messo PASSWORD.

Installazione di SLAPD

Si inizia installando i pacchetti necessari:

sudo apt-get install slapd ldap-utils

E inserendo alcuni schemi base:

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

Creiamo poi un file backend.ldif con:

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

dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=DOMAIN
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=DOMAIN
olcRootPW: PASSWORD
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=DOMAIN" 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=DOMAIN" write by * read

E inseriamolo nel db:

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f backend.ldif

Creiamo frontend.ldif:

dn: dc=DOMAIN
objectClass: top
objectClass: dcObject
objectclass: organization
o: MyDomain
dc: DOMAIN
description: My Domain's LDAP

dn: cn=admin,dc=DOMAIN
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword: PASSWORD

dn: ou=People,dc=DOMAIN
objectClass: organizationalUnit
ou: People

dn: ou=Groups,dc=DOMAIN
objectClass: organizationalUnit
ou: Groups

dn: uid=john,ou=People,dc=DOMAIN
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 10000
gidNumber: 10000
userPassword: password
gecos: John Doe
loginShell: /bin/bash
homeDirectory: /home/john
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: john.doe@mymaildomain.com
postalCode: 31000
l: Toulouse
o: Example
mobile: +33 (0)6 xx xx xx xx
homePhone: +33 (0)5 xx xx xx xx
title: System Administrator
postalAddress:
initials: JD

dn: cn=example,ou=Groups,dc=DOMAIN
objectClass: posixGroup
cn: example
gidNumber: 10000

e inseriamolo nel db:

sudo ldapadd -x -D cn=admin,dc=DOMAIN -W -f frontend.ldif

Aggiungiamo degli indici per velocizzare le query, creiamo il file uid_index.ldif:

dn: olcDatabase={1}hdb,cn=config
add: olcDbIndex
olcDbIndex: uid eq,pres,sub

E inseriamoli:

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f uid_index.ldif

È necessario anche convertire gli schema al nuovo formato, creiamo quindi il file schema_convert.conf:

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

Creiamo una directory temporanea in cui salvare l'output:

mkdir -p ./tmp/ldif_output

E convertiamo il file schema in LDIF:

slapcat -f schema_convert.conf -F ./tmp/ldif_output -n0 -s "cn={5}dyngroup,cn=schema,cn=config" > ./tmp/cn=dyngroup.ldif

Il file ./tmp/cn\=dyngroup.ldif va modificato in questo modo:

dn: cn=dyngroup,cn=schema,cn=config
...
cn: dyngroup

E rimosse le seguenti righe dalla fine del file:

structuralObjectClass: olcSchemaConfig
entryUUID: 10dae0ea-0760-102d-80d3-f9366b7f7757
creatorsName: cn=config
createTimestamp: 20080826021140Z
entryCSN: 20080826021140.791425Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20080826021140Z

Infine inseriamo gli schema nel db:

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f ./tmp/cn\=dyngroup.ldif

Con questo comando possiamo verificare il tutto:

sudo ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn

Autenticazione LDAP

Come sempre installiamo il necessario:

sudo apt-get install libnss-ldap

In fase di configurazione dobbiamo rispondere:

ldap://127.0.0.1:389/
dc=DOMAIN
3
yes
no
cn=admin,dc=DOMAIN
PASSWORD

Configuriamo anche le autenticazioni NSS e PAM:

sudo auth-client-config -t nss -p lac_ldap
sudo pam-auth-update

Con getent possiamo verificare il funzionamento dell'autenticazione. Il sistema infatti adesso ha unito i gruppi e gli utenti su ldap a quelli in /etc/passwd e /etc/group:

~$ getent passwd

...
john:x:10000:10000:John Doe:/home/john:/bin/bash

~$ getent group

...
example:*:10000:

Se non vedete l'utente john o il gruppo example, avete sbagliato qualcosa :)

Samba

Installiamo i pacchetti:

sudo apt-get install samba samba-doc smbldap-tools

Inseriamo lo schema samba:

sudo cp /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz /etc/ldap/schema/
sudo gzip -d /etc/ldap/schema/samba.schema.gz

Creiamo il file sambaschemaconvert.conf:

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

E convertiamo gli schema:

slapcat -f samba_schema_convert.conf -F ./tmp/ldif_output -n0 -s "cn={12}samba,cn=schema,cn=config" > ./tmp/cn=samba.ldif

Modifichiamo il file ./tmp/cn\=samba.ldif sistemando i seguenti attributi:

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

e rimuovendo le seguenti righe dalla fine del file:

structuralObjectClass: olcSchemaConfig
entryUUID: b53b75ca-083f-102d-9fff-2f64fd123c95
creatorsName: cn=config
createTimestamp: 20080827045234Z
entryCSN: 20080827045234.341425Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20080827045234Z

Inseriamo il tutto nel db:

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f ./tmp/cn\=samba.ldif

Aggiungiamo gli indici, creiamo samba_indexes.ldif:

dn: olcDatabase={1}hdb,cn=config
add: olcDbIndex
olcDbIndex: uidNumber eq
olcDbIndex: gidNumber eq
olcDbIndex: loginShell eq
olcDbIndex: memberUid eq,pres,sub
olcDbIndex: uniqueMember eq,pres
olcDbIndex: sambaSID eq
olcDbIndex: sambaPrimaryGroupSID eq
olcDbIndex: sambaGroupType eq
olcDbIndex: sambaSIDList eq
olcDbIndex: sambaDomainName eq
olcDbIndex: default sub

Inseriamoli:

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f samba_indexes.ldif

smbldap-tools

Gli smbldap-tools sono degli ottimi script per gestire il tutto, io comunque per la gestione del dominio consiglio l'utilizzo di LAM ma con smbldap-tools si può popolare velocemente LDAP con i dati necessari e Samba li utilizzerà per aggiungere le macchine che si uniscono al dominio.
Iniziamo quindi configurandoli:

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

Dopo l'ultimo comando vi verranno fatte varie domande che servono a configurare i file che riporto qui di seguito, quindi dategli uno sguardo per capire cosa dovete rispondere.

/etc/smbldap-tools/smbldap_bind.conf:

slaveDN="cn=admin,dc=DOMAIN"
slavePw="PASSWORD"
masterDN="cn=admin,dc=DOMAIN"
masterPw="PASSWORD"

/etc/smbldap-tools/smbldap.conf:

SID="S-1-5-21-395106984-1667043562-2069293566" (il SID è unico del vostro server, questo è il mio!)
sambaDomain="DOMAIN"
slaveLDAP="127.0.0.1"
slavePort="389"
masterLDAP="127.0.0.1"
masterPort="389"
ldapTLS="0"
verify=""
cafile=""
clientcert=""
clientkey=""
suffix="dc=DOMAIN"
usersdn="ou=People,${suffix}"
computersdn="ou=Computers,${suffix}"
groupsdn="ou=Groups,${suffix}"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=DOMAIN,${suffix}"
scope="sub"
hash_encrypt="SSHA"
crypt_salt_format=""
userLoginShell="/bin/bash"
userHome="/home/%U"
userHomeDirectoryMode="700"
userGecos="System User"
defaultUserGid="513"
defaultComputerGid="515"
skeletonDir="/etc/skel"
defaultMaxPasswordAge="120"
userSmbHome=""
userProfile=""
userHomeDrive="H:"
userScript="logon.cmd"
mailDomain="mymaildomain.com"
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"
with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"

A questo punto configuriamo anche samba con il suo file /etc/samba/smb.conf. Riporto direttamente l'output del comando testparm che verifica il ruolo del server Samba e poi stampa il dump del file smb.conf:

Load smb config files from /etc/samba/smb.conf
rlimit_max: rlimit_max (1024) below minimum Windows limit (16384)
Processing section "[netlogon]"
WARNING: The "share modes" option is deprecated
Processing section "[profiles]"
Loaded services file OK.
Server role: ROLE_DOMAIN_PDC
Press enter to see a dump of your service definitions

[global]
        dos charset = 850
        unix charset = ISO8859-1
        workgroup = DOMAIN
        server string = %h server (Samba, Ubuntu)
        map to guest = Bad User
        obey pam restrictions = Yes
        passdb backend = ldapsam:ldap://127.0.0.1
        pam password change = Yes
        passwd program = /usr/bin/passwd %u
        passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
        unix password sync = Yes
        log level = 3 passdb:5 auth:10 winbind:2
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        smb ports = 139 445
        name resolve order = wins host dns bcast
        time server = Yes
        deadtime = 10
        socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=8192 SO_RCVBUF=8192
        load printers = No
        show add printer wizard = No
        add machine script = sudo /usr/sbin/smbldap-useradd -t 0 -w "%u"
        logon script = logon.cmd
        logon path =
        logon drive = H:
        logon home =
        domain logons = Yes
        os level = 65
        preferred master = Yes
        domain master = Yes
        dns proxy = No
        wins support = Yes
        ldap admin dn = cn=admin,dc=DOMAIN
        ldap group suffix = ou=Groups
        ldap idmap suffix = ou=Idmap
        ldap machine suffix = ou=Computers
        ldap passwd sync = yes
        ldap suffix = dc=DOMAIN
        ldap ssl = no
        ldap user suffix = ou=People
        usershare allow guests = Yes
        panic action = /usr/share/samba/panic-action %d
        idmap backend = ldap:ldap://127.0.0.1
        idmap uid = 10000-20000
        idmap gid = 10000-20000
        template shell = /bin/bash
        winbind enum users = Yes
        winbind enum groups = Yes
        nt acl support = No
        case sensitive = No
        dont descend = /proc,/dev,/etc,/lib,/lost+found,/initrd

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

[profiles]
        comment = Users profiles
        path = /srv/samba/profiles
        create mask = 0600
        directory mask = 0700
        profile acls = Yes
        browseable = No
        browsable = No

A questo punto popoliamo LDAP:

sudo smbldap-populate

Se tutto è andato bene il vostro albero LDAP dovrebbe esser più o meno così:

Prima di terminare creiamo la cartella netlogon:

sudo mkdir -p /srv/samba/netlogon
sudo touch /srv/samba/netlogon/logon.cmd

Il file logon.cmd può contenere le istruzioni che volete che i pc Windows eseguano all'accesso dell'utente, ad esempio per montare delle condivisioni o settare qualche paramentro.

Riavviamo Samba e impostiamo la password di root:

sudo stop smbd
sudo start smbd
sudo smbpasswd -w PASSWORD

Verifichiamo il mappaggio dei gruppi Samba nei gruppi LDAP con il comando net:

~$ sudo net groupmap list

Domain Admins (S-1-5-21-395106984-1667043562-2069293566-512) -> Domain Admins
Domain Users (S-1-5-21-395106984-1667043562-2069293566-513) -> Domain Users
Domain Guests (S-1-5-21-395106984-1667043562-2069293566-514) -> Domain Guests
Domain Computers (S-1-5-21-395106984-1667043562-2069293566-515) -> Domain Computers
Administrators (S-1-5-32-544) -> Administrators
Account Operators (S-1-5-32-548) -> Account Operators
Print Operators (S-1-5-32-550) -> Print Operators
Backup Operators (S-1-5-32-551) -> Backup Operators
Replicators (S-1-5-32-552) -> Replicators

Attualmente l'utente Domain Admin è root, è comodo avere l'alias in Administrator:

echo "root = Administrator" > /etc/samba/smbusers

Abbiamo terminato, possiamo adesso aggiungere il primo pc al dominio!

Aggiungere un pc Windows al dominio

In generale si può seguire la guida ufficiale Microsoft

Accedere al pc, cliccare col tasto destro del mouse su Risorse del computer e poi su Proprietà. Selezionare la scheda Nome computer e premere su Cambia.
Spuntare Membro di Dominio e inserire il nome del dominio DOMAIN.
Alla richiesta inserire username root (o Administrator) e la relativa password.

Risoluzione dei problemi

In caso di errore nell'unione al dominio:

  • Aprire l'editor delle policy di Sicurezza Locale Start->Pannello di controllo->Strumenti di Aministrazione->Criteri di protezione locali->Criteri locali->opzioni di protezione
  • Disabilitare la voce Domain member: Digitally encrypt or sign secure channel (always) (_Membro di dominio: aggiunta crittografia of irma digitale ai dati del canale protetto (sempre))
  • Disabilitare la voce Domain member: Disable machine account password changes (Controller di dominio: rifiuta cambio password account computer)
  • Disabilitare la voce Domain member: Require strong (Windows 2000 or later) session key (Membro di dominio: richiesta chiave di sessione avanzata (Windows 2000 o versioni successive))
  • Scaricare il file WinXP_SignOrSeal.reg (qui di seguito) ed eseguirlo per modificare il registro di sistema:
Windows Registry Editor Version 5.00

;
; This registry key is needed for a Windows XP Client to join
; and logon to a Samba domain. Note: Samba 2.2.3a contained
; this key in a broken format which did nothing to the registry -
; however XP reported "registry key imported". If in doubt
; check the key by hand with regedit.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters]
"requiresignorseal"=dword:00000000

Funzioni di base

Qui di seguito riporto alcuni comandi di base per la gestione del dominio, consiglio comunque l'utilizzo di LAM (ldap-account-manager) che semplifica il tutto.. e parecchio :)

  • Per aggiungere un nuovo utente a LDAP con attributi Samba, digitare quanto segue, sostituendo "NOME_UTENTE" con un nome utente reale:
sudo smbldap-useradd -a -P NOME_UTENTE

L'opzione -a aggiunge gli attributi Samba, -P chiama l'utilità smbldap-passwd dopo aver creato l'utente consentendo di inserire la password per l'utente.

  • Per rimuovere un utente dalla directory:
sudo smbldap-userdel NOME_UTENTE

L'utilità smbldap-userdel è dotata anche di un'opzione -r per rimuovere la directory home dell'utente.

  • Per aggiungere un gruppo, usare smbldap-groupadd, sostituendo "NOME_GRUPPO" con il nome di un gruppo esistente:
sudo smbldap-groupadd -a NOME_GRUPPO

Come per smbldap-useradd, l'opzione -a aggiunge gli attributi Samba.

  • Per aggiungere un utente a un gruppo, usare smbldap-groupmod:
sudo smbldap-groupmod -m NOME_UTENTE NOME_GRUPPO

Assicurarsi di sostituire NOME_UTENTE con un utente reale. Inoltre, con l'opzione -m è possibile aggiungere più di un utente alla volta, elencandoli come valori separati da virgola.

  • smbldap-groupmod può essere usato anche per rimuovere un utente da un gruppo:
sudo smbldap-groupmod -x NOME_UTENTE NOME_GRPPO
  • L'utilità smbldap-useradd può anche aggiungere degli account macchina:
sudo smbldap-useradd -t 0 -w NOME_MACCHINA

Sostituire NOME_MACCHINA con il nome della workstation. L'opzione -t 0 crea un account macchina immediatamente, -w indica di creare l'utente come account macchina. Notare che l'opzione add machine script in /etc/samba/smb.conf è stata modificata per usare smbldap-useradd.

Webografia

blog comments powered by Disqus