Samba

De ClissXXI.

Sommaire

Une configuration minimale

[global]
        workgroup = ANGRES
        passdb backend = tdbsam

[homes]
        comment = Répertoire personnel de %u
        read only = no

[monpartage]
        comment = Description longue de mon partage
        read only = no
        path = /srv/samba/monpartage

Noter qu'un partage partage est read only par défaut, d'où la nécessité de désactiver cette option.

Le passbd backend implicite est smbpasswd qui ne permet pas de stocker tous les champs utilisateurs (durée de validité, etc.), on utilise donc tdbsam d'office pour ne pas avoir de surprises par la suite.

Créer un dossier partagé

cd /srv/samba/groups
mkdir nom_du_partage
chmod o= nom_du_partage
chmod g=rwxs nom_du_partage
chgrp nom_du_partage nom_du_partage

Puis modifier le fichier de configuration de Samba /etc/samba/smb.conf:

[nom_du_partage]
 comment = Répertoire pour ...
 force group = +nom_du_partage
 path = /srv/samba/groups/nom_du_partage
 valid users = @nom_du_partage
 read only = no
 create mask = 0660
 directory mask = 0770

On teste la configuration avec:

testparm

On relance le serveur de fichiers:

/etc/init.d/samba restart

Noter l'astuce pour forcer le bon groupe dans les répertoires partagés: ne change le groupe que pour les utilisateurs qui en sont déjà membres:

[qualite]
...
 force group = +qualite
...
[prod]
...
 force group = +prod

Conserver la compatibilité avec MS Woe9X et WoeMe

La nouvelle version dans Debian Lenny (3.2.5) désactive implicitement les vieux clients, ce qui a également pour conséquence d'EFFACER tous les mots de passe dans l'ancien format. Il faut donc - AVANT de mettre à jour - rajouter ceci dans la configuration:

lanman auth = yes
client plaintext auth = yes
client lanman auth = yes

Pour plus d'information, cf. /usr/share/doc/samba/NEWS.Debian.gz:

samba (3.0.27a-2) unstable; urgency=low

  * Weak authentication methods are disabled by default

    Beginning with this version, plaintext authentication is disabled for
    clients and lanman authentication is disabled for both clients and
    servers.  Lanman authentication is not needed for Windows
    NT/2000/XP/Vista, Mac OS X or Samba, but if you still have Windows
    95/98/ME clients (or servers) you may need to set lanman auth (or client
    lanman auth) to yes in your smb.conf.

    The "lanman auth = no" setting will also cause lanman password hashes to
    be deleted from smbpasswd and prevent new ones from being written, so
    that these can't be subjected to brute-force password attacks.  This
    means that re-enabling lanman auth after it has been disabled is more
    difficult; it is therefore advisable that you re-enable the option as
    soon as possible if you think you will need to support Win9x clients.

    Client support for plaintext passwords is not needed for recent Windows
    servers, and in fact this behavior change makes the Samba client behave
    in a manner consistent with all Windows clients later than Windows 98.
    However, if you need to connect to a Samba server that does not have
    encrypted password support enabled, or to another server that does not
    support NTLM authentication, you will need to set
    "client plaintext auth = yes" and "client lanman auth = yes" in smb.conf.

 -- Steve Langasek <vorlon@debian.org>  Sat, 24 Nov 2007 00:23:37 -0800

Configuration LDAP

OpenLDAP

apt-get install slapd
dpkg-reconfigure slapd
apt-get install samba-doc
zcat /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz > /etc/ldap/schema/samba3.schema

Modifier /etc/ldap/slapd.conf et ajouter:

include /etc/ldap/schema/samba3.schema
invoke-rc.d slapd restart

Note: si vous passez par des outils utilisateurs (smbpasswd, ms woe...) pour changer le mot de passe, OpenLDAP va utiliser son cryptage par défaut: SSHA.

En principe, cela ne pose pas de problème, mais si vous voulez exporter ces mots de passe dans un autre système (ex: une authentification sur une base MySQL contenant des mots de passe pré-cryptés, telle qu'utilisée dans PostfixAdmin), vous pouvez le changer en crypage Unix classique (crypt(3)):

password-hash {crypt}

De plus, pour utiliser un cryptage plus fort (MD5-CRYPT), et si vous êtes sous glibc2:

password-crypt-salt-format "$1$%.8s"

Voir aussi: OpenLDAP

Système UNIX

cat <<EOF | debconf-set-selections
libnss-ldap     shared/ldapns/ldap-server       string  ldap://127.0.0.1/
libnss-ldap     shared/ldapns/base-dn   string  dc=chezmoi,dc=fr
libnss-ldap     libnss-ldap/rootbinddn  string  cn=admin,dc=chezmoi,dc=fr
libnss-ldap     libnss-ldap/rootbindpw  password  admin
EOF

apt-get install libnss-ldap
cat <<EOF >> /etc/libnss-ldap.conf
nss_base_passwd ou=people,dc=chezmoi,dc=fr
nss_base_shadow ou=people,dc=chezmoi,dc=fr
nss_base_group  ou=groups,dc=chezmoi,dc=fr
EOF

sed -i -e 's/^\(passwd:.*$\)/\1 ldap/' \
       -e 's/^\(group:.*$\)/\1 ldap/'  \
       -e 's/^\(shadow:.*$\)/\1 ldap/' \
    /etc/nsswitch.conf

SMB-LDAP-Tools:

apt-get install smbldap-tools
zcat /usr/share/doc/smbldap-tools/examples/smbldap.conf.gz \
   > /etc/smbldap-tools/smbldap.conf
chmod 644 /etc/smbldap-tools/smbldap.conf
  • comment SID="..."
  • sambaDomain="CHEZMOI"
  • suffix="dc=chezmoi,dc=fr"
  • groupsdn="ou=groups,${suffix}"
  • computersdn="ou=people,${suffix}" # same than users, otherwise WXP won't join the domain %(
  • usersdn="ou=people,${suffix}"
  • idmapdn="ou=people,${suffix}"
  • sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"
  • hash_encrypt="CRYPT"
  • defaultMaxPasswordAge="-1" # (http://www.planetmy.com/blog/ldap-samba-pdc/)

- sambaSID mantadory: `net getlocalsid` . "$uidNumber" > uid=admin/sambaSID

cp /usr/share/doc/smbldap-tools/examples/smbldap_bind.conf \
   /etc/smbldap-tools/smbldap_bind.conf
chmod 600 /etc/smbldap-tools/smbldap_bind.conf
  • masterDN="cn=admin,dc=chezmoi,dc=fr"
  • masterPw="secret"
smbldap-populate
cat <<EOF | ldapmodify -c -x -D 'cn=admin,dc=chezmoi,dc=fr' -W
dn: sambaDomainName=CHEZMOI,dc=chezmoi,dc=fr
changetype: modify
replace: uidNumber
uidNumber: 3000
-
replace: sambaNextRid
sambaNextRid: 3000
EOF
# Not necessary:
#gidNumber: 3000
  • Set uidNumber=3000 - only machines will use this script, and this will avoid conflicts with webmin.
  • Not sure about the 'sambaNextRid', it seems it's defined when the computer joins the domain (not in 'smbldap-useradd -w')

Samba

workgroup = CHEZMOI

# I use LDAP
passdb backend = ldapsam
#passdb backend = ldapsam:ldap://ldap-server.chezmoi.fr
ldap suffix = dc=chezmoi,dc=fr
ldap admin dn = cn=admin,dc=chezmoi,dc=fr
ldap user suffix = ou=people
ldap group suffix = ou=groups
#ldap machine suffix = ou=computers
ldap machine suffix = ou=people
ldap idmap suffix = ou=people
ldap passwd sync = yes

# Pour les dossiers personnels
root preexec = /usr/local/bin/smb_mkhomedir.sh %U
mkdir -m 755 /srv/samba/
mkdir -m 755 /srv/samba/netlogon

Définir le mot de passe LDAP:

smbpasswd -W

Créer automatiquement les dossiers personnels:

cat <<'EOF' > /usr/local/bin/smb_mkhomedir.sh
#!/bin/bash
echo `date -R` $0 $* >> /var/log/smb_mkhomedir.log

user="$1"

homedir=`getent passwd $user | cut -d: -f 6`
# Validate homedir starts with "/home/"
if ! echo $homedir | grep ^/home/ >/dev/null; then
    exit 1
fi
# Don't do anything if the path already exists
if [ -e homedir ]; then
    exit 0
fi

mkdir -p -m 755 $homedir
chown $user: $homedir
EOF
chmod 755 /usr/local/bin/smb_mkhomedir.sh

Changer le nom de domaine:

  • modifier avec gq (ou autre interface d'édition)
  • mettre à jour dans /etc/smbldap-tools/
  • mettre à jour dans /etc/samba/smb.conf

Configuration Webmin

(testé sous Webmin 1.400)

# Debian-specific Webmin patch
ln -s libnss-ldap.secret ldap.secret
  • LDAP Users and Groups
    • Enabled Samba account by default? => Yes
    • Show fields for given name and surname? [otherwise "Failed to add user to LDAP database : object class 'inetOrgPerson' requires attribute 'sn'"] => Yes
    • Object class to add for given name? [otherwise "objectclass: value #4 invalid per syntax" because webmin will add an empty class] => inetOrgPerson
    • Domain SID for Samba3 [necessary?] => S-1-5-21-XXXXXXXXXX-XXXXXXXXX-XXXXXXXXXX
    • LDAP object class for Samba groups [necessary?] => sambaGroupMapping (Samba 3 new schema)
  • Users and Groups
    • Default primary group for new users => "Domain Users"
    • Default shell for new users => /bin/false
  • LDAP Client
    • Root LDAP client password file => /etc/libnss-ldap.secret

Configuration PDC

PDC = Primary Domain Controller = CPD = Contrôleur Principal de Domaine = terminologie microsoft pour dire serveur d'identification

Suivre la configuration LDAP, puis:

# I'm a PDC
domain logons = yes
# I'm a master browser
domain master = yes
local master = yes

## <configuration plus agressive>
# Au cas où:
preferred master = yes
os level = 65
# Si pas de Win98, supprimer le port 139 (les déconnexions de WXP sont logguées)
#smb ports = 445
# Ne pas activer s'il y a un autre wins sur le réseau:
wins support = yes
dns proxy = no
socket options = TCP_NODELAY
## </configuration plus agressive>

# Jonction de machines au domaine:
add machine script = /usr/sbin/smbldap-useradd -w "%u"

# Homedir
logon drive = Z:
logon script = %U.bat
## Disable roaming profiles:
#logon path =
#logon home =
# UnDisable roaming profiles:
# (default: logon path = \\%N\%U\profile)
logon path = \\%h\%U\profile


[netlogon]
path = /srv/samba/netlogon
read only = yes
browsable = no
comment = Scripts de connexion et Stratégies Systèmes
force directory mode = 755
force create mode = 644
# Debian tips:
share modes = no
guest ok = yes

Dépannage PDC

À tester: désactiver RequireSignOrSeal:

3 valeurs:

; http://lists.samba.org/archive/samba/2005-July/108896.html
; force Windows XP Professional clients to accept Samba as a PDC
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters]
"requiresignorseal"=dword:00000000
"signsecurechannel"=dword:00000000 
; Do not check for user ownership of Roaming Profile Folders
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\System]
"CompatibleRUPSecurity"=dword:00000001


Configuration de client / jonction domaine NT4

Configuration minimale, dresse une association locale RID->uid dans /var/lib/samba/winbindd_idmap.tdb:

[global]
security = domain
workgroup = CHEZMOI
idmap uid = 10000-20000
idmap gid = 10000-20000
# Désactiver si plus de 10000 utilisateurs dans le domaine
winbind enum users = yes
winbind enum groups = yes
# Compléter les informations du PDC
template homedir = /home/%U
template shell = /bin/bash
# Ne pas préfixer DOMAINE\ dans les noms d'utilisateurs et de groupes
winbind use default domain = yes

# Pour les dossiers personnels
root preexec = /usr/local/bin/smb_mkhomedir.sh %U

Au niveau système:

  • /etc/nsswitch.conf:
sed -i -e 's/^\(passwd:.*$\)/\1 winbind/' \
       -e 's/^\(group:.*$\)/\1 winbind/'  \
       -e 's/^\(shadow:.*$\)/\1 winbind/' \
    /etc/nsswitch.conf
  • RELANCER LE DÉMON NSCD (name service caching daemon) si vous l'utilisez, sans quoi les changement ne seront pas pris en compte:
/etc/init.d/nscd restart
  • Voire le désactiver (ce que recommande [1]):
apt-get delete --purge nscd
  • Se connecter au domaine:
net rpc join -Uroot
# ou
net rpc join -Uroot -Sadresse_ip

Variante, fait une association avec un algorithme déterministe, permettent de partage facilement ces associations entre plusieurs machines:

idmap backend = rid:CHEZMOI-70000-10000


Configuration winbind PAM: seulement nécessaire si besoin d'un login local (ssh, shell, etc.). Le module est nécessaire (contrairement à une installation LDAP) parce que le PDC ne propose pas de champ de type shadow, mais à la place effectue l'authentification via un défi cryptographique (challenge).


Pour une connexion à un AD (pas reproductible avec Samba, attendre Samba 4 ou patienter sur du PDC type NT4 comme ci-dessus):

  • security = ads
  • configuration kerberos
  • net ads join à la place de net rpc join

Voir aussi:

Samba + ClamAV

Pour automatiquement vérifier les transferts de fichiers avec un antivirus.

apt-get source samba
pushd samba-3.2.5/
sudo apt-get build-dep samba
debian/rules configure-stamp
pushd source/
make proto
popd
popd
wget http://fastbull.dl.sourceforge.net/sourceforge/openantivirus/samba-vscan-0.3.6b.tar.bz2
tar xjf samba-vscan-0.3.6b.tar.bz2 
push samba-vscan-0.3.6b/
sudo apt-get install libmagic-dev
./configure --with-samba-source=/usr/src/samba-3.2.5/source/
make clamav
# ERROR - missing system/capability.h
sudo make install
cp clamav/vscan-clamav.conf /etc/samba/
popd
# IN PROGRESS

Filtrer les avertissements cups

Si vous ne partagez pas d'imprimante, et que vous souhaitez éviter les messages concernant l'impression (ex: Unable to connect to CUPS server localhost:631 - Connection refused) dans les logs, utilisez:

printing = bsd
printcap name = /dev/null

Lister les utilisateurs

Si on n'utilise pas LDAP:

pdbedit -w -L

Voir aussi

Samba et ms woe

Synchronisation ("profils")

L'algorithme n'a pas l'air terrible. Si je comprends bien:

  • quand le fichier est plus récent sur le serveur à l'ouverture de session, on le récupère sur le client,
  • quand le fichier est plus récent sur le client à la fermeture de session, on l'envoie au serveur.
    • si le fichier est gros, on renvoie tout (même si modification en append, test avec une BAL de Thunderbird de 3Go)

Pour transférer un fichier, le nouveau contenu est d'abord placé dans un fichier prf xxx .tmp. Une fois le transfert fini, ce fichier .tmp est renommé et écrase l'ancien contenu.

Il se peut que lors d'une synchronisation interrompue, des fichiers prfxxx.tmp existent toujours. Ils risquent alors d'être eux-même synchronisés. S'il s'agit de gros fichiers, windows peut rester bloqué longtemps (e.g. 40Go = une bonne heure sur un réseau 100Mbit/s). Dans ce cas il faut de préférence attendre la fin de la synchronisation (ou alors forcer l'extinction de ordinateur), puis supprimer les fichiers prfxxx.tmp des deux côtes (sur le serveur et le poste client). À la prochaine connexion, ces fichiers ne seront plus pris en compte.

  • Chez l'ennemi: [2] [3] [4]
  • Liste de diffusion de Samba: [5]

Liens

Outils personnels