web-dev-qa-db-fra.com

Meilleures pratiques de sécurité Ansible

Je vais introduire Ansible dans mon centre de données et je recherche des meilleures pratiques de sécurité sur l'emplacement de la machine de contrôle et sur la gestion des clés SSH.

Question 1: la machine de contrôle

Nous avons bien sûr besoin d'une machine de contrôle. La machine de contrôle possède des clés SSH publiques enregistrées. Si un attaquant a accès à la machine de contrôle, il a potentiellement accès à l'ensemble du centre de données (ou aux serveurs gérés par Ansible). Est-il donc préférable d'avoir une machine de contrôle dédiée dans le centre de données ou une machine de télécommande (comme mon ordinateur portable connecté à distance au centre de données)?

Si la meilleure pratique consiste à utiliser mon ordinateur portable (qui pourrait être volé, bien sûr, mais je pourrais avoir mes clés publiques en toute sécurité enregistrées en ligne dans le cloud ou hors ligne sur un appareil portable crypté), que faire si j'ai besoin d'utiliser certaines interfaces Web avec Ansible, comme Ansible Tower, Semaphore, Rundeck ou Foreman qui doit être installé sur une machine centralisée dans le centre de données? Comment le sécuriser et éviter qu'il ne devienne un "point d'attaque unique"?

Question 2: les clés SSH

Supposons que j'ai besoin d'utiliser Ansible pour effectuer certaines tâches qui doivent être exécutées par root (comme l'installation de packages logiciels ou quelque chose comme ça). Je pense que la meilleure pratique n'est pas d'utiliser l'utilisateur root sur des serveurs contrôlés, mais d'ajouter un utilisateur normal pour Ansible avec les autorisations Sudo. Mais, si Ansible doit effectuer presque toutes les tâches, il doit avoir accès à toutes les commandes via Sudo. Alors, quel est le meilleur choix:

  • laissez Ansible utiliser l'utilisateur root (avec sa clé publique enregistrée dans ~/.ssh/authorized_keys
  • créer un utilisateur non privilégié dédié à Ansible avec accès Sudo
  • laisser l'utilisateur Ansible exécuter toutes les commandes via Sudo en spécifiant un mot de passe (ce qui est unique doit être connu de chaque administrateur système qui utilise Ansible pour contrôler les serveurs)
  • laisser l'utilisateur Ansible exécuter toutes les commandes via Sudo sans spécifier de mot de passe
  • d'autres indices?
39
Mat

L'hôte bastion (le centre de contrôle ansible) appartient à un sous-réseau distinct. Il ne doit pas être directement accessible de l'extérieur, il ne doit pas être directement accessible depuis les serveurs gérés!

Votre ordinateur portable est l'appareil le moins sécurisé de tous. Un mail stupide, une vulnérabilité flash stupide, un Wifi invité stupide et il est pwned.

Pour les serveurs, n'autorisez pas du tout l'accès root via ssh. De nombreux audits se moquent de cela.

Pour ansible, laissez chaque administrateur utiliser son propre compte personnel sur chaque serveur cible, et laissez-le Sudo avec des mots de passe. De cette façon, aucun mot de passe n'est partagé entre deux personnes. Vous pouvez vérifier qui a fait quoi sur chaque serveur. C'est à vous de décider si les comptes personnels autorisent la connexion par mot de passe, clé ssh uniquement ou nécessitent les deux.

Pour clarifier ansible ne nécessite pas d'utiliser un seul nom de connexion cible. Chaque administrateur peut et doit avoir un nom de connexion cible personnel.

Remarque: essayez de ne jamais créer un compte appelé Word (comme "ansible" ou "admin" ou "cluster" ou "management" ou "opérateur") s'il a un mot de passe. Le seul bon nom pour un compte qui a un mot de passe est le nom d'un être humain, comme "jkowalski". Seul un être humain peut être responsable des actions effectuées via le compte et responsable de la sécurisation incorrecte de son mot de passe, "ansible" ne peut pas.

17
kubanczyk

> Question 1: la machine de contrôle

Chez Userify (divulgation complète: nous proposons en fait des logiciels pour gérer les clés ssh), nous traitons tout cela en permanence, car nous gérons également le plus grand entrepôt de clés SSH. Nous recommandons généralement une installation locale plutôt que d'utiliser le cloud, car vous avez un contrôle accru, réduisez votre surface, vous pouvez vraiment le verrouiller uniquement sur des réseaux de confiance connus.

La chose importante à retenir est que, dans un système correctement construit comme celui-ci, il ne devrait vraiment pas y avoir de secrets importants pouvant être divulgués à un attaquant. Si quelqu'un conduit un chariot élévateur dans votre centre de données et s'en va avec votre serveur, il n'obtiendra pas grand-chose, à l'exception de certains mots de passe fortement hachés, probablement de certains fichiers fortement cryptés et de certaines clés publiques sans leurs clés privées correspondantes. En d'autres termes, pas tant que ça.

Comme vous le faites remarquer, les vrais vecteurs de menace sont ici ce qui se passe si un attaquant prend le contrôle de cette machine et l'utilise pour déployer ses propres comptes d'utilisateurs et clés (publiques). C'est un risque pour pratiquement toutes les plateformes cloud (ex: Linode). Vous devez vous concentrer plus fortement sur la prévention de l'accès au plan de contrôle, ce qui signifie minimiser la surface d'attaque (exposer seulement quelques ports et verrouiller ces ports autant que possible) et de préférence utiliser un logiciel renforcé contre l'escalade de privilèges et diverses attaques ( Injection SQL, XSS, CSRF, etc.) Activez l'accès 2FA/MFA au plan de contrôle et concentrez-vous sur le verrouillage de ce plan de contrôle autant que possible.

Est-il donc préférable d'avoir une machine de contrôle dédiée dans le centre de données ou une machine de télécommande (comme mon ordinateur portable connecté à distance au centre de données)?

Il est nettement mieux d'avoir une machine de contrôle dédiée dans un centre de données sécurisé, car vous pouvez l'isoler et le verrouiller pour éviter/minimiser les risques de vol ou d'accès non autorisé.

Si la meilleure pratique consiste à utiliser mon ordinateur portable (qui pourrait être volé, bien sûr, mais je pourrais avoir mes clés publiques en toute sécurité enregistrées en ligne dans le cloud ou hors ligne sur un appareil crypté portable), quoi si j'ai besoin d'utiliser certaines interfaces Web avec Ansible, comme Ansible Tower, Semaphore, Rundeck ou Foreman qui doit être installé sur une machine centralisée dans le centre de données?

Vous n'avez pas besoin d'exécuter N'IMPORTE QUELLE interface Web ou plan de contrôle secondaire pour gérer vos clés (même Userify) jusqu'à ce que vous deveniez assez gros pour commencer à rencontrer des problèmes de gestion en raison d'un plus grand nombre d'utilisateurs et de différents niveaux d'autorisation sur tous les serveurs ou nécessitent une prise en main supplémentaire pour vos utilisateurs qui peuvent ne pas avoir la connaissance ou l'accès à Ansible pour mettre à jour les clés. Userify au début n'était pas beaucoup plus qu'un tas de scripts Shell (aujourd'hui ils seraient probablement Ansible!) Et il n'y a rien de mal à cela, jusqu'à ce que vous commenciez à avoir besoin d'un contrôle de gestion supplémentaire et de moyens faciles pour les gens de gérer/faire tourner leur propres clés. (Bien sûr, veuillez consulter Userify si vous arrivez à ce point!)

Comment le sécuriser et éviter qu'il ne devienne un "point d'attaque unique"?

Eh bien, bien sûr, consultez toutes les ressources sur le net pour verrouiller les choses, mais surtout commencez par une fondation sécurisée:

1. Concevez votre solution en pensant à la sécurité dès le début. Choisissez la technologie (c'est-à-dire la base de données ou les langages) qui a traditionnellement eu moins de problèmes, puis codez en toute sécurité. Désinfectez toutes les données entrantes, même des utilisateurs de confiance. La paranoïa est une vertu.

2. Finalement, tout se casse. Minimisez les dégâts lorsque cela se produit: comme vous l'avez déjà souligné, essayez de minimiser la manipulation de matériel secret.

. Restez simple. Ne faites pas les derniers trucs exotiques à moins d'être certain que cela augmentera de façon mesurable et prouvable votre sécurité. Par exemple, nous avons sélectionné X25519/NaCl (libsodium) sur AES pour notre couche de chiffrement (nous chiffrons tout, au repos et en mouvement), car il a été initialement conçu et écrit par une personne de confiance (DJB et al) et a été examiné par World des chercheurs de renom comme Schneier et l'équipe de sécurité de Google. Utilisez des choses qui tendent vers la simplicité si elles sont plus récentes, car la simplicité rend plus difficile la dissimulation de bugs profonds.

4. Répondez aux normes de sécurité. Même si vous ne tombez pas dans un régime de sécurité comme PCI ou la règle de sécurité HIPAA, lisez ces normes et découvrez comment les respecter ou au moins des contrôles de compensation très puissants . Cela vous aidera à vous assurer que vous respectez réellement les "meilleures pratiques".

5. Apportez des tests de pénétration externes/indépendants et exécutez des primes de bogues pour vous assurer que vous suivez ces meilleures pratiques sur une base continue. Tout a l'air génial jusqu'à ce que des personnes intelligentes et très motivées se penchent dessus ... une fois cela terminé, vous aurez une grande confiance en votre solution.


Question 2: les clés SSH Quel est le meilleur choix: laissez Ansible utiliser l'utilisateur root (avec sa clé publique enregistrée dans ~/.ssh/authorized_keys/laisser l'utilisateur Ansible exécuter toutes les commandes via Sudo en spécifiant un mot de passe (ce qui est unique doit être connu de chaque administrateur système qui utilise Ansible pour contrôler les serveurs)

Essayez d'éviter de jamais utiliser des mots de passe sur les serveurs, même pour Sudo. Cela traite des secrets et finira par saper votre sécurité (vous ne pouvez pas vraiment faire varier ce mot de passe Sudo entre les machines très facilement, vous devez stocker quelque part, le mot de passe signifie que vous ne pouvez pas vraiment faire d'automatisation de serveur à serveur, ce qui est exactement ce dont il s'agit. De plus, si vous laissez SSH à ses valeurs par défaut, ces mots de passe peuvent être forcés brutalement, ce qui rend les clés quelque peu dénuées de sens Évitez également l'utilisation de l'utilisateur root dans n'importe quel but, et en particulier la connexion à distance.

Créez un utilisateur non privilégié dédié à Ansible avec accès Sudo/laissez l'utilisateur Ansible exécuter toutes les commandes via Sudo sans spécifier de mot de passe

Exactement. Un utilisateur non privilégié que vous pouvez auditer sur ansible, avec des rôles Sudo. Idéalement, créez un utilisateur standard dédié aux communications de serveur à serveur/ansible avec accès Sudo (sans mot de passe).

... NB, si vous utilisiez Userify, la façon dont je suggérerais de le faire serait de créer un utilisateur Userify pour ansible (vous pouvez également le décomposer par projet ou même groupe de serveurs si vous avez plusieurs machines de contrôle ansible), générer une clé SSH sur le serveur de contrôle et fournissez sa clé publique dans sa page de profil Userify. (Cette zone de texte devient essentiellement /home/ansible/.ssh/authorized_keys). Vous devez garder le compte système ansible séparé des autres comptes système de serveur à serveur tels qu'un compte de sauvegarde à distance, la gestion des secrets, etc. Ensuite, invitez vos humains et ils peuvent également créer et gérer leurs propres clés et tout reste séparé. Mais, tout comme pour verrouiller un serveur de contrôle Ansible, essayez de verrouiller votre serveur Userify (ou la solution que vous déployez) de la même manière.

d'autres indices?

Je pense que vous allez définitivement dans ce sens et posez les bonnes questions. Si vous souhaitez discuter de ce genre de choses, envoyez-moi un e-mail (nom de famille du premier point à userify) et je serais heureux d'avoir une conversation, quelle que soit la direction que vous poursuivez. Bonne chance!

17
Jamieson Becker

Réponse 1: la machine de contrôle

Un peu des deux, vous pouvez utiliser votre ordinateur portable pour vous connecter aux serveurs VIA un hôte bastion. Quelque chose comme:

Host private1
  IdentityFile ~/.ssh/rsa_private_key
  ProxyCommand ssh user@bastion -W %h:%p

Host bastion
  IdentityFile ~/.ssh/bastion_rsa_key

Plus d'informations sur les hôtes bastions

Où vous avez une clé pour le serveur bastion, puis une clé distincte pour l'hôte derrière. (personnellement j'utiliserais gpg-agent/ssh-agent)

Réponse 2: Authentification

Je ne sais pas en quoi les meilleures pratiques spécifiques "ansible" diffèrent des autres meilleures pratiques de connexion ssh Mais non, vous voulez exécuter ansible en tant que vous-même, pas un compte de service et pas un compte root.

Une combinaison des authentifications suivantes:

Autres réflexions:

  • Stockez toujours les secrets/informations privées dans ansible-vault.
  • Ansible ne nécessite pas l'exécution de Sudo/Root, sauf si ce que vous faites nécessite Sudo/root.
  • Ansible peut augmenter les autorisations de différentes manières

Enfin, vous n'avez rien dit sur les fenêtres. Je peux donc seulement supposer que vous n'utilisez pas cela. Cependant, dans ce cas, j'utiliserais l'option déléguée pour que votre ordinateur portable utilise l'hôte bastion (delegate_to: bastion.hostname.fqdn) et kerberos/winrm https avec des tickets kerberos.

Au cas où vous l'auriez manqué, meilleure pratique informatique, ne faites jamais rien en tant que root, utilisez toujours des comptes nommés

5
Jacob Evans