====== Reaction le nouveau fail2ban ======
===== Contexte =====
Lorsque vous avez un serveur accessible sur internet, il est vraiment indispensable de contrôler qui y a accès et comment. Depuis des années j'utilise l'excellent outil [[fr:security:iptables|iptables]] d'une façon très restrictive. Mais je suis tombé sur un cas limite que je propose de découvrir ensemble...
===== Architecture =====
J'ai conçu cette architecture d'accès pour me connecter en SSH à mon serveur distant.
{{ :fr:security:architecture-one-server-access-fr.png?direct&600 |Architecture avec un seul serveur}}
J'ai configuré [[fr:security:iptables|iptables]] sur mon serveur de la façon la plus restrictive que je connaisse d'un point de vue réseau: uniquement deux IP publiques ont accès en SSH au serveur. Cela fonctionne très bien. Mais avec ce design il y a un cas limite. En effet, mes FAI ((Fournisseurs d'Accès Internet)) me fournissent des IP dynamiques. Elles peuvent donc changer sans préavis même si cela n'est pas arrivé une seule fois en 3 ans (( ne jamais dire jamais )).
J'ai accepté ce risque en gardant en tête ces deux idées:
- Comme mes IPs ne changent pas très souvent et que j'utilise deux FAI différents alors la probabilité que les deux changent en même temps est faible. Je me disais que si une IP changeait alors il me resterait la deuxième pour remettre à jour les restrictions d'accès.
- Dans le pire scénario où les deux IP changeraient en même temps, je pourrais toujours utiliser la console d'administration d'urgence de mon hébergeur pour accéder à une console root de mon serveur et changer les restrictions d'accès d'[[fr:security:iptables|iptables]].
===== Les probabilités gagnent toujours =====
Un jour, l'un de mes FAI a coupé mon accès à internet pour plusieurs jours. Aucun problème, j'avais toujours accès à mon serveur avec le second FAI. Mais le matin suivant, mauvaise surprise: tous mes rapports automatiques de sauvegarde me sont apparus en erreur (( oui j'utilise mon serveur en tant que backup )). Mon deuxième FAI avait décidé dans la nuit de changer mon IP (( ils ont choisi de libérer un sous-réseau d'IPv4 trop cher pour un autre plus petit et moins cher )).
Alors aux grands maux les grands remèdes, j'essaie d'utiliser la console d'urgence de mon hébergeur. Et là, triste de constater qu'il n'offrait plus ce service.
Résultat des courses, j'ai perdu accès à mon serveur pendant plusieurs jours. J'ai donc "profité" de ce temps pour revoir mon design avec quelque chose de plus robuste. C'est ainsi que [[https://fr.wikipedia.org/wiki/Fail2ban|fail2ban]] m'est revenu en tête et encore mieux, je me suis souvenu qu'une personne membre du [[https://www.chatons.org/|CHATONS]] [[https://picasoft.net|Picasoft]] était en train de travailler sur l'outil parfait pour moi: [[https://blog.ppom.me/fr-reaction/|reaction]].
===== Nouvelle architecture =====
Dans cette nouvelle mouture, j'ai choisi d'introduire un [[https://fr.wikipedia.org/wiki/Bastion_(informatique)|serveur bastion]] dédié à SSH et qui serait protégé par [[https://blog.ppom.me/fr-reaction/|reaction]].
{{ :fr:security:architecture-one-server-access-with-bastion-fr.png?direct&600 |Architecture avec un serveur bastion SSH}}
===== Pourquoi pas Fail2ban ? =====
Et bien pour ma part, j'ai choisi d'utiliser [[https://blog.ppom.me/fr-reaction/|reaction]] plutôt que [[https://fr.wikipedia.org/wiki/Fail2ban|fail2ban]] pour deux raisons principales:
- Fail2ban est un vieux logiciel avec peu de nouvelles fonctionnalités.
- Reaction utilise des technologies récentes et est très efficace. Et cerise sur le gâteau, il a un but très important pour moi: fournir/s'appuyer sur une fédération d'IPs bannies.
Comme une bonne image vaut mille mots, je vous propose celle-ci réalisée par [[https://ptilouk.net/|Gee]].
{{ :fr:security:bd-reaction-francais.png?direct&600 |Reaction le nouveau Fail2ban}}
===== Retour d'expérience =====
J'utilise l'outil depuis quelques semaines et j'en suis très satisfait.
Prenez quelques minutes pour le tester vous-même 8-).
==== Utilisation ====
Le service est actif depuis 2 semaines et 2 jours et l'utilisation mémoire est très basse.
{{ :en:security:reaction-usage-for-2-weeks.png?direct&600 |Reaction systemctl status}}
==== Ansible playbook ====
Voici mon playbook ansible pour configurer reaction sur mon serveur. Ce n'est pas parfait mais cela peut permettre de tester facilement.
- name: install packages required to have logs
package:
name: "{{ item }}"
state: latest
with_items:
- iptables
- iptables-persistent
- logrotate
- rsyslog
become: True
- name: stop reaction if running
service:
name: reaction.service
state: stopped
become: True
ignore_errors: yes
- name: download binary
ansible.builtin.get_url:
url: https://static.ppom.me/reaction/releases/v1.4.1/reaction
dest: /usr/local/bin/reaction
mode: '0755'
become: True
- name: copy systemd file
copy:
src: files/reaction.service
dest: /etc/systemd/system/reaction.service
owner: root
group: root
mode: 0700
become: True
- name: copy reaction.yml
copy:
src: files/reaction.yml
dest: /etc/reaction.yml
owner: root
group: root
mode: 0755
become: True
- name: reload daemon
command: "systemctl daemon-reload"
become: True
- name: enable reaction
command: "systemctl enable reaction.service"
become: True
- name: restart reaction
service:
name: reaction.service
state: restarted
become: True
et la configuration pour les banissements via logs SSH selon la [[https://reaction.ppom.me/filters/ssh.html|documentation officielle]]
patterns:
ip:
regex: '(?:(?:[0-9]{1,3}\.){3}[0-9]{1,3})'
streams:
ssh:
cmd: ['tail', '-F', '/var/log/auth.log']
filters:
fail:
regex:
- 'authentication failure;.*rhost='
- 'Connection (reset|closed) by (authenticating|invalid) user .* '
- 'Failed password for .* from '
retry: 3
retryperiod: '3h'
actions:
ban:
cmd: ['iptables', '-w', '-A', 'reaction', '-s', '', '-j', 'DROP']
unban:
cmd: ['iptables', '-w', '-D', 'reaction', '-s', '', '-j', 'DROP']
after: '24h'
start:
- [ 'iptables', '-w', '-N', 'reaction' ]
- [ 'iptables', '-w', '-I', 'INPUT', '-p', 'all', '-j', 'reaction' ]
stop:
- [ 'iptables', '-w', '-D', 'INPUT', '-p', 'all', '-j', 'reaction' ]
- [ 'iptables', '-w', '-F', 'reaction' ]
- [ 'iptables', '-w', '-X', 'reaction' ]
et le service
[Install]
WantedBy=multi-user.target
[Service]
ExecStart=/usr/local/bin/reaction start -c /etc/reaction.yml
StateDirectory=reaction
RuntimeDirectory=reaction
WorkingDirectory=/var/lib/reaction
Ce code se base sur ceux fournis par le blog officiel de [[https://blog.ppom.me/fr-reaction/|reaction]].
===== Conclusion =====
Cet outil est une très bonne initiative que tout le monde devrait suivre. Au moins prenez le temps de l'essayer. La personne derrière ce projet s'investit réellement dedans et il me fait plaisir de la soutenir dans ce bel objectif d'avoir un internet plus sûr.