Comment sécuriser l'infrastructure de serveur Web avec les pare-feu cloud DigitalOcean à l'aide de Doctl
Introduction
DigitalOcean Cloud Firewalls fournit un puissant service de pare-feu au niveau du réseau, protégeant vos ressources contre le trafic non autorisé.
Bien que vous puissiez configurer les pare-feu cloud via le panneau de configuration DigitalOcean, lorsque vous avez de nombreux droplets à gérer, que vous avez besoin de scripter un processus ou que vous préférez travailler à partir du terminal, une interface de ligne de commande peut être un meilleur choix.
Dans ce didacticiel, nous allons apprendre à utiliser doctl
—le DigitalOcean Command-Line Client—pour créer et gérer des pare-feu Cloud pour un serveur Web.
Conditions préalables
Pour ce tutoriel, vous aurez besoin de :
doctl
version 1.7.0 installé et authentifié en suivant les instructions d'installation officielles dans le référentiel doctl GitHub. (Utilisez la commandedoctl version
pour vérifier la version dedoctl
que vous utilisez.)- Une clé SSH ajoutée à votre compte DigitalOcean en suivant le tutoriel How To Use SSH Keys with DigitalOcean Droplets.
Nous allons créer une image de pile LAMP (Linux, Apache, MySQL, PHP) en un clic exécutant Ubuntu 16.04, dans la région nyc1, et nous la placerons sur un droplet de 512 Mo. Avant de commencer ce didacticiel, cependant, nous vous recommandons de vous familiariser avec doctl
et les pare-feu cloud en lisant Comment utiliser Doctl, le client de ligne de commande officiel de DigitalOcean et Une introduction à Pare-feu cloud DigitalOcean .
Étape 1 - Configuration du serveur Web
Tout d'abord, nous allons choisir une région pour notre Droplet. Nous utiliserons nyc1 dans ce tutoriel, mais vous pouvez voir toutes les régions et leurs slugs avec la commande suivante :
doctl compute region list
OutputSlug Name Available nyc1 New York 1 true sfo1 San Francisco 1 true ams2 Amsterdam 2 true sgp1 Singapore 1 true lon1 London 1 true nyc3 New York 3 true ams3 Amsterdam 3 true fra1 Frankfurt 1 true tor1 Toronto 1 true sfo2 San Francisco 2 true blr1 Bangalore 1 true
Étant donné que nous ne voulons pas envoyer de mots de passe sur le réseau et que nous voulons réduire la possibilité d'une attaque par force brute, nous allons sécuriser notre serveur Web avec une authentification par clé SSH.
Pour créer un Droplet qui inclut une clé SSH, doctl
nécessite l'empreinte de la clé SSH, que vous pouvez obtenir avec la commande :
doctl compute ssh-key list
OutputID Name FingerPrint 9763174 sammy_rsa your_ssh_key_fingerprint
Copiez l'empreinte de la clé SSH que vous souhaitez utiliser avec votre Droplet.
Maintenant, rassemblons tout en une seule commande qui créera un droplet de 512 Mo nommé web-1 dans la région nyc1, en utilisant une image de pile LAMP en un clic exécutant Ubuntu 16.04 avec notre Clé SSH.
doctl compute droplet create web-1 \ --region nyc1 \ --image lamp-16-04 \ --ssh-keys your_ssh_key_fingerprint \ --size 512mb
La sortie nous donne un aperçu de la Droplet que nous venons de créer, y compris l'ID, le nom, l'adresse IPv4, la mémoire, etc. de la Droplet :
OutputID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags 52059458 web-1 512 1 20 nyc1 Ubuntu LAMP on 16.04 new
Remarque : Vous devrez attendre quelques minutes pour que le processus de provisionnement se termine. Une fois provisionné, le Droplet aura une adresse IPv4 et un statut de active
au lieu de new
.
Utilisez la commande suivante pour vérifier l'état de votre Droplet et, s'il est entièrement provisionné, notez l'ID car nous en aurons besoin lors de l'attribution du pare-feu au Droplet à l'étape 2. Ne dépassez pas cette étape jusqu'à ce que le statut de votre Droplet indique active
.
doctl compute droplet list web-1
OutputID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags 52059458 web-1 203.0.113.1 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
Ensuite, utilisez doctl
pour vous connecter au Droplet via SSH, en activant votre installation LAMP et en obtenant des instructions supplémentaires sur la façon de préparer votre serveur pour une utilisation en production. Si vous obtenez un message d'erreur connection refused
, votre Droplet n'est pas encore prêt. Attendez quelques minutes, puis relancez la commande list
pour vérifier que l'état de votre Droplet est défini sur active
avant de continuer.
doctl compute ssh web-1
Output... ------------------------------------------------------------------------------- Thank you for using DigitalOcean's LAMP Application. LAMP has now been enabled. You can access your LAMP instance at: Your web root is located at /var/www/html and can be seen from http://203.0.113.1 ...
Après avoir configuré le droplet selon vos besoins, quittez la session SSH.
[environment] exit
Enfin, pointez votre navigateur Web vers l'adresse IP du Droplet pour vous assurer que la pile LAMP fonctionne correctement. Vous devriez voir la page d'accueil par défaut de la pile LAMP en un clic de DigitalOcean avec le message : "Veuillez vous connecter à votre droplet via SSH pour configurer votre installation LAMP". Si ce n'est pas le cas, refaites les étapes précédentes pour vous assurer que vous avez activé LAMP et que vous avez correctement copié l'adresse IP de votre Droplet dans votre navigateur.
Étant donné que nous avons déjà terminé la configuration LAMP requise pour ce didacticiel, nous sommes prêts à passer à la protection de Droplet contre le trafic non autorisé.
Étape 2 - Création du pare-feu pour le serveur Web
Pour commencer, nous allons utiliser l'ID Droplet que nous avons obtenu de la commande doctl compute droplet list
à l'étape 1 pour créer un pare-feu Cloud nommé web-firewall
qui autorise les connexions SSH entrantes sur le port 22
. et toutes les connexions sortantes TCP, UDP et ICMP. Cela nous permettra d'administrer le serveur à partir de la ligne de commande tout en permettant à de nombreux services fondamentaux de fonctionner normalement.
Le champ protocol
est obligatoire et doit être défini sur tcp
, udp
ou icmp
, et vous devez inclure une valeur ports
pour tous les protocoles sauf icmp
qui, de par sa spécification [1], n'en nécessite pas.
Le champ address
spécifie quelles adresses IP sont autorisées à accéder à un port donné. Si vous souhaitez autoriser le trafic provenant de toutes les adresses IPv4, utilisez 0:0:0:0/0
, et si vous souhaitez autoriser le trafic provenant de toutes les adresses IPv6, utilisez ::0/0
.
Enfin, chaque pare-feu que vous créez doit avoir au moins une règle, sous l'indicateur --inbound-rules
ou --outbound-rules
, et toutes les valeurs doivent être saisies sous forme de listes key:value
séparées par des virgules. Utilisez une chaîne entre guillemets de valeurs séparées par des espaces pour plusieurs règles.
Maintenant, utilisez la commande create
pour créer le pare-feu :
doctl compute firewall create --name web-firewall \ --droplet-ids your_droplet_id \ --inbound-rules "protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0" \ --outbound-rules "protocol:icmp,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:all,address:0.0.0.0/0,address:::/0 protocol:udp,ports:all,address:0.0.0.0/0,address:::/0"
La sortie contient un aperçu de base du nouveau pare-feu cloud. Notez l'ID du pare-feu cloud, car vous l'utiliserez à l'étape 3 pour ajouter des règles supplémentaires au pare-feu.
OutputID Name Status Created At Inbound Rules Outbound Rules Droplet IDs Tags Pending Changes c7b39b43-4fcc-4594-88f2-160a64aaddd4 web-firewall waiting 2017-06-17T21:20:38Z protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0 protocol:icmp,ports:0,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:0,address:0.0.0.0/0,address:::/0 protocol:udp,ports:0,address:0.0.0.0/0,address:::/0 your_droplet_id droplet_id:your_droplet_id,removing:false,status:waiting
Si vous avez besoin de spécifier une plage de ports, utilisez le format suivant :
--inbound-rules "protocol:tcp,ports:8000-8080,address:0.0.0.0/0,address:::/0"
Vous pouvez également utiliser le drapeau droplet_id
au lieu du drapeau address
. Cela peut être particulièrement utile dans les configurations qui impliquent plusieurs gouttelettes communiquant entre elles.
--inbound-rules "protocol:tcp,ports:8000-8080,droplet_id:your_droplet_id"
De plus, vous pouvez combiner plusieurs champs address
ou droplet_id
en une seule règle, comme :
--inbound-rules "protocol:tcp,ports:8000-8080,droplet_id:your_first_droplet_id,droplet_id:your_second_droplet_id"
À ce stade, confirmez que le pare-feu Cloud fonctionne correctement en pointant votre navigateur Web vers l'adresse IP du Droplet. Vous devriez voir un message indiquant que le site n'est plus accessible. Si vous ne le faites pas, revérifiez la sortie de la commande précédente create
pour vous assurer que vous n'avez manqué aucun message d'erreur.
Enfin, même si notre règle entrante devrait déjà autoriser SSH, nous allons la vérifier en utilisant doctl
.
doctl compute ssh web-1
Si vous ne parvenez pas à vous connecter au Droplet, la série de tutoriels Comment dépanner SSH vous aidera à diagnostiquer le problème.
Une fois que vous avez réussi à vous connecter au Droplet, quittez la session SSH :
[environment] exit
Comme nous avons maintenant vérifié que le Cloud Firewall fonctionne correctement, nous allons ajouter une règle supplémentaire pour autoriser le trafic entrant vers le serveur Web.
Étape 3 - Ajout de règles supplémentaires
En utilisant l'ID de pare-feu que nous avons obtenu de la commande doctl compute firewall create
à l'étape 2, nous allons maintenant ajouter une règle pour autoriser le trafic TCP entrant pour Apache sur le port 80
.
Nous utiliserons la commande add-rules
, qui nécessite un ID de pare-feu et au moins une règle. Les règles sont spécifiées à l'aide des drapeaux --outbound-rules
et --inbound-rules
, comme à l'étape 2.
doctl compute firewall add-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \ --inbound-rules "protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0"
Si vous avez besoin de HTTPS, autorisez le trafic TCP entrant sur le port 443
.
doctl compute firewall add-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \ --inbound-rules "protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0"
Si elle réussit, cette commande ne produira aucune sortie. Si vous recevez un message d'erreur, suivez les instructions à l'écran pour diagnostiquer le problème.
Maintenant, redirigez votre navigateur Web vers l'adresse IP de votre Droplet. Cette fois, vous devriez voir à nouveau la page de destination par défaut de la pile LAMP en un clic de DigitalOcean. Si ce n'est pas le cas, vérifiez que vous avez correctement copié votre adresse IP dans votre navigateur Web, puis refaites les étapes précédentes.
Si vous souhaitez protéger d'autres serveurs Web, passez à l'étape 4. Sinon, passez à l'étape 5 où nous gérerons les pare-feu cloud avec des balises.
(Facultatif) Étape 4 - Ajout de gouttelettes au pare-feu
Si vous avez plusieurs Droplets, vous pouvez appliquer le même Cloud Firewall à chacun d'eux.
Utilisez la commande add-droplets
pour ajouter des droplets supplémentaires à un pare-feu cloud. Cette commande nécessite un ID de pare-feu Cloud comme argument et utilise l'indicateur droplet-ids
pour déterminer à quelles gouttelettes appliquer le pare-feu.
Si vous ne connaissez pas l'ID du Cloud Firewall, utilisez la commande list
:
doctl compute firewall list
OutputID Name Status Created At Inbound Rules Outbound Rules Droplet IDs Tags Pending Changes c7b39b43-4fcc-4594-88f2-160a64aaddd4 web-firewall succeeded 2017-06-17T21:20:38Z protocol:tcp,ports:22,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0 protocol:icmp,ports:0,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:0,address:0.0.0.0/0,address:::/0 protocol:udp,ports:0,address:0.0.0.0/0,address:::/0 52059458
Vous pouvez également utiliser la commande list
pour obtenir les identifiants des Droplets :
doctl compute droplet list
OutputID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image Status Tags 51146959 test-1 203.0.113.1 512 1 20 nyc1 Ubuntu LAMP on 16.04 active 52059458 web-1 203.0.113.2 512 1 20 nyc1 Ubuntu LAMP on 16.04 active
À l'aide de la commande doctl
suivante, nous ajouterons le droplet test-1
au pare-feu web-servers
, dont l'ID est c7b39b43-4fcc-4594-88f2-160a64aaddd4
:
doctl compute firewall add-droplets c7b39b43-4fcc-4594-88f2-160a64aaddd4 \ --droplet-ids 51146959
Si vous ne recevez aucune sortie, la commande a réussi. Si vous recevez un message d'erreur, suivez les instructions à l'écran pour diagnostiquer le problème.
Et, si vous souhaitez ajouter plusieurs gouttelettes à la fois, séparez-les à l'aide de virgules. Notez qu'il n'y a pas d'espace entre deux identifiants :
--droplet-ids 51146959,52059458
Utilisons maintenant les balises pour faciliter la gestion de Cloud Firewall.
Étape 5 - Utilisation de balises
À ce stade, nous avons ajouté des gouttelettes individuelles au pare-feu cloud, mais les pare-feu cloud prennent également en charge les balises pour une gestion plus facile de plusieurs ressources. Pour mieux comprendre le fonctionnement des balises, consultez Comment baliser les gouttelettes DigitalOcean.
Dans cette étape, nous allons étiqueter les droplets, ajouter des tags au pare-feu cloud, puis supprimer les ID de droplet individuels du pare-feu en gardant les droplets sécurisés au moyen de tags.
Avant de pouvoir ajouter un tag à un droplet à l'aide de doctl
, nous devons d'abord créer le tag avec la commande tag create
:
doctl compute tag create web-servers
OutputName Droplet Count web-servers 0
Une fois le Tag créé, appliquez-le au Droplet à l'aide de la commande droplet tag
. Cette commande prend l'ID de gouttelette comme argument et obtient le nom de la balise à partir du drapeau --tag-name
.
doctl compute droplet tag 52059458 \ --tag-name "web-servers"
Si vous souhaitez sécuriser plusieurs Droplets avec un seul Cloud Firewall, répétez la commande précédente pour chaque Droplet.
Ensuite, ajoutez le Tag au Cloud Firewall avec la commande add-tags
, qui prend l'ID du Firewall comme argument et obtient la liste des noms de Tag à utiliser à partir du drapeau --tag-names
:
doctl compute firewall add-tags c7b39b43-4fcc-4594-88f2-160a64aaddd4 \ --tag-names web-servers
Si vous ne recevez aucune sortie, la commande a réussi. Si vous recevez un message d'erreur, suivez les instructions à l'écran pour diagnostiquer le problème.
Et, si vous avez besoin d'ajouter plusieurs balises, fournissez-les sous forme de liste séparée par des virgules :
--tag-names web-servers,backend-servers
Enfin, nous pouvons supprimer l'ID de la Droplet du pare-feu, car la Droplet fait partie de la balise web-servers
, et cette balise entière est désormais protégée.
doctl compute firewall remove-droplets c7b39b43-4fcc-4594-88f2-160a64aaddd4 \ --droplet-ids 52059458
Répétez l'étape précédente pour chaque Droplet que vous souhaitez sécuriser par Tag uniquement.
Avertissement : La suppression des droplets non tagués du pare-feu cloud laisse les droplets sans protection contre le trafic non autorisé.
Vous disposez maintenant d'un pare-feu cloud entièrement configuré qui protégera votre serveur Web contre le trafic non autorisé. Si vous souhaitez également supprimer une règle du pare-feu, passez à l'étape 6.
(Facultatif) Étape 6 - Suppression des règles du pare-feu
Si vous souhaitez supprimer une règle d'un Cloud Firewall, utilisez la commande remove-rules
.
La commande remove-rules
prend un ID de pare-feu comme argument et les règles sont spécifiées à l'aide des indicateurs --outbound-rules
et --inbound-rules
. Notez que la règle spécifiée doit être exactement la même que la règle qui a été utilisée lors de la création.
doctl compute firewall remove-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \ --inbound-rules protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0
Si vous ne recevez aucune sortie, la commande a réussi. Si vous recevez un message d'erreur, suivez les instructions à l'écran pour diagnostiquer le problème.
Conclusion
Dans ce didacticiel, nous avons utilisé doctl
pour créer des pare-feu Cloud DigitalOcean, ajouter des règles à ces pare-feu, ajouter des gouttelettes supplémentaires aux pare-feu, gérer les pare-feu avec des balises et supprimer des règles des pare-feu.
Pour découvrir d'autres façons d'utiliser les pare-feu cloud, consultez Comment organiser les pare-feu cloud DigitalOcean.
Et, pour en savoir plus sur le dépannage des pare-feu cloud, visitez Comment dépanner les pare-feu DigitalOcean.