/etc ist das Herz der systemweiten Konfiguration unter Linux — alle Einstellungen für Dienste, Distributionen und installierte Software liegen hier, fast ausschließlich als Textdateien. Das macht das System per SSH administrierbar, in Git versionierbar, mit grep durchsuchbar und mit diff vergleichbar. Pro Programm meist ein Unterordner (/etc/ssh/, /etc/nginx/, /etc/postgresql/); Drop-In-Verzeichnisse mit *.d-Suffix trennen Distributions-Defaults sauber von lokalen Überschreibungen.
Was ist /etc?
/etc enthält die statische, systemweite Konfiguration des Linux-Systems — und nichts anderes. Der FHS-Standard (3.0, Kapitel 3.7) schreibt zwei Kerneigenschaften fest:
/etcenthält Konfigurationsdateien, keine ausführbaren Binaries und keine variablen Daten (die gehören in/var).- Die Konfiguration gilt für das gesamte System, nicht für einzelne Nutzer (User-spezifische Konfiguration lebt in
~/.config/und Co.).
Die Bedeutung des Namens ist historisch: ursprünglich „etcetera" — also „und so weiter", weil dort alles abgelegt wurde, was nirgendwo anders hinpasste. Eric S. Raymond und andere haben den Begriff später als „Editable Text Configuration" rückwirkend gedeutet, was die heutige Verwendung eher trifft.
Wichtig zur Abgrenzung:
Gehört nach /etc? | Ja | Nein |
|---|---|---|
| Konfigurationsdatei eines Service | ✅ z. B. /etc/nginx/nginx.conf | |
| Standard-Werte einer Anwendung | ✅ pro Paket | |
| Authentifizierungs-Datenbank | ✅ /etc/passwd, /etc/shadow | |
| Hostname und Netzwerk-Basics | ✅ /etc/hostname, /etc/hosts | |
| Logfiles, Caches, Datenbanken | ❌ → /var | |
| Ausführbare Programme | ❌ → /bin, /usr/bin | |
| User-spezifische Config | ❌ → ~/.config/, ~/.bashrc | |
| Bibliotheken und Header-Files | ❌ → /usr/lib, /usr/include |
Eine kleine Ausnahme von der Regel „nichts ausführbares": /etc/init.d/-Skripte auf Legacy-SysV-Systemen sowie /etc/rc.local waren ausführbar. Auf modernen systemd-Distributionen sind diese weitgehend obsolet — Service-Definitionen liegen in /etc/systemd/system/ als reine Text-Unit-Files.
Die wichtigsten Dateien und Verzeichnisse
In jedem produktiven Linux-System findest du dieselben Kern-Dateien — sie gehören zur Grundausstattung praktisch jeder Distribution:
| Datei / Verzeichnis | Zweck |
|---|---|
/etc/passwd | User-Datenbank (UID, GID, Home, Shell — Passwörter heute in /etc/shadow) |
/etc/shadow | Gehashte Passwörter, nur für root lesbar |
/etc/group | Gruppen-Datenbank |
/etc/sudoers (+ /etc/sudoers.d/) | Wer darf via sudo was — nur per visudo editieren |
/etc/hostname | Rechnername des Systems |
/etc/hosts | Lokale Hostname-zu-IP-Auflösung (vor DNS) |
/etc/resolv.conf | DNS-Server (auf systemd meist Symlink auf systemd-resolved) |
/etc/fstab | Mount-Punkte und ihre Optionen beim Boot |
/etc/crontab (+ /etc/cron.*/) | System-weite Cron-Jobs |
/etc/ssh/sshd_config | SSH-Server-Konfiguration |
/etc/systemd/system/ | Lokale Service-Units (überschreiben /lib/systemd/system/) |
/etc/network/, /etc/netplan/ | Netzwerk-Konfiguration (Distributions-spezifisch) |
/etc/apt/, /etc/dnf/, /etc/pacman.conf | Paketmanager-Konfiguration |
/etc/timezone | System-Zeitzone (oft Symlink in /etc/localtime) |
/etc/os-release | Distributions-Metadaten (Name, Version, ID) |
/etc/profile (+ /etc/profile.d/) | Shell-Initialisierung für alle Login-Shells |
Programmspezifische Einstellungen leben fast immer in eigenen Unterverzeichnissen — /etc/nginx/, /etc/postgresql/<version>/, /etc/apache2/, /etc/mysql/, /etc/redis/. Das vermeidet Namens-Kollisionen und macht das Backup einer einzelnen Anwendung einfacher.
# Distribution und Version
cat /etc/os-release
# NAME="Ubuntu"
# VERSION="24.04 LTS (Noble Numbat)"
# ID=ubuntu
# Hostname
cat /etc/hostname
# myserver
# Eigene User
getent passwd michael
# michael:x:1000:1000:Michael Belokon,,,:/home/michael:/bin/bash
# SSH-Port und PermitRootLogin auf einen Blick
grep -E '^(Port|PermitRootLogin)' /etc/ssh/sshd_configDrop-In-Pattern: *.d-Verzeichnisse für saubere Anpassungen
Eine der wichtigsten Konventionen unter /etc: für viele Konfigurationen existiert nicht nur eine Hauptdatei, sondern parallel ein Drop-In-Verzeichnis mit .d-Suffix. Beispiele: /etc/sudoers.d/, /etc/cron.d/, /etc/systemd/system/<unit>.d/, /etc/apt/sources.list.d/, /etc/profile.d/, /etc/sysctl.d/.
Die Idee dahinter ist konsistent in allen Fällen:
- Die Distribution liefert ihre Defaults in der Hauptdatei (
/etc/sudoers) oder in eigenen Distributions-Drop-Ins. - Lokale Anpassungen kommen als separate Datei in das
.d-Verzeichnis (/etc/sudoers.d/myadmin). - Beim Start liest das Programm zuerst die Hauptdatei und dann alle Dateien aus dem Drop-In-Verzeichnis (alphabetisch sortiert), wobei spätere Werte frühere überschreiben können.
Vorteile dieses Patterns:
- Paket-Updates überschreiben deine Anpassungen nicht. Die Hauptdatei kann vom Paketmanager aktualisiert werden, deine Drop-Ins bleiben unangetastet.
- Modulare Konfiguration. Jede logische Einheit bekommt ihre eigene Datei (
10-base.conf,20-network.conf,90-overrides.conf). - Sauberes Diff und Rollback. Anpassungen lassen sich einzeln versionieren oder löschen.
# FALSCH: direkt in /etc/sudoers schreiben
# → Update-Konflikte beim nächsten apt-Lauf
# RICHTIG: eigene Datei in /etc/sudoers.d/
sudo visudo -f /etc/sudoers.d/admin-bypass
# Inhalt:
# michael ALL=(ALL:ALL) NOPASSWD: /usr/bin/systemctl restart nginx
# Drop-Ins werden automatisch geladen — die Datei muss
# 0440-Berechtigungen haben (visudo setzt das richtig).
ls -la /etc/sudoers.d/# Drop-In-Editor (legt /etc/systemd/system/nginx.service.d/override.conf an)
sudo systemctl edit nginx
# Nach dem Speichern:
sudo systemctl daemon-reload
sudo systemctl restart nginx
# Prüfen, was effektiv gilt
systemctl cat nginx
# /lib/systemd/system/nginx.service ← Distribution
# /etc/systemd/system/nginx.service.d/override.conf ← Drop-InBerechtigungen, Eigentümer und Sicherheit
/etc selbst gehört root und ist 0755 (rwx für root, read+execute für alle). Die Mehrheit der Dateien darunter ebenfalls 0644 und root:root — sie sollen für alle lesbar sein, weil viele Programme als normale User auf System-Konfiguration zugreifen müssen (etwa passwd für die UID-Auflösung).
Ausnahmen mit eingeschränkten Rechten:
| Datei | Berechtigungen | Begründung |
|---|---|---|
/etc/shadow | 0640 root:shadow | Enthält Passwort-Hashes — nur root und Mitglieder der shadow-Gruppe |
/etc/sudoers | 0440 root:root | Schon Lesen außer durch root öffnet Privilege-Escalation-Vektoren |
/etc/sudoers.d/* | 0440 root:root | Gleiches gilt für jede Drop-In-Datei |
/etc/ssh/ssh_host_*_key | 0600 root:root | Private SSH-Server-Schlüssel |
/etc/cron.d/* | 0644 root:root, kein +x | Werden von cron geparst, nicht ausgeführt |
Praktischer Sicherheits-Check: regelmäßig mit find /etc -type f -perm -o+w prüfen, ob fälschlich world-writable Dateien existieren. Das ist ein klassischer Privilege-Escalation-Vektor — sobald irgendein Service dort als root parst, kann ein normaler User Code injizieren.
# World-writable Dateien (sollte leer sein)
find /etc -type f -perm -o+w 2>/dev/null
# SUID-Programme (in /etc sehr ungewöhnlich)
find /etc -type f -perm -4000 2>/dev/null
# Dateien, deren Owner NICHT root ist
find /etc ! -user root 2>/dev/null
# Was hat sich seit letztem Backup geändert?
sudo apt install debsums
sudo debsums -ce /etc 2>/dev/nullBackup, Versionskontrolle und etckeeper
Weil /etc fast komplett aus Textdateien besteht, ist es prädestiniert für Versionskontrolle. Das gibt dir einen Audit-Trail über alle Änderungen — egal ob du sie selbst gemacht hast oder sie durch ein Paket-Update entstanden sind.
Das Standard-Werkzeug dafür ist etckeeper — ein Wrapper um Git, Mercurial oder Bazaar, der speziell für /etc ausgelegt ist:
sudo apt install etckeeper
# Bei der Installation wird /etc automatisch initialisiert
cd /etc
sudo git log --oneline | head -10
# 5a8f2e3 saving uncommitted changes in /etc prior to apt run
# b3c1d04 committing changes in /etc after apt run
# ...
# etckeeper hooks in apt — automatischer Commit vor und nach
# jedem apt-Lauf, mit Diff der getroffenen Änderungen.Was etckeeper konkret macht:
- Initialisiert ein Git-Repo direkt in
/etc/.git. - Konfiguriert die Berechtigungen so, dass das Repo nur für root lesbar ist (Schutz vor Schlüssel-Leaks).
- Hängt sich in den Paketmanager ein und committed automatisch vor und nach jedem Update.
- Lässt sich manuell ergänzen:
sudo etckeeper commit "sudoers angepasst".
Alternativen: ein eigenes Git-Repo per Hand pflegen, Snapshots auf Filesystem-Ebene (Btrfs, ZFS) oder Configuration-Management-Tools wie Ansible, Puppet oder Salt — letztere lösen das Problem auf der nächsthöheren Abstraktionsebene, indem sie /etc aus zentralen Definitionen erzeugen statt es direkt zu versionieren.
Praxis-Befehle für /etc
Ein paar Standard-Werkzeuge zur Inspektion und Wartung:
# Wieviel Platz verbraucht /etc?
du -sh /etc
# 12M /etc
# Größte Dateien
sudo du -ah /etc | sort -hr | head -20
# Anzahl Dateien
sudo find /etc -type f | wc -l
# ca. 2000–5000 auf einem Desktop-System
# Alle veränderten Konfigurationsdateien (Debian)
sudo dpkg --verify | grep '^..5' | head# Debian/Ubuntu
dpkg -S /etc/ssh/sshd_config
# openssh-server: /etc/ssh/sshd_config
# Fedora/RHEL
rpm -qf /etc/ssh/sshd_config
# openssh-server-9.8p1-1.fc41.x86_64
# Arch
pacman -Qo /etc/ssh/sshd_config
# /etc/ssh/sshd_config is owned by openssh 9.8p1-1# Debian/Ubuntu: alle modifizierten Conffiles auflisten
dpkg-query -W -f='${Conffiles}\n' '*' \
| awk 'OFS=" " {print $2,$1}' \
| md5sum -c 2>/dev/null \
| awk -F': ' '$2 !~ /OK$/{print $1}'Interessantes
Niemals /etc/passwd direkt editieren — visudo, vipw, vigr nutzen
Die Tools vipw, vigr und visudo sperren die jeweilige Datei während der Bearbeitung und prüfen vor dem Speichern auf Syntax-Fehler. Direktes Editieren mit vim /etc/passwd riskiert ein gleichzeitiges Schreiben durch andere Prozesse (Race-Condition) — und ein Syntax-Fehler in /etc/sudoers sperrt dich aus dem System aus, bis du dich physisch oder per Recovery anmeldest.
Drop-Ins werden alphabetisch geladen — nutze 2-stellige Präfixe
Wenn die Reihenfolge wichtig ist (z. B. bei sysctl oder profile.d), verwendet die Konvention 2-stellige Präfixe: 10-base.conf, 30-network.conf, 90-local.conf. Spätere Dateien überschreiben Werte aus früheren. So bleibt klar, in welcher Reihenfolge gelesen wird, und neue Dateien lassen sich leicht zwischen bestehenden einfügen.
resolv.conf wird auf systemd-Systemen automatisch verwaltet
Auf modernen Distributionen ist /etc/resolv.conf meist ein Symlink auf eine von systemd-resolved verwaltete Datei. Manuelle Änderungen werden bei der nächsten Aktualisierung überschrieben. Die richtige Stelle für Änderungen ist /etc/systemd/resolved.conf oder die NetworkManager-Konfiguration — je nachdem, wer die Verwaltung übernimmt.
Konfigurationsdateien sind UTF-8 — aber Vorsicht mit BOM
Linux-Programme erwarten UTF-8 ohne BOM (Byte Order Mark). Editoren auf Windows fügen gelegentlich ein BOM ein, das viele Parser nicht verstehen — Apache, sshd, sudo verweigern dann den Start mit kryptischen Fehlern. Mit file /etc/datei.conf oder head -c 3 /etc/datei.conf | xxd lässt sich das BOM erkennen.
/etc gehört in dein Backup, /etc/.git nur mit Bedacht
Beim Backup von /etc schließe explizit das Git-Repo (/etc/.git) entweder ein oder aus, je nach Strategie — keine Mischung. Wenn du es einschließt, hast du die volle Historie, brauchst aber Zugriff auf das Repo. Sonst sicherst du nur den aktuellen Stand. Außerdem enthält /etc/shadow Hashes — Backups sollten verschlüsselt liegen.
config.d-Snippets sind nicht der einzige Mechanismus
Manche Programme nutzen alternative Patterns: nginx hat include /etc/nginx/conf.d/*.conf, sshd unterstützt Include /etc/ssh/sshd_config.d/*.conf (seit OpenSSH 8.2), Apache nutzt IncludeOptional. Schau immer in die Hauptkonfiguration, um zu sehen, ob und wie ein Programm Drop-Ins einliest — die Konvention ist verbreitet, aber nicht universell.
Weiterführende Ressourcen
Externe Quellen
- Filesystem Hierarchy Standard 3.0 — /etc
- etckeeper auf joeyh.name
- systemd: Drop-In-Konfiguration
- Linux man-pages: hier(7) — Verzeichnisstruktur
- Linux Foundation: LSB — Konfigurationskonventionen