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 Dienstprogrammufw
eingerichtet. 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 vonufw
ist 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:
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:
Machen Sie dasselbe für Ihren Datenbankserver und geben Sie ihm eindatabase-Tag. Die Tags werden in Ihrer Droplet-Liste angezeigt:
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:
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.
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:
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:
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:
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 vonufw
durch 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: