Verwendung von Firejail zum Einrichten einer WordPress-Installation in einer inhaftierten Umgebung

Einführung

Wenn Sie einen öffentlich zugänglichen Webserver betreiben, kann es schwierig werden, ein Gleichgewicht zwischen dem Zugriff auf Ihre Inhalte und der Einrichtung einer sicheren Konfiguration zu finden. Es gibt viele verschiedene Bereiche, die einer sorgfältigen Prüfung unterzogen werden sollten. Eine davon ist die Prozessisolation und -sichtbarkeit.

Ein Projekt mit dem Namen * firejail * versucht, in diesem Bereich Unterstützung zu bieten, indem ein kompakter Sicherheitscontainer-Mechanismus bereitgestellt wird, der den Kernel-Namespace verwendet, um Trennungsrichtlinien durchzusetzen. Dies macht die Chroot-Umgebung extrem leicht.

In diesem Handbuch zeigen wir Ihnen, wie Sie FireJail verwenden, um Prozesse in ihrer eigenen Chroot-Umgebung zu isolieren. Um dies anhand eines Beispiels zu demonstrieren, richten wir zwei Chroot-Umgebungen ein, eine mit einem Nginx-Webserver für WordPress und die andere mit einer MySQL-Datenbank, die die Site-Daten verwaltet. Diese beiden Instanzen haben ihre eigenen Dateisysteme und Installationen und kommunizieren über ein überbrücktes Netzwerkgerät.

Voraussetzungen und Ziele

In diesem Handbuch verwenden wir einen 64-Bit-Ubuntu 14.04-Server als Basisinstallation. Dadurch können wir vorgefertigte "+ firejail +" - Pakete verwenden und auf einfache Weise "chroot" -Umgebungen erstellen.

Um eine gute Basis für die Installation zu erhalten, stellen Sie sicher, dass Sie das initial server setup for Ubuntu 14.04 abgeschlossen haben. Hier.

Wir werden zwei Chroot-Umgebungen auf unserem Host-System einrichten. Dies werden tatsächlich stabile Debian-Umgebungen sein, eine Auswahl, die ausgewählt wurde, weil die Debian-Umgebungen mit dem von uns verwendeten Tool + debootstrap + besser getestet wurden.

Unser Hostcomputer wird mit einer öffentlichen IP-Adresse konfiguriert und fungiert als Gateway für das überbrückte Netzwerk, das für die Kommunikation mit den Jails eingerichtet wird. Die inhaftierten Umgebungen werden nur für die Verwendung der Bridge-Schnittstelle konfiguriert und können nur über NAT-Regeln auf dem Host auf das weitere Internet zugreifen.

Die drei Umgebungen, die konfiguriert werden, weisen die folgenden Eigenschaften auf:

Environment Public IP Address Bridge IP Address

Host

10.10.20.1

Web Server

(none)

10.10.20.10

Database Server

(none)

10.10.20.20

Beachten Sie, dass der rote Wert oben durch die öffentliche IP-Adresse Ihres Hostservers ersetzt werden sollte. Die Bridge-IP-Adressen sollten jedoch unverändert verwendet werden, da wir diese Schnittstelle und diese Adressen im gesamten Handbuch einrichten werden.

In diesem Handbuch werden alle Befehle als Benutzer * root * ausgeführt.

Laden Sie die Hostcomputerkomponenten herunter und konfigurieren Sie sie

Zu Beginn müssen wir einige der Tools, die wir verwenden werden, auf unseren Server herunterladen.

Als erstes müssen wir das + .deb + Paket für das firejail Programm herunterladen. Suchen Sie den neuesten + .deb + Paketnamen auf der download page of the site und ersetzen Sie den Dateinamen der unten stehenden URL durch diese Version. Die folgende URL ist der direkte Download-Link zum Paket:

cd ~
wget http://downloads.sourceforge.net/project/firejail/firejail/

Wenn die Datei heruntergeladen wurde, installieren Sie sie mit + dpkg +:

dpkg -i firejail*

Nach der Installation des FireJail-Programms müssen wir einige zusätzliche Pakete aus den Standard-Repositorys von Ubuntu herunterladen. Insbesondere benötigen wir das Tool "+ debootstrap ", mit dem wir unsere chroot-Dateisysteme erstellen können, und " bridge-utils +", mit dem wir die Netzwerkbrückenschnittstelle erstellen können, über die unsere Jails kommunizieren:

apt-get update
apt-get install debootstrap bridge-utils

Konfigurieren Sie die Bridge-Schnittstelle

Bevor wir mit den eigentlichen Jails beginnen, werden wir die überbrückte Netzwerkschnittstelle einrichten.

Wir können die neue Schnittstelle mit dem Befehl "+ brctl " erstellen, der Teil des Pakets " bridge-utils " war. Unsere Brücke heißt " br0 +":

brctl addbr br0

Als nächstes müssen wir die Schnittstelle aufrufen. Zusammen mit der Aktivierung der Schnittstelle weisen wir einen CIDR-Netzwerkbereich zu. Unser Hostserver hat die Adresse * 10.10.20.1 * auf dieser Schnittstelle:

ifconfig br0 10.10.20.1/24

Wenn die Schnittstelle läuft, müssen wir den Kernel anweisen, IP-Weiterleitungen oder Routing zwischen unseren Schnittstellen zuzulassen. Wir können diese Funktion für diese Sitzung aktivieren, indem wir Folgendes eingeben:

echo "1" > /proc/sys/net/ipv4/ip_forward

Jetzt müssen wir eine "+ iptables +" - Regel einrichten, mit der der für Port 80 auf unserem Hostserver bestimmte Datenverkehr an den Webserver weitergeleitet wird, den wir in einem unserer Jails installieren werden. Unser Webserver hat die IP-Adresse * 10.10.20.10 * auf unserer Bridge-Schnittstelle:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 10.10.20.10:80

Dies fügt eine Regel am Ende der Kette "PREROUTING" in der Tabelle "nat" hinzu. Wenn ein TCP-Paket, das für Port 80 bestimmt ist, zugreift, wird der Datenverkehr durch Netzwerkadressübersetzung an Port 80 umgeleitet, und zwar am "+ 10.10.20.10 +".

Wir müssen auch eine Reihe von Regeln einrichten, die es unserer Datenbank und unserem Webserver ermöglichen, das Internet abzufragen, damit sie Komponenten von WordPress aktualisieren können. Zunächst fügen wir eine Maskeraderegel hinzu, die es unserer + br0 + - Schnittstelle ermöglicht, die Kommunikation erfolgreich über unseren Hostcomputer weiterzuleiten:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Wir können dann die Kommunikation zwischen unseren Schnittstellen sperren, indem wir die Regeln in der FORWARD-Kette anpassen.

Zuerst sollten wir unsere vorherige NAT-Regel, die festgelegt wurde, spiegeln, damit wir den Datenverkehr von Port 80 explizit in unser "+ br0 +" - Netzwerk zulassen können:

iptables -A FORWARD -i eth0 -o br0 -p tcp -m tcp --dport 80 -j ACCEPT

Wir möchten auch eingehenden Datenverkehr zulassen, der mit unseren bestehenden Verbindungen zusammenhängt:

iptables -A FORWARD -i eth0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT

Wir möchten die Weiterleitung des gesamten Datenverkehrs über die Schnittstelle "+ br0 +" zulassen, damit unsere Gefängnisse miteinander und mit der Außenwelt kommunizieren können:

iptables -A FORWARD -i br0 -j ACCEPT

Schließlich werden alle anderen Weiterleitungsverbindungen getrennt, sodass die Weiterleitung nur für ausgehende Verbindungen aus dem "+ br0 +" - Netzwerk zulässig ist. Die Ausnahmen von dieser Richtlinie wurden bereits in den vorstehenden Regeln festgelegt.

iptables -P FORWARD DROP

Jetzt ist unser Host-System mit der Bridge-Schnittstelle konfiguriert, die für die Kommunikation mit den inhaftierten Umgebungen verwendet wird.

Erstellen Sie die Chroot-Verzeichnisstruktur

Jetzt können wir unsere Chroot-Verzeichnisstrukturen erstellen.

Wie bereits erwähnt, arbeiten unser Webserver und unser Datenbankserver in völlig getrennten Dateisystemen. Wir werden beide Dateisysteme in einem Verzeichnis namens "+ / jails +" speichern. Erstellen Sie dieses Verzeichnis jetzt:

mkdir /jails

Wechseln Sie in das soeben erstellte Verzeichnis:

cd /jails

Jetzt müssen wir die Dateistrukturen erstellen, die von unseren inhaftierten Betriebssystemen verwendet werden. Dazu verwenden wir das Tool + debootstrap +. Dieses Dienstprogramm wurde erstellt, um Debian-Umgebungen in einem vorhandenen Dateisystem zu booten. Dies geschieht, indem Pakete aus den Debian-Repositorys abgerufen und an der richtigen Stelle „installiert“ werden.

Obwohl + debootstrap + verwendet werden kann, um Ubuntu-Umgebungen zu booten, werden wir stattdessen stabile Debian-Installationen auswählen. Da das Tool für Debian entwickelt wurde, sind diese Umgebungen für dieses Tool am besten getestet.

Wir werden unsere Datenbankumgebung in einem Verzeichnis namens "db" installieren. Geben Sie Folgendes ein, um die entsprechende Verzeichnisstruktur zu erstellen und die erforderlichen Pakete herunterzuladen und zu installieren:

debootstrap --arch=amd64 stable db

Nachdem wir unser Dateisystem unter dem Verzeichnis "+ / jails / db " erstellt haben, können wir " rsync +" verwenden, um die Struktur in ein anderes Verzeichnis zu kopieren, das unser Webserver verwenden kann. Das neue Verzeichnis heißt "www". Stellen Sie sicher, dass Sie die Schrägstriche (/) im folgenden Befehl beachten. Dies kopiert die contents des ersten Verzeichnisses in das zweite, anstatt das Verzeichnis selbst zu kopieren:

rsync -azvh db/ www

Jetzt haben wir zwei Chroot-Verzeichnisstrukturen, die wir mit unserem Programm + firejail + verwenden können.

Verwenden Sie Firejail, um die WordPress-Datenbank einzurichten

Nachdem wir nun unsere Verzeichnisstruktur haben, können wir mit "+ firejail " eine Chroot-Umgebung in unserer " / jails / db +" - Verzeichnisstruktur erstellen.

Um eine Chroot-Umgebung zu erstellen und eine Bash-Sitzung darin zu starten, müssen Sie nur den Verzeichnispfad des Chroot-Stamms und den Hostnamen angeben, den Sie für die Sitzung verwenden möchten:

firejail --chroot=/jails/db --name=db
Parent pid 17390, child pid 17391
Interface           IP                  Mask                Status
lo                  127.0.0.1           255.0.0.0           UP
eth0                192.0.2.1           255.255.255.0       UP
eth1                10.128.1.228        255.255.0.0         UP
br0                 10.10.20.1          255.255.255.0       UP

Child process initialized
[root@db ~]$

Der Befehl gibt die übergeordnete PID, die untergeordnete PID und die Schnittstellen aus, die in dieser Gefängnissitzung konfiguriert wurden (die Schnittstellen wurden zu diesem Zeitpunkt weder eingeschränkt noch konfiguriert). Anschließend werden Sie in eine Eingabeaufforderung in Ihrer inhaftierten Umgebung geleitet.

Als Erstes müssen wir unsere Paketdatenbank aktualisieren und den MySQL-Server in der Chroot-Umgebung installieren. Sie können dies tun, indem Sie Folgendes eingeben:

apt-get update
apt-get install mysql-server

Während des Aktualisierungsprozesses sollten Sie sehen, dass Debian-Repositorys überprüft werden. Dies liegt daran, dass unsere chroot-Umgebung eine Debian-Installation ist.

Während des Installationsvorgangs werden Sie aufgefordert, ein Kennwort für das Root-MySQL-Konto auszuwählen und zu bestätigen.

Nach Abschluss der Installation sollten wir die MySQL-Datenverzeichnisstruktur generieren, indem wir Folgendes eingeben:

mysql_install_db

Sperren Sie als Nächstes einige unsichere Standardeinstellungen mit einem enthaltenen Skript:

mysql_secure_installation

Sie werden nach dem Root-MySQL-Passwort gefragt, das Sie während der Installation eingerichtet haben. Anschließend werden Sie gefragt, ob Sie das Passwort ändern möchten. Wählen Sie "Nein", wenn Sie mit Ihrer Auswahl zufrieden sind. Für den Rest der Eingabeaufforderungen drücken Sie einfach die EINGABETASTE, um die Standardoptionen auszuwählen.

Erstellen Sie die WordPress-Datenbank und Benutzer

Als nächstes wollen wir eine separate Datenbank für WordPress einrichten. Melden Sie sich mit dem MySQL-Root-Konto beim MySQL-Server an. Geben Sie das Kennwort ein, das Sie für diesen Benutzer ausgewählt haben, wenn Sie dazu aufgefordert werden:

mysql -u root -p

Sie werden zu einer MySQL-Eingabeaufforderung weitergeleitet. Erstellen Sie eine neue Datenbank für WordPress:

CREATE DATABASE wordpress;

Als Nächstes erstellen wir einen Benutzer für die Arbeit mit dieser Datenbank aus dem Web-Server-Gefängnis. Der Webserver hat eine IP-Adresse von * 10.10.20.10 * auf der Bridge-Schnittstelle, daher müssen wir diesen Benutzer mit dieser Adresse verknüpfen. Vergeben Sie ein sicheres Passwort für diesen Benutzer. Wir erteilen diesem Benutzer dann die Möglichkeit, an der von uns erstellten Datenbank zu arbeiten:

CREATE USER 'wordpressuser'@'10.10.20.10' IDENTIFIED BY '';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'10.10.20.10';

Jetzt müssen wir nur noch die Privileg-Tabelle leeren und beenden:

FLUSH PRIVILEGES;
exit

Ändern Sie die MySQL-Einstellungen, um sie an die Bridge-Adresse zu binden

Als nächstes müssen wir die MySQL-Konfigurationsdatei ändern. Öffne es jetzt mit deinem Editor:

nano /etc/mysql/my.conf

Diese Datei ist in Abschnitte unterteilt. Suchen Sie den Abschnitt, der wie folgt beginnt:

[mysqld]

Sie sollten eine Direktive mit dem Namen "+ bind-address " sehen, die derzeit auf " 127.0.0.1 +" gesetzt ist. Wir wollen unsere MySQL-Instanz starten, die auf der Bridge-Schnittstelle lauscht. Die Adresse dieses Gefängnisses auf dieser Schnittstelle lautet * 10.10.20.20 *, daher sollten wir sie so ändern, dass sie wie folgt aussieht:

bind-address = 10.10.20.20

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Jetzt können wir die aktuell ausgeführte MySQL-Instanz stoppen und dieses Jail beenden:

service mysql stop
exit

Verwenden Sie Firejail, um den WordPress-Webserver einzurichten

Nachdem unsere Datenbank konfiguriert ist, können wir zu unserem Gefängnis übergehen, das für den Webserver verwendet wird. Verwenden Sie firejail, um jetzt eine Sitzung in dieser Gefängnisumgebung zu starten:

firejail --chroot=/jail/www --name=www

Als erstes müssen wir unsere lokale Paketdatenbank aktualisieren und den Nginx-Webserver und die PHP-Komponenten installieren. Diese sind erforderlich, um dynamische Anforderungen zu verarbeiten und eine Verbindung zur MySQL-Datenbank herzustellen:

apt-get update
apt-get install nginx php5-fpm php5-mysql

PHP konfigurieren

Zunächst bearbeiten wir die Konfigurationsdatei des PHP-Prozessors, um eine Funktion zu deaktivieren, die ein Sicherheitsproblem darstellen kann:

nano /etc/php5/fpm/php.ini

Suchen Sie in der Datei nach der Direktive "+ cgi.fix_pathinfo +". Es wird auskommentiert und auf „1“ gesetzt. Wir müssen es auskommentieren und in "0" ändern:

cgi.fix_pathinfo=0

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Nginx konfigurieren

Jetzt müssen wir Nginx einrichten, um die WordPress-Dateien korrekt bereitzustellen. Dazu müssen Sie ein neues Dokumentenstammverzeichnis unter "+ / var / www / html" erstellen, "+ Servername _" auf die öffentliche IP-Adresse Ihres Hostsystems setzen und die PHP-Verarbeitung konfigurieren.

Öffnen Sie die Standard-Nginx-Konfigurationsdatei:

vim /etc/nginx/sites-available/default

Nachfolgend finden Sie eine Zusammenfassung der Änderungen, die wir vornehmen müssen:

  • Deaktivieren Sie die Anweisung "+ listen 80 +", um die Portnummer explizit anzugeben.

  • Ändern Sie den Wert der Direktive "+ root " so, dass er auf " / var / www / html +" zeigt, den Speicherort, an dem wir unsere WordPress-Dateien aufbewahren.

  • Ändern Sie den Parameter "+ index", um nach einer "+ index.php" -Datei vor anderen Indexdateien zu suchen.

  • Ändern Sie den Wert der Anweisung "+ Servername +" so, dass er auf die IP-Adresse oder Domäne des * Hostservers * verweist.

  • Passen Sie den letzten Wert für die Direktive "+ try_files" an, um Anforderungen an die Datei "+ index.php" zu übergeben, wenn sie nicht als Dateien oder Verzeichnisse gefunden werden. Dies befindet sich innerhalb des + location / + Blocks.

  • Kommentieren Sie alle Anweisungen der Fehlerseite aus, um Fehlerseiten zuzulassen.

  • Kommentieren Sie den Block + location ~ \ .php $ +, die enthaltene Direktive + fastcgi_split_path_info +, die Zeile + fastcgi_pass + * socket *, die Direktiven + fastgci_index + und + include fastcgi_params + und fügen Sie ein `+ hinzu try_files + `Direktive, die die Anfrage wie angegeben versucht und andernfalls einen 404 zurückgibt.

Wenn Sie mit den obigen Änderungen fertig sind, sollte die Datei ähnlich der folgenden aussehen (die Kommentare wurden der Kürze halber entfernt):

server {
   listen 80;
   root ;
   index  index.html index.htm;
   server_name ;
   location / {
       try_files $uri $uri/ ;
   }
   location /doc/ {
       alias /usr/share/doc/;
       autoindex on;
       allow 127.0.0.1;
       allow ::1;
       deny all;
   }
   error_page 404 /404.html;
   error_page 500 502 503 504 /50x.html;
   location = /50x.html {
       root /usr/share/nginx/www;
   }
   location ~ \.php$ {

       fastcgi_split_path_info ^(.+\.php)(/.+)$;
       fastcgi_pass unix:/var/run/php5-fpm.sock;
       fastcgi_index index.php;
       include fastcgi_params;
   }
}

Sie können den gesamten hier gezeigten Inhalt einfügen, wenn dies einfacher ist. Sie müssen nur die Anweisung "+ Servername" anpassen, um auf die öffentliche IP-Adresse oder den Domänennamen Ihres Hostsystems zu verweisen.

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Herunterladen und Konfigurieren der WordPress-Dateien

Nachdem Nginx so konfiguriert wurde, dass die Dateien korrekt bereitgestellt werden, können wir sie herunterladen, konfigurieren und installieren.

Wechseln Sie zunächst in das Stammverzeichnis des Root-Benutzers und laden Sie den neuesten WordPress-Tarball herunter:

cd ~
wget http://wordpress.org/latest.tar.gz

Extrahieren Sie den Inhalt des Tarballs und erstellen Sie ein Verzeichnis mit dem Namen "+ ~ / wordpress +":

tar xzvf latest.tar.gz

Kopieren Sie die Beispielkonfigurationsdatei in den gültigen Konfigurationsdateinamen, der überprüft werden soll:

cd ~/wordpress
cp wp-config-sample.php wp-config.php

Öffnen Sie nun die neue Konfigurationsdatei in Ihrem Texteditor:

nano wp-config.php

Im Inneren müssen wir die Werte ändern, die dem Datenbankspeicher zugeordnet sind. Wir müssen die Konfigurationsoptionen mit den Details der Entscheidungen ausfüllen, die wir in unserer MySQL-Datenbank getroffen haben.

Mit Ausnahme des Kennwortfelds, das Sie früher auf Ihren eigenen Wert ändern sollten, können Sie die folgenden Werte verwenden:

/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'wordpressuser');

/** MySQL database password */
define('DB_PASSWORD', '');

/** MySQL hostname */
define('DB_HOST', '10.10.20.20');

Wenn Sie fertig sind, speichern und schließen Sie die Datei.

Als nächstes müssen wir das Verzeichnis "+ / var / www / html" erstellen, auf das wir in unserer Nginx-Konfigurationsdatei als Dokumentstamm verwiesen haben. Wir werden dann alle Ihre WordPress-Dateien in dieses Verzeichnis kopieren:

mkdir -p /var/www/html
cp -r ~/wordpress/* /var/www/html

Jetzt können wir dem Webbenutzer das Eigentum an den Dateien übertragen:

cd /var/www/html
chown -R www-data:www-data /var/www/html/*

Ihr Webserver-Gefängnis ist jetzt vollständig konfiguriert. Wir können unseren Webserver und PHP-Prozesse ordnungsgemäß herunterfahren, indem wir Folgendes eingeben:

service nginx stop
service php5-fpm stop

Verlassen Sie nun das Gefängnis, um zur Host-Server-Sitzung zurückzukehren:

exit

Starten der Gefängnisse

Wir haben jetzt unsere Gefängnisse vollständig konfiguriert. Wir können sie mit unserer Netzwerkbrücken-Schnittstelle individuell starten.

Zunächst starten wir den Datenbankserver, da dieser einfacher ist. Wir müssen den Speicherort des Chroot-Stammverzeichnisses wie zuvor angeben. Dieses Mal verwenden wir auch den Parameter "+ - net ", um die Bridge-Schnittstelle anzugeben. Wir werden dies in Verbindung mit dem Parameter " - ip " verwenden, um die genaue Adresse anzugeben, die wir diesem Gefängnis geben möchten (" 10.10.20.20 +", wenn Sie sich an unsere Konfiguration erinnern).

Wir übergeben auch das "+ - private " -Flag, um neue " / tmp" -, "+ / root" - und "+ / home / user and" -Verzeichnisse im Gefängnis zu laden. Wir müssen dann die Prozesse spezifizieren, die wir im Gefängnis starten möchten, und sie mit einem abschließenden „&“ in den Hintergrund stellen.

Die Prozesse, die wir starten sollten, sind der MySQL-Server-Prozess und auch ein "+ sleep inf +" - Prozess. Dadurch wird das Gefängnis auf unbestimmte Zeit weiter ausgeführt, anstatt zu beenden, wenn die vorherigen Prozesse abgeschlossen sind. Insgesamt sieht der Befehl so aus:

firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 \
   "/etc/init.d/mysql start; \
   sleep inf" &

Das Gefängnis wird gestartet und die angegebenen Prozesse werden nacheinander ausgeführt. Sie können die Ergebnisse dieser Prozesse mit der Option "+ - Liste" für "+ Feuergefängnis" anzeigen:

firejail --list
21913:root:firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 /etc/init.d/mysql
 21916:root:bash -c /etc/init.d/mysql start; sleep inf
   21970:root:/bin/sh /usr/bin/mysqld_safe
     22322:syslog:/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/
     22323:root:logger -t mysqld -p daemon.error
   22409:root:sleep inf

Wie Sie sehen können, ist der Prozessbaum auf unserem Host-System verfügbar. Da wir sehen können, wie die + sleep inf + ausgeführt wird und die MySQL-Prozesse immer noch aktiv sind, können wir sehen, dass das Booten des Jails abgeschlossen ist.

Für das Webserver-Gefängnis ist dasselbe Grundsetup erforderlich. Wir müssen den chroot-Root-Speicherort, die überbrückte Schnittstelle und die tatsächlich zugewiesene IP-Adresse (+ 10.10.20.10 +) sowie das + - private + -Flag angeben.

In Bezug auf die Prozessliste haben wir einige zusätzliche Überlegungen. Zunächst wird das Verzeichnis "+ / var / log" im Gefängnis bei jedem Start dynamisch erstellt. Aus diesem Grund verweisen die Protokollanweisungen in unseren Nginx-Dateien auf nicht vorhandene Speicherorte. Wir können diese Speicherorte erstellen, bevor wir versuchen, Nginx zu starten.

Außerdem ist der Nginx-Prozess auf einen Systemlogger angewiesen. Wir werden den Prozess "+ rsyslog " auch vor Nginx starten. Nach dem Start von Nginx müssen wir auch daran denken, unseren PHP-Prozessor zu starten, der Anfragen bei Bedarf an das Datenbank-Gefängnis weiterleitet. Wieder wollen wir mit " sleep inf +" enden, damit das Gefängnis nach dem Punkt anhält, an dem die Dienste begonnen haben.

Am Ende sieht unser Befehl zum Starten unseres Webserver-Jails folgendermaßen aus:

firejail --chroot=/jails/www --private --net=br0 --ip=10.10.20.10 \
   "mkdir -p /var/log/nginx; \
   touch /var/log/nginx/error.log; \
   touch /var/log/nginx/access.log; \
   /etc/init.d/rsyslog start; \
   /etc/init.d/nginx start; \
   /etc/init.d/php5-fpm start; \
   sleep inf" &

Es kann einen Moment dauern, bis das Web-Server-Gefängnis hochgefahren ist. Überprüfen Sie weiterhin mit "+ firejail --list ", ob der Prozess den Status " sleep inf +" erreicht.

Wenn Sie nun in Ihrem Webbrowser die öffentliche IP-Adresse oder den Domänennamen Ihres Hostservers aufrufen, sollte die WordPress-Erstinstallationsseite angezeigt werden:

http://

Geben Sie die entsprechenden Werte ein und klicken Sie unten auf "WordPress installieren", wenn Sie fertig sind. Sie müssen sich mit Ihrem neu erstellten Administratorkonto anmelden. Anschließend gelangen Sie zum WordPress-Dashboard:

Wenn hier alles wie erwartet funktioniert, bedeutet dies, dass die Installation erfolgreich war. Wir können jetzt daran arbeiten, diese Konfiguration wiederholbar und dauerhaft zu machen.

Erstellen der Firejail-Instanzdienste

Nachdem wir unsere Konfiguration eingerichtet haben, möchten wir sicherstellen, dass wir nach einem Neustart problemlos wieder hierher zurückkehren können. Dazu müssen wir eine Reihe von Bereichen ansprechen. Diese schließen ein:

  • Konfigurieren des Host-to-Jail- und Jail-to-Jail-Netzwerks für den Start.

  • Die Änderungen an den "+ iptables" bleiben bestehen.

  • Konfigurieren Sie unsere Jails so, dass sie automatisch gestartet werden, wenn der Hostserver gestartet wird.

Mit diesen drei können wir sofort beginnen.

Konfigurieren des Netzwerks für Jails beim Booten

Das erste, worauf wir uns konzentrieren werden, ist die Inbetriebnahme des Brückennetzwerks. Dies ist erforderlich, bevor wir uns über unsere Firewall-Regeln Gedanken machen und bevor wir unsere inhaftierten Umgebungen starten.

Wir müssen die eigentliche Bridged-Verbindung konfigurieren. Um diese Verbindung beim Booten zum Laufen zu bringen, müssen wir die + / etc / network / interfaces + Dateien ändern. Öffnen Sie diese Datei jetzt:

nano /etc/network/interfaces

Im Inneren sehen Sie einige Abschnitte, die festlegen, welche Schnittstellen beim Booten gestartet werden, und andere Zeilen, die die einzelnen Schnittstellen beschreiben. Beginnen Sie, indem Sie das Netzwerk + br0 + an das Ende der zweiten Zeile + auto + anhängen, um die Schnittstelle zu starten, die wir beim Booten definieren werden:

auto eth0 eth1

Als nächstes müssen wir einen Abschnitt einrichten, der die Schnittstelle definiert. Da dies eine Brückenschnittstelle ist und nicht wie eine herkömmliche Brücke zum Kombinieren von zwei Netzwerken funktioniert, definieren wir unsere Schnittstelle manuell. Dies bedeutet, dass wir die genauen Befehle angeben, die zum Konfigurieren des Netzwerks verwendet werden sollen.

Beginnen Sie mit der Abschnittsüberschrift:

iface br0 inet manual

Darunter verwenden wir die Direktiven + pre-up +, + up +, + post-down + und + down +, um die Befehle zu definieren, die in jeder Phase ausgeführt werden sollen. Für die Befehle + pre-up + und + up + möchten wir die Bridge erstellen und dann die Schnittstelle auf dieselbe Weise wie zuvor manuell aufrufen. Das "+ $ IFACE " wird dynamisch durch " br0 +" ersetzt, wenn die Befehle ausgeführt werden. Daher sollten Sie diese hier nicht ändern:

iface br0 inet manual
   pre-up brctl addbr $IFACE
   up ifconfig $IFACE 10.10.20.1/24

Für die Befehle + post-down + und + down + möchten wir diese Befehle einfach umkehren. Wir werden die Schnittstelle wieder herunterfahren und dann die Brücke löschen:

iface br0 inet manual
   pre-up brctl addbr $IFACE
   up ifconfig $IFACE 10.10.20.1/24
   down ifconfig $IFACE down
   post-down brctl delbr $IFACE

Unsere + br0 + Schnittstelle ist jetzt definiert und wir haben sie so eingerichtet, dass sie beim Booten automatisch startet. Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Richten Sie IPTables ein, um die eingeschränkte Weiterleitung an Jails zuzulassen

Als Nächstes müssen wir iptables mit den zuvor hinzugefügten Regeln einrichten. Glücklicherweise ist dies mit Hilfe des Pakets "+ iptables-persistent +" einfach.

Installieren Sie das Paket, indem Sie Folgendes eingeben:

apt-get install iptables-persistent

Während des Installationsvorgangs werden Sie gefragt, ob Sie die aktuellen IPv4- und IPv6-Regeln speichern möchten. Wählen Sie bei diesen Eingabeaufforderungen * yes * aus, um die aktuellen Regelsätze automatisch zu speichern. Diese werden beim Booten automatisch neu angewendet.

Wenn Sie jemals die Regeln anpassen müssen, die beim Booten angewendet werden, nehmen Sie die gewünschten Änderungen vor und geben Sie Folgendes ein:

/etc/init.d/iptables-persistent save

Der aktuelle Regelsatz wird aktualisiert.

Unsere iptables-Regeln werden jetzt beim Booten des Servers wiederhergestellt. Es gibt jedoch noch einen weiteren Punkt, den wir noch nicht angesprochen haben: Wir müssen sicherstellen, dass unser Kernel die Weiterleitung zulässt.

Zuvor haben wir eine "1" in eine Datei im Pseudo-Dateisystem "+ / proc " eingegeben, um diese Funktion zu aktivieren. Bearbeiten Sie die Datei " sysctl.conf +", damit diese Änderung beim nächsten Start automatisch wirksam wird:

nano /etc/sysctl.conf

Kommentieren Sie die folgende Zeile aus:

net.ipv4.ip_forward=1

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Erstellen Sie ein Upstart-Skript, um die WordPress-Jails zu starten

Um unsere Jails so zu konfigurieren, dass sie beim Booten gestartet werden, müssen wir ein Startskript erstellen. Wir werden unser Skript "+ firejail_wp.conf +" aufrufen.

Öffnen Sie eine Datei mit diesem Namen im Verzeichnis "+ / etc / init +" in Ihrem Texteditor:

nano /etc/init/firejail_wp.conf

Im Inneren füllen wir zunächst eine kurze Beschreibung dessen aus, wofür dieser Service gedacht ist:

description "WordPress jail"

Als Nächstes konfigurieren wir die Umstände, die zutreffen müssen, damit dieser Dienst automatisch gestartet wird. Wir wollen sicherstellen, dass das Dateisystem verfügbar ist und wir müssen auch sicherstellen, dass das "+ br0 " - Netzwerk eingerichtet wurde. Wenn das " br0 +" - Netzwerk ausfällt, schlagen beide unserer FireJail-Befehle fehl.

Dazu verwenden wir die Direktive + start on + und die Bezeichner + local-filesystems + und + net-device-up +, um unsere Startbedingungen zu erstellen. Wir werden unser Skript auch so konfigurieren, dass es stoppt, wenn der Computer in den Neustart- oder Herunterfahrmodus wechselt (dies wird durch einen Runlevel angezeigt, der nicht 1-5 ist):

description "WordPress jail"

start on (local-filesystems and net-device-up IFACE=br0)
stop on runlevel [!12345]

Schließlich müssen wir den tatsächlichen Befehl festlegen, der ausgeführt wird, wenn dieser Dienst gestartet wird. Aufgrund der Art und Weise, wie Dienste ausgeführt werden, platzieren wir die firejail-Befehle in einem externen Skript. Daher müssen wir hier nur auf den Skriptnamen verweisen:

description "WordPress jail"

start on (local-filesystems and net-device-up IFACE=br0)
stop on runlevel [!12345]

exec /startjails.sh

Wenn Sie fertig sind, speichern und schließen Sie die Datei.

Jetzt müssen wir die eigentliche Skriptdatei erstellen, auf die wir gerade verwiesen haben. Verwenden Sie Ihren Texteditor, um eine Datei an dieser Stelle zu öffnen:

nano /startjails.sh

Da dies ein Bash-Skript ist, beginnen Sie mit dem Standard-Shebang-Aufruf zum Bash:

#!/bin/bash

Als nächstes werden wir unsere beiden FireJail-Befehle mit einer kleinen Modifikation hinzufügen. Aus einem unbekannten Grund liegt ein Problem beim Ausführen des Nginx-Init-Skripts in der inhaftierten Umgebung vor, wenn es von upstart gestartet wird. Dieses Problem tritt nicht auf, wenn es von einer anderen Methode aufgerufen wird.

Um dies zu umgehen, rufen wir einfach die ausführbare Nginx-Datei anstelle des internen Jailed-Init-Skripts auf. Davon abgesehen sind die Befehle genau so, wie wir sie zuvor verwendet haben:

#!/bin/bash

firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 "/etc/init.d/mysql start; sleep inf" &

firejail --chroot=/jails/www --private --net=br0 --ip=10.10.20.10 "mkdir -p /var/log/nginx; touch /var/log/nginx/error.log; touch /var/log/nginx/access.log; /etc/init.d/rsyslog start; /usr/sbin/nginx; /etc/init.d/php5-fpm start; sleep inf" &

Ein weiterer Befehl ist erforderlich, um sicherzustellen, dass dies ein fortlaufender Dienst ist und keine Aufgabe, die unmittelbar nach dem Start der Gefängnisse endet. Wir müssen + sleep inf + als letzte Zeile im Skript hinzufügen. Auf diese Weise kann Upstart den Dienst korrekt verwalten:

#!/bin/bash

firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 "/etc/init.d/mysql start; sleep inf" &

firejail --chroot=/jails/www --private --net=br0 --ip=10.10.20.10 "mkdir -p /var/log/nginx; touch /var/log/nginx/error.log; touch /var/log/nginx/access.log; /etc/init.d/rsyslog start; /usr/sbin/nginx; /etc/init.d/php5-fpm start; sleep inf" &

sleep inf

Wenn Sie fertig sind, speichern und schließen Sie die Datei.

Jetzt müssen wir diese Datei nur noch ausführbar machen, damit das Upstart-Skript sie starten kann:

chmod +x /startjails.sh

Mit diesem Schritt wird die in WordPress eingesperrte Umgebung vollständig so konfiguriert, dass sie beim Booten gestartet wird.

Sie können Ihren Host-Server neu starten, um dies auszuprobieren:

shutdown -r now

Wenn alles richtig konfiguriert wurde, können Sie Ihre WordPress-Site erreichen, nachdem alles Zeit zum Starten hatte.

Fazit

Dieser Leitfaden war nur ein Beispiel für eine der vielen Möglichkeiten, die Sie mit einem Tool wie firejail nutzen können. Obwohl es viele andere Möglichkeiten gibt, isolierte Komponenten für Ihre Server einzurichten, ist firejail eine großartige Lösung, da es flexibel ist und so viele verschiedene Szenarien mit minimalen Ressourcen bewältigen kann.