Comment utiliser Ansible et Tinc VPN pour sécuriser votre infrastructure de serveur

introduction

Dans ce tutoriel, nous montrerons comment utiliserAnsible, un outil de gestion de configuration, pour configurer un VPN maillé avecTinc afin de sécuriser les communications réseau entre vos serveurs Ubuntu et CentOS.

Un réseau privé virtuel maillé est particulièrement utile si vos serveurs utilisent un réseau partagé, car il permet à vos serveurs de communiquer comme s'ils étaient isolés sur un réseau véritablement privé. La couche de sécurité supplémentaire fournie par les fonctionnalités d'authentification et de cryptage du VPN protégera la communication réseau de vos services privés (bases de données, clusters Elasticsearch, etc.) contre les accès non autorisés ou les attaques. Si vous utilisez lesprivate networking feature de DigitalOcean, alors l’isolement entre cette fonction de sécurité sera déjà activé pour les serveurs de la même équipe ou compte dans la même région.
Mesh VPN Diagram

La configuration et la maintenance manuelles d'un VPN sur plusieurs serveurs sont difficiles et sujettes aux erreurs, car plusieurs fichiers de configuration et de clés doivent être distribués à tous les membres du VPN. Pour cette raison, un outil de gestion de la configuration doit être utilisé pour toute configuration pratique de VPN maillé dont les membres peuvent changer à un moment donné. Tout outil de gestion de la configuration peut être utilisé, mais ce didacticiel utilise Ansible car il est populaire et facile à utiliser. LePlaybook Ansible utilisé par ce tutoriel,ansible-tinc, a été testé sur les serveurs Ubuntu 14.04 et CentOS 7.

Lecture en arrière-plan

Vous devriez être capable de suivre ce tutoriel et de configurer un VPN maillé sans trop en savoir sur Ansible ou Tinc, car le Playbook inclus effectuera la majeure partie du travail à votre place. Cependant, vous voudrez peut-être vous renseigner sur leur fonctionnement, à un moment donné, afin de comprendre les détails de ce que vous installez.

This Tinc VPN tutorial explique comment installer et configurer manuellement Tinc VPN. En utilisant Ansible pour automatiser le processus, il est beaucoup plus facile à gérer.

How to Install and Configure Ansible fournit une introduction de très haut niveau au fonctionnement d'Ansible. Si vous souhaitez commencer à écrire des Playbooks Ansible pour automatiser les tâches de l'administrateur système, consultezthis tutorial.

Conditions préalables

Machine locale

La machine locale est l'endroit où vous allez exécuter le Ansible Playbook. Cela pourrait être votre machine locale (par exemple portable) ou un autre serveur que vous utilisez pour gérer vos serveurs. Comme mentionné précédemment, il doit pouvoir se connecter à chaque serveur distant en tant queroot.

Ansible 2.0+ doit être installé sur votre ordinateur local. Reportez-vous auxofficial Ansible installation documentation si vous devez l'installer, car le processus d'installation varie en fonction de votre système d'exploitation ou de votre distribution.

Votre machine locale doit également avoir Git installé, vous pouvez donc facilement télécharger une copie du Playbook deansible-tinc. Encore une fois, comme les instructions d'installation dépendent de votre machine locale, reportez-vous auxofficial Git installation guide.

Serveurs distants

Les serveurs distants sont les hôtes que vous souhaitez configurer pour utiliser Tinc VPN. Vous devriez commencer par au moins deux. Pour travailler avec Ansible Playbook, ils doivent être:

[.note] #Note: Il n'est pas possible d'utiliser un autre utilisateur distant pour le moment en raison d'unbug with the Ansible Synchronize module, que le Playbook utilise.
#

Si vous n’avez pas déjà désactivé l’authentification par mot de passe pourroot, vous pouvez le faire en ajoutantPermitRootLogin without-password à votre fichier/etc/ssh/sshd_config, puis en redémarrant SSH.

Si vous utilisez des gouttelettes DigitalOcean qui se trouvent dans le même centre de données, vous devezenable Private Networking sur tous. Cela vous permettra d'utiliser l'interface du réseau privé,eth1, pour la communication VPN cryptée. Le Playbook fourni suppose que chaque nœud VPN utilisera le même nom de périphérique réseau.

Télécharger Ansible-Tinc Playbook

Une fois que vous êtes prêt à commencer, utilisezgit clone pour télécharger une copie du Playbook. Nous allons le cloner dans notre répertoire personnel:

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

Maintenant, passez au répertoireansible-tinc nouvellement téléchargé:

cd ansible-tinc

[.note] #Note: Le reste de ce didacticiel suppose que vous vous trouvez dans le répertoireansible-tinc, sur votre machine locale. Toutes les commandes Ansible doivent être exécutées à partir de ce répertoire. De plus, tous les fichiers référencés, à l'exception de/etc/hosts, sont relatifs à ce chemin, par exemple. hosts fait référence à~/ansible-tinc/hosts.
#

Ensuite, nous allons vous montrer comment utiliser le Playbook pour créer votre réseau privé virtuel virtuel. Si vous connaissez Ansible, vous voudrez peut-être prendre un peu de temps pour parcourir le contenu du Playbook. Essentiellement, il installe et configure un VPN maillé à l'aide de Tinc, et ajoute également des entrées de commodité dans les/etc/hosts de chaque serveur.

Créer un fichier d'inventaire de l'hôte

Avant d'exécuter le Playbook, vous devez créer un fichierhosts contenant des informations sur les serveurs que vous souhaitez inclure dans votre VPN Tinc. Nous allons maintenant examiner le contenu du fichier hosts.

~/ansible-tinc/hosts example

[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]

La première ligne,[vpn], spécifie que les entrées d'hôte directement en dessous font partie du groupe «vpn». Les membres de ce groupe auront le VPN maillé Tinc configuré sur eux.

  • La première colonne est l'endroit où vous définissez le nom d'inventaire d'un hôte, "node01" sur la première ligne de l'exemple, comment Ansible fera référence à l'hôte. Cette valeur est utilisée pour configurer les connexions Tinc et pour générer les entrées/etc/hosts. N'utilisez pas de trait d'union ici, car Tinc ne les prend pas en charge dans les noms d'hôte.

  • vpn_ip est l'adresse IP que le nœud utilisera pour le VPN. Attribuez-le à l'adresse IP que vous souhaitez que le serveur utilise pour ses connexions VPN.

  • ansible_host doit être défini sur une valeur à laquelle votre machine locale peut atteindre le nœud (c.-à-d. une adresse IP réelle ou un nom d'hôte)

Par conséquent, dans l'exemple, nous souhaitons configurer quatre hôtes dans un réseau VPN maillé ressemblant à ceci:

Example Mesh VPN Diagram

Une fois que votre fichierhosts contient tous les serveurs que vous souhaitez inclure dans votre VPN, enregistrez vos modifications. Assurez-vous qu'il ne contient pas d'entrées en double (noms d'hôte, adressesvpn_ip ou valeursansible_host).

À ce stade, vous devez vérifier qu'Ansible peut se connecter à tous les hôtes de votre fichier d'inventaire:

ansible all -m ping

Ils devraient tous répondre avec un message vert «SUCCESS». Si l'une des connexions échoue, recherchez des erreurs dans votre fichier hosts et assurez-vous que tous les serveurs en question répondent aux exigences répertoriées dans lesprerequisites section avant de continuer.

Variables de groupe d'examen

Avant d'exécuter le Playbook, vous souhaiterez peut-être consulter le contenu du fichier/group_vars/all:

/group_vars/all

---

netname: nyc3
physical_ip: "{{ ansible_eth1.ipv4.address }}"

vpn_interface: tun0

vpn_netmask: 255.255.255.0
vpn_subnet_cidr_netmask: 32

Les deux variables les plus importantes sontphysical_ip etvpn_netmask:

  • physical_ip spécifie l'adresse IP à laquelle vous voulez que tinc se lie. Ici, nous utilisons unAnsible Fact pour le définir sur l'adresse IP du périphérique réseaueth1. Sur DigitalOcean,eth1 est l'interface de réseau privé, doncPrivate Networking doit être activé sauf si vous préférez utiliser l'interface de réseau public,eth0, en changeant sa valeur en{{ ansible_eth0.ipv4.address }}

  • vpn_netmask spécifie le masque de réseau qui sera appliqué à l'interface VPN. Par défaut, il est défini sur255.255.255.0, ce qui signifie que chaquevpn_ip est une adresse de classe C qui ne peut communiquer qu’avec d’autres hôtes du même sous-réseau. Par exemple, un10.0.0.x ne pourra pas communiquer avec un hôte10.0.1.x à moins que le sous-réseau ne soit agrandi en changeantvpn_netmask en quelque chose comme255.255.0.0.

[.note] #Note: Les avantages de sécurité du VPN peuvent être étendus à vos serveurs via l'Internet public, mais gardez à l'esprit que la communication aura toujours les mêmes limitations de latence et de bande passante que la connexion non VPN.
#

Voici une explication des autres paramètres:

  • netname spécifie le nom de réseau tinc. Il est défini surnyc3 par défaut.

  • vpn_interface est le nom de l'interface réseau virtuelle que tinc utilisera. C'esttun0 par défaut.

  • vpn_subnet_cidr_netmask est défini sur 32, ce qui indique un sous-réseau à hôte unique (point à point) car nous configurons un VPN maillé. Ne changez pas cette valeur.

Une fois que vous avez terminé d’examiner les variables de groupe, vous devez être prêt à passer à l’étape suivante.

Déployer Tinc VPN

Maintenant que vous avez créé un fichier d’hôtes d’inventaire et examiné les variables de groupe, vous êtes prêt à déployer Tinc et à configurer le VPN sur vos serveurs en exécutant le Playbook.

Depuis le répertoireansible-tinc, exécutez cette commande pour exécuter le Playbook:

ansible-playbook site.yml

Pendant que le Playbook est exécuté, il doit fournir le résultat de chaque tâche exécutée. Si tout est configuré correctement, vous devriez voir plusieurs étatsok etchanged, et zéro étatfailed:

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

S'il n'y a pas de tâches en échec, tous les hôtes du fichier d'inventaire doivent pouvoir communiquer entre eux via le réseau VPN.

Testez le VPN

Connectez-vous à votre premier hôte et envoyez une requête ping au deuxième hôte:

ping 10.0.0.2

Comme le Playbook crée automatiquement des entrées/etc/hosts qui pointent le nom d'hôte de l'inventaire vers l'adresse IP VPN de chaque membre, vous pouvez également faire quelque chose comme ceci (en supposant que l'un de vos hôtes est nomménode02 dans Ansiblehosts):

ping node02

Dans les deux cas, vous devriez voir des réponses ping valides:

[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
...

N'hésitez pas à tester les connexions VPN entre les autres nœuds.

[.note] #Note: Tinc utilise le port655. Si votre test ping ne fonctionne pas, assurez-vous que le pare-feu de chaque nœud autorise le trafic approprié sur le périphérique réseau réel utilisé par le VPN.
#

Une fois vos tests terminés, votre réseau VPN maillé est prêt à être utilisé!

Configurer les services et les applications

Maintenant que votre VPN maillé est configuré, vous devez vous assurer de configurer vos services et applications dorsaux pour l’utiliser (le cas échéant). Cela signifie que tous les services qui devraient communiquer via le VPN doivent utiliser les adresses IP VPN appropriées (vpn_ip) au lieu de l'adresse IP privée normale.

Par exemple, supposons que vous exécutiez une pile LEMP avec Nginx surnode01 et une base de données MySQL surnode02. MySQL doit être configuré pour se lier à l'adresse IP VPN10.0.0.2, l'application PHP doit se connecter à la base de données à10.0.0.2, et Nginx doit écouter sur192.0.2.55 (adresse IP publique de node01).

Pour un autre exemple, sinode01,node02 etnode03 sont des nœuds dans un cluster Elasticsearch, Elasticsearch doit être configuré pour utiliser10.0.0.1,10.0.0.2 et10.0.0.3 comme adresses IP du nœud. De même, tous les clients qui se connectent au cluster doivent également utiliser les adresses VPN.

Considérations sur le pare-feu

Vous devrez peut-être mettre à jour vos règles de pare-feu pour autoriser le trafic sur le périphérique réseau VPN, «tun0» ou les adresses IP VPN.

Comment ajouter ou supprimer des serveurs

Ajouter de nouveaux serveurs

Tous les serveurs répertoriés dans le groupe[vpn] du fichierhosts feront partie du VPN. Pour ajouter de nouveaux membres VPN, ajoutez simplement les nouveaux serveurs au groupe[vpn] puis relancez le Playbook:

ansible-playbook site.yml

Supprimer des serveurs

Pour supprimer des membres VPN, déplacez les entréeshosts des serveurs que vous souhaitez supprimer sous le groupe[removevpn] vers le bas du fichier.

Par exemple, si nous voulions supprimernode04, le fichierhosts ressemblerait à ceci:

hôtes - supprimer node04 du 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

Enregistrez le fichier hosts. Notez quevpn_ip est facultatif et inutilisé pour les membres du groupe[removevpn].

Puis relancez le Playbook:

ansible-playbook site.yml

Cela arrêtera Tinc et supprimera la configuration de Tinc et les fichiers de clé d'hôte des membres du groupe[removevpn], les supprimant du VPN.

Notez que la suppression d'hôtes du VPN entraînera des fichiers hôtes tinc orphelins et des entrées / etc / hosts sur les membres VPN restants. Cela ne devrait affecter rien, sauf si vous ajoutez ultérieurement de nouveaux serveurs au VPN mais réutilisez les noms retirés du service. Supprimez les entrées/etc/hosts appropriées sur chaque serveur, si cela vous pose un problème.

Conclusion

Votre infrastructure de serveur devrait maintenant être sécurisée par un réseau VPN maillé, en utilisant Tinc et Ansible! Si vous avez besoin de modifier le playbook pour répondre à vos besoins spécifiques, n'hésitez pas àfork it on GitHub.

Bonne chance!