Le livre "Linux en action"

image Salut, habrozhiteli! Dans le livre, David Clinton décrit 12 projets du monde réel, notamment l'automatisation d'un système de sauvegarde et de récupération, la configuration d'un cloud de fichiers de style Dropbox personnel et la création de votre propre serveur MediaWiki. Avec des exemples intéressants, vous découvrirez la virtualisation, la reprise après sinistre, la sécurité, la sauvegarde, le déploiement de DevOps et le dépannage des problèmes système. Chaque chapitre se termine par un examen des recommandations pratiques, un glossaire de nouveaux termes et des exercices.

Extrait "10.1. Création d'un tunnel OpenVPN »


Dans ce livre, j'ai déjà beaucoup parlé du chiffrement. SSH et SCP peuvent protéger les données transmises via des connexions à distance (chapitre 3), le cryptage des fichiers vous permet de protéger les données lorsqu'elles sont stockées sur le serveur (chapitre 8), et les certificats TLS / SSL peuvent protéger les données lors de la transmission entre les sites et les navigateurs clients (chapitre 9). Mais parfois, vos données nécessitent une protection dans un plus large éventail de connexions. Par exemple, il est possible que certains membres de votre équipe doivent travailler sur la route et se connecter au réseau via le Wi-Fi via des points d'accès publics. Vous ne devez certainement pas supposer que tous ces points d'accès sont sûrs, mais vos employés ont vraiment besoin d'un moyen de se connecter aux ressources de l'entreprise - auquel cas un VPN vous aidera.

Un tunnel VPN correctement conçu fournit une connexion directe entre les clients distants et le serveur de manière à masquer les données lorsqu'elles sont transmises sur un réseau non sécurisé. Et alors? Vous avez déjà vu de nombreux outils qui peuvent le faire avec le cryptage. La vraie valeur d'un VPN est qu'en ouvrant un tunnel, vous pouvez connecter des réseaux distants comme s'ils étaient tous ensemble locaux. Dans un sens, vous utilisez une solution de contournement.

En utilisant un tel réseau étendu, les administrateurs peuvent effectuer leur travail sur leurs serveurs de n'importe où. Mais, plus important encore, une entreprise avec des ressources réparties sur plusieurs succursales peut les rendre toutes visibles et accessibles à tous les groupes qui en ont besoin, où qu'ils se trouvent (Fig. 10.1).

Le tunnel lui-même ne garantit pas la sécurité. Mais l'une des normes de chiffrement peut être incluse dans la structure du réseau, ce qui augmente considérablement le niveau de sécurité. Les tunnels créés à l'aide du package OpenVPN open source utilisent le même cryptage TLS / SSL que vous avez déjà lu. OpenVPN n'est pas la seule option disponible pour le tunneling, mais l'une des plus célèbres. On pense qu'il est légèrement plus rapide et plus sûr qu'un autre protocole de tunneling de couche 2 qui utilise le cryptage IPsec.

Voulez-vous que tous les membres de votre équipe communiquent en toute sécurité entre eux sur la route ou dans différents bâtiments? Pour ce faire, vous devez créer un serveur OpenVPN pour permettre le partage d'application et l'accès à l'environnement de réseau local du serveur. Pour que cela fonctionne, il suffit de démarrer deux machines virtuelles ou deux conteneurs: l'un pour agir en tant que serveur / hôte et l'autre pour le client. La création d'un VPN n'est pas un processus facile, il vaut donc probablement la peine de prendre quelques minutes pour avoir une vue d'ensemble.

image

10.1.1. Configuration du serveur OpenVPN


Avant de commencer, je vous donnerai des conseils utiles. Si vous allez tout faire vous-même (et je vous le recommande vivement), vous constaterez probablement que vous travaillez avec plusieurs fenêtres de terminal ouvertes sur le bureau, chacune étant connectée à sa machine. Il y a un risque qu'à un moment donné vous entriez la mauvaise commande dans la fenêtre. Pour éviter cela, vous pouvez utiliser la commande hostname pour changer le nom de la machine affiché sur la ligne de commande en quelque chose qui vous indiquera clairement où vous êtes. Dès que vous effectuez cette opération, vous devrez quitter le serveur et vous reconnecter pour que les nouveaux paramètres prennent effet. Voici à quoi ça ressemble:

image

En adhérant à cette approche et en attribuant les noms correspondants à chacune des machines avec lesquelles vous travaillez, vous pouvez facilement suivre où vous êtes.

Après avoir utilisé le nom d'hôte, vous pouvez rencontrer des messages gênants Impossible de résoudre les serveurs OpenVPN-Server lorsque vous exécutez les commandes suivantes. La mise à jour du fichier / etc / hosts avec le nouveau nom d'hôte correspondant devrait résoudre le problème.

Préparation de votre serveur pour OpenVPN


L'installation d'OpenVPN sur votre serveur nécessite deux packages: openvpn et easy-rsa (pour contrôler le processus de génération de la clé de chiffrement). Si nécessaire, les utilisateurs CentOS doivent d'abord installer le dépôt epel-release, comme vous l'avez fait au chapitre 2. Pour pouvoir vérifier l'accès à l'application serveur, vous pouvez également installer le serveur Web Apache (apache2 pour Ubuntu et httpd sur CentOS).

Pendant que vous configurez le serveur, je vous conseille d'activer un pare-feu qui bloque tous les ports sauf 22 (SSH) et 1194 (le port OpenVPN par défaut). Cet exemple illustre comment ufw fonctionnera sur Ubuntu, mais je suis sûr que vous vous souvenez toujours du programme pare-feu CentOS du chapitre 9:

# ufw enable # ufw allow 22 # ufw allow 1194 

Pour autoriser le routage interne entre les interfaces réseau sur le serveur, vous devez décommenter une ligne (net.ipv4.ip_forward = 1) dans le fichier /etc/sysctl.conf. Cela vous permettra de rediriger les clients distants au besoin après leur connexion. Pour faire fonctionner le nouveau paramètre, exécutez sysctl -p:

 # nano /etc/sysctl.conf # sysctl -p 

L'environnement serveur est maintenant entièrement configuré, mais il y a autre chose à faire avant d'être prêt: vous devrez effectuer les étapes suivantes (nous les examinerons plus en détail ci-dessous).

  1. Créez un jeu de clés sur le serveur pour chiffrer l'infrastructure à clé publique (PKI) à l'aide des scripts fournis avec le package easy-rsa. En substance, le serveur OpenVPN agit également comme sa propre autorité de certification (CA).
  2. Préparez les clés appropriées pour le client
  3. Configurer le fichier server.conf pour le serveur
  4. Configurez votre client OpenVPN
  5. Vérifiez votre VPN

Génération de clés de chiffrement


Afin de ne pas vous compliquer la vie, vous pouvez configurer votre infrastructure clé sur la même machine où le serveur OpenVPN est en cours d'exécution. Cependant, les recommandations de sécurité suggèrent généralement d'utiliser un serveur CA distinct pour les déploiements dans un environnement de production. Le processus de génération et d'allocation des ressources de clé de chiffrement à utiliser dans OpenVPN est illustré sur la Fig. 10.2.

image

Lorsque vous avez installé OpenVPN, le répertoire / etc / openvpn / a été créé automatiquement, mais il ne contient encore rien. Les packages openvpn et easy-rsa sont fournis avec des exemples de fichiers de modèle que vous pouvez utiliser comme base pour votre configuration. Pour démarrer le processus de certification, copiez le répertoire du modèle easy-rsa depuis / usr / share / vers / etc / openvpn et accédez au répertoire easy-rsa /:

 # cp -r /usr/share/easy-rsa/ /etc/openvpn $ cd /etc/openvpn/easy-rsa 

Le répertoire easy-rsa contiendra désormais pas mal de scripts. Dans le tableau. 10.1 répertorie les outils que vous utiliserez pour créer des clés.

image

Ces opérations nécessitent des privilèges root, donc via sudo su vous devez devenir root.

Le premier fichier avec lequel vous travaillerez s'appelle vars et contient les variables d'environnement que easy-rsa utilise lors de la génération des clés. Vous devez modifier le fichier pour utiliser vos propres valeurs au lieu des valeurs par défaut qui existent déjà. Voici à quoi ressemblera mon fichier (Listing 10.1).

Listing 10.1. Les principaux fragments du fichier / etc / openvpn / easy-rsa / vars

 export KEY_COUNTRY="CA" export KEY_PROVINCE="ON" export KEY_CITY="Toronto" export KEY_ORG="Bootstrap IT" export KEY_EMAIL="info@bootstrap-it.com" export KEY_OU="IT" 

L'exécution du fichier vars vous permettra de transférer ses valeurs dans l'environnement shell, d'où elles seront incluses dans le contenu de vos nouvelles clés. Pourquoi la commande sudo ne fonctionne-t-elle pas seule? Parce qu'à la première étape, nous éditons le script appelé vars, puis l'appliquons. Application et signifie que le fichier vars transfère ses valeurs à l'environnement shell, d'où elles seront incluses dans le contenu de vos nouvelles clés.

Assurez-vous de réexécuter le fichier à l'aide du nouveau shell pour terminer le processus inachevé. Lorsque cela est fait, le script vous invite à exécuter un autre script, tout nettoyer, pour supprimer tout contenu dans le répertoire / etc / openvpn / easy-rsa / keys /:

image

Naturellement, l'étape suivante consiste à exécuter le script clean-all, suivi de build-ca, qui utilise le script pkitool pour créer le certificat racine. Il vous sera demandé de confirmer les paramètres d'authentification fournis par vars:

 # ./clean-all # ./build-ca Generating a 2048 bit RSA private key 

Vient ensuite le script build-key-server. Puisqu'il utilise le même script pkitool avec le nouveau certificat racine, vous verrez les mêmes questions pour confirmer la création de la paire de clés. Les clés recevront des noms en fonction des arguments que vous passez, qui, sauf si vous démarrez plusieurs VPN sur cet ordinateur, seront généralement des serveurs, comme dans l'exemple:

 # ./build-key-server server [...] Certificate is to be certified until Aug 15 23:52:34 2027 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated 

OpenVPN utilise les paramètres générés par l'algorithme Diffie-Hellman (en utilisant build-dh) pour négocier l'authentification pour les nouvelles connexions. Le fichier créé ici ne doit pas être secret, mais doit être généré à l'aide du script build-dh pour les clés RSA actuellement actives. Si vous créez de nouvelles clés RSA à l'avenir, vous devrez également mettre à jour le fichier en fonction de l'algorithme Diffie-Hellman:

 # ./build-dh 

Vos clés côté serveur seront désormais dans le répertoire / etc / openvpn / easy-rsa / keys /, mais OpenVPN ne le sait pas. Par défaut, OpenVPN recherchera les clés dans / etc / openvpn /, alors copiez-les:

 # cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn # cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn # cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn 

Préparation des clés de chiffrement client


Comme vous l'avez déjà vu, le cryptage TLS utilise des paires de clés correspondantes: l'une est installée sur le serveur et l'autre sur le client distant. Cela signifie que vous aurez besoin de clés client. Notre vieil ami pkitool est exactement ce dont vous avez besoin pour cela. Dans cet exemple, en exécutant le programme dans le répertoire / etc / openvpn / easy-rsa /, nous lui passons l'argument client pour générer des fichiers appelés client.crt et client.key:

 # ./pkitool client 

Les deux fichiers client, ainsi que le fichier ca.crt d'origine, qui se trouve toujours dans le répertoire keys /, doivent maintenant être transférés en toute sécurité vers votre client. En raison de leurs droits d'affiliation et d'accès, cela peut ne pas être si facile. L'approche la plus simple consiste à copier manuellement le contenu du fichier source (et rien que ce contenu) sur le terminal exécuté sur le bureau de votre PC (sélectionnez le texte, faites un clic droit dessus et sélectionnez Copier dans le menu). Collez-le ensuite dans un nouveau fichier avec le même nom que vous créez dans le deuxième terminal connecté à votre client.

Mais n'importe qui peut couper et coller. Au lieu de cela, pensez en tant qu'administrateur, car vous n'aurez pas toujours accès à l'interface graphique, où une opération couper / coller est possible. Copiez les fichiers dans le répertoire personnel de votre utilisateur (afin que l'opération scp distante puisse y accéder), puis utilisez chown pour changer le propriétaire des fichiers de root en un utilisateur non root normal afin que l'action scp distante puisse être effectuée. Assurez-vous que tous vos fichiers sont actuellement installés et accessibles. Vous les déplacerez vers le client un peu plus tard:

 # cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/ # cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/ # cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/ # chown ubuntu:ubuntu /home/ubuntu/client.key # chown ubuntu:ubuntu /home/ubuntu/client.crt # chown ubuntu:ubuntu /home/ubuntu/ca.crt 

Avec un ensemble complet de clés de chiffrement prêtes à l'action, vous devez indiquer au serveur comment vous souhaitez créer un VPN. Cela se fait à l'aide du fichier server.conf.

Réduisez le nombre de frappes

Trop à imprimer? Une extension entre parenthèses aidera à réduire ces six commandes à deux. Je suis sûr que vous pouvez étudier ces deux exemples et comprendre ce qui se passe. Plus important encore, vous pouvez comprendre comment appliquer ces principes à des opérations impliquant des dizaines voire des centaines d'éléments:

 # cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/ # chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}} 


Configuration du fichier server.conf


Comment savoir à quoi devrait ressembler le fichier server.conf? Rappelez-vous le modèle de répertoire easy-rsa que vous avez copié à partir de / usr / share /? Pendant l'installation d'OpenVPN, un fichier de modèle de configuration compressé est resté, que vous pouvez copier dans / etc / openvpn /. Je m'appuierai sur le fait que le modèle a été archivé et je vous présenterai un outil utile: zcat.

Vous savez déjà comment afficher le contenu textuel d'un fichier à l'aide de la commande cat, mais que faire si le fichier est compressé à l'aide de gzip? Vous pouvez toujours décompresser le fichier, puis cat l'affichera volontiers, mais cela représente une ou deux étapes de plus que nécessaire. Au lieu de cela, comme vous l'avez probablement déjà deviné, vous pouvez entrer la commande zcat pour charger le texte décompressé en mémoire en une seule étape. Dans l'exemple suivant, au lieu d'imprimer du texte à l'écran, vous le redirigez vers un nouveau fichier appelé server.conf:

 # zcat \ /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz \ > /etc/openvpn/server.conf $ cd /etc/openvpn 

Nous laissons de côté la documentation complète et utile fournie avec le fichier et voyons à quoi il pourrait ressembler une fois la modification terminée. Notez que le point-virgule (;) indique à OpenVPN de ne pas lire ou exécuter la ligne suivante (Listing 10.2).

image

Passons en revue certains de ces paramètres.

  • Par défaut, OpenVPN fonctionne via le port 1194. Vous pouvez modifier cela, par exemple, pour masquer encore plus vos actions ou pour éviter les conflits avec d'autres tunnels actifs. Étant donné que 1194 nécessite une coordination minimale avec les clients, il est préférable de le faire.
  • OpenVPN utilise le protocole TCP (Transmission Control Protocol) ou le protocole UDP (User Datagram Protocol) pour le transfert de données. TCP peut être un peu plus lent, mais il est plus fiable et plus susceptible d'être compris par les applications s'exécutant aux deux extrémités du tunnel.
  • Vous pouvez dire à dev tun quand vous voulez créer un tunnel IP plus simple et plus efficace qui transmet le contenu des données et rien de plus. Si, en revanche, vous devez connecter plusieurs interfaces réseau (et les réseaux qu'elles représentent) en créant un pont Ethernet, vous devrez sélectionner dev tap. Si vous ne comprenez pas ce que tout cela signifie, utilisez l'argument tun.
  • Les quatre lignes suivantes transmettent les noms OpenVPN des trois fichiers d'authentification sur le serveur et le fichier de paramètres dh2048 que vous avez créé précédemment.
  • La ligne de serveur définit la plage et le masque de sous-réseau qui seront utilisés pour attribuer des adresses IP aux clients lors de la connexion.
  • Le paramètre push optionnel «route 10.0.3.0 255.255.255.0» permet aux clients distants d'accéder à des sous-réseaux privés derrière le serveur. Pour effectuer ce travail, vous devez également configurer le réseau sur le serveur lui-même, afin que le sous-réseau privé connaisse le sous-réseau OpenVPN (10.8.0.0).
  • La ligne port-share localhost 80 vous permet de rediriger le trafic client provenant du port 1194 vers le serveur Web local écoutant sur le port 80. (Cela sera utile si vous avez l'intention d'utiliser le serveur Web pour tester votre VPN.) Cela ne fonctionne que si lorsque le protocole TCP est sélectionné.
  • Les lignes utilisateur nobody et group nogroup doivent être actives - pour ce faire, supprimez les points-virgules (;). Forcer les clients distants à travailler sous personne et nogroup garantit que les sessions sur le serveur ne sont pas privilégiées.
  • log indique que les entrées de journal actuelles remplaceront les anciennes entrées à chaque démarrage d'OpenVPN, tandis que log-append ajoute de nouvelles entrées à un fichier journal existant. Le fichier openvpn.log lui-même est écrit dans le répertoire / etc / openvpn /.

En outre, la valeur client à client est également souvent ajoutée au fichier de configuration afin que plusieurs clients puissent se voir en plus du serveur OpenVPN. Si vous êtes satisfait de votre configuration, vous pouvez démarrer le serveur OpenVPN:

 # systemctl start openvpn 

En raison de la nature changeante de la relation entre OpenVPN et systemd, la syntaxe suivante peut parfois être requise pour démarrer un service: systemctl start openvpn @ server.

Exécuter ip addr pour afficher la liste des interfaces réseau de votre serveur devrait maintenant afficher un lien vers une nouvelle interface nommée tun0. OpenVPN le créera pour servir les clients entrants:

 $ ip addr [...] 4: tun0: mtu 1500 qdisc [...] link/none inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0 valid_lft forever preferred_lft forever 

Vous devrez peut-être redémarrer le serveur avant que tout commence à fonctionner complètement. L'arrêt suivant est l'ordinateur client.

10.1.2. Configuration du client OpenVPN


Traditionnellement, les tunnels sont construits avec au moins deux sorties (sinon nous les appellerions des grottes). Un OpenVPN correctement configuré sur le serveur dirige le trafic vers et depuis le tunnel d'une part. Mais vous avez également besoin d'une sorte de logiciel côté client, c'est-à-dire à l'autre bout du tunnel.

Dans cette section, je vais me concentrer sur la configuration manuelle d'un ordinateur Linux d'un type ou d'un autre pour fonctionner en tant que client OpenVPN. Mais ce n'est pas la seule façon dont cette opportunité est disponible. OpenVPN prend en charge les applications client qui peuvent être installées et utilisées sur les ordinateurs de bureau et portables avec Windows ou macOS, ainsi que sur les smartphones et tablettes basés sur Android et iOS. Voir openvpn.net pour plus de détails.

Le package OpenVPN devra être installé sur l'ordinateur client, comme il a été installé sur le serveur, bien qu'il n'y ait pas besoin d'easy-rsa, car les clés que vous utilisez existent déjà. Vous devez copier le fichier de modèle client.conf dans le répertoire / etc / openvpn / que vous venez de créer. Cette fois, le fichier ne sera pas archivé, donc la commande cp régulière fera parfaitement cette tâche:

 # apt install openvpn # cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf \ /etc/openvpn/ 

La plupart des paramètres de votre fichier client.conf seront assez simples: ils doivent correspondre aux valeurs du serveur. Comme vous pouvez le voir dans l'exemple de fichier suivant, le paramètre unique est distant 192.168.1.23 1194, qui indique au client l'adresse IP du serveur. Encore une fois, assurez-vous qu'il s'agit de l'adresse de votre serveur. Vous devez également forcer l'ordinateur client à authentifier le certificat de serveur pour empêcher une éventuelle attaque de l'homme du milieu. Une façon de procéder consiste à ajouter le serveur de ligne remote-cert-tls (Listing 10.3).

image

Vous pouvez maintenant aller dans le répertoire / etc / openvpn / et extraire les clés de certification du serveur. Remplacez l'adresse IP ou le nom de domaine du serveur dans l'exemple par vos valeurs:

image

Rien d'excitant n'est susceptible de se produire jusqu'à ce que vous exécutiez OpenVPN sur le client. Puisque vous devez passer quelques arguments, vous le ferez à partir de la ligne de commande. L'argument --tls-client indique à OpenVPN que vous agirez en tant que client et que vous vous connecterez à l'aide du chiffrement TLS, et --config pointe vers votre fichier de configuration:

 # openvpn --tls-client --config /etc/openvpn/client.conf 

Lisez attentivement la sortie de la commande pour vous assurer que vous êtes correctement connecté. Si, pour la première fois, quelque chose ne va pas, cela peut être dû à un décalage entre les paramètres entre les fichiers de configuration du serveur et du client ou à un problème de connexion réseau / pare-feu. Voici quelques conseils de dépannage.

  • Lisez attentivement la sortie de l'opération OpenVPN sur le client. Il contient souvent de précieux conseils sur ce qui ne peut pas être effectué exactement et pourquoi.
  • Vérifiez les messages d'erreur dans les fichiers openvpn.log et openvpn-status.log dans le répertoire / etc / openvpn / sur le serveur.
  • Vérifiez les messages liés à OpenVPN et appropriés dans le temps dans les journaux système sur le serveur et le client. (journalctl -ce affichera les entrées les plus récentes.)
  • Assurez-vous que vous disposez d'une connexion réseau active entre le serveur et le client (pour plus de détails, voir le chapitre 14).

À propos de l'auteur


David Clinton est administrateur système, enseignant et écrivain. Il a administré, écrit à ce sujet et créé du matériel de formation pour de nombreuses disciplines techniques importantes, y compris les systèmes Linux, le cloud computing (en particulier AWS) et les technologies de conteneurs telles que Docker. Il a écrit le livre Learn Amazon Web Services in a Month of Lunches (Manning, 2017). Beaucoup de ses didacticiels vidéo peuvent être trouvés sur Pluralsight.com, et des liens vers ses autres livres (sur l'administration Linux et la virtualisation des serveurs) sont disponibles sur bootstrap-it.com .

»Plus d'informations sur le livre sont disponibles sur le site Web de l'éditeur
» Contenu
» Extrait

25% de réduction sur les colporteurs - Linux
Lors du paiement de la version papier du livre, un livre électronique est envoyé par e-mail.

Source: https://habr.com/ru/post/fr461879/


All Articles