chore:: update

This commit is contained in:
Xor290
2026-08-07 18:58:50 +02:00
parent ec59d5933b
commit 56aef1fa9b
13 changed files with 301 additions and 71 deletions
+90 -6
View File
@@ -26,22 +26,106 @@
ansible.builtin.iptables:
chain: DOCKER-USER
protocol: tcp
match: multiport
destination_ports: "80,443"
destination_port: "{{ item }}"
jump: DROP
action: insert
comment: "app-firewall: bloque 80/443 hors load-balancer"
comment: "app-firewall: bloque {{ item }} hors load-balancer"
loop:
- "80"
- "443"
- name: Autoriser les connexions 80/443 depuis le load-balancer (VPN)
ansible.builtin.iptables:
chain: DOCKER-USER
protocol: tcp
source: "{{ lb_vpn_ip }}/32"
match: multiport
destination_ports: "80,443"
destination_port: "{{ item }}"
jump: RETURN
action: insert
comment: "app-firewall: autorise 80/443 depuis le load-balancer"
comment: "app-firewall: autorise {{ item }} depuis le load-balancer"
loop:
- "80"
- "443"
- name: Sauvegarder les règles iptables (persistance au reboot)
ansible.builtin.command: netfilter-persistent save
changed_when: false
# Le load-balancer n'a besoin que de faire du reverse-proxy HTTP/HTTPS vers
# prod/replica-prod : il n'a aucune raison de se connecter en SSH à quoi que
# ce soit. On bloque donc son SSH sortant vers toutes les autres machines du
# réseau (chaîne INPUT, en tête de chaîne pour passer avant les ACCEPT VPN
# existants), afin de limiter le rayon d'action en cas de compromission du
# load-balancer (seul hôte exposé publiquement sur 80/443).
- name: Empêcher le load-balancer de se connecter en SSH aux autres machines
hosts: all:!load-balancer
become: true
gather_facts: false
vars:
lb_vpn_ip: "{{ hostvars['load-balancer']['vpn_ip'] }}"
lb_public_ip: "{{ hostvars['load-balancer']['ansible_host'] }}"
tasks:
- name: Installer iptables-persistent
ansible.builtin.apt:
name: iptables-persistent
state: present
update_cache: yes
- name: Bloquer le SSH entrant depuis le load-balancer
ansible.builtin.iptables:
chain: INPUT
protocol: tcp
source: "{{ item }}/32"
destination_port: "22"
jump: DROP
action: insert
rule_num: 1
comment: "app-firewall: bloque SSH depuis le load-balancer"
loop:
- "{{ lb_vpn_ip }}"
- "{{ lb_public_ip }}"
- name: Sauvegarder les règles iptables (persistance au reboot)
ansible.builtin.command: netfilter-persistent save
changed_when: false
# Le replica n'a besoin de parler à bdd-redis-prod que sur le port Postgres
# (5432, réplication). On bloque son SSH vers bdd-redis-prod (chaîne INPUT,
# en tête de chaîne pour passer avant l'ACCEPT VPN existant sur dpt:22) sans
# toucher au port 5432, déjà autorisé pour toute la plage VPN 10.0.0.0/24.
- name: Empêcher le replica de se connecter en SSH à bdd-redis-prod
hosts: bdd-redis-prod
become: true
gather_facts: false
vars:
replica_vpn_ip: "{{ hostvars['replica-prod-uber']['vpn_ip'] }}"
replica_public_ip: "{{ hostvars['replica-prod-uber']['ansible_host'] }}"
tasks:
- name: Installer iptables-persistent
ansible.builtin.apt:
name: iptables-persistent
state: present
update_cache: yes
- name: Bloquer le SSH entrant depuis le replica
ansible.builtin.iptables:
chain: INPUT
protocol: tcp
source: "{{ item }}/32"
destination_port: "22"
jump: DROP
action: insert
rule_num: 1
comment: "app-firewall: bloque SSH depuis le replica"
loop:
- "{{ replica_vpn_ip }}"
- "{{ replica_public_ip }}"
- name: Sauvegarder les règles iptables (persistance au reboot)
ansible.builtin.command: netfilter-persistent save
+19 -54
View File
@@ -1,45 +1,4 @@
---
# Le certificat mln-uber.club n'est pas généré ici : il existe déjà sur prod-uber
# (utilisé par le conteneur waf du docker-compose). On le récupère et on le copie
# vers le load-balancer. Relancer ce playbook après chaque renouvellement du cert
# sur prod-uber pour resynchroniser HAProxy.
- name: Récupérer le certificat mln-uber.club depuis prod-uber
hosts: prod-uber
become: true
gather_facts: false
vars:
# À CONFIRMER : chemin réel du cert sur prod-uber (aucun playbook ne le dépose
# actuellement à cet endroit — à ajuster si différent).
app_cert_dir: "{{ docker_dir }}/certs"
local_cert_sync_dir: /tmp/mln-uber-cert-sync
tasks:
- name: Créer le dossier temporaire local de synchronisation
ansible.builtin.file:
path: "{{ local_cert_sync_dir }}"
state: directory
mode: "0700"
delegate_to: localhost
become: false
- name: Rapatrier fullchain.pem et privkey.pem
ansible.builtin.fetch:
src: "{{ app_cert_dir }}/{{ item }}"
dest: "{{ local_cert_sync_dir }}/{{ item }}"
flat: true
loop:
- fullchain.pem
- privkey.pem
- name: Restreindre les permissions locales de la clé privée
ansible.builtin.file:
path: "{{ local_cert_sync_dir }}/privkey.pem"
mode: "0600"
delegate_to: localhost
become: false
- name: Déploiement HAProxy (load-balancer)
hosts: load-balancer
become: true
@@ -48,7 +7,7 @@
vars:
haproxy_cert_dir: /etc/haproxy/certs
haproxy_cert_path: "{{ haproxy_cert_dir }}/{{ domain_name }}.pem"
local_cert_sync_dir: /tmp/mln-uber-cert-sync
local_cert_sync_dir: ../certs
tasks:
- name: Installer HAProxy
@@ -91,11 +50,24 @@
group: root
mode: "0640"
- name: Ouvrir le port HTTPS dans UFW
ansible.builtin.ufw:
rule: allow
port: "443"
proto: tcp
- name: Installer iptables-persistent
ansible.builtin.apt:
name: iptables-persistent
state: present
update_cache: yes
- name: Autoriser le port HTTPS (443) entrant
ansible.builtin.iptables:
chain: INPUT
protocol: tcp
destination_port: "443"
jump: ACCEPT
action: insert
comment: "haproxy: autorise HTTPS entrant"
- name: Sauvegarder les règles iptables (persistance au reboot)
ansible.builtin.command: netfilter-persistent save
changed_when: false
- name: Déployer la configuration HAProxy
ansible.builtin.template:
@@ -113,13 +85,6 @@
state: started
enabled: yes
- name: Nettoyer les fichiers temporaires locaux
ansible.builtin.file:
path: "{{ local_cert_sync_dir }}"
state: absent
delegate_to: localhost
become: false
handlers:
- name: reload haproxy
ansible.builtin.systemd:
+38
View File
@@ -67,6 +67,44 @@
vpn_private_key: "+E1pcelkLIr0x6FcOofnAWAFr6g5qHu8QHpG1sY6mG4="
tasks:
# ─── Dynamic debug WireGuard ────────────────────────────────────────────
# Le module kernel wireguard ne logge les handshakes/keepalives (utilisés
# par les decoders/rules Wazuh) que si son dynamic debug est activé. Ce
# flag n'est PAS persistant : il retombe à "désactivé" à chaque reboot ou
# rechargement du module, ce qui coupe silencieusement la remontée des
# handshakes vers Wazuh sans toucher au fonctionnement du VPN lui-même
# (constaté : coupure du 18 au 30/07/2026 après un reboot du serveur).
- name: Déployer le service systemd qui réactive le dynamic debug wireguard au boot
ansible.builtin.copy:
dest: /etc/systemd/system/wireguard-dyndbg.service
mode: "0644"
owner: root
group: root
content: |
[Unit]
Description=Active le dynamic debug du module kernel WireGuard (logs handshakes pour Wazuh)
After=wg-quick@wg0.service sys-kernel-debug.mount
Requires=wg-quick@wg0.service
PartOf=wg-quick@wg0.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c 'echo "module wireguard +p" > /sys/kernel/debug/dynamic_debug/control'
[Install]
WantedBy=multi-user.target
register: dyndbg_unit
tags: [vpn, logging]
- name: Activer et démarrer le service wireguard-dyndbg
ansible.builtin.systemd:
name: wireguard-dyndbg.service
daemon_reload: "{{ dyndbg_unit.changed }}"
enabled: yes
state: started
tags: [vpn, logging]
- name: Calculer la clé publique du client à partir de sa clé privée
command: wg pubkey
args: