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