So sichern Sie Ihre Serverinfrastruktur mit Ansible- und Tinc-VPN

Einführung

In diesem Tutorial zeigen wir Ihnen, wie Sie mit * Ansible *, einem Konfigurationsmanagement-Tool, ein Mesh-VPN mit * Tinc * einrichten, um die Netzwerkkommunikation zwischen Ihren Ubuntu- und CentOS-Servern zu sichern.

Ein Mesh-VPN ist besonders nützlich, wenn Ihre Server ein freigegebenes Netzwerk verwenden, da Ihre Server so kommunizieren können, als wären sie in einem wirklich privaten Netzwerk isoliert. Die zusätzliche Sicherheitsstufe, die durch die Authentifizierungs- und Verschlüsselungsfunktionen des VPN bereitgestellt wird, schützt die Netzwerkkommunikation Ihrer privaten Dienstedatenbanken, Elasticsearch-Cluster und mehr vor unbefugtem Zugriff oder Angriffen. Wenn Sie die private networking feature von DigitalOcean verwenden, ist diese Sicherheitsfunktion für Server im selben Team oder bereits aktiviert Konto innerhalb der gleichen Region. + image: https: //assets.digitalocean.com/articles/tinc/ansible-tinc-mesh.png [Mesh VPN-Diagramm]

Die manuelle Konfiguration und Wartung eines VPN über mehrere Server hinweg ist schwierig und fehleranfällig, da mehrere Konfigurations- und Schlüsseldateien auf alle VPN-Mitglieder verteilt werden müssen. Aus diesem Grund sollte ein Konfigurationsverwaltungstool für alle praktischen Mesh-VPN-Setups verwendet werden, deren Mitglieder sich zu einem bestimmten Zeitpunkt ändern können. Jedes Konfigurationsverwaltungstool kann verwendet werden. In diesem Lernprogramm wird jedoch Ansible verwendet, da es beliebt und einfach zu verwenden ist. Das in diesem Tutorial verwendete Ansible-Playbook ansible-tinc wurde auf Ubuntu 14.04- und CentOS 7-Servern getestet.

Hintergrund lesen

Sie sollten in der Lage sein, diesem Tutorial zu folgen und ein Mesh-VPN einzurichten, ohne zu viel über Ansible oder Tinc zu wissen, da das mitgelieferte Playbook den größten Teil der Arbeit für Sie erledigt. Möglicherweise möchten Sie jedoch irgendwann nachlesen, wie sie funktionieren, damit Sie die Details Ihrer Einrichtung verstehen.

Dieses Tinc VPN-Tutorial beschreibt, wie Sie vorgehen müssen Installieren und konfigurieren Sie Tinc VPN manuell. Durch die Automatisierung des Prozesses mit Ansible wird die Verwaltung erheblich vereinfacht.

https://www.digitalocean.com/community/tutorials/installations- und konfigurationsanleitung Level Einführung in die Funktionsweise von Ansible. Wenn Sie Ansible Playbooks schreiben möchten, um Systemadministratoraufgaben zu automatisieren, lesen Sie https://www.digitalocean.com/community/tutorials/how-to-create-ansible-playbooks-to-automate-system-configuration-on- Ubuntu [dieses Tutorial].

Voraussetzungen

Lokale Maschine

Auf dem lokalen Computer wird das Ansible Playbook ausgeführt. Dies könnte Ihr lokaler Computer sein (z. Laptop) oder einen anderen Server, mit dem Sie Ihre Server verwalten. Wie bereits erwähnt, muss es in der Lage sein, eine Verbindung zu jedem Remote-Server als "+ root +" herzustellen.

Auf Ihrem lokalen Computer muss Ansible 2.0+ installiert sein. Informationen zur Installation finden Sie unter official Ansible-Installationsdokumentation, da der Installationsvorgang je nach Betriebssystem oder Distribution unterschiedlich ist.

Auf Ihrem lokalen Computer muss außerdem Git installiert sein, damit Sie problemlos eine Kopie des ansible-tinc Playbook herunterladen können. Da die Installationsanweisungen von Ihrem lokalen Computer abhängen, lesen Sie die official Git installation guide.

Remote-Server

Die Remote-Server sind die Hosts, die Sie für die Verwendung von Tinc VPN konfigurieren möchten. Sie sollten mit mindestens zwei beginnen. Um mit dem Ansible Playbook arbeiten zu können, müssen sie:

Wenn Sie die Kennwortauthentifizierung für "+ root" noch nicht deaktiviert haben, können Sie dazu "+ PermitRootLogin without-password " zu Ihrer " / etc / ssh / sshd_config" -Datei hinzufügen und anschließend SSH neu starten.

Wenn Sie DigitalOcean Droplets verwenden, die sich im selben Datencenter befinden, sollten Sie enable Private Networking auf alle von ihnen. Auf diese Weise können Sie die private Netzwerkschnittstelle "+ eth1 +" für die verschlüsselte VPN-Kommunikation verwenden. Das bereitgestellte Playbook geht davon aus, dass jeder VPN-Knoten denselben Netzwerkgerätenamen verwendet.

Laden Sie Ansible-Tinc Playbook herunter

Wenn Sie bereit sind, können Sie mit "+ Git Clone +" eine Kopie des Playbooks herunterladen. Wir werden es in unser Home-Verzeichnis klonen:

cd ~
git clone https://github.com/thisismitch/ansible-tinc

Wechseln Sie nun in das neu heruntergeladene Verzeichnis + ansible-tinc +:

cd ansible-tinc

Als Nächstes zeigen wir Ihnen, wie Sie mit dem Playbook Ihr Mesh-VPN erstellen. Wenn Sie mit Ansible vertraut sind, sollten Sie sich etwas Zeit nehmen, um den Inhalt des Playbooks zu durchsuchen. Im Wesentlichen installiert und konfiguriert es ein Mesh-VPN mit Tinc und fügt Bequemlichkeitseinträge in die + / etc / hosts + jedes Servers ein.

Erstellen Sie eine Host-Inventardatei

Bevor Sie das Playbook ausführen, müssen Sie eine + hosts + - Datei erstellen, die Informationen zu den Servern enthält, die Sie in Ihr Tinc-VPN aufnehmen möchten. Wir werden jetzt den Inhalt der hosts-Datei durchgehen.

~ / ansible-tinc / hosts Beispiel

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=192.0.2.55
node02 vpn_ip=10.0.0.2 ansible_host=192.0.2.240
node03 vpn_ip=10.0.0.3 ansible_host=198.51.100.4
node04 vpn_ip=10.0.0.4 ansible_host=198.51.100.36

[removevpn]

Die erste Zeile "+ [vpn] +" gibt an, dass die Hosteinträge direkt darunter Teil der Gruppe "vpn" sind. Auf Mitgliedern dieser Gruppe ist das Tinc-Mesh-VPN konfiguriert.

  • In der ersten Spalte legen Sie den Inventarnamen eines Hosts fest, "node01" in der ersten Zeile des Beispiels, wie Ansible auf den Host verweist. Dieser Wert wird verwendet, um Tinc-Verbindungen zu konfigurieren und "+ / etc / hosts +" - Einträge zu generieren. Verwenden Sie hier keine Bindestriche, da Tinc sie in Hostnamen nicht unterstützt

  • "+ vpn_ip +" ist die IP-Adresse, die der Knoten für das VPN verwendet. Weisen Sie dies der IP-Adresse zu, die der Server für seine VPN-Verbindungen verwenden soll

  • + ansible_host + muss auf einen Wert gesetzt werden, bei dem Ihr lokaler Rechner den Knoten erreichen kann (d. h. eine echte IP-Adresse oder ein Hostname)

Aus diesem Grund möchten wir in diesem Beispiel vier Hosts in einem Mesh-VPN konfigurieren, das folgendermaßen aussieht:

Sobald Ihre "+ hosts " - Datei alle Server enthält, die Sie in Ihr VPN aufnehmen möchten, speichern Sie Ihre Änderungen. Stellen Sie sicher, dass es keine doppelten Einträge enthält (Hostnamen, " vpn_ip " - Adressen oder " ansible_host +" - Werte).

Zu diesem Zeitpunkt sollten Sie testen, ob Ansible eine Verbindung zu allen Hosts in Ihrer Inventardatei herstellen kann:

ansible all -m ping

Sie sollten alle mit einer grünen "SUCCESS" -Nachricht antworten. Wenn eine der Verbindungen fehlschlägt, überprüfen Sie Ihre Hosts-Datei auf Fehler und stellen Sie sicher, dass alle fraglichen Server die in der https://www.digitalocean.com/community/tutorials/how-to-use-ansible- aufgeführten Anforderungen erfüllen. und-tinc-vpn-to-Secure-Your-Server-Infrastructure # Voraussetzungen [Abschnitt Voraussetzungen], bevor Sie fortfahren.

Überprüfen Sie die Gruppenvariablen

Bevor Sie das Playbook ausführen, können Sie den Inhalt der Datei + / group_vars / all + überprüfen:

/ group_vars / all

---

netname:
physical_ip: "{{ ansible_.ipv4.address }}"

vpn_interface:

vpn_netmask:
vpn_subnet_cidr_netmask: 32

Die beiden wichtigsten Variablen sind "+ physical_ip " und " vpn_netmask +":

  • + physical_ip + gibt an, an welche IP-Adresse Sie sich binden möchten. Hier nutzen wir einen Ansible Fact, um ihn auf die IP-Adresse des Netzwerkgeräts + eth1 + zu setzen. Bei DigitalOcean ist "+ eth1 " die private Netzwerkschnittstelle. Daher muss _Private Networking_ aktiviert sein, es sei denn, Sie möchten die öffentliche Netzwerkschnittstelle " eth0 " verwenden, indem Sie ihren Wert in " {{ansible_eth0.ipv4.address}}" ändern. + `

  • + vpn_netmask + gibt die Netzmaske an, die auf die VPN-Schnittstelle angewendet wird. Standardmäßig ist "+ 255.255.255.0" eingestellt, was bedeutet, dass jedes "+ vpn_ip " eine Klasse-C-Adresse ist, die nur mit anderen Hosts innerhalb desselben Subnetzes kommunizieren kann. Beispielsweise kann ein " 10.0.0.x " nicht mit einem " 10.0.1.x " - Host kommunizieren, es sei denn, das Subnetz wird durch Ändern von " vpn_netmask " in " 255.255.0.0 +" vergrößert .

Hier ist eine Erläuterung der anderen Einstellungen:

  • + netname + gibt den tinc netnamen an. Es ist standardmäßig auf "+ nyc3 +" eingestellt.

  • + vpn_interface + ist der Name der virtuellen Netzwerkschnittstelle, die tinc verwenden wird. Es ist standardmäßig "+ tun0 +".

  • + vpn_subnet_cidr_netmask + ist auf 32 gesetzt, was auf ein Einzelhost-Subnetz (Punkt-zu-Punkt) hinweist, da wir ein Mesh-VPN konfigurieren. Ändern Sie diesen Wert nicht.

Sobald Sie die Gruppenvariablen überprüft haben, sollten Sie mit dem nächsten Schritt fortfahren.

Stellen Sie Tinc VPN bereit

Nachdem Sie eine Inventar-Hosts-Datei erstellt und die Gruppenvariablen überprüft haben, können Sie Tinc bereitstellen und das VPN auf Ihren Servern einrichten, indem Sie das Playbook ausführen.

Führen Sie im Verzeichnis "+ ansible-tinc +" den folgenden Befehl aus, um das Playbook auszuführen:

ansible-playbook site.yml

Während das Playbook ausgeführt wird, sollte es die Ausgabe jeder ausgeführten Aufgabe bereitstellen. Wenn alles richtig konfiguriert ist, sollten Sie mehrere "+ ok " - und " geänderte " -Status und null " fehlgeschlagene +" -Status sehen:

PLAY RECAP *********************************************************************node01                     : ok=18   changed=15   unreachable=0    failed=0
node02                     : ok=18   changed=15   unreachable=0    failed=0
node03                     : ok=21   changed=19   unreachable=0    failed=0
node04                     : ok=21   changed=19   unreachable=0    failed=0

Wenn keine fehlgeschlagenen Aufgaben vorhanden sind, sollten alle Hosts in der Inventardatei über das VPN-Netzwerk miteinander kommunizieren können.

Testen Sie das VPN

Melden Sie sich bei Ihrem ersten Host an und senden Sie einen Ping an den zweiten Host:

ping 10.0.0.2

Da das Playbook automatisch "+ / etc / hosts " - Einträge erstellt, die den Hostnamen des Inventars auf die VPN-IP-Adresse jedes Mitglieds verweisen, können Sie auch so etwas tun (vorausgesetzt, einer Ihrer Hosts heißt " node02 +" im Ansible " + hosts + `file):

ping node02

In beiden Fällen sollten gültige Ping-Antworten angezeigt werden:

[secondary_label Output:
PING node02 (10.0.0.2) 56(84) bytes of data.
64 bytes from node02 (10.0.0.2): icmp_seq=1 ttl=64 time=1.42 ms
64 bytes from node02 (10.0.0.2): icmp_seq=2 ttl=64 time=1.03 ms
...

Fühlen Sie sich frei, um die VPN-Verbindungen zwischen den anderen Knoten zu testen.

Sobald Sie Ihre Tests abgeschlossen haben, kann Ihr Mesh-VPN verwendet werden!

Konfigurieren Sie Dienste und Anwendungen

Nachdem Sie Ihr Mesh-VPN eingerichtet haben, müssen Sie sicherstellen, dass Ihre Back-End-Dienste und -Anwendungen für die Verwendung konfiguriert sind (sofern zutreffend). Dies bedeutet, dass alle Dienste, die über das VPN kommunizieren sollen, die entsprechenden VPN-IP-Adressen (+ vpn_ip +) anstelle der normalen privaten IP-Adresse verwenden müssen.

Angenommen, Sie führen einen LEMP-Stack mit Nginx auf * node01 * und einer MySQL-Datenbank auf * node02 * aus. MySQL sollte so konfiguriert sein, dass es an die VPN-IP-Adresse "+ 10.0.0.2 " bindet, die PHP-Anwendung sollte unter " 10.0.0.2 " eine Verbindung zur Datenbank herstellen und Nginx sollte " 192.0.2.55 +" (node01s) abhören öffentliche IP-Adresse).

Wenn * node01 *, * node02 * und * node03 * Knoten in einem Elasticsearch-Cluster sind, sollte Elasticsearch für die Verwendung von + 10.0.0.1 +, + 10.0.0.2 + und `+10.0 konfiguriert werden .0.3 + `als IP-Adresse des Knotens. Ebenso sollten alle Clients, die eine Verbindung zum Cluster herstellen, auch die VPN-Adressen verwenden.

Firewall-Überlegungen

Möglicherweise müssen Sie Ihre Firewall-Regeln aktualisieren, um Datenverkehr auf dem VPN-Netzwerkgerät, "tun0" oder den VPN-IP-Adressen zuzulassen.

Hinzufügen oder Entfernen von Servern

Neue Server hinzufügen

Alle Server, die in der Gruppe "+ [vpn] " in der Datei " hosts " aufgeführt sind, sind Teil des VPN. Um neue VPN-Mitglieder hinzuzufügen, fügen Sie einfach die neuen Server zur Gruppe " [vpn] +" hinzu und starten Sie das Playbook erneut:

ansible-playbook site.yml

Server entfernen

Verschieben Sie zum Entfernen von VPN-Mitgliedern die Einträge "+ hosts " der Server, die Sie entfernen möchten, in die Gruppe " [removevpn] +" unten in der Datei.

Wenn wir beispielsweise * node04 * entfernen möchten, sieht die Datei + hosts + folgendermaßen aus:

hosts - entferne node04 von VPN

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=192.0.2.55
node02 vpn_ip=10.0.0.2 ansible_host=192.0.2.240
node03 vpn_ip=10.0.0.3 ansible_host=198.51.100.4

[removevpn]
node04 vpn_ip=10.0.0.4 ansible_host=198.51.100.36

Speichern Sie die Hosts-Datei. Beachten Sie, dass "+ vpn_ip " optional ist und für " [removevpn] +" - Gruppenmitglieder nicht verwendet wird.

Dann starte das Playbook erneut:

ansible-playbook site.yml

Dies stoppt Tinc und löscht die Tinc-Konfigurations- und Host-Schlüsseldateien von den Mitgliedern der Gruppe "+ [removevpn] +" und entfernt sie aus dem VPN.

Beachten Sie, dass das Entfernen von Hosts aus dem VPN zu verwaisten tinc-Hosts-Dateien und / etc / hosts-Einträgen auf den verbleibenden VPN-Mitgliedern führt. Dies sollte keine Auswirkungen haben, es sei denn, Sie fügen dem VPN später neue Server hinzu, verwenden jedoch die stillgelegten Namen erneut. Löschen Sie die entsprechenden "+ / etc / hosts +" - Einträge auf jedem Server, falls dies für Sie ein Problem darstellt.

Fazit

Ihre Serverinfrastruktur sollte jetzt durch ein Mesh-VPN mit Tinc und Ansible gesichert sein! Wenn Sie das Playbook an Ihre speziellen Bedürfnisse anpassen müssen, können Sie es unter fork auf GitHub veröffentlichen.

Viel Glück!