
🌐 Auch auf: English · Français · Español
⚠️ Achtung, lieber Mensch (oder Bot):
Dieser Beitrag ist derzeit veraltet und reif für eine gründliche Überarbeitung.
Manche Teile sind womöglich nicht mehr korrekt, vollständig oder auf dem aktuellen Stand der Technik.
Eine komplett aktualisierte und ausführlichere Version ist bald™ unterwegs.
TL;DR: Lesen auf eigenes Nerd-Risiko — keine Gewährleistung, keine Garantie, nur Vibes. 🤓
Apache mit AppArmor unter Debian 12 zu betreiben, muss kein Chaos sein. Vergiss mod_apparmor, vergiss „Hats“ und lass das Kaninchenloch der dynamischen Module links liegen. Wir sichern unseren Webserver mit einem einfachen, wartbaren statischen AppArmor-Profil ab — und zwar im Nerd-Stil.
🛡️ Was ist AppArmor und warum sollte es dich interessieren?
AppArmor ist ein Linux-Sicherheitsmodul, das einschränkt, worauf einzelne Anwendungen zugreifen dürfen — Dateien, Sockets, Systemressourcen. Die Zugriffsregeln werden in Profilen pro Programm festgelegt. Versucht ein Prozess etwas, das er nicht darf, kann AppArmor es protokollieren oder blockieren. Das begrenzt die Folgen von Exploits und Fehlern. Selbst wenn Apache kompromittiert wird, kann er zum Beispiel nichts außerhalb seiner festgelegten Verzeichnisse lesen oder schreiben. AppArmor ist schlank, leichter zu verwalten als SELinux und wie gemacht für abgeschottete Linux-Server.
🎯 Ziel
- ✅ Kein
mod_apparmor - ✅ Keine VirtualHost-„Hats“
- ✅ Einfach ein schlichtes, statisches AppArmor-Profil
- ✅ Apache mit Nextcloud unter
/var/www/html/nextcloud - ✅ Datenablage unter
/data - ✅ PHP-FPM über
/run/php/php8.2-fpm.sock
🧩 Das AppArmor-Profil
Lege diese Datei hier ab:
/etc/apparmor.d/usr.sbin.apache2
# AppArmor profile for Apache
#include <tunables/global>
profile /usr/sbin/apache2 {
# Apache binary and required libraries
/usr/sbin/apache2 mr,
/lib/** mr,
/lib64/** mr,
/usr/lib/** mr,
# Apache configuration
/etc/apache2/** r,
# Web root (Nextcloud)
/var/www/html/nextcloud/** r,
# Nextcloud data directory
/data/** rw,
# PHP-FPM socket communication
/run/php/php8.2-fpm.sock rw,
# Logging
/var/log/apache2/ rw,
/var/log/apache2/** rwk,
# Required capabilities
capability net_bind_service,
capability setuid,
capability setgid,
# OpenSSL configuration
/etc/ssl/openssl.cnf r,
# Stream socket access
network inet stream,
network inet6 stream,
network unix stream,
# System configuration files
/etc/ld.so.cache r,
/etc/gai.conf r,
/etc/nsswitch.conf r,
/etc/passwd r,
/etc/group r,
# Datagram and raw network sockets
network inet dgram,
network inet6 dgram,
network netlink raw,
network unix dgram,
# DNS and hostname resolution
/etc/host.conf r,
/etc/hosts r,
/run/systemd/resolve/resolv.conf r,
# Timezone data
/usr/share/zoneinfo/Etc/UTC r,
/usr/share/zoneinfo/Europe/Berlin r,
# IPv6 configuration
/proc/sys/net/ipv6/conf/all/disable_ipv6 r,
# Random and zero devices
/dev/urandom r,
/dev/zero rw,
/dev/null rw,
# Shared memory
/dev/shm/** rwk,
# SSL certificates (Let's Encrypt)
/etc/letsencrypt/archive/nextcloud.example.com/fullchain1.pem r,
/etc/letsencrypt/archive/nextcloud.example.com/privkey1.pem r,
/etc/letsencrypt/live/nextcloud.example.com/fullchain.pem r,
/etc/letsencrypt/live/nextcloud.example.com/privkey.pem r,
/etc/letsencrypt/** r,
# Diffie-Hellman parameters
/etc/ssl/certs/dhparam.pem r,
# MIME type detection
/etc/mime.types r,
# Kernel configuration access
/proc/sys/kernel/ngroups_max r,
# Apache runtime PID directory
/run/apache2/** rwk,
# Allow signaling systemd (for notify/reload etc.)
signal peer=unconfined,
signal (receive) peer=/lib/systemd/systemd,
}
🔎 Tipp: Das Profil läuft im complain-Modus und protokolliert Verstöße nur, statt sie durchzusetzen. Schalte auf enforce um, sobald du sicher bist, dass alles funktioniert.
sudo aa-enforce /etc/apparmor.d/usr.sbin.apache2🔧 Ausrollen mit Ansible
Wenn du Ansible nutzt, kannst du das Profil so ausrollen (vorausgesetzt, die Datei liegt unter files/usr.sbin.apache2):
- name: Upload AppArmor profile for Apache
copy:
src: files/usr.sbin.apache2
dest: /etc/apparmor.d/usr.sbin.apache2
owner: root
group: root
mode: '0644'
- name: Reload AppArmor profile
command: apparmor_parser -r /etc/apparmor.d/usr.sbin.apache2
notify: Restart Apache
Und vergiss den Handler nicht:
- name: Restart Apache
service:
name: apache2
state: restarted📋 AppArmor-Spickzettel
Du willst eine schnelle Referenz für die AppArmor-Verwaltung? Hier ist eine praktische Liste gängiger Befehle zum Untersuchen, Verwalten und Debuggen von AppArmor auf Debian-basierten Systemen.
🔍 STATUS & INFO sudo aa-status # Show loaded profiles and their mode (enforce/complain) sudo apparmor_status # Same as above (older syntax, still valid) 🪵 VIEW LOGS sudo journalctl -k | grep -i apparmor # Kernel-level logs for AppArmor denials sudo dmesg | grep -i apparmor # Alternative way to see recent denials 📦 INSTALL APPARMOR TOOLS sudo apt install apparmor-utils # Installs tools like aa-enforce, aa-complain, etc. ⚙️ PROFILE MANAGEMENT sudo aa-enforce /etc/apparmor.d/PROFILE # Enforce mode: block everything not explicitly allowed sudo aa-complain /etc/apparmor.d/PROFILE # Complain mode: only log violations, don’t block sudo aa-disable /etc/apparmor.d/PROFILE # Disable a profile completely sudo apparmor_parser -r /etc/apparmor.d/PROFILE # Reload a profile after editing 🔁 TEMPORARILY DISABLE APPARMOR (until reboot) sudo systemctl stop apparmor # Stops AppArmor service — disables all active profiles 🔒 ENABLE APPARMOR sudo systemctl start apparmor # Starts AppArmor and loads profiles sudo systemctl restart apparmor # Reloads all profiles 🚫 PERMANENTLY DISABLE APPARMOR (via GRUB) sudo nano /etc/default/grub # Add: GRUB_CMDLINE_LINUX_DEFAULT="quiet splash apparmor=0" sudo update-grub sudo reboot # AppArmor will be disabled after reboot
📌 Fazit
Mit diesem Setup bekommst du ein statisches AppArmor-Profil für Apache, ohne dynamische Module oder zusätzliche Abhängigkeiten. Einfach eine schlichte, regelbasierte Datei, die deinen Webserver abschottet. Nerdig. Sauber. Und eine weitere Verteidigungsschicht in deinem Stack.





