Outils pour utilisateurs

Outils du site


anthony_messe:ansible:roles

Lien vers 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 cette page.

Avec des roles

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 :

  • 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
anthony_messe/ansible/roles.txt · Dernière modification: 2018/06/14 13:02 par Anthony Messé