Comment sécuriser une infrastructure de serveur Web avec les pare-feux DigitalOcean Cloud utilisant Doctl

introduction

DigitalOceanCloud Firewalls fournit un service de pare-feu puissant au niveau du réseau, protégeant vos ressources contre le trafic non autorisé.

Bien que vous puissiez configurer Cloud Firewalls via le panneau de configuration DigitalOcean, lorsque vous devez gérer plusieurs droplets, devez scripter un processus ou préférez travailler à partir du terminal, une interface de ligne de commande peut constituer un meilleur choix.

Dans ce didacticiel, nous allons apprendre à utiliserdoctl, lesDigitalOcean Command-Line Client officiels, pour créer et gérer les pare-feu Cloud pour un serveur Web.

Conditions préalables

Pour ce tutoriel, vous aurez besoin de:

Nous allons créer une image de pile LAMP (Linux, Apache, MySQL, PHP) en un clic exécutant Ubuntu 16.04, dans la régionnyc1, et nous la placerons sur un droplet de 512 Mo. Cependant, avant de commencer ce didacticiel, nous vous recommandons de vous familiariser avecdoctl et les pare-feu Cloud en lisantHow To Use Doctl, the Official DigitalOcean Command-Line Client etAn Introduction To DigitalOcean Cloud Firewalls.

[[step-1 -—- setting-up-the-web-server]] == Étape 1 - Configuration du serveur Web

Premièrement, nous choisirons une région pour notre Droplet. Nous utiliseronsnyc1 dans ce didacticiel, 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

Puisque nous ne voulons pas envoyer de mots de passe sur le réseau et que nous voulons réduire la possibilité d'unbrute-force attack, nous sécuriserons 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 dans une seule commande qui créera un droplet de 512 Mo nomméweb-1 dans la régionnyc1, 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 une vue d’ensemble du Droplet que nous venons de créer, y compris son ID, son nom, son adresse IPv4, sa mémoire, etc.:

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

[.note] #Note: Vous devrez attendre quelques minutes pour que le processus d'approvisionnement se termine. Une fois provisionné, le Droplet aura une adresse IPv4 et un état deactive au lieu denew.
#

Utilisez la commande suivante pour vérifier l’état de votre Droplet et, s’il est entièrement configuré, notez-le car nous en aurons besoin lors de l’attribution du pare-feu à Droplet à l’étape 2. Ne passez pas cette étape tant que l’état de votre Droplet n’a pas luactive.

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, utilisezdoctl pour vous connecter au Droplet via SSH, en activant votre installation LAMP et en obtenant des instructions supplémentaires sur la préparation de votre serveur pour une utilisation en production. Si vous obtenez un message d'erreurconnection refused, votre Droplet n'est pas encore prêt. Attendez quelques minutes, puis réexécutez la commandelist pour vérifier que l’état de votre Droplet est défini suractive 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 sur l’adresse IP de Droplet pour vous assurer que la pile LAMP fonctionne correctement. La page d'arrivée par défaut de la pile LAMP DigitalOcean par un clic devrait s'afficher avec le message suivant: «Connectez-vous à votre droplet via SSH pour configurer votre installation LAMP.» Si ce n'est pas le cas, retracez la procédure précédente activé et que vous avez correctement copié l’adresse IP de votre Droplet dans votre navigateur.

Comme nous avons déjà terminé la configuration de LAMP requise pour ce tutoriel, nous sommes prêts à protéger les droplets du trafic non autorisé.

[[step-2 -—- creation-the-firewall-for-the-web-server]] == Étape 2 - Création du pare-feu pour le serveur Web

Pour commencer, nous utiliserons l'ID de droplet que nous avons obtenu de la commandedoctl compute droplet list à l'étape 1 pour créer un pare-feu cloud nomméweb-firewall qui autorise les connexions SSH entrantes sur le port22 et toutes les sorties Connexions TCP, UDP et ICMP. Cela nous permettra d’administrer le serveur à partir de la ligne de commande tout en laissant la possibilité à de nombreux services fondamentaux de fonctionner normalement.

Le champprotocol est obligatoire et doit être défini surtcp,udp ouicmp, et vous devez inclure une valeurports pour tous les protocoles sauficmp qui, par sesspecification, n'en a pas besoin.

Le champaddress spécifie les adresses IP autorisées à accéder à un port donné. Si vous souhaitez autoriser le trafic de toutes les adresses IPv4, utilisez0:0:0:0/0, et si vous souhaitez autoriser le trafic 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 listeskey:value séparées par des virgules. Utilisez une chaîne entre guillemets contenant des valeurs séparées par des espaces pour plusieurs règles.

Maintenant, utilisez la commandecreate 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 Cloud Firewall. Notez l'ID de Cloud Firewall, 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 l'indicateurdroplet_id au lieu de l'indicateuraddress. Cela peut être particulièrement utile dans les configurations impliquant plusieurs Droplets communiquant entre elles.

--inbound-rules "protocol:tcp,ports:8000-8080,droplet_id:your_droplet_id"

Et, vous pouvez combiner plusieurs champsaddress oudroplet_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, vérifiez que Cloud Firewall fonctionne correctement en indiquant votre navigateur Web à l’adresse IP de Droplet. Vous devriez voir un message indiquant que le site n'est plus accessible. Si ce n'est pas le cas, revérifiez le résultat de la commandecreate précédente 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 la vérifierons à l'aide dedoctl.

doctl compute ssh web-1

Si vous ne parvenez pas à vous connecter au Droplet, la série de didacticielsHow To Troubleshoot SSH vous aidera à diagnostiquer le problème.

Une fois que vous êtes connecté au Droplet, quittez la session SSH:

[environment]
exit

Comme nous avons maintenant vérifié que le pare-feu Cloud fonctionne correctement, nous allons ajouter une règle supplémentaire pour autoriser le trafic entrant sur le serveur Web.

[[step-3 -—- ajoutant-additional-rules]] == Étape 3 - Ajout de règles supplémentaires

En utilisant l'ID de pare-feu que nous avons obtenu de la commandedoctl compute firewall create à l'étape 2, nous allons maintenant ajouter une règle pour autoriser le trafic TCP entrant pour Apache sur le port80.

Nous utiliserons la commandeadd-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 indicateurs--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 port443.

doctl compute firewall add-rules c7b39b43-4fcc-4594-88f2-160a64aaddd4 \
    --inbound-rules "protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0"

En cas de succès, cette commande ne produira aucune sortie. Si vous recevez un message d'erreur, suivez les instructions à l'écran pour diagnostiquer le problème.

Maintenant, re-pointez votre navigateur Web sur l’adresse IP de votre Droplet. Cette fois, vous devriez voir la page d'arrivée par défaut de la pile LAMP DigitalOcean par un clic. Si ce n'est pas le cas, vérifiez que vous avez bien copié votre adresse IP dans votre navigateur Web, puis tracez à nouveau 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 allons gérer Cloud Firewalls avec des balises.

[[facultatif-étape-4 -—- ajout de gouttelettes au pare-feu]] == (facultatif) Étape 4 - Ajout de gouttelettes au pare-feu

Si vous possédez plusieurs Droplets, vous pouvez appliquer le même pare-feu Cloud à chacun d'eux.

Utilisez la commandeadd-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'indicateurdroplet-ids pour déterminer à quels droplets appliquer le pare-feu.

Si vous ne connaissez pas l'ID du pare-feu Cloud, utilisez la commandelist:

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 commandelist pour obtenir les ID 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 commandedoctl suivante, nous allons ajouter le droplettest-1 au pare-feuweb-servers, qui a un ID dec7b39b43-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 en utilisant des virgules. Notez qu'il n'y a pas d'espace entre deux ID:

--droplet-ids 51146959,52059458

Maintenant, utilisons les balises pour faciliter la gestion de Cloud Firewall.

[[step-5 -—- using-tags]] == Étape 5 - Utilisation des tags

À ce stade, nous avons ajouté des droplets individuels au pare-feu Cloud, mais ces pare-feu prennent également en charge les balises pour faciliter la gestion de plusieurs ressources. Pour mieux comprendre le fonctionnement des balises, consultezHow To Tag DigitalOcean Droplets.

Au cours de cette étape, nous allons étiqueter les gouttelettes, ajouter des balises au pare-feu Cloud, puis supprimer les ID de gouttelettes individuels du pare-feu afin de sécuriser les gouttelettes au moyen de balises.

Avant de pouvoir ajouter un Tag à un Droplet en utilisantdoctl, nous devons d'abord créer le Tag avec la commandetag create:

doctl compute tag create web-servers
OutputName           Droplet Count
web-servers    0

Une fois la balise créée, appliquez-la au droplet à l'aide de la commandedroplet tag. Cette commande prend l'ID de droplet comme argument et obtient le nom de la balise à partir de l'indicateur--tag-name.

doctl compute droplet tag 52059458 \
    --tag-name "web-servers"

Si vous souhaitez sécuriser plusieurs droplets avec un pare-feu Cloud, répétez la commande précédente pour chaque droplet.

Ensuite, ajoutez le tag au Cloud Firewall avec la commandeadd-tags, qui prend l'ID du pare-feu comme argument et obtient la liste des noms de tag à utiliser à partir de l'indicateur--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 devez 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 du droplet du pare-feu, car le droplet fait partie du tagweb-servers, et ce tag entier est désormais protégé.

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 balise uniquement.

[.Attention]##

Warning: La suppression des Droplets non marqués du Cloud Firewall laisse les Droplets sans protection contre le trafic non autorisé.

Vous avez maintenant un pare-feu Cloud entièrement configuré qui protégera votre serveur Web du trafic non autorisé. Si vous souhaitez également supprimer une règle du pare-feu, passez à l'étape 6.

[[optional-step-6 -—- remove-rules-from-the-firewall]] == (Facultatif) Étape 6 - Suppression de règles du pare-feu

Si vous souhaitez supprimer une règle d'un pare-feu cloud, utilisez la commanderemove-rules.

La commanderemove-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 celle 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, consultezHow To Organize DigitalOcean Cloud Firewalls.

Et, pour en savoir plus sur le dépannage des pare-feu cloud, visitezHow To Troubleshoot DigitalOcean Firewalls.