Lien vers [[anthony_messe:anthony_messe|l'accueil]] ====== Utiliser les playbooks dans Ansible ====== On va utiliser un playbook pour exécuter toutes les tâches. C'est un fichier qui contient toutes les actions à effectuer (un peu comme un script shell). ===== Avec un seul fichier yml ===== Voir [[anthony_messe:ansible:playbook|cette page]]. ===== Avec des roles ===== Attention, pour que les logs soient récupérés correctement, veillez à ce que [[anthony_messe:banana_pi:logs_des_connexions#configuration_du_serveur|le serveur de logs]] soit correctement configuré Chaque rôle peut être exécuté en l'appelant. Il contient une suite d'instructions, un peu comme une fonction d'un programme. On crée l'arborescence suivante > Le fichier //ansible.retry// est créé automatiquement et ne doit donc pas être créé par vous, tout comme //access_point_one_file.yml//. . ├── access_point_one_file.yml ├── access_point.retry ├── access_point.yml └── roles ├── configure_interfaces │   ├── files │   │   ├── interface_ap │   │   └── interfaces │   └── tasks │   └── main.yml ├── dnsmasq │   ├── files │   │   └── dnsmasq.conf │   └── tasks │   └── main.yml ├── hostapd │   ├── files │   │   └── hostapd.conf │   └── tasks │   └── main.yml ├── iptables │   ├── files │   │   ├── iptables_access_point.service │   │   └── iptables_access_point.sh │   └── tasks │   └── main.yml ├── logs │   ├── files │   │   └── rsyslog.conf │   └── tasks │   └── main.yml ├── ntp │   └── tasks │   └── main.yml ├── reboot │   └── tasks │   └── main.yml ├── tor │   ├── files │   │   └── torrc │   └── tasks │   └── main.yml ├── update_upgrade │   ├── files │   │   └── sources.list │   └── tasks │   └── main.yml └── wifi_tools └── tasks └── main.yml Le dossier roles contient les dossiers suivants : * configure_interfaces * hostapd * tor * wifi_tools * dnsmasq * iptables * reboot * update_upgrade * ntp * logs Qui contiennent eux-mêmes les dossiers suivant : * tasks * files (pas pour tous) Nous n'utilisons que le dossier //tasks// (d'autres répertoires peuvent être utilisés comme //var//, //template//...). Attention, il faut faire attention à échapper les //quote// avec un //antislash// : par exemple //"// devient //\"//. ==== access_point.yml ==== À la racine, le fichier //access_point.yml// contient le code suivant --- - hosts: bpi vars: "wifi_driver": "nl80211" "wlan_interface": "wlx503eaa3d7d6c" ansible_connection: ssh ansible_ssh_user: user ansible_ssh_pass: bonjour ansible_become_method: su ansible_become_user: root ansible_become_pass: bonjour ansible_become: yes roles: - update_upgrade - wifi_tools - hostapd - tor - ntp - configure_interfaces - dnsmasq - iptables - logs - reboot ==== Contenu des dossiers ==== On va maintenant créer un fichier //main.yml// dans le dossier //tasks// de chacun des dossiers créés dans rôle (comme dans l'arborescence plus haut). C'est à dire : * configure_interfaces * hostapd * tor * wifi_tools * dnsmasq * iptables * reboot * update_upgrade Voici le contenu de chaque fichier //main.yml// de chaque dossier > On reprend simplement le code du playbook simple du début === configure_interfaces === --- - name: Suppression du fichier de configuration /etc/network/interfaces file: path: /etc/network/interfaces state: absent - name: Création du fichier de configuration /etc/network/interfaces.d/interfaces copy: src: "{{ role_path }}/files/interfaces" dest: /etc/network/interfaces - name: Création du fichier de configuration /etc/network/interfaces.d/interface_ap copy: src: "{{ role_path }}/files/interface_ap" dest: /etc/network/interfaces.d/interface_ap Dans le dossier /configure_interfaces/files/ créez un fichier interface_ap et collez-y le contenu suivant auto wlx503eaa3d7d6c iface wlx503eaa3d7d6c inet static hostapd /etc/hostapd/hostapd.conf address 10.255.255.254 netmask 255.0.0.0 Dans le dossier /configure_interfaces/files/ créez un fichier interfaces et collez-y le contenu suivant # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet dhcp # This is an autoconfigured IPv6 interface iface eth0 inet6 auto === hostapd === --- - name: Installation du paquet hostapd apt: pkg=hostapd state=installed update_cache=true - name: Suppression du fichier de configuration /etc/hostapd/hostapd.conf file: path: /etc/hostapd/hostapd.conf state: absent - name: Création du fichier de configuration /etc/hostapd/hostapd.conf copy: src: "{{ role_path }}/files/hostapd.conf" dest: /etc/hostapd/hostapd.conf Dans le dossier /hostapd/files/ créez un fichier hostapd.conf et collez-y le contenu suivant #L'interface wifi interface=wlx503eaa3d7d6c #Le SSID (le nom du point d'accès wifi) ssid=🐧 OPEN WIFI 🐧 #Le driver wifi driver=nl80211 #On choisit le channel channel=6 #Mettre le paramètre à "g" pour la bande à 2.4Ghz, et à "a" pour la bande à 5Ghz hw_mode=g #Vous pouvez décommenter les paramètres suivants pour utiliser l'authentification wpa=2 wpa_passphrase=votre_mot_de_passe wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP rsn_pairwise=CCMP #Pour nous permettre d'obtenir la liste des stations connectées ctrl_interface=/var/run/hostapd ctrl_interface_group=0 #On log le trafic logger_syslog=-1 logger_syslog_level=1 logger_stdout=-1 logger_stdout_level=2 # Levels (minimum value for logged events): # 0 = verbose debugging # 1 = debugging # 2 = informational messages # 3 = notification # 4 = warning # -1 = all === tor === --- - name: Install Tor apt: pkg=tor state=installed update_cache=true - name: Suppression du fichier de configuration /etc/tor/torrc file: path: /etc/tor/torrc state: absent - name: Création du fichier de configuration /etc/tor/torrc copy: src: "{{ role_path }}/files/torrc" dest: /etc/tor/torrc Dans le dossier /tor/files/ créez un fichier torrc et collez-y le contenu suivant #Adresse virtualle de Tor (voir le man pour plus d'infos) VirtualAddrNetworkIPv4 10.192.0.0/10 #Pour résoudre les noms de domaine via Tor AutomapHostsOnResolve 1 #Port vers lequel on va rediriger le trafic TransPort 10.255.255.254:9040 #Port vers lequel on va rediriger les requêtes DNS DNSPort 10.255.255.254:5353 === wifi_tools === --- - name: Installation du paquet wireless-tools apt: pkg=wireless-tools state=installed update_cache=true - name: Installation du paquet wpasupplicant apt: pkg=wpasupplicant state=installed update_cache=true === dnsmasq === --- - name: Installation du paquet dnsmasq apt: pkg=dnsmasq state=installed update_cache=true - name: Suppression du fichier de configuration /etc/dnsmasq.conf file: path: /etc/dnsmasq.conf state: absent - name: Création du fichier de configuration /etc/dnsmasq.conf copy: src: "{{ role_path }}/files/dnsmasq.conf" dest: /etc/dnsmasq.conf Dans le dossier /dnsmasq/files/ créez un fichier dnsmasq.conf et collez-y le contenu suivant #L'interface wifi sur laquelle on va distribuer les adresses interface=wlx503eaa3d7d6c #Les interfaces sur lesquelles on ne distribue pas d'adresses no-dhcp-interface=lo, eth0 #La plage d'adresses distribuées dhcp-range=10.0.0.10,10.255.255.250,255.0.0.0,12h #On désactive le serveur DNS de dnsmasq (activé par défaut) port = 0 #On active les logs log-queries log-facility=/var/log/syslog #On donne le serveur DNS (quelle que soit l'adresse, les requêtes seront redirigées vers Tor) dhcp-option=6,10.255.255.254 === iptables === --- - name: Création du script iptables copy: src: "{{ role_path }}/files/iptables_access_point.sh" dest: /usr/local/sbin/iptables_access_point.sh owner: root group: root mode: 01777 - name: Création du fichier service iptables copy: src: "{{ role_path }}/files/iptables_access_point.service" dest: /etc/systemd/system/iptables_access_point.service - name: Activation du service iptables systemd: name: iptables_access_point enabled: yes masked: no Dans le dossier /iptables/files/ créez un fichier iptables_access_point.sh et collez-y le contenu suivant #!/bin/sh #Variables _trans_port="9040" _dns_port="5353" _interface_wifi="wlx503eaa3d7d6c" _tor_uid=`id -u debian-tor` _router="10.255.255.254" #Adresse du router (adresse de la machine ayant le point d'accès wifi) _reseau_wifi="10.0.0.0/8" _interface_phy="eth0" #On efface toutes les règles iptables iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X #On met les policy iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP ip6tables -P INPUT DROP ip6tables -P FORWARD DROP ip6tables -P OUTPUT DROP #On redirige le traffic TCP vers Tor iptables -t nat -A PREROUTING -i $_interface_wifi -p tcp --syn -j REDIRECT --to-ports $_trans_port #On redirige les requêtes DNS vers Tor iptables -t nat -A PREROUTING -i $_interface_wifi -p udp --dport 53 -j REDIRECT --to-ports $_dns_port #On log le trafic entrant iptables -A INPUT -i $_interface_wifi -m state --state NEW -j LOG --log-prefix "New input connection: " #On autorise les requêtes DHCP à entrer iptables -A INPUT -i $_interface_wifi -p udp --dport 67:68 --sport 67:68 -j ACCEPT #On autorise les connexions déja établies iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT #On autorise la boucle locale iptables -A INPUT -d $_router -i $_interface_wifi -p udp -m udp --dport $_dns_port -j ACCEPT #On autorise les requêtes vers le routeur pour le traffic TCP iptables -A INPUT -d $_router -i $_interface_wifi -p tcp -m tcp --dport $_trans_port --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT #On autorise le trafic vers eth0 iptables -A INPUT -i $_interface_phy -j ACCEPT ip6tables -A INPUT -i $_interface_phy -j ACCEPT #On drop le paquet si il n'est pas dans l état new, established, ou related iptables -A OUTPUT -m state --state INVALID -j DROP #On autorise ls connexions déja établies iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT #On autorise les requêtes DHCP à sortir iptables -A OUTPUT -o $_interface_wifi -p udp --dport 67:68 --sport 67:68 -j ACCEPT #On autorise le traffic issu de la carte iptables -A OUTPUT -o $_interface_phy -j ACCEPT ip6tables -A OUTPUT -o $_interface_phy -j ACCEPT Dans le dossier /iptables/files/ créez un fichier iptables_access_point.service et collez-y le contenu suivant [Unit] Description=Setup firewall After=network.target local-fs.target [Service] RemainAfterExit=true ExecStart=/usr/local/sbin/iptables_access_point.sh [Install] WantedBy=multi-user.target === reboot === --- - name: Redémarrage des hosts become: yes shell: sleep 2 && /sbin/shutdown -r now async: 1 poll: 0 === logs === --- - name: Installation du paquet rsyslog-relp apt: pkg=rsyslog-relp state=installed update_cache=true - name: Suppression du fichier de configuration /etc/rsyslog.conf file: path: /etc/rsyslog.conf state: absent - name: Création du fichier de configuration /etc/rsyslog.conf copy: src: "{{ role_path }}/files/rsyslog.conf" dest: /etc/rsyslog.conf Dans le dossier /logs/files/ créez un fichier rsyslog.conf et collez-y le contenu suivant module(load="imuxsock") # provides support for local system logging module(load="imklog") # provides kernel logging support # Use traditional timestamp format. $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # Set the default permissions for all log files. $FileOwner root $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 # Where to place spool and state files $WorkDirectory /var/spool/rsyslog #On charge le module relp (output) module(load="omrelp") #On log avec le protocole relp vers une adresse et un port précis action(type="omrelp" target="192.168.16.11" port="20514" tls="on") === ntp === --- - name: Installation du paquet ntp apt: pkg=ntp state=installed update_cache=true === update_upgrade === --- - name: Suppression du fichier sources.list file: path: /etc/apt/sources.list state: absent - name: Création du fichier sources.list copy: src: "{{ role_path }}/files/sources.list" dest: /etc/apt/sources.list - name: Installation du paquet aptitude apt: pkg=aptitude state=installed update_cache=true - name: Mise à jour de la liste des paquets apt: update_cache=yes - name: Mise à jour des paquets apt: upgrade=yes Dans le dossier /update_upgrade/files/ créez un fichier sources.list et collez-y le contenu suivant deb http://deb.debian.org/debian stretch main contrib non-free deb-src http://deb.debian.org/debian stretch main contrib non-free deb http://deb.debian.org/debian stretch-updates main contrib non-free deb-src http://deb.debian.org/debian stretch-updates main contrib non-free deb http://security.debian.org/debian-security/ stretch/updates main contrib non-free deb-src http://security.debian.org/debian-security/ stretch/updates main contrib non-free Puis comme précédemment, on exécute le fichier ansible ansible-playbook access_point.yml