L'obiettivo è quello di creare un server da utilizzare come "fileserver" sfruttando gli utenti presenti in un
dominio Windows AD per l'autenticazione e per la gestione delle ACL estese M$.
NB. Il server Samba DEVE consentire di poter gestire anche le ACL secondo la "filosofia M$".
Prerequisiti:
- ntp per mantenere sincronizzati gli orologi tra i client, il server samba e i server di AD
- kerberos client installato sul server samba per effettuare il join con il dominio di AD
- samba configurato per l'utilizzo di kerberos
- il filesystem deve essere montato con gli attributi acl,user_xattr
Filesystem
Il filesystem dedicato alle cartelle condivise da samba DEVE essere montato con i seguenti parametri aggiuntivi:
acl - per abilitare le ACL estese provenienti dal mondo M$
user_xattr - per abilitare l'ereditarietà degli attributi (tra cartella padre e le sottocartelle/file)
es.
# cat /etc/fstab | grep acl
UUID=afdf16a9-30b9-445f-aa10-e1ae360eb71d /condivisioni ext4 rw,acl,user_xattr 0 2
NTP
intallare e configurare il servizio NTP, il server samba e il server AD devono avere gli orologi sincronizzati
apt-get install ntp
cat /etc/ntp.conf
....
# You do need to talk to an NTP server or two (or three).
#server ntp.your-provider.example
server SERVER_NTP_INTERNO
# pool.ntp.org maps to about 1000 low-stratum NTP servers. Your server will
# pick a different set every time it starts up. Please consider joining the
# pool:
#server 0.debian.pool.ntp.org iburst dynamic
#server 1.debian.pool.ntp.org iburst dynamic
#server 2.debian.pool.ntp.org iburst dynamic
#server 3.debian.pool.ntp.org iburst dynamic
....
riavviare i servizi NTP
/etc/init.d/ntp restart
Kerberos
Installare e configurare kerberos
apt-get install krb5-user krb5-config krb5-doc
questo il file di configurazione di kerberos /etc/krb5.conf
[libdefaults]
default_realm = NOMEDOMINIO.LOCALE
# The following krb5.conf variables are only for MIT Kerberos.
krb4_config = /etc/krb.conf
krb4_realms = /etc/krb.realms
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
# The following libdefaults parameters are only for Heimdal Kerberos.
v4_instance_resolve = false
v4_name_convert = {
host = {
rcmd = host
ftp = ftp
}
plain = {
something = something-else
}
}
fcc-mit-ticketflags = true
[realms]
NOMEDOMINIO.LOCALE = {
kdc = IP_DEL_SERVER_AD
admin_server = IP_DEL_SERVER_AD
}
[domain_realm]
.miodominio.locale = MIODOMINIO.LOCALE
miodominio.locale = MIODOMINIO.LOCALE
[login]
krb4_convert = true
krb4_get_tickets = false
per testare la corretta configurazione di kerberos eseguire il seguente comando
kinit -V Administrator (richiede un ticket al KDC)
klist (visualizza l'elenco dei ticket rilasciati dal KDC)
per cancellare i ticket ricevuti utilizzare il seguente comando
kdestroy
Modificare il numero massimo di file che possono essere aperti contemporaneamente
# cat /etc/security/limits.conf
* soft nofile 16384
* hard nofile 16384
le modifiche diventeranno effettive solo al successivo riavvio, per impostare il nuovo valore "al volo" eseguire un:
# ulimit -n 16384
Samba e Winbind
Installare samba e winbind
apt-get install samba smbclient smbfs winbind
Questo è un esempio di configurazione del file /etc/samba/smb.conf
[global]
# nome del dominio
workgroup = MIODOMINIO
# nome del reame
realm = MIODOMINIO.LOCALE
# descrizione del server samba
server string = %h server
# abilito l'autenticazione tramite AD
security = ADS
obey pam restrictions = Yes
# abilito la scrittura dei log 0 error, 1 warning, 2 notice, 3 info
syslog = 0
# gestisco file di log specifici per ogni macchina connessa
log file = /var/log/samba/log.%m
# imposto la dimensione massima per ogni file di log
max log size = 1000
# imposto alcune opzioni per migliorare le performance generali
# questo nella squeeze mi dava qualche problema e l'ho marcato :-|
#socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
# disattivo la gestione delle stampanti tramite samba
load printers = No
show add printer wizard = No
# presento il server al dominio come un membro di AD
os level = 40
local master = No
# disattivo il dns proxy in quanto il server non fa da wins
dns proxy = No
# impedisco agli utenti di utilizzare la funzionalita' "user defined shares"
usershare path =
# applicativo da eseguire se il sistema samba si "impasta"
panic action = /usr/share/samba/panic-action %d
# definisco il charset da utilizzare per la gestione di file e cartelle
display charset = ISO8859-15
# disattivo eventuali template per gli utenti
template homedir = /dev/null
template shell = /bin/true
# utilizzo idmpa_rid come back-end per il mapping degli utenti/gruppi AD e Linux
idmap backend = idmap_rid:MIODOMINIO=10000-20000
# il back-end idmap_rid consente il mapping verso un SOLO dominio
allow trusted domains = No
# imposto il range per il mapping degli utenti
idmap uid = 10000-20000
# imposto il range per il mapping dei gruppi
idmap gid = 10000-20000
# imposto il carattere per dividere il nome dominio dal nome utente
winbind separator = +
# disattivo enumerazione degli utenti per migliorare le performance, NON sara' possibile utilizzare il comando getent users
winbind enum users = No
# disattivo enumerazione degli utenti per migliorare le performance, NON sara' possibile utilizzare il comando getent group
winbind enum groups = No
# imposto questo parametro per poter utilizzare direttamente il nome utente, senza dominio, tramite il comando wbinfo
winbind use default domain = Yes
# abilito il refresh del tickets kerberos per gestire i cambiamenti di appartenenza di un utente ai vari gruppi di AD
winbind refresh tickets = true
[nomeshare]
comment = descrizione della share
path = /percorsodellacartellacondivisa
invalid users = root
# consento solo agli amministratori di modificare le ACL
admin users = "@domain admins"
read only = No
# http://www.samba.org/samba/docs/man/manpages-3/vfs_acl_xattr.8.html
# la documentazione di samba riporta che il modulo e' "experimental"
# ma dalle prove che ho fatto e' l'unica soluzione in grado di gestire
# le ACL di Windows in modo corretto !!
#
# alla cartella "percorsodellacartellacondivisa" verranno impostati in automatico
# i relativi permessi Unix e le relative ACL M$ durante il normale utilizzo da un
# qualsiasi client M$
vfs objects = acl_xattr
# faccio in modo che a ogni nuovo file/cartella creato vengano essegnati i permessi 0750
force security mode = 0750
# per far mappare l'ereditarietà dei permessi
map acl inherit = Yes
Nota relativa al modulo acl_xattr
La share che lo utilizza non deve essere direttamente il mountpoint ma una sottocartella (es.: se ho montato il filesystem /dev/sdb1 in /mnt/pippo/ devo condividere la cartella /mnt/pippo/pluto ) altrimenti il modulo non funziona.
Test file di configurazione
Utilizzare il seguente comando per verificare la corretta configurazione del file /etc/samba/smb.conf
testparm
Impostazione preliminare dei permessi sulla cartella padre
- mappare la cartella condivisa da un client (utilizzando un utente che abbia i relativi permessi)
- rimuovere eventuali gruppi/utenti non desiderati dalle permission del disco mappato
- NB. rimuovere il gruppo everybody e il gruppo impostato nel parametro "admin users" di Samba per consentire
al parametro "force security mode" di lavorare correttamente
- impostare il flag "Consenti di propagare a questo oggetto le autorizzazioni ereditabili dal padre"
Migrazione di file/cartelle dal mondo M$ verso Samba, conservando le relative ACL
Lato Windows, utilizzare l'applicativo robocopy.exe disponibile nel M$ Resource Kit
es.
robocopy d:\ z: /mir /e /copy:DATS /log:c:\robocopy.log
nell'esempio:
- vengono copiate tutte le cartelle presenti nel disco D: in Z:
- il parametro "/mir" cancella eventuali file non più presenti nel disco D: dal disco Z: (attenzione !!!)
- il parametro "/e" copia anche eventuali cartelle vuote
- il parametro "/copy:DATS" copia i file, gli attributi, i vari timestamps e le NTFS Security (ACLs)
- ho appositamente omesso il parametro "/O" (ownership information) in quanto viene gestito in
automatico dal modulo acl_xattr di Samba
- viene loggato il tutto su di un file esterno c:\robocopy.log
Alcune note relative a robocopy (la versione che ho utilizzato e' la XP010):
- non è infallibile :-|
- ho riscontrato alcune incongruenze, comunque segnalate tutte sul file di log, durante la copia
di alcuni file/cartelle
In conclusione:
- tutte le anomalie riscontrate da robocopy vanno sistemate a manina !
Configurazione di PAM
Modifichiamo i file relativi all'autenticazione linux
NB. la modifica dei file PAM in debian squeeze NON serve piu' !!
credo ci pensi direttamente la procedura di installazione di winbind.
#
# /etc/pam.d/common-auth - authentication settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the
# traditional Unix authentication mechanisms.
#
#auth required pam_unix.so nullok_secure
auth sufficient pam_winbind.so
auth sufficient pam_unix.so nullok_secure use_first_pass
#
# /etc/pam.d/common-account - authorization settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authorization modules that define
# the central access policy for use on the system. The default is to
# only deny service to users whose accounts are expired in /etc/shadow.
#
#account required pam_unix.so
account sufficient pam_winbind.so
account sufficient pam_unix.so
#
# /etc/pam.d/common-session - session-related modules common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of modules that define tasks to be performed
# at the start and end of sessions of *any* kind (both interactive and
# non-interactive). The default is pam_unix.
#
# session required pam_unix.so
session required pam_mkhomedir.so skel=/etc/skel/ umask=0077
session required pam_unix.so
NB. la modifica di nsswitch.conf invece serve !!
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
passwd: compat winbind
group: compat winbind
shadow: compat
hosts: files wins dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
Aggiungiamo la macchina al dominio
net ads join -U Administrator
Facciamo ripartire i servizi samba e winbind
/etc/init.d/samba restart
/etc/init.d/winbind restart
e attendiamo circa un minuto prima di procedere ai vari test di funzionamento.
Alcuni comandi utili per testare la corretta integrazione tra Samba e AD/Kerberos:
NB. i seguenti comandi, nel nostro caso NON restituiranno alcun valore in quanto i parametri "winbind enum users" e
"winbind enum group" sono stati impostati a "No"
getent passwd (restituisce l'elenco degli utenti locali e aggiunge in coda quelli di AD
getent group (restituisce l'elenco dei gruppi locali e aggiunge in coda quelli di AD)
wbinfo -u (restituisce l'elenco degli utenti di AD
wbinfo -r (restituisce l'elenco dei gruppi di AD)
NB. è possibile utilizzare gli utenti e i gruppi di AD per impostare i vari permessi per le cartelle e
i file presenti sul file server.
es.
# chgrp 'NOME GRUPPO AD' test.txt
# ls -l test.txt
-rw-rw-r-- 1 root NOME GRUPPO AD 8 12 ago 09:04 test.txt
E' POSSIBILE CONFIGURARE UN "CLIENT" LINUX (es. Ubuntu) PER L'AUTENTICAZIONE KERBEROS
In questo modo è possibile sfruttare il single sign on anche su macchine linux.
#apt-get install ntp
#apt-get install libnss-ldap ----> NO
#apt-get install libpam-cracklib
#apt-get install samba-common winbind
#apt-get install krb5-user krb5-config krb5-doc libpam-krb5
# /etc/pam.d/common-auth
auth sufficient pam_krb5.so ccache=/tmp/krb5cc_%u
auth sufficient pam_unix.so likeauth nullok_secure use_first_pass
auth required pam_deny.so
# /etc/pam.d/common-account
account required pam_unix.so
account [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore] pam_krb5.so minimum_uid=10000
# /etc/pam.d/common-session
session required pam_unix.so
session optional pam_foreground.so
session optional pam_krb5.so minimum_uid=10000
session required pam_mkhomedir.so umask=0077 skel=/etc/skel
# /etc/nsswitch.conf
passwd compat winbind
group compat winbind
è necessario ovviamente configurare samba anche lato client e aggiungere la macchina al dominio AD.
Link utili:
http://searchenterpriselinux.techtarget.com/tip/Samba-3-Windows-file-and...
http://ss64.com/nt/robocopy.html
http://www.dia.unisa.it/~ads/corso-security/www/CORSO-0001/kerberos/
http://wiki.samba.org/index.php/Samba_%26_Active_Directory
http://help.ubuntu-it.org/9.10/ubuntu/serverguide/it/kerberos-ldap.html
http://sourceforge.net/apps/mediawiki/pam-krb5-ldap/index.php?title=Main...
http://buechse.de/HOWTO/samba_pam_mount_sshd/