chore:: update
This commit is contained in:
@@ -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
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user