Comment sécuriser l'infrastructure de serveur Web avec les pare-feu cloud DigitalOcean à l'aide de Doctl

De Get Docs
Aller à :navigation, rechercher

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 :

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.