In dieser Anleitung fasse ich die Schritte zusammen, die Unter Debian 9 nötig waren, um eine Sambafreigabe mit einer Active Directory Integration zur Benutzerauthentifizierung zu realisieren. Die einrichtung eines Domain Controllers, der das AD bereit stellt, ist ein anderes Thema.

Achtung: SMBv2 aktivieren

Samba versucht in den von mir bisher eingestezten Versionen per Default über SMBv1 zu kommunizieren und wird bei neueren Windows Versionen damit scheitern. SMBv1 ist dort aufgrund der bekannten Schwachstellen abgeschaltet. Um Samba auf neuere Versionen von SMB zu zwingen fügt man in der Konfigurationsdatei smb.conf (/etc/samba/smb.conf) folgende Zeile hinzu, in der Section [global]:

min protocol = SMB2
Vorbereitung

Auf folgende Schritte gehe ich hier nicht weiter ein, weil die klar seien sollten:

  • Debian 9 installieren
  • Netzwerk konfigurieren
  • /etc/motd anpassen (weil die Copyright Info nach jedem Login einfach nervt)
  • SSH-Server installieren und Root-Zugang blockieren
Erforderliche Pakete installieren

Wir benötigen folgende Pakete:

  • ntp (Network Time Protokoll)
  • krb5-user (Authentifizierung der Benutzer über das Kerberos Protokoll)
  • samba (der Samba Server)
  • smbclient (der Samba Client)
  • winbind (stellt die Mechanismen der Authentifizierung für Windows-Domänen bereit)
  • libnss-winbind (winbind Support für nsswitch)
  • libpam-winbind (winbind Support für PAM)
apt-get install ntp krb5-user samba smbclient winbind libnss-winbind libpam-winbind
NTP und DNS konfigurieren

Kerberos, also auch Active Directory, ist sehr empfindlich, wenn es um Zeit geht. Wir nutzen als NTP Server also unseren Active Directory NTP Server.

# /etc/resolv.conf
domain domain.com
search domain.com
nameserver 10.5.5.51
nameserver 10.5.5.52

# /etc/network/interfaces
iface eth0 inet static
    [...]
    dns-nameservers 10.5.5.51 10.5.5.56
    dns-search domain.com

Kerberos konfigurieren
Kerberos ist ein Ticketbasierter Mechanismus, zur Authentifizierung von Benutzern über ein unsicheres Netzwerk. Die Architektur folgt dem Client-Server-Modell.
Microsoft hat einen Artikel darüber, wie Kerberos im Active Directory verwendet wird
Wir müssen Kerberos konfigurieren, um die AD-Benutzer auf dem Linuxsystem authentifizieren zu können.

  • DOMAIN.COM mit eigener Domain ersetzen (Wichtig: alles groß geschrieben!)
  • kdc mit IP des Domain Controllers ersetzen
# /etc/krb5.conf
[libdefaults]
  ticket_lifetime = 24h
  default_realm = DOMAIN.COM
  forwardable = true

[realms]
  DOMAIN.COM = {
    kdc = 10.5.5.51
    default_domain = DOMAIN.COM
  }

[domain_realm]
  .domain.com = DOMAIN.COM
  domain.com = DOMAIN.COM

[kdc]
  profile = /etc/krb5kdc/kdc.conf

[appdefaults]
  pam = {
    debug = false
    ticket_lifetime = 36000
    renew_lifetime = 36000
    forwardable = true
    krb4_convert = false
  }

[logging]
  kdc = FILE:/var/log/krb5kdc.log
  admin_server = FILE:/var/log/kadmin.log
  default = FILE:/var/log/krb5lib.log

Es muss kein Dienst neu gestartet werden. Wir prüfen nun mit dem Befehl kinit, ob die Kerberos-Konfiguration richtig ist, indem wir ein Ticket für einen Active Directory Benutzer anfordern.

kinit Benutzer
Password for Benutzer@DOMAIN.COM:

Mit dem Befehl klist prüfen wir ob ein valides Ticket ergeben wurde

klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: Benutzer@DOMAIN.COM

Valid starting    Expires           Service principal
18.06.2018 18:02:28  19.06.2018 04:02:28  krbtgt/DOAMIN.COM@DOMAIN.COM
        erneuern bis 19.06.2018 18:02:28

Nsswitch konfigurieren
Mit nsswitch lässt sich der Name Service Dispatcher konfigurieren. Wir konfigurieren ihn so, dass auch Benutzer aus dem Active Directory akzeptiert werden. Dies passwiert über den Umweg des Daemons winbindd. Samba nutzt winbind zur Nutzerauthentifizierung, nach dem Beitritt in die Domäne. Die Nutzung von winbind werden wir später auch in der Samba-Konfigurationsdatei konfigurieren. Folgende Zeilen sind anzupassen:

# /etc/nsswitch.conf
passwd: files winbind
group: files winbind
shadow: files
gshadow: files

Manpage zu nsswitch.conf

Samba konfigurieren

# /etc/samba/smb.conf
[global]
security = ads
realm = DOMAIN.LOCAL
workgroup = HRG
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
winbind cache time = 10
winbind use default domain = yes
template homedir = /home/%U
template shell = /bin/bash
client use spnego = yes
client ntlmv2 auth = yes
encrypt passwords = true
restrict anonymous = 2
domain master = no
local master = no
preferred master = no
os level = 0
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes
min protocol = SMB2
[exampleshare]         
	comment = a comment         
	path = /home/exampleshare         
	browseable = yes         
	read only = no
        writeable = yes
	#inherit acls = yes         
	#inherit permissions = yes         
	create mask = 0660     
	directory mask = 0770         
	valid users = +"DOMAIN\Gruppe"
	admin users = +"DOMAIN\Gruppe"  <-- optionally define your ads groups with admin rights 

Den Realm in der Konfig auf den korrekten Domänennamen anpassen.

Datei speichern und Dienste neu starten. Das unter path angegebene Verzeichnis muss die entsprechende Berechtigung haben, damit die AD-Gruppen dort rein schreiben dürfen. Evtl. muss man die Datei und Verzeichnismasken anpassen auf 0666 und 0777.

Der winbind Dienst wird versagen, wenn wir die Dienste neu starten, da wir der Domäne noch nicht beigetreten sind. Das holen wir im nächsten Schritt nach.

/etc/init.d/winbind restart
/etc/init.d/nmbd restart
/etc/init.d/smbd restart

Dazu erstellen wir ein Kerberos Ticket für einen Domänenadministrator und benutzen das Ticket, um der Domäne beitzutreten.

kinit Administrator
net ads join -U administrator
Enter Administrators's password:
Using short domain name -- DOMAIN
Joined 'COMPUTERNAME' to dns domain 'domain.com'
DNS Update for computername.domain.com failed: ERROR_DNS_UPDATE_FAILED
DNS update failed: NT_STATUS_UNSUCCESSFUL

Dass die Fehlermeldung wegen dem DNS erscheint ist normal. Einfach manuell auf dem DNS Server einen A und einen PTR Record anlegen. Der PTR Record wird normalerweise sogar automatisch beim Erstellen des A Records mit angelegt.

Dienste neu starten. Sollte nun alles klappen.

/etc/init.d/winbind restart
/etc/init.d/nmbd restart
/etc/init.d/smbd restart

Update des PAM (Pluggable Auhtentication Module)

pam-auth-update

Prüfen ob die Vertrauensstellung gegeben ist:

wbinfo -t

Man kann sich nun über winbind die Benutzer und Gruppen innerhalb der Domäne anzeigen lassen.

wbinfo -u
wbinfo -g

Nun prüfen wir ob auch nsswitch die AD Benutzer und Gruppen kennt. Es sollten die Benutzer und Gruppen des lokalen System UND des AD angezeigt werden. Wenn das nicht funktioniert in der /etc/nsswitch.conf auf files ändern (siehe oben).

getent passwd
getent group
Samba Shares konfigurieren

Wir richten 3 Sahres ein.

  1. für die Buchhaltung(Backup Strategie nötig),
  2. als temporärer Datenspeicher, damit die Benutzer Datenaustauschen können (Löschstrategie nötig)
  3. für eine einzelne Person, zur verdeutlichung der Konfigurationsunterschiede. Sagen wir mal für den Chef.

Verzeichnisse anlegen

mkdir -p /sambashares/{daten,zwischenspeicher,chef}
chmod -R 0770 /sambashares/
chgrp -R "Domain Users" /sambashares/

Nun konfigurieren wir Samba

# /etc/samba/smb.conf

[Buchhaltung]
    comment = Buchhaltung
    path = /sambashares/buchhaltung
    valid users = @DOMAIN\buchhaltung, @DOMAIN\vorstand
    force group = buchhaltung
    writable = yes
    read only = no
    force create mode = 0660
    create mask = 0777
    directory mask = 0777
    force directory mode = 0770
    access based share enum = yes
    hide unreadable = yes

[zwischenspeicher]
    comment = Daily Emptied Dropbox
    path = /sambashares/zwischenspeicher
    valid users = "@DOMAIN\Domain Users"
    force group = "domain users"
    writable = yes
    read only = no
    force create mode = 0660
    create mask = 0777
    directory mask = 0777
    force directory mode = 0770
    access based share enum = yes
    hide unreadable = yes

[Chef]
    comment = CEO Only
    path = /sambashares/chef
    valid users = EXAMPLE\chef
    force group = "domain users"
    writable = yes
    read only = no
    force create mode = 0660
    create mask = 0777
    directory mask = 0777
    force directory mode = 0770
    access based share enum = yes
    hide unreadable = yes

Zu beachten ist folgendes:

  • AD Gruppen wird ein @ vorangestellt, einzelnen Benutzern nicht.
  • bei Leerzeichen im Gruppenname wird die Zeichenkette mit Anführungszeichen („) umschlossen.

Samba unterstützt auch die Rechtevergabe für Benutzer und Gruppen innerhalb eines Shares über Windows ACL’s oder POSIC ACL’s. Mehr dazu hier.

Danach Samba Dienst neu starten

/etc/init.d/smbd restart

Diese Anleitung basiert auf dem englischen Tutorial von Remy van Elst und wurde an ein paar Stellen korrigiert. Getestet mit Debian 9.