
🌐 También en: English · Deutsch · Français
⚠️ Aviso, querido humano (o bot):
Este artículo está actualmente desactualizado y pide a gritos una buena reescritura.
Puede que algunas partes ya no sean precisas, completas o acordes con la realidad tecnológica actual.
Una versión totalmente actualizada y más detallada llegará pronto™.
TL;DR: léelo bajo tu propio riesgo friki: sin garantías, sin promesas, solo buenas vibras. 🤓
Ejecutar Apache con AppArmor en Debian 12 no tiene por qué ser un lío. Olvídate de mod_apparmor, olvídate de los «hats» y no te metas en la madriguera de los módulos dinámicos. Vamos a proteger nuestro servidor web con un perfil estático de AppArmor, sencillo y fácil de mantener, y lo haremos al más puro estilo friki.
🛡️ ¿Qué es AppArmor y por qué debería importarte?
AppArmor es un módulo de seguridad de Linux que restringe a qué puede acceder cada aplicación: archivos, sockets, recursos del sistema. Utiliza perfiles por programa para definir las reglas de acceso. Si un proceso intenta hacer algo que no le corresponde, AppArmor puede registrarlo o bloquearlo. Así se reduce el impacto de exploits y errores. Por ejemplo, aunque Apache se vea comprometido, no podrá leer ni escribir fuera de sus directorios definidos. Es ligero, más fácil de gestionar que SELinux y perfecto para servidores Linux blindados.
🎯 Objetivo
- ✅ Sin
mod_apparmor - ✅ Sin «hats» por virtualhost
- ✅ Solo un perfil de AppArmor estático y sencillo
- ✅ Apache con Nextcloud en
/var/www/html/nextcloud - ✅ Almacenamiento de datos en
/data - ✅ PHP-FPM a través de
/run/php/php8.2-fpm.sock
🧩 El perfil de AppArmor
Guarda este archivo como:
/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,
}
🔎 Consejo: el perfil está en modo complain, así que registra las infracciones en lugar de bloquearlas. Cambia a enforce cuando tengas claro que funciona.
sudo aa-enforce /etc/apparmor.d/usr.sbin.apache2🔧 Despliegue con Ansible
Si usas Ansible, así puedes desplegar el perfil (suponiendo que guardas el archivo en 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
Y no te olvides del handler:
- name: Restart Apache
service:
name: apache2
state: restarted📋 Chuleta de AppArmor
¿Quieres una referencia rápida para gestionar AppArmor? Aquí tienes una práctica lista de comandos habituales para inspeccionar, gestionar y depurar AppArmor en sistemas basados en Debian.
🔍 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
📌 Resumen
Esta configuración te da un perfil estático de AppArmor para Apache, sin módulos dinámicos ni dependencias adicionales. Solo un archivo sencillo basado en reglas para blindar tu servidor web. Es friki. Es limpio. Y es una capa más de defensa en tu stack.





