# Windows-Freigabe mit Samba

Samba ist die Linux-Variante um SMB-Verbindungen zu Windows, Linux und OS X (macOS) herzustellen. Hierfür wird ein Serverdienst installiert und über eine übersichtliche Konfigurationsdatei entsprechend den Anforderungen eingestellt. Es existieren zwar auch Möglichkeiten diese Freigaben über GUI-Programme oder Webinterfaces zu konfigurieren allerdings sind deren Funktionsumfang meist auf Basis-Funktionen beschränkt. Samba bietet eine Überprüfungsmöglichkeit der Konfigurationsdatei, um Schreibfehler und deren Konsequenzen übersichtlich darzustellen.

## Installation

Für die Installation empfiehlt sich die Shell da hierüber sinnvoll beobachtet werden kann welche weiteren Abhängigkeiten installiert werden.

### Shell-Installation

Update der Paketdatenbank und der installierten Pakete

```bash
sudo apt update && sudo apt-get upgrade -y
```

Installation des Samba-Dienstes

```bash
sudo apt install samba
```

Nach der Installation des Dienstes kann dieser über die Konfigurationsdatei /etc/samba/smb.conf bearbeitet werden. Die von Ubuntu vorkonfigurierte Version ist nahezu vollständig selbsterklärend und mit entsprechenden Beispielen versehen.

## /etc/samba/smb.conf

Hier soll der Aufbau der Datei mit ihren Default werten erkärt werden. Schauen Sie sich parallel ihre Datei auf ihrem System an.

```ini
[global]
workgroup = WORKGROUP
```

Hier wird die Arbeitsgruppe bzw. die Domäne, in der der Samba-Server
betrieben werden soll definiert.

```ini
server string = %h server (Samba, Ubuntu)
```

Die Beschreibung des Servers (mouse-over) wobei für %h für der hostname
des Servers eingesetzt wird.


```ini
dns proxy = no
```

Bei der Grundkonfiguration no wird kein DNS-Server für die Namensauflösung genutzt sondern nur die lokalen host Dateien, WINS-Server und Broadcasts. Wenn ein funktionierender DNS-Server im Netzwerk vorhanden ist kann dieser durch den Einsatz von yes ebenfalls genutzt werden.

```ini
interfaces = 127.0.0.0/8 eth0
bind interfaces only = yes
```

Hier kann konfiguriert werden ob der Samba-Server auf einer, mehreren oder allen Netzwerkkarten und IP-Adressen verfügbar ist. Wenn Sie hier nichts verändern ist der Server Grundsätzlich auf allen Netzwerkkarten und Subnetzen erreichbar.

```ini
server role =
```

standalone server: Die einfachste Variante, nur User die per smbpasswd hinzugefügt wurden können auf den Samba-Server zugreifen.

member server: Der Server ist Mitglied einer Domäne und hat ein Maschinenkonto auf dem ADDC an welchen auch die Benutzeranfragen weitergegegeben werden.

classic primary domain controller: Samba agiert als NT4 PDC

classic backup domain controller : Samba ist ein sekundärer NT4 DC

active directory domain controller: Samba agiert als ADDC und übernimmt die gesamte Benutzerauthentifizierung. Diese Einstellung sollte nicht von Hand genutzt werden da hierfür ein Provisionierungsscript genutzt wird.

```
map to guest = bad user
```

Was passiert mit unbekannten Nutzern.

## Freigaben

Freigaben werden je nach Funktionalität unterschiedlich beschrieben wobei es auch besondere Freigaben gibt, welche z.B. Drucker, Clientspezifisch oder Userspezifische Freigaben betreffen.

## Beispiel einer freien Freigabe z.B. Medienfreigabe im Privatbereich

```ini
[Musik]
comment = Musikfreigabe
path = /srv/samba/musik
read only = no
browseable = yes
```

Nach dem Speichern überprüfen Sie ob alle Funktionen, die sie definiert
haben korrekt übernommen werden konnten:

```bash
sudo samba-tool testparm
```

Sie werden feststellen, dass die Option browseable nicht angezeigt wird. Dies liegt daran, dass diese Kombination browseable = yes ein defaultwert ist und somit nicht angezeigt wird.

Damit diese Freigabe auch funktioniert, muss Sie auch auf dem System vorhanden sein, sowie die korrekte Rechtevergabe erfolgt sein.

```bash
sudo mkdir /srv/samba
sudo mkdir /srv/samba/musik
sudo chmod -R a+rw /srv/samba/musik
```

nach Abschluss dieser Aktion muss der Samba-Dienst und der NetBIOS-Nameserver neu gestartet werden.

```bash
sudo systemctl restart smbd.service nmbd.service
```

Alle vor der Installation von Samba vorhandenen User sind nicht in der Samba-Datenbank hinterlegt und müssen nachgepflegt werden. Hierbei geben sie ihren Usernamen und ihr Passwort erneut ein. Spätere Änderungen werden synchronisiert.

```bash
sudo smbpasswd -a USERNAME
```

Nun können Sie von einem beliebigen Client auf diese Freigabe zugreifen:

Windows:

Explorer öffnen und in der Adresszeile:

```
\\IP des Servers\Musik
```

eingeben oder direkt ein Netzlaufwerk verbinden

Linux und OSX:

Im Dateimanager in die Adresszeile:

```
smb://IP des Servers/Musik
```

## Beispiel eingeschränkte Freigabe z.B. Unterlagen für bestimmten Personenkreis.

Im Vorfeld solcher Freigaben müssen die betreffenden Benutzer zum einen auf dem System vorhanden sein und auch noch ergänzend in Samba bekannt gemacht werden. Dazu legen wir nun 2 neue Nutzer an, um später nachvollziehen zu können wer was darf. Dazu als Beispiel Hans Wurst aus der Produktion und Peter Lustig aus der Verwaltung.

Im folgenden werden Zugriffsgruppen definiert welche es ermöglichen die Lese- und Schreibrechte sauber Granuliert darzustellen:

|              | Lesen&#xA;Angebote | Schreiben&#xA;Angebote | Lesen&#xA;Lieferscheine | Schreiben&#xA;Lieferscheine |
| ------------ | ------------------ | ---------------------- | ----------------------- | --------------------------- |
| Hans Wurst   | X                  |                        |                         | X                           |
| Peter Lustig |                    | X                      |                         | X                           |

```bash
sudo adduser hwurst 
sudo adduser plustig
sudo addgroup angebote_l
sudo addgroup angebote_ae
sudo addgroup lieferscheine_l
sudo addgroup lieferscheine_ae
sudo usermod -aG angebote_l hwurst
sudo usermod -aG lieferscheine_ae hwurst
sudo usermod -aG angebote_ae plustig
sudo usermod -aG lieferscheine_ae plustig
```

Bekanntgabe an Samba:

```bash
sudo smbpasswd -a hwurst
sudo smbpasswd -a plustig
```

Erstellen der Verzeichnisse:

```bash
sudo mkdir /srv/samba/angebote
sudo chown -R nobody:angebote_ae /srv/samba/angebote
sudo chmod -R 0077 /srv/samba/angebote
sudo mkdir /srv/samba/lieferscheine
sudo chown -R nobody:lieferscheine_ae /srv/samba/lieferscheine
sudo chmod -R 0077 /srv/samba/lieferscheine
sudo nano /etc/samba/smb.conf
```
Erklärung:
```bash
chown Rekursive USER:GRUPPE Pfad
chmod Rekurisv OKTALMODE-RECHTE (Siehe Tabelle) Pfad
```
Die Zahlenfolge 0077 Steht für die Rechte im Ordner:
* 0 Spezialrechte (Sticky bit damit Dateiersteller Dateieigentümer bleiben, für Samba besser auf 0)
* 0 Eigentümer (vorher auf nobody gesetzt)
* 7 Gruppe (vorher auf angebote_ae gesetzt)
* 7 Andere (sonstige user im System ohne Samba) 

| Oktal | Binär | Rechte (rwx) | Typische Nutzung                                  |
| ----- | ----- | ------------ | ------------------------------------------------- |
| 0     | 000   | ---          | Kein Zugriff                   |
| 1     | 001   | --x          | Nur Ausführen (z. B. Skripte)​        |
| 2     | 010   | -w-          | Nur Schreiben                          |
| 3     | 011   | -wx          | Schreiben + Ausführen​              |
| 4     | 100   | r--          | Nur Lesen​                            |
| 5     | 101   | r-x          | Lesen + Ausführen (Ordner/Dateien)​ |
| 6     | 110   | rw-          | Lesen + Schreiben                       |
| 7     | 111   | rwx          | Voller Zugriff (unsicher für Freigaben) ​  |

In der Datei /etc/samba/smb.conf:

```ini
[Angebote]
comment = Angebote an Kunden
path = /srv/samba/angebote
guest ok = no
browseable = yes
readonly = yes
valid users = @angebote_l, @angebote_ae
write list = @angebote_ae
force create mode = 0775
force directory mask = 0775
force group = angebote_ae

[Lieferscheine]
copy = Angebote
comment = Lieferscheine von Lieferanten
path = /srv/samba/lieferscheine
valid users = @lieferscheine_l, @lieferscheine_ae
write list = @lieferscheine_ae
force group = lieferscheine_ae

```

## Userverzeichnis

> Jeder User der Zugriffsrechte auf Samba selbst hat kann durch eine spezielle Freigabe automatisch Zugriff auf sein eigenes Home-Verzeichnis erhalten. Diese ist in der Beispielkonfiguration der smb.conf bereits auskommentiert vorhanden und kann schlicht wieder ein kommentiert werden.

```ini
[homes]
comment = Privates Verzeichnis
browseable = no
read only = yes
create mask = 0700
directory mask = 0700
valid users = %S

```

„homes" ist hier nur ein Platzhalter dieser wird automatisch durch den jeweiligen Usernamen ersetzt und auch der Zugriff ist dann nur für diesen User verfügbar.

## Sonderfall Drucker

Für Drucker ist standartmäßig eine Freigabe aktiviert ähnlich wie dies auch Windows in einem Heimnetzwerk tut. Die Konfiguration können Sie der Beispielkonfiguration der smb.conf entnehmen es sind 2 Freigaben notwendig, um ALLE Drucker freizugeben.

```ini
[printers]
comment = Alle Drucker
browseable = no
path = /var/spool/samba
printable = yes
guest ok = no
read only = yes
create mask = 0700
```

Damit werden Alle Drucker, die am System eingerichtet sind mit jeweils einem eigenen Eintrag freigegeben.

```ini
[print$]
comment = Drucker Treiber
path /var/lib/samba/printers
browseable = yes
read only = yes
guest ok = no

```

Hier sucht Windows nach Druckertreibern. Die Treiber müssen entweder über andere Wege in dieses Verzeichnis gelegt werden oder es kann auch ein write list Eintrag hinzugefügt werden.

## Netzwerkpapierkorb

Auf einem Netzlaufwerk gelöschte Dateien können schnell mal verloren gehen, dafür lässt sich ein Netzwerkpapierkorb einsetzen. Entweder unter global für alle Freigaben oder pro Freigabe einmal einsetzen.

```ini
# Virtuelles File System "recycle" wird angelegt
vfs object = recycle
# Der Pfad zum Papierkorb relativ zur Freigabe (".recyclebin" ist
Default).
recycle:repository = .recyclebin
# Im Papierkorb bleiben Pfad-Angaben erhalten.
recycle:keeptree = Yes
# Beim Verschieben wird der Zeitstempel angepasst.
recycle:touch = Yes
# Gleichnamige Dateien werden nicht überschrieben.
recycle:versions = Yes
# Keine Begrenzung der Dateigröße pro gelöschter Datei.
recycle:maxsize = 0
```

Und wer leert den? Durch Cron wird jeden Tag der Papierkorb durchsucht
und alles, was älter als 14 Tage ist gelöscht.

```bash
sudo crontab -e
```

In einer Zeile:

```
0 12 * * * for path in $(grep path /etc/samba/smb.conf | cut -d= -f2 | sed -e 's/ //' -e 's/\%S/*/'); do if  ; then find ${path}/.recycle -mindepth 1 -mtime +14 -exec rm -rf {} \;; fi; done
```

Was steht da nun drin:

Jeden Tag um 0:12 soll in der smb.conf nach Pfad-Angaben gesucht werden und innerhalb dieser die Pfade „.recycle" nach Dateien durchsucht werden die älter als 14 Tage sind. Diese werden gelöscht.


[PDF herunterladen](Windows-Freigabe_mit_Samba.pdf){ .md-button }
