Une bonne nouvelle, reaction a sorti une version 2 qui est encore plus efficace et qui est encore moins gourmande. En effet, on passe d'un logiciel en GO à du Rust.
Dans mon cas très simple de sécurisation d'OpenSSH, on a divisé par deux l'utilisation de la mémoire.
Image de fond d'écran par David Revoy CC-BY 4.0
Pour cette occasion j'ai mis à jour mon playbook ansible que je vous partage.
- 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@reaction.jsonnet.service state: stopped become: True ignore_errors: yes - name: download deb package ansible.builtin.get_url: url: https://static.ppom.me/reaction/releases/v2.1.2/reaction_2.1.2-1_amd64.deb dest: /root/reaction.deb mode: '0755' become: True - name: Install .deb package ansible.builtin.apt: deb: /root/reaction.deb become: True - name: copy reaction.jsonnet template: src: "templates/{{ ansible_fqdn }}/reaction.jsonnet" dest: /etc/reaction.jsonnet owner: root group: root mode: 0755 become: True - name: reload daemon command: "systemctl daemon-reload" become: True - name: enable reaction command: "systemctl enable --now reaction@reaction.jsonnet.service" become: True - name: restart reaction service: name: reaction@reaction.jsonnet.service state: restarted become: True
Et le template pour OpenSSH
local banFor(time) = { ban: { cmd: ['iptables', '-w', '-A', 'reaction', '-s', '<ip>', '-j', 'DROP'], }, unban: { after: time, cmd: ['iptables', '-w', '-D', 'reaction', '-s', '<ip>', '-j', 'DROP'], }, }; { patterns: { ip: { regex: @'(([0-9]{1,3}\.){3}[0-9]{1,3})|([0-9a-fA-F:]{2,90})', }, }, 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' ], ], streams: { ssh: { cmd: ['tail', '-n0', '-f', '/var/log/auth.log'], filters: { login: { regex: [ @'authentication failure;.*rhost=<ip>' ], retry: 3, retryperiod: '3h', actions: banFor('48h'), }, }, }, }, }
Je vous invite une nouvelle fois à essayer cette application à la place de fail2ban.