So erstellen Sie ein AppArmor-Profil für Nginx unter Ubuntu 14.04

Einführung

Ein guter Serveradministrator sucht nach neuen Sicherheitslücken. Wenn Sie einen Server mit öffentlich zugänglichen Ports betreiben, sollten Sie dessen Sicherheit im Auge behalten.

Leider ist Ihr Server auch dann anfällig für Zero-Day-Angriffe, wenn Sie mit den neuesten Sicherheitspatches für Ihre Anwendungen und Ihr Betriebssystem auf dem Laufenden bleiben: Angriffe auf unbekannte Schwachstellen, für die keine Patches vorhanden sind. * AppArmor * ist ein Linux-Kernelmodul, das als Zugriffskontrollsystem fungiert und Ihren Server vor solchen Angriffen schützt. Dieses Modul ist seit der Veröffentlichung von Ubuntu 8.04 standardmäßig unter Ubuntu verfügbar.

Wenn AppArmor für eine Anwendung aktiv ist, kann die Anwendung vom Betriebssystem nur auf die Dateien und Ordner zugreifen, die in ihrem Sicherheitsprofil aufgeführt sind. Mit einem gut geplanten Sicherheitsprofil kann die Anwendung selbst dann keinen großen Schaden anrichten, wenn sie während eines Angriffs kompromittiert wird.

Was dieses Tutorial behandelt

In diesem Tutorial erstellen wir ein einfaches AppArmor-Sicherheitsprofil, eine Textdatei mit Berechtigungsdetails für * Nginx *, einen beliebten HTTP-Server.

Um zu demonstrieren, wie AppArmor funktioniert, werden wir Nginx so konfigurieren, dass statische Dateien aus zwei Verzeichnissen bereitgestellt werden: und und AppArmor so konfigurieren, dass Nginx darauf beschränkt wird.

Bei diesem Setup kann ein externer Benutzer, wenn AppArmor inaktiv ist, auf Dateien aus beiden Verzeichnissen zugreifen. Wenn AppArmor aktiv ist, kann der Benutzer nur auf die Dateien in zugreifen.

Voraussetzungen

Sie benötigen Folgendes:

  • * Ubuntu 14.04 * Server

  • Ein sudo Benutzer

Erster Schritt - Installieren Sie Nginx

Verwenden Sie diese Option, um Ihren Server zu aktualisieren und Nginx zu installieren:

sudo apt-get update
sudo apt-get install nginx

Ihr Nginx-Server ist jetzt betriebsbereit. Der Standardserver wird auf Port 80 ausgeführt. Sie können es in einem Browser testen, indem Sie die IP-Adresse Ihres Droplets als URL aufrufen:. Sie sollten die Standard-Willkommensseite von Nginx sehen.

Schritt 2: Konfigurieren Sie Nginx zum Bereitstellen statischer Dateien

Erstellen Sie die Verzeichnisse, aus denen die statischen Dateien bereitgestellt werden.

sudo mkdir -p /data/www/safe
sudo mkdir -p /data/www/unsafe

Fügen Sie dem Verzeichnis eine Datei hinzu, indem Sie Folgendes verwenden:

sudo nano /data/www/safe/index.html

Lassen Sie die Datei den folgenden Inhalt haben:

<html>
   <b>Hello! Accessing this file is allowed.</b>
</html>

Erstellen Sie in ähnlicher Weise eine weitere Datei mit dem folgenden Inhalt in named:

<html>
   <b>Hello! Accessing this file is NOT allowed.</b>
</html>

Die Konfigurationsdatei von Nginx befindet sich unter. Bearbeiten Sie diese Datei, um einen neuen Server zu erstellen, der den Port abhört und Dateien von diesem bedient. Wenn Sie die kommentierten Zeilen ignorieren, sollte Ihre Datei nach der Bearbeitung wie folgt aussehen. Sie müssen ein Hash-Zeichen hinzufügen, um die Zeile + include / etc / nginx / sites-enabled / *; + zu kommentieren. Sie müssen auch den gesamten * Server * -Block hinzufügen, der unten in Rot angezeigt wird:

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
   worker_connections 768;
}

http {
   sendfile on;
   tcp_nopush on;
   tcp_nodelay on;
   keepalive_timeout 65;
   types_hash_max_size 2048;

   include /etc/nginx/mime.types;
   default_type application/octet-stream;

   access_log /var/log/nginx/access.log;
   error_log /var/log/nginx/error.log;

   gzip on;
   gzip_disable "msie6";

   include /etc/nginx/conf.d/*.conf;







}

Speichern Sie Ihre Änderungen und laden Sie die neue Konfiguration, indem Sie den folgenden Befehl ausführen:

sudo nginx -s reload

Da AppArmor zu diesem Zeitpunkt noch nicht für Nginx aktiviert wurde, sollten Sie in der Lage sein, sowohl als auch zu besuchen. Die sichere Seite sieht folgendermaßen aus:

Die Nginx-Konfiguration ist nun abgeschlossen.

Schritt Drei - Bestehende AppArmor-Profile prüfen

In Ubuntu 14.04 sind einige AppArmor-Profile vorinstalliert. Installieren Sie weitere mit diesem Befehl:

sudo apt-get install apparmor-profiles

Listen Sie alle verfügbaren Profile auf, indem Sie diesen Befehl ausführen:

sudo apparmor_status

Sie sollten einige Profile sehen. Einige befinden sich im Erzwingungsmodus, andere im Beschwerdemodus. Wenn sich das Profil einer Anwendung im * Beschwerdemodus * befindet, protokolliert AppArmor die Aktivitäten der Anwendung, ohne sie in irgendeiner Weise einzuschränken.

Sobald etwas zu protokollieren ist, finden Sie die Protokolldateien für den Nginx-Server im Verzeichnis.

AppArmor schränkt ein, was eine Anwendung nur tun kann, wenn sich ihr Profil im * Erzwingungsmodus * befindet.

Sie werden auch feststellen, dass für den Nginx-Server kein Profil vorhanden ist. Wir werden im nächsten Schritt eine erstellen.

Schritt 4 - Erstellen Sie ein neues AppArmor-Profil für Nginx

Installieren . Hierbei handelt es sich um eine Sammlung von Dienstprogrammen, mit denen Sie AppArmor verwalten können.

sudo apt-get install apparmor-utils

Sie können nun mit der Profilerstellung für die Aktivitäten von Nginx beginnen. Verwenden Sie den Befehl, um ein neues leeres Profil zu erstellen. Das Profil wird in erstellt.

cd /etc/apparmor.d/
sudo aa-autodep nginx

Sobald das Profil erstellt wurde, können Sie es mit in den Beschwerdemodus versetzen.

sudo aa-complain nginx

Starten Sie Nginx neu.

sudo service nginx restart

Öffnen Sie einen Browser und besuchen Sie. Dadurch werden die normalen Einträge für den Zugriff auf die sichere Website in Ihren Nginx-Protokollen angezeigt.

Gehe zurück zum Terminal. Jetzt verwenden wir ein AppArmor-Dienstprogramm, um die Nginx-Protokolle zu durchsuchen und alle dort gefundenen Aktionen zu genehmigen oder abzulehnen.

sudo aa-logprof

Dieser Befehl durchsucht die Protokolldateien und aktualisiert das AppArmor Nginx-Profil. Sie werden mehrmals aufgefordert, eine Funktion zuzulassen oder abzulehnen. Angenommen, Ihr Server wird derzeit nicht angegriffen, können Sie jedes Mal * A * drücken, da alle erforderlichen Funktionen erforderlich sind, damit Nginx ordnungsgemäß funktioniert. Wenn Sie zum Speichern der Änderungen aufgefordert werden, drücken Sie abschließend * S *.

Dieser allgemeine Vorgang zum Aktivieren von AppArmor für eine neue Anwendung lautet wie folgt:

  • Erstellen Sie ein neues leeres Profil für die Anwendung

  • Versetzen Sie es in den Beschwerdemodus

  • Führen Sie normale Aktionen mit der Anwendung aus, damit den Protokollen entsprechende Einträge hinzugefügt werden

  • Führen Sie das AppArmor-Dienstprogramm aus, um die Protokolle zu durchsuchen und verschiedene Anwendungsaktionen zu genehmigen oder abzulehnen

Schritt 5: Bearbeiten Sie das AppArmor Nginx-Profil

Insbesondere für Nginx müssen Sie einige Änderungen an der automatisch generierten Datei vornehmen, damit sie ordnungsgemäß funktioniert. Öffnen Sie die Datei + / etc / apparmor.d / usr.sbin.nginx + zum Bearbeiten.

sudo nano /etc/apparmor.d/usr.sbin.nginx

Sie sollten mindestens die folgenden Änderungen vornehmen:

  • Fügen Sie die Zeile + # include <abstractions / apache2-common> + hinzu - ja, die Raute ist beabsichtigt

  • Fügen Sie die Zeile hinzu

  • Fügen Sie die Zeile hinzu

  • Aktualisieren Sie die Zeile, um das gesamte Verzeichnis mit einem Sternchen (*) einzuschließen.

  • Fügen Sie die Zeile einschließlich des Kommas hinzu

  • Stellen Sie sicher, dass Nginx in das Fehlerprotokoll schreiben kann, indem Sie * w * für festlegen

Mit dem Include kann Nginx verschiedene Ports überwachen. Die neuen * Capability * -Linien ermöglichen es Nginx, neue Prozesse zu starten. Mit der * deny * -Regel können wir verhindern, dass Nginx auf das Verzeichnis zugreift.

Ein Arbeitsprofil sieht so aus:

#include <tunables/global>

/usr/sbin/nginx {

 #include <abstractions/base>
 #include <abstractions/nis>

 capability dac_override,
 capability dac_read_search,
 capability net_bind_service,



 /data/www/safe/ r,

 /etc/group r,
 /etc/nginx/conf.d/ r,
 /etc/nginx/mime.types r,
 /etc/nginx/nginx.conf r,
 /etc/nsswitch.conf r,
 /etc/passwd r,
 /etc/ssl/openssl.cnf r,
 /run/nginx.pid rw,
 /usr/sbin/nginx mr,
 /var/log/nginx/access.log w,
 /var/log/nginx/error.log ,
}

Ihr Profil sieht möglicherweise etwas anders aus, da es auf der Grundlage Ihrer Protokolldatei erstellt wurde. Es liegt an Ihnen, ob Sie einzelne Parameter recherchieren und aktualisieren oder diese Datei mit den üblichen Einschränkungen in Bezug auf Ihre eigene Serverumgebung kopieren möchten. Es kann schwierig sein, die AppArmor-Berechtigungen richtig festzulegen. Sie können diese und Ihre automatisch generierten Beispieldateien als Ausgangspunkte verwenden, sind jedoch auf einige Fehlerbehebungsmaßnahmen vorbereitet.

Das AppArmor Nginx-Profil ist fertig. Verwenden Sie, um das Profil in den Erzwingungsmodus zu versetzen.

sudo aa-enforce nginx

Es wird empfohlen, alle Profile neu zu laden und Nginx neu zu starten, um sicherzustellen, dass die neuesten Änderungen wirksam werden. Geben Sie Folgendes ein:

sudo /etc/init.d/apparmor reload
sudo service nginx restart

Wenn Sie in einer dieser Phasen auf Fehler stoßen, lesen Sie die Fehler, überprüfen Sie Ihre Konfigurationsdateien und zeigen Sie in die richtige Richtung.

Überprüfen Sie den AppArmor-Status:

sudo apparmor_status

Sie sollten sehen, dass Nginx-Prozesse im Erzwingungsmodus ausgeführt werden.

Gehen Sie zurück zum Browser und besuchen Sie. Sie sollten die Seite sehen können. Dann besuchen Sie. Sie sollten eine Fehlerseite wie die unten gezeigte sehen. Dies zeigt, dass unser Profil wie erwartet funktioniert.

Fehlerbehebung

Wenn Ihr Nginx-Server nach dem Erzwingen des Profils nicht gestartet werden kann, enthält das Profil wahrscheinlich keine Berechtigung, die Nginx benötigt. Sie sollten überprüfen:

  • Der Fehlertext

  • {leer}

  • {leer}

Sie müssen dann Ihr Profil basierend auf diesen Fehlern ändern.

Wenn Sie beispielsweise vergessen haben, in das Profil aufzunehmen, wird folgender Fehler angezeigt:

[emerg] 3611#0: socket() 0.0.0.0:8080 failed (13: Permission denied)

In einem realen Szenario ist es sehr zeitaufwendig, ein nützliches AppArmor-Profil für eine neue Anwendung zu finden.

Fazit

Mit diesem Tutorial haben Sie gelernt, ein AppArmor-Profil von Grund auf neu zu erstellen. In einem realen Szenario sollten Sie einen strengeren Prozess ausführen, bevor Sie AppArmor für eine große Anwendung aktivieren.

Aktivieren Sie zunächst den Beschwerdemodus mit dem Befehl. Anschließend warten Systemadministratoren in der Regel mehrere Tage, bevor sie den Befehl ausführen, um dem System Zeit zu geben, häufigere Aktionen für die Anwendung zu protokollieren. Es wird empfohlen, dasselbe zu tun, wenn Sie ein Profil erstellen, das in Produktionssystemen verwendet wird.