Lien vers l'accueil
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).
Voir cette page.
Attention, pour que les logs soient récupérés correctement, veillez à ce que 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 :
Qui contiennent eux-mêmes les dossiers suivant :
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 \”.
À 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
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 :
Voici le contenu de chaque fichier main.yml de chaque dossier
On reprend simplement le code du playbook simple du début
---
- 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
---
- 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
---
- 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
--- - 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
---
- 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
---
- 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
--- - name: Redémarrage des hosts become: yes shell: sleep 2 && /sbin/shutdown -r now async: 1 poll: 0
---
- 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")
--- - name: Installation du paquet ntp apt: pkg=ntp state=installed update_cache=true
---
- 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