# Samba-Konfiguration für Linux-Einsteiger
*Ein vollständiger Leitfaden zur Einrichtung von Samba-Freigaben, Rechteverwaltung und Gruppen auf einem Standalone-Server*

---

## Inhaltsverzeichnis
- [Samba-Konfiguration für Linux-Einsteiger](#samba-konfiguration-für-linux-einsteiger)
  - [Inhaltsverzeichnis](#inhaltsverzeichnis)
  - [Einführung in Samba](#einführung-in-samba)
    - [Wichtige Anwendungsfälle:](#wichtige-anwendungsfälle)
    - [Voraussetzungen:](#voraussetzungen)
  - [Installation von Samba](#installation-von-samba)
    - [1. Paketdatenbank aktualisieren](#1-paketdatenbank-aktualisieren)
    - [2. Samba installieren](#2-samba-installieren)
    - [3. Dienststatus prüfen](#3-dienststatus-prüfen)
  - [Die Konfigurationsdatei smb.conf](#die-konfigurationsdatei-smbconf)
    - [Globale Einstellungen \[global\]](#globale-einstellungen-global)
  - [Freigaben definieren](#freigaben-definieren)
  - [Sonderfälle: Home-Verzeichnisse und Drucker](#sonderfälle-home-verzeichnisse-und-drucker)
    - [1. Nutzer-Home-Verzeichnisse](#1-nutzer-home-verzeichnisse)
    - [2. Druckerfreigabe](#2-druckerfreigabe)
  - [Rechteverwaltung unter Linux](#rechteverwaltung-unter-linux)
    - [````chown````: Besitzer und Gruppe ändern](#chown-besitzer-und-gruppe-ändern)
    - [````chmod````: Zugriffsrechte setzen](#chmod-zugriffsrechte-setzen)
      - [Symbolische Darstellung:](#symbolische-darstellung)
      - [Oktal-Darstellung:](#oktal-darstellung)
      - [Beispiele:](#beispiele)
    - [Gruppenverwaltung](#gruppenverwaltung)
      - [1. Nutzer und Gruppe erstellen:](#1-nutzer-und-gruppe-erstellen)
      - [2. Nutzer einer Gruppe hinzufügen:](#2-nutzer-einer-gruppe-hinzufügen)
      - [3. Gruppe einer Datei/Ordner zuweisen:](#3-gruppe-einer-dateiordner-zuweisen)
      - [4. Gruppe in Samba nutzen:](#4-gruppe-in-samba-nutzen)
  - [Samba-Freigaben in der Praxis](#samba-freigaben-in-der-praxis)
    - [Beispiel 1: Öffentliche Freigabe](#beispiel-1-öffentliche-freigabe)
    - [Beispiel 2: Eingeschränkte Freigabe](#beispiel-2-eingeschränkte-freigabe)
  - [Schritt-für-Schritt: Neue Freigabe erstellen](#schritt-für-schritt-neue-freigabe-erstellen)
  - [Häufige Fehler und Lösungen](#häufige-fehler-und-lösungen)
  - [Wichtige Befehle im Überblick](#wichtige-befehle-im-überblick)
  - [Sicherheitshinweise](#sicherheitshinweise)
  - [Anhang: Spezialrechte (Sticky Bit, SUID, SGID)](#anhang-spezialrechte-sticky-bit-suid-sgid)

---

## Einführung in Samba
**Samba** ist eine Open-Source-Software, die es Linux-Systemen ermöglicht, **Datei- und Druckdienste** für Windows-, macOS- und andere Linux-Clients bereitzustellen. Samba implementiert das **SMB/CIFS-Protokoll** (Server Message Block / Common Internet File System), das in Windows-Netzwerken standardmäßig verwendet wird.

### Wichtige Anwendungsfälle:
- **Dateifreigaben** im lokalen Netzwerk (z. B. für Medien, Dokumente oder Backups).
- **Druckerfreigaben** für Windows-Clients.
- **Zentraler Speicher** für mehrere Nutzer (z. B. in kleinen Büros oder Heimnetzwerken).

### Voraussetzungen:
- Ein **Linux-Server** (z. B. Ubuntu, Debian, Raspberry Pi OS).
- **Root-Zugriff** oder `sudo`-Berechtigungen.
- Grundkenntnisse in der **Linux-Kommandozeile**.

---

## Installation von Samba

### 1. Paketdatenbank aktualisieren
```bash
sudo apt update && sudo apt upgrade -y
```
### 2. Samba installieren
````bash
sudo apt install samba
````
### 3. Dienststatus prüfen
````bash
sudo systemctl status smbd
````

> Erwarteter Output: active (running).
Falls nicht aktiv: sudo systemctl start smbd und sudo systemctl enable smbd.

Zum verlassen ````q```` oder ````strg + c````

## Die Konfigurationsdatei smb.conf
Die zentrale Konfigurationsdatei /etc/samba/smb.conf steuert das Verhalten des Samba-Servers. Sie ist in zwei Hauptbereiche unterteilt:

**[global]**: Globale Einstellungen für den gesamten Server.
**[Freigabename]**: Definition einzelner Freigaben (Ordner, Drucker).
### Globale Einstellungen \[global]
Die globalen Einstellungen gelten für alle Freigaben, sofern sie nicht in einer Freigabe überschrieben werden.
Wichtige Optionen für einen Standalone-Server:
````ini

[global]
   # Netzwerk-Identifikation
   workgroup = WORKGROUP          # Name der Arbeitsgruppe (wie in Windows)
   server string = %h server (Samba, Ubuntu)  # Beschreibung des Servers (%h = Hostname)

   # Netzwerk-Interfaces
   interfaces = 127.0.0.0/8 eth0  # Auf welchen Interfaces soll Samba laufen?
   bind interfaces only = yes     # Nur auf den genannten Interfaces

   # Protokollierung
   log file = /var/log/samba/log.%m  # Log-Datei pro Client (%m = Client-Name)
   max log size = 1000               # Maximale Log-Größe in KB
   logging = file                    # Logs nur in Dateien (nicht syslog)

   # Sicherheit
   server role = standalone server   # Server arbeitet allein (keine Domain)
   map to guest = bad user          # Unbekannte Nutzer werden als "Gast" behandelt
   obey pam restrictions = yes        # Nutzer müssen Linux-PAM-Regeln einhalten
   unix password sync = yes         # Samba-Passwort ändert auch Linux-Passwort
   passwd program = /usr/bin/passwd %u  # Programm zum Ändern des Passworts
   pam password change = yes        # PAM für Passwort-Änderungen nutzen

   # Nutzerfreigaben
   usershare allow guests = yes    # Gäste dürfen auf Nutzerfreigaben zugreifen
````
Hinweise:
````
; oder #:

; = Deaktivierter Vorschlag (kann aktiviert werden).
# = Standardwert (wird auch ohne Angabe genutzt).
````
Platzhalter:
````
%h = Hostname des Servers.
%m = Name des Clients.
%S = Name der aktuellen Freigabe.
````

## Freigaben definieren
Freigaben werden in eigenen Abschnitten definiert, z. B. [Musik] oder [Dokumente]. Jede Freigabe hat einen Namen (erscheint im Netzwerk) und Optionen für Zugriffsrechte.
Grundlegende Optionen:
|Option        |Bedeutung                                                               |Beispiel                  |
|--------------|------------------------------------------------------------------------|--------------------------|
|comment       |Beschreibung der Freigabe (erscheint im Explorer).                      |comment = Medienarchiv    |
|path          |Pfad zum freigegebenen Ordner.                                          |path = /srv/samba/musik   |
|browseable    |yes: Freigabe ist im Netzwerk sichtbar. no: Nur mit direktem Pfad.      |browseable = yes          |
|read only     |yes: Nur Lesezugriff. no: Schreibzugriff erlaubt.                       |read only = no            |
|guest ok      |yes: Gäste (ohne Passwort) dürfen zugreifen.                            |guest ok = yes            |
|valid users   |Liste der Nutzer/Gruppen, die überhaupt zugreifen dürfen.               |valid users = @mitarbeiter|
|write list    |Liste der Nutzer/Gruppen, die schreiben dürfen (überschreibt read only).|write list = @teamleitung |
|create mask   |Berechtigungen für neue Dateien (oktal).                                |create mask = 0664        |
|directory mask|Berechtigungen für neue Ordner (oktal).                                 |directory mask = 0775     |
|force group   |Neue Dateien/Ordner gehören automatisch zu dieser Gruppe.               |force group = mitarbeiter |

## Sonderfälle: Home-Verzeichnisse und Drucker
### 1. Nutzer-Home-Verzeichnisse
Jeder Nutzer kann automatisch auf sein eigenes Home-Verzeichnis zugreifen:
````ini

[homes]
   comment = Persönlicher Ordner
   browseable = no       # Nur der eigene Nutzer sieht die Freigabe
   read only = no        # Nutzer darf schreiben
   valid users = %S      # %S = aktueller Nutzer (z. B. "felix")
   create mask = 0700    # Neue Dateien: rwx------
   directory mask = 0700 # Neue Ordner: rwx------
````
### 2. Druckerfreigabe
Samba kann Drucker für Windows-Clients freigeben:
````ini 

[printers]
   comment = Alle Drucker
   path = /var/spool/samba  # Spoolfolder für Druckaufträge
   browseable = no          # Drucker sind nicht im Explorer sichtbar
   printable = yes          # Erlaubt Druckaufträge
   guest ok = no            # Nur authentifizierte Nutzer dürfen drucken

[print\$]
   comment = Druckertreiber
   path = /var/lib/samba/printers
   browseable = yes
   read only = yes
   guest ok = no
   write list = root, @lpadmin  # Nur Admins dürfen Treiber hochladen
````


## Rechteverwaltung unter Linux
Die korrekte Vergabe von Datei- und Ordnerrechten ist essenziell für die Sicherheit und Funktionalität von Samba-Freigaben.
### ````chown````: Besitzer und Gruppe ändern
Jede Datei/Ordner gehört einem **Besitzer (User)** und einer **Gruppe (Group)**.
Syntax:
````bash
sudo chown [BESITZER]:[GRUPPE] [DATEI/ORDNER]
````
Beispiele:
|Befehl| Wirkung|
|-|-|
|sudo chown felix:mitarbeiter /srv/samba|Besitzer: felix, Gruppe: mitarbeiter.                                 |
|sudo chown :mitarbeiter /srv/samba|Ändert nur die Gruppe auf mitarbeiter.                                  |
|sudo chown -R nobody:mitarbeiter /srv/samba|Rekursiv: Besitzer: nobody, Gruppe: mitarbeiter für alle Unterordner/Dateien.|



Hinweise:

**sudo** ist erforderlich, wenn Sie nicht der Besitzer sind.
**-R** (rekursiv): Wendet die Änderung auf alle Unterordner/Dateien an.
**Samba-Empfehlung**: Für Freigaben oft nobody oder root als Besitzer und eine **spezifische Gruppe** (z. B. mitarbeiter) verwenden.

### ````chmod````: Zugriffsrechte setzen
Die Zugriffsrechte werden für **drei Kategorien** von Nutzern definiert:

**Besitzer (User)**: Der Nutzer, dem die Datei/der Ordner gehört.
**Gruppe (Group)**: Die Gruppe, der die Datei/der Ordner zugeordnet ist.
**Andere (Others)**: Alle anderen Nutzer.

Jede Kategorie kann drei Rechte haben:

````r```` **(Read)**: Lesen.
````w```` **(Write)**: Schreiben.
````x```` **(Execute)**: Ausführen (bei Ordnern: Betreten).
#### Symbolische Darstellung:
````
rwx r-x r--
│   │   │
│   │   └─ Andere (Others): Lesen (r), kein Schreiben (–), kein Ausführen (–)
│   └───── Gruppe (Group): Lesen (r), kein Schreiben (–), Ausführen (x)
└───────── Besitzer (User): Lesen (r), Schreiben (w), Ausführen (x)
````
#### Oktal-Darstellung:
Jedes Recht wird durch eine **Zahl** repräsentiert:

````r```` = 4
````w```` = 2
````x```` = 1
Die Rechte für jede Kategorie werden **addiert**:

|Rechte|Oktal-Wert|Bedeutung            |
|------|----------|---------------------|
|````---````   |0         |Keine Rechte         |
|````--x````   |1         |Nur Ausführen        |
|````-w-````   |2         |Nur Schreiben        |
|````-wx````   |3         |Schreiben + Ausführen|
|````r--````   |4         |Nur Lesen            |
|````r-x````   |5         |Lesen + Ausführen    |
|````rw-````   |6         |Lesen + Schreiben    |
|````rwx````   |7         |Vollzugriff          |


Die Oktal-Modi für alle drei Kategorien werden kombiniert:

* ````755```` = ````rwxr-xr-x```` (Besitzer: Vollzugriff, Gruppe/Andere: Lesen + Ausführen)
* ````644```` = ````rw-r--r--```` (Besitzer: Lesen + Schreiben, Gruppe/Andere: Nur Lesen)
* ````770```` = ````rwxrwx---```` (Besitzer/Gruppe: Vollzugriff, Andere: Keine Rechte)
  
Syntax von chmod:
````bash
sudo chmod [OPTIONEN] [RECHTE] [DATEI/ORDNER]
````

* ````RECHTE````: Symbolisch (z. B. ````u=rwx,g=rx,o=rx````) oder oktal (z. B. ````755````).
* ````OPTIONEN````:

  * ````-R````: Rekursiv (für alle Unterordner/Dateien).

#### Beispiele:
|Befehl                      |Wirkung                                      |
|----------------------------|---------------------------------------------|
|sudo chmod 755 /srv/samba   |Besitzer: rwx, Gruppe/Andere: r-x.           |
|sudo chmod 644 datei.txt    |Besitzer: rw-, Gruppe/Andere: r--.           |
|sudo chmod -R 770 /srv/samba|Rekursiv: Besitzer/Gruppe: rwx, Andere: ---. |
|sudo chmod u+x skript.sh    |Fügt dem Besitzer das Ausführrecht (x) hinzu.|
|sudo chmod g-w /srv/samba   |Entfernt das Schreibrecht für die Gruppe.    |


Samba-spezifische Empfehlungen:

**Freigabe-Ordner:**

* ````775```` ````(rwxrwxr-x)````: Besitzer und Gruppe haben Vollzugriff, Andere dürfen lesen und Ordner betreten.
* ````770```` ````(rwxrwx---)````: Nur Besitzer und Gruppe haben Zugriff (empfohlen für sensible Daten).

**Dateien in Freigaben:**

* ````664```` ````(rw-rw-r--)````: Besitzer und Gruppe dürfen lesen/schreiben, Andere nur lesen.
* ````660```` ````(rw-rw----)````: Nur Besitzer und Gruppe dürfen lesen/schreiben.


### Gruppenverwaltung
Gruppen ermöglichen die zentrale Steuerung von Zugriffsrechten für mehrere Nutzer.
#### 1. Nutzer und Gruppe erstellen:
````bash
sudo adduser felix
sudo addgroup mitarbeiter
````
#### 2. Nutzer einer Gruppe hinzufügen:
````bash

sudo usermod -aG mitarbeiter felix  # Fügt "felix" der Gruppe "mitarbeiter" hinzu.
````

**````-aG````**: ````-a```` (append) stellt sicher, dass der Nutzer nicht aus anderen Gruppen entfernt wird.
#### 3. Gruppe einer Datei/Ordner zuweisen:
````bash

sudo chown \:mitarbeiter /srv/samba/dokumente  # Setzt die Gruppe auf "mitarbeiter".
sudo chmod 770 /srv/samba/dokumente           # Gruppe erhält Vollzugriff.
````
#### 4. Gruppe in Samba nutzen:
````ini

[Dokumente]
   path = /srv/samba/dokumente
   valid users = @mitarbeiter      # Nur Nutzer der Gruppe "mitarbeiter" dürfen zugreifen.
   write list = @teamleitung       # Nur Gruppe "teamleitung" darf schreiben.
   force group = mitarbeiter       # Neue Dateien/Ordner gehören automatisch zur Gruppe "mitarbeiter".
````

## Samba-Freigaben in der Praxis
### Beispiel 1: Öffentliche Freigabe
Anwendungsfall: Medienfreigabe für alle Nutzer im Netzwerk (z. B. Musik, Filme).
**Schritt 1: Ordner erstellen und Rechte setzen**
````bash
sudo mkdir -p /srv/samba/medien
sudo chown nobody\:nogroup /srv/samba/medien  # Besitzer: "nobody", Gruppe: "nogroup"
sudo chmod 777 /srv/samba/medien              # Temporär volle Rechte (für Test)
````
**Schritt 2: Freigabe in smb.conf definieren**
````ini
[Medien]
   comment = öffentliche Medienfreigabe
   path = /srv/samba/medien
   browseable = yes
   read only = no
   guest ok = yes
````
**Schritt 3: Samba neu starten**
````bash
sudo systemctl restart smbd
````
**Schritt 4: Von Windows aus testen**
> Im Explorer: \\<IP-des-Servers>\Medien eingeben.

### Beispiel 2: Eingeschränkte Freigabe
Anwendungsfall: Vertrauliche Dokumente für bestimmte Nutzer/Gruppen.
**Schritt 1: Gruppe und Nutzer anlegen**
````bash
sudo adduser felix
sudo adduser hans
sudo addgroup mitarbeiter
sudo addgroup teamleitung
sudo usermod -aG mitarbeiter felix
sudo usermod -aG mitarbeiter hans
sudo usermod -aG teamleitung felix
````
**Schritt 2: Ordner erstellen und Rechte setzen**
````bash
sudo mkdir -p /srv/samba/dokumente
sudo chown nobody:mitarbeiter /srv/samba/dokumente
sudo chmod 770 /srv/samba/dokumente
````
**Schritt 3: Freigabe in smb.conf definieren**
````ini
[Dokumente]
   comment = Vertrauliche Dokumente
   path = /srv/samba/dokumente
   browseable = yes
   read only = no
   guest ok = no
   valid users = @mitarbeiter      # Nur Gruppe "mitarbeiter" darf zugreifen
   write list = @teamleitung      # Nur Gruppe "teamleitung" darf schreiben
   force group = mitarbeiter      # Neue Dateien/Ordner gehören zur Gruppe "mitarbeiter"
   force create mode = 0660        # Neue Dateien: rw-rw----
   force directory mode = 0770     # Neue Ordner: rwxrwx---
````
**Schritt 4: Nutzer zu Samba hinzufügen**
````bash
sudo smbpasswd -a felix
sudo smbpasswd -a hans
````
**Schritt 5: Samba neu starten**
````bash
sudo systemctl restart smbd
````

## Schritt-für-Schritt: Neue Freigabe erstellen


**1. Ordner anlegen:**
````bash
sudo mkdir -p /srv/samba/neue_freigabe
````


**2. Besitzer und Gruppe setzen:**
````bash
sudo chown nobody\:mitarbeiter /srv/samba/neue_freigabe
````

**3. Rechte setzen:**
````bash

sudo chmod 770 /srv/samba/neue_freigabe
````

**4. Freigabe in /etc/samba/smb.conf definieren:**
````ini

[NeueFreigabe]
   comment = Beschreibung der Freigabe
   path = /srv/samba/neue_freigabe
   browseable = yes
   read only = no
   guest ok = no
   valid users = @mitarbeiter
   write list = @teamleitung
````
**5. Konfiguration testen:**
````bash

sudo samba-tool testparm
````

**6. Samba neu starten:**
````bash

sudo systemctl restart smbd
````


## Häufige Fehler und Lösungen
|Problem                             |Ursache                                               |Lösung                                                                |
|------------------------------------|------------------------------------------------------|----------------------------------------------------------------------|
|Freigabe nicht sichtbar             |browseable = no oder Firewall blockiert Samba.        |browseable = yes setzen oder Firewall prüfen (sudo ufw allow samba).  |
|Zugriff verweigert                  |Nutzer nicht in smbpasswd oder falsche Rechte.        |sudo smbpasswd -a nutzername ausführen. Rechte mit chmod/chown prüfen.|
|Dateien können nicht gelöscht werden|Nutzer ist nicht Besitzer und hat keine Schreibrechte.|chmod g+w oder chown anpassen.                                        |
|Gruppe wird nicht übernommen        |force group fehlt in smb.conf.                        |force group = gruppenname ergänzen.                                   |
|Neue Dateien haben falsche Rechte   |force create mode/force directory mode fehlt.         |force create mode = 0660 und force directory mode = 0770 setzen.      |



## Wichtige Befehle im Überblick
|Befehl                                 |Beschreibung                                         |
|---------------------------------------|-----------------------------------------------------|
|````sudo apt install samba````                 |Samba installieren.                                  |
|````sudo systemctl restart smbd````            |Samba-Dienst neu starten.                            |
|````sudo samba-tool testparm ````                         |Konfiguration auf Fehler prüfen.                     |
|````sudo smbpasswd -a nutzername````           |Nutzer zu Samba hinzufügen.                          |
|````sudo chown besitzer:gruppe pfad````        |Besitzer und Gruppe einer Datei/eines Ordners ändern.|
|````sudo chmod 755 pfad````                    |Rechte auf rwxr-xr-x setzen.                         |
|````sudo chmod -R 770 pfad````                 |Rechte rekursiv auf rwxrwx--- setzen.                |
|````sudo adduser nutzername````                |Benutzer erstellen. |
|````sudo addgroup gruppenname````              |Gruppe erstellen.                                    |
|````sudo usermod -aG gruppenname nutzername````|Nutzer einer Gruppe hinzufügen.                      |
|````smbclient -L //localhost -U %````          |Freigegebene Ordner/Drucker auflisten (lokal).       |

## Sicherheitshinweise

**Minimale Rechte vergeben:**
* Vermeiden Sie ````chmod 777````. Nutzen Sie stattdessen ````770```` oder ````750````.

**Keine Gastzugriffe für sensible Daten:**

* Setzen Sie ````guest ok = no```` für vertrauliche Freigaben.

**Regelmäßige Backups:**

* Sichern Sie die ````smb.conf```` und wichtige Freigabe-Ordner.

**Firewall konfigurieren:**
````bash

sudo ufw allow samba  # Erlaubt Samba-Ports (139, 445).
````

Logs prüfen:

Fehler finden Sie in /var/log/samba/log.%m.


## Anhang: Spezialrechte (Sticky Bit, SUID, SGID)
Für fortgeschrittene Anwendungsfälle können Spezialrechte gesetzt werden:

|Recht     |Oktal|Symbolisch|Wirkung                                                                               |
|----------|-----|----------|--------------------------------------------------------------------------------------|
|Sticky Bit|1    |t         |Nur der Besitzer darf Dateien in einem Ordner löschen (z. B. ````/tmp````).                   |
|SUID      |4    |s         |Führt eine Datei mit den Rechten des **Besitzers** aus (z. B. ````passwd````).                    |
|SGID      |2    |s         |Neue Dateien/Ordner erben die **Gruppe** des Elternordners (nützlich für Samba-Freigaben).|

**Beispiele:**

|Befehl                           |Wirkung                                                            |
|---------------------------------|-------------------------------------------------------------------|
|````sudo chmod 1777 /tmp````             |Setzt das **Sticky Bit** (nur Besitzer darf Dateien löschen).          |
|````sudo chmod 2775 /srv/samba````       |Setzt **SGID**: Neue Dateien/Ordner erben die Gruppe des Elternordners.|
|````sudo chmod 4755 /usr/bin/programm````|Setzt **SUID**: Programm läuft mit Rechten des Besitzers.              |


**Samba-spezifische Nutzung:**
* **SGID** ist nützlich, um sicherzustellen, dass neue Dateien/Ordner in einer Freigabe automatisch der richtigen Gruppe gehören:
````bash

sudo chmod 2770 /srv/samba/dokumente  # SGID + Besitzer/Gruppe: rwx
````

