So konfigurieren Sie eine sichere Web-App-Infrastruktur mit DigitalOcean Cloud Firewalls

Einführung

DigitalOcean Cloud Firewalls bieten einen leistungsstarken Firewall-Service auf Netzwerkebene, sodass Ihre Server ihre Aufgaben als Dienstleister für Ihre Anwendungen und zum Speichern Ihrer Daten ausführen können. In diesem Tutorial werden wir ein Wordpress- und MySQL-Setup mit zwei Servern für die Verwendung von Cloud-Firewalls anpassen und einige der Vorteile dieses Dienstes demonstrieren. Wenn Sie vor Beginn weitere Hintergrundinformationen zu diesem Firewall-Dienst wünschen, lesen Sie bitte unserIntroduction To DigitalOcean Cloud Firewalls-Tutorial.

Voraussetzungen

Bevor Sie mit diesem Lernprogramm beginnen, müssen Sie die inHow To Set Up a Remote Database to Optimize Site Performance with MySQL on Ubuntu 16.04 angegebene Infrastruktur erstellt haben. Auf diese Weise stehen Ihnen zwei Server zur Verfügung, ein Nginx-Webserver mit PHP und WordPress sowie ein eigenständiger MySQL-Server. In diesem Tutorial werden diese Serverfrontend-01 bzw.database-01 genannt.

Unsere aktuelle Firewall-Situation

Derzeit sind auf beiden Servern Firewalls mit dem Dienstprogrammufweingerichtet. ufw ist ein benutzerfreundlicher Wrapper für die iptables-Firewall-Engine von Linux. Melden Sie sich jetzt bei beiden Servern an und überprüfen Sie den Status unserer Firewalls:

Zunächst auf dem Webserverfrontend-01:

sudo ufw status verbose
OutputStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
80,443/tcp (Nginx Full)    ALLOW IN    Anywhere
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)
80,443/tcp (Nginx Full (v6)) ALLOW IN    Anywhere (v6)

In der Ausgabe wird nachDefault: angezeigt, dass die Firewall standardmäßig alle eingehenden Verbindungen verweigert und alle ausgehenden Verbindungen zulässt. Zusätzlich gibt es vier Regeln, die eingehende IPv4- und IPv6-TCP-Verbindungen (ALLOW IN) zu den Ports 22 (SSH), 80 (HTTP) und 443 (HTTPS) zulassen.

Machen wir dasselbe auf dem Datenbankserver,database-01:

sudo ufw status verbose
OutputStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
3306                       ALLOW IN    Anywhere
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)
3306 (v6)                  ALLOW IN    Anywhere (v6)

Diese Ausgabe ist ähnlich, mit der Ausnahme, dass wir die beiden Nginx-Ports gegen Port 3306 ausgetauscht haben, den Standard-MySQL-Port. Nachdem wir unser aktuelles Setup kennen, planen wir unseren Austausch.

Unser Cloud Firewall-Plan

Obwohl wir nur zwei Cloud-Firewalls erstellen könnten, eine für jeden bestimmten Server, und eine auffrontend-01 und die andere aufdatabase-01 anwenden könnten, werden wir unsere Regeln flexibler organisieren .

Zunächst möchten wir uns auf eine Zukunft vorbereiten, in der wir diesem System möglicherweise eine dritte Art von Dienst hinzufügen müssen (möglicherweise einen Cache-Server). Daher werden wir unsere Firewall-Regeln nicht nach physischen Servern, sondern nach Rollen aufteilen. Wir können jedem Droplet mehrere Cloud-Firewalls zuweisen. Daher ist es kein Problem, diese Firewalls feinkörnig und modular zu gestalten.

[.note] #Note: Wenn Sie die Best Practices für die Strukturierung Ihrer Cloud-Firewalls genauer untersuchen möchten, lesen Sie bitteHow To Organize DigitalOcean Cloud Firewalls.
#

Wenn wir die Dinge ein wenig zusammenbrechen lassen, stellen wir fest, dass unsere beiden Server tatsächlich mehrere Funktionen haben. Es gibt die Hauptfunktion, entweder Webseiten oder Datenbankinformationen bereitzustellen, und es gibt auch eine Verwaltungsfunktion, die vom SSH-Dienst bereitgestellt wird. Es wäre sinnvoll, einemanagement-Firewall, einefrontend-Firewall und einedatabase-Firewall zu erstellen.

Um das zukünftige Szenario zu bewältigen, in dem wir unsere Web- oder Datenbankdienste auf mehrere Hosts skalieren, verwenden wir die Tag-Funktion von DigitalOcean, um unsere Droplets nach Rolle zu organisieren. Tags sind einfache Bezeichnungen, die wir auf Droplets anwenden können, um sie zu kategorisieren und ganze Servergruppen gleichzeitig anzusprechen. Der Cloud Firewall-Dienst kann Firewall-Regeln auf alle Droplets in einem Tag anwenden, sodass es einfach ist, neue Droplets mit den richtigen Firewall-Regeln bereitzustellen, die bereits vorhanden sind.

Ein zusätzlicher Bonus - und etwas, das mitufw auf dynamische Weise schwierig zu tun wäre - ist, dass Cloud-Firewalls den eingehenden Zugriff basierend auf Tags einschränken können. So müssen beispielsweise die Server vondatabasenur von den Servern vonfrontendaus zugänglich sein. Beim aktuellen Setup vonufwist die Datenbank für alle Personen im Netzwerk geöffnet. Wir werden dies nur auf unsere mitfrontend gekennzeichneten Tröpfchen beschränken.

Fassen wir die drei Firewalls, die wir einrichten müssen, im Klartext zusammen:

  • Management: erlauben eingehenden Datenverkehr von jedem Host zum TCP-Port 22

  • Frontend: erlauben eingehenden Datenverkehr von jedem Host zu den TCP-Ports 80 und 443

  • Database: erlauben eingehenden Datenverkehr zum TCP-Port 3306 nur vonfrontend markierten Servern

In diesem Lernprogramm wird der ausgehende Datenverkehr überhaupt nicht eingeschränkt. Es ist keine schlechte Idee, aber es muss sorgfältig darauf geachtet werden, dass Sie die automatischen Aktualisierungsmechanismen und andere wichtige Funktionen des zugrunde liegenden Betriebssystems nicht beschädigen.

Jetzt, da wir einen Plan für unsere neuen Firewalls haben, können wir loslegen.

[[Schritt 1 - Markieren unserer Server]] == Schritt 1 - Markieren unserer Server

Zunächst markieren wir unsere Droplets nach ihrer Rolle, um uns auf die Firewall-Regeln vorzubereiten. Navigieren Sie zur DigitalOcean-Systemsteuerung. Die Standardansicht ist eine Liste Ihrer Tröpfchen. Klicken Sie auf die SchaltflächeMore rechts neben Ihremfrontend-01-Tröpfchen und wählen SieAdd tags aus:

Select "Edit Tags"

Ein Textfeld wird angezeigt, in das Sie Tags für dieses Droplet eingeben können. Geben Siefrontend ein und klicken Sie auf die SchaltflächeAdd Tags:

Tag Editing Interface

Machen Sie dasselbe für Ihren Datenbankserver und geben Sie ihm eindatabase-Tag. Die Tags werden in Ihrer Droplet-Liste angezeigt:

Droplet List with Tags

Beim Erstellen zukünftiger Droplets können Sie diese Tags während des anfänglichen Bereitstellungsprozesses anwenden. Die Droplets erben dann automatisch die entsprechenden Firewall-Regeln.

Wir werden diese Regeln im nächsten Schritt einrichten.

[[Schritt-2 - Erstellen von Cloud-Firewalls]] == Schritt 2 - Erstellen von Cloud-Firewalls

Wir richten jetzt unsere Cloud-Firewalls ein. Wir führen zuerst die Firewall vonfrontendaus, gefolgt vondatabaseund dannmanagement. Diese Bestellung sollte für die Besucher Ihrer Website keine Serviceunterbrechungen zur Folge haben, aber wir werden vorübergehend die Möglichkeit verlieren, neue SSH-Verbindungen herzustellen. Dies hat keine Auswirkungen auf bereits hergestellte Verbindungen.

Der Firewalls-Dienst ist im AbschnittNetworking der DigitalOcean-Systemsteuerung verfügbar. Klicken Sie dort auf die RegisterkarteFirewalls und dann auf die SchaltflächeCreate Firewall, um zu beginnen.

Erstellen der Frontend-Firewall

Auf der SeiteCreate Firewall müssen wir einName ausfüllen, unsereInbound Rules konfigurieren und auswählen, auf welche Droplets die Firewall angewendet werden soll. Wir werden den AbschnittOutbound Ruleso lassen, wie er ist.

Wir erstellen zuerst die Firewall vonfrontend, geben Sie alsofrontend-fw in das FeldNameein.

[.note] #Note: Wir werden-fw am Ende unserer Firewall-Namen hinzufügen, um sie zu unterscheiden. Obwohl die Benutzeroberfläche der Systemsteuerung Symbole verwendet, um zwischen Ressourcentypen zu unterscheiden, kann es verwirrend werden, wenn Sie die Befehlszeile oder API verwenden und mehrerefrontend-Elemente haben, z. B.
#

Als nächstes müssen wir die Standard-SSH-Regel aus dem AbschnittInbound Rules löschen. Wir werden diese Regel aus Gründen der Flexibilität in die Firewall vonmanagementaufteilen. Verwenden Sie den LinkDelete auf der rechten Seite, um die SSH-Regel jetzt zu löschen.

Klicken Sie dann auf die Dropdown-ListeNew rule und wählen SieHTTP aus. Dadurch werden das richtige Protokoll (TCP) und der richtige Port (80) automatisch ausgefüllt und standardmäßig Datenverkehr von allen IPv4- und IPv6-Adressen zugelassen. Das wollen wir.

Wenn Sie HTTPS aktiviert haben, wiederholen Sie den obigen Vorgang, um eine zweite Regel zu erstellen, und wählen Sie diesmalHTTPS aus. Ihr AbschnittInbound Rulesendet folgendermaßen:

Inbound Rules for frontend-fw

Beginnen Sie schließlich im FeldApply to Droplets mit der Eingabe vonfrontend und wählen Sie dann das Tagfrontend aus, wenn es automatisch vorgeschlagen wird.

Apply to "frontend" tag

Klicken Sie auf die SchaltflächeCreate Firewall. Die neue Firewall wird erstellt und auf alle Droplets mit dem Tagfrontendangewendet. Sie kehren zu einer aktualisierten Firewall-Übersichtsseite zurück, auf der Ihre neue Firewall angezeigt wird:

Firewall summary with the frontend rule listed

Jetzt erstellen wir die Firewall vondatabase.

Erstellen der Datenbankfirewall

Klicken Sie auf der Seite Firewalls erneut aufCreate Firewall. Der Prozess ist größtenteils der gleiche wie für unserefrontend-Firewall.

Geben Siedatabase-fw in das FeldName ein.

Löschen Sie inInbound Rules die Standard-SSH-Regel. Erstellen Sie dann mithilfe der Dropdown-Liste eine neue Regel und wählen SieMySQL aus. Es wird eine Standard-MySQL-Regel erstellt, die allen IP-Adressen den Zugriff auf Port 3306 ermöglicht. Löschen SieAll IPv4 undAll IPv6 aus dem FeldSources. Wir möchten, dass nur unsere Frontend-Server auf die Datenbank zugreifen können. Geben Siefrontend in das FeldSources ein und wählen Sie das Tagfrontend aus, wenn es automatisch vorgeschlagen wird. Jetzt kann jedes Droplet mit diesem Tag auf den Datenbankserver zugreifen. Alle anderen IPs sind gesperrt.

Lassen Sie dieOutbound Rules unverändert. Wenden Sie unterApply to Droplets diese Firewall auf das Tagdatabase an und klicken Sie dann aufCreate Firewall. Erneut kehren Sie zur Firewall-Übersichtsseite zurück:

Firewall summary with database-fw and frontend-fw rules in place

Beachten Sie, dass beide Firewalls anzeigen, dass sie auf jeweils ein Droplet angewendet werden. Wenn Sie Ihre Website laden, sollte sie dennoch einwandfrei geladen werden. Lassen Sie uns nun die Verwaltung über SSH wieder aktivieren.

Erstellen der Management Firewall

Klicken Sie ein letztes Mal aufCreate Firewall. Fügen Siemanagement-fw zum FeldName hinzu.

Die Standard-SSH-Regel ist alles, was wir für diese Firewall benötigen. Auf diese Weise kann jede IP-Adresse eine Verbindung zu Port 22 herstellen.

Alternativ können Sie das FeldSourcesder SSH-Regel in eine bestimmte IP-Adresse ändern, von der aus Sie eine Verbindung herstellen. Wenn Ihr Büro beispielsweise über eine statische IP-Adresse verfügt und Sie den SSH-Zugriff nur auf Verbindungen vom Büro aus beschränken möchten, geben Sie diese IP-Adresse inSources ein und ersetzen SieAll IPv4 undAll IPv6. Wenn sich Ihre IP-Adresse in Zukunft ändert, müssen Sie nur diese eine Regel aktualisieren, um den Verwaltungszugriff wiederherzustellen. Dies ist ein weiterer Vorteil der vorausschauenden Planung und der Modularisierung unserer Regeln.

Fügen Sie unterApply to Droplets die Tagsfrontend unddatabase hinzu und klicken Sie dann aufCreate Firewall. Werfen wir einen Blick auf unsere endgültige Firewall-Zusammenfassung:

Firewall summary with all rules in place

Zu diesem Zeitpunkt sollte unsere Cloud-Firewall voll funktionsfähig sein, aber wir haben auch noch die Host-basiertenufw-Firewalls aktiv. Deaktivieren wir diese und testen dann unsere Verbindungen.

[[Schritt-3 - Löschen der Host-Firewalls]] == Schritt 3 - Löschen der Host-Firewalls

Wir müssen dieufw-Firewall auf beiden Hosts deaktivieren. Erstens auffrontend-01:

sudo ufw disable
OutputFirewall stopped and disabled on system startup

Dann aufdatabase-01:

sudo ufw disable
OutputFirewall stopped and disabled on system startup

Dies stoppt die aktuelle Firewall, löscht alle Regeln und verhindert, dass die Regeln beim Start erneut aktiviert werden.

Zu diesem Zeitpunkt sollte unsere gesamte Konnektivität wiederhergestellt sein. Versuchen Sie, eine neue SSH-Sitzung mit einem Ihrer Server zu erstellen. Laden Sie dann Ihre Website, um sicherzustellen, dass der Webserver noch eine Verbindung zur Datenbank herstellt und Webseiten an den Browser zurückgibt.

Wenn Sie eine Verbindung zu allen unseren Diensten herstellen können, ist dies jedoch noch kein Beweis dafür, dass eine Firewall funktioniert. Testen wir noch einmal, ob unsere Firewalls tatsächlich installiert sind.

[[Schritt 4 - Testen unserer Firewalls]] == Schritt 4 - Testen unserer Firewalls

Um unsere Firewalls zu testen, melden wir uns bei einem dritten Server an und scannen unsere Web- und Datenbankserver mit einem Dienstprogramm namensnmap. nmap ist ein Port-Scanner, der unsere Hosts scannt und uns mitteilt, welche Ports offen, geschlossen oder gefiltert sind.

Melden Sie sich bei einem anderen Ubuntu 16.04-Server an, der sich in derselben Region befindet wie Ihre Serverfrontend-01unddatabase-01. Installieren Sie dannnmap:

sudo apt-get update
sudo apt-get install nmap

Verwenden Sie dannnmap, um die öffentliche IP des Webservers zu scannen:

nmap -Pn frontend-01_public_ip
OutputStarting Nmap 7.01 ( https://nmap.org ) at 2017-06-05 17:08 UTC
Nmap scan report for 203.0.113.11
Host is up (0.0022s latency).
Not shown: 997 filtered ports
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 4.54 seconds

Beachten Sie die Ausgabe überfiltered ports. Wenn die Firewall nicht funktioniert, werden diese alsclosed ports angezeigt. Filtered bedeutet, dassnmap nicht einmal eine Verbindung herstellen kann, um festzustellen, ob der Port offen oder geschlossen ist.

Beachten Sie auch, dass unsere SSH-, HTTP- und HTTPS-Ports wie erwartet geöffnet sind.

Als Nächstes scannen wir den Datenbankserver. Stellen Sie sicher, dass Sie die private IP des Droplets verwenden, wenn Sie dies so eingerichtet haben, da dies von der MySQL-Datenbank abgehört wird:

nmap -Pn database-01_private_ip
OutputStarting Nmap 7.01 ( https://nmap.org ) at 2017-06-05 17:21 UTC
Nmap scan report for 198.51.100.20
Host is up (0.0024s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 8.17 seconds

Wir sehen, dass die meisten Ports wie zuvor gefiltert werden. Wir sehen jedoch nur, dass der SSH-Port offen ist und kein MySQL-Port verfügbar ist. Denken Sie daran, dass wir den Datenbankzugriff nur auf die mitfrontend gekennzeichneten Server beschränkt haben. Wechseln Sie zurück zur DigitalOcean-Systemsteuerung und fügen Sie das Tagfrontend zu dem Server hinzu, von dem Sienmap verwenden. Führen Sie dann den Befehl erneut aus:

nmap -Pn database-01_private_ip
OutputStarting Nmap 7.01 ( https://nmap.org ) at 2017-06-05 17:22 UTC
Nmap scan report for 198.51.100.20
Host is up (0.0033s latency).
Not shown: 998 filtered ports
PORT     STATE SERVICE
22/tcp   open  ssh
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 4.46 seconds

Der MySQL-Port wird jetzt als offen angezeigt. Wir haben überprüft, dass beide unserer Server jetzt durch unsere Cloud-Firewall-Regeln geschützt sind. Sie können jetzt die ursprünglichen Firewall-Einstellungen dieses Testservers wiederherstellen, indem Sie zur Systemsteuerung zurückkehren und dasfrontend-Tag des Droplets entfernen.

Fazit

In diesem Tutorial haben wir das Firewall-Setup vonufwdurch eine flexible und leistungsstarke netzwerkbasierte Cloud-Firewall-Konfiguration ersetzt. Weitere Informationen zur Verwendung von Cloud-Firewalls überdoctl oder die DigitalOcean-API finden Sie in den folgenden Artikeln: