====== Comprendre et débuter avec Ansible ====== ===== Pré-requis ===== **ssh** bien configuré et sécure > "Pentesting Guide > "In this guide, I will: Quickly introduce the SSH protocol and implementations.Expose some common configuration mistakes then showcase some attacks on the protocol & implementations.Present some SSH pentesting blue team tools." https://community.turgensec.com/ssh-hacking-guide/ * Upgrade your SSH keys! https://blog.g3rt.nl/upgrade-your-ssh-keys.html * Secure your SSH access https://infosec-handbook.eu/blog/wss1-basic-hardening/ * allow only whitelisted IP addresses to connect * use a non-root account for access and disable root * use keys instead of passwords * only use modern algorithms * enable 2FA for SSH * back up your configuration * (use dedicated hardware to store your keys) ===== Introduction ===== **Pour provisioning et orchestration sans agent installé sur les serveurs cibles avec un lanage ''yaml'' et [[wp>fr:Jinja_(moteur_de_template)|Template Jinja]]**, permet également de faire des migrations **Outil //idempotence//, si on lance deux fois le cahier de jeux :** * la première fois : faire la modification sur servuer pour application de celle-ci * la seconde fois : verifie la configuration et affiche le //ok// ou la différence Un module Ansible environ 15 lignes en python (snippets) qui sera installé à coté du playbook dans ''./library'' dans le cas de choes trop complexe avec ansible que l'on pourrait faire en python. Dans Ansible : * **Le rôle** : sert à packager les actions (idempotentes) et les fichiers statiques et variables par défaut dont on a besoin * La commande ''ansible-galaxy init '' crée le squelette, la structure du role {{screenshot_2020-01-21_ansible_hors_des_sentiers_battus_aurélien_maury_.png}} //ref : https://invidio.us/watch?v=jePp5ZP1n14&autoplay=0&continue=0&dark_mode=true&listen=0&local=1&loop=0&nojs=0&player_style=youtube&quality=dash&thin_mode=false à partir de 29 min 30 sec// * On peut installer plusieurs rôles groupés dans un fichier ''requirements.yml'' puis faire un commande pour rendre disponible et in installer tous ces roles d'un coup ''ansible-galaxy install -r requirements.yml'' ===== Ressources externes ===== * Les [[https://wiki.tchack.xyz/doku.php?id=adminsys:ansible|notes de Jaxom]] * Vidéo : * [[https://invidio.us/watch?v=Jp6sb2_aQOg&autoplay=0&continue=0&dark_mode=true&listen=0&local=1&loop=0&nojs=0&player_style=youtube&quality=dash&thin_mode=false|Conférence "Rodez en libre". "Découverte de Ansible" proposé par Alexis Couronne]] * [[https://invidio.us/watch?v=jePp5ZP1n14&autoplay=0&continue=0&dark_mode=true&listen=0&local=1&loop=0&nojs=0&player_style=youtube&quality=dash&thin_mode=false|Ansible hors des sentiers battus]] (Aurélien Maury), avec configuration ssh persitente lors de la négocitation avec serveur pendant le chargement du playbook Ansible * [[https://video.tedomum.net/videos/watch/8c126aa4-6604-4640-b7cd-de7c2b18ba19|FOSDEM18 - Zero Downtime Deployment with Ansible]] * Blog : * [[https://blog.octo.com/introduction-aux-ansible-content-collections/|Introduction aux Ansible Content Collections]] * [[https://blog.genma.fr/?Ansible-Une-erreur-bete-qui-peut-faire-perdre-du-temps|Ansible - Une erreur bête qui peut faire perdre du temps]] ===== Structures des fichiers ===== Depuis un dossier, par exemple, ''host'' {{screenshot_2020-01-21_découverte_de_ansible.png}} {{screenshot_2020-01-21_découverte_de_ansible_1_.png}} puis les rôles, avec des sous-dossiers, créés avec ''ansible galaxy'' pour chaque rôle {{screenshot_2020-01-21_découverte_de_ansible_2_.png}} ''playbook'' est le fichier passé en paramètre pour point d'entrée pour apllique l'ensemble de la recette, ici pour exmple avec 2 types de recettes {{screenshot_2020-01-21_découverte_de_ansible_3_.png}} - les //hosts// du groupe web qui se connecte via ''ssh'' - via utilisateurs ''root'' - applique les deux rôles ''web'' et ''common'' - Les //hosts// du groupe ''database'' - Via utilisateur ''root'' - applique ''common'' et ''database'' L'indentation est importante pour définir les focntions à appliquer dans le fichier ''yaml'' Notification possible de la mise en application d'une recette via irc, mail, jabber... Pour concevoir une tache à l'inétrieur d'un rôle, oou plusieurs taches - Intallation de ''vim'' - le module utilisé pour installé ''vim'' est ici ''apt'' - L'état désiré du paquet installé, ici ''latest'', dernière version - ''update case'', précision avant d'installer, faire un ''apt-get update'' pour mise à jour - Idem pour ''git'' qui ne nécessite plus ''update'' puisqu'il a été réalisé à la tâche précédente {{screenshot_2020-01-21_découverte_de_ansible_4_.png}} Dans le cas d'installer beaucoup de package on peut utiliser un boucle pour alléger le nombre de taches {{screenshot_2020-01-21_découverte_de_ansible_5_.png}} Il s'agit de passer un liste de packages à installer avec état ''latest'' et ''update'' avant d'installer ==== Vrac de questionnements ==== === le Yaml === Pour le boucle, par exemple ici pour installation, depuis un ''with_item.yml'' - name : Installation de logiciels pour communs apt: name={{ item }} state=latest update-case=yes with_items: - vim - git ou - name : Installation de logiciels pour communs apt: name="{{ item }}" state=latest update-case=yes with_items: - vim - git En gros, objet ou strings Ou alors j'ai fait un erreur 🤔 Il y a ''%%name: "{{ item.name }}"%%'' dans la doc https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html?highlight=loop#standard-loops Le format yaml impose de mettre les ''%%{{ }}%%'' entre quotes. Même si à l'intérieur c'est un objet qui sera dépilé par ansible automatiquement lors de la phase du parsing > "Strings (scalars) are ordinarily unquoted, but may be enclosed in double-quotes ("), or single-quotes (')." https://en.wikipedia.org/wiki/YAML C'est parce que les ''%%{{ }}%%'' sont interpretées en yaml qu'il faut les quoter pour qu'ansible puisse les parser En yaml on utilise '':'' tout le temps. Les ''='' peuvent servir pour tout mettre sur une seule ligne, déconsiellé car assez crade. **Merci <3 Inso pour ton aide** === État d'un logiciel pour install === Dérivé de la question ci-dessus, ''state=present'' semble plus dans la logique d'idempotence que ''state=latest'', et, de plus, si on veut assurer que le systeme soit à jour il faut l'assurer par un autre mecanisme (typiquement unattended-upgrades dans le monde APT) Une discussion en cours apparait mener à des distinctions plus claires entre ''latest'' et ''present'' https://github.com/ansible/ansible-lint/pull/568 **Merci Samuel pour ton aide** === Problème de première connexion === il faut avoir configuré une authentification par clé pour l'utilisateur SSH qu'on utilise La première configuration qu'ansible met en œuvre désactive l'authentification SSH par mot de passe Depuis le système de contrôle (depuis lequel on lance ansible) ''ssh-keygen -o && scp ~/.ssh/id_rsa.pub user@mamachine_cible:~/.ssh/authorized_keys'' avec l'IP de la machine plutôt que son nom === Choix pour clés SSH === sécu des clés, en gros le choix des 'Digital Signature Algorithm' et compatibilité (je dois regarder du coup ecdsa et ansible https://docs.ansible.com/ansible/latest/modules/openssh_keypair_module.html) il faudra vérifier que cela ne casse pas des compatibilités (https://tools.ietf.org/html/rfc4251) entre différents systèmes et aussi des raisonnements sur la robustesse https://www.ssh.com/ssh/keygen