====== Wordfence (wordpress WAF plugin) ======
Pare-feu d'applications Web ([[/glossaire/WAF]]) pour [[/informatique/wordpress|Wordpress]].
[[https://wordpress.org/plugins/wordfence/|Wordfence plugin]] & [[https://www.wordfence.com|Wordfence Web site]]
Super plugin que je utilise depuis des années sur de nombreux sites.
===== Configuration =====
==== General Wordfence Options ====
Cocher "Bypass the LiteSpeed "noabort" check".
==== Advanced Firewall Options ====
Immediately block IPs that access these URLs:
/.git/*
/.env
/wp-config.php
/wp-content/debug.log
/vendor/phpunit/*
==== Activity Report ====
List of directories to exclude from recently modified file list
wp-content/cache
wp-content/wflogs
wp-content/et-cache
===== Autour de Wordfence =====
* [[https://github.com/kadekjayak/notification-wordfence|kadekjayak/notification-wordfence]] Catch Wordfence email alert and send it to your notification channel (Slack or Telegram)
* [[https://github.com/SentinalMax/LogFence|SentinalMax/LogFence]] Wordfence attack log exporting tool
* [[https://github.com/Paolo-Monti/Firewall-WAF-Wordfence|Paolo-Monti/Firewall-WAF-Wordfence]] qui scanne la datatable de Wordfence et reproduit la liste d'ip bloquées sur iptables. C'est un gain de performance notable.
collection of bad username and file paths for WordFence:
* https://github.com/SimonHayter/Wordfence-Ban-Users-and-URL-list
* https://github.com/itconsulting-live/wordpress-urls-to-block
===== Wordfence -> firewall =====
Connecter Wordfence avec un firewall
* Un plugin Wordpress
* il ne faut pas donner le droit au php du siteweb de manipuler le firewall !
* il faudrait donc créer des données à partir des ''actions'' appelées par WF et scanner ces données avec un daemon/cron pour alimenter le FW
* les ''blocked:wfsn'' et ''blocked:wordfence'' sont-ils tous relayés par les ''actions'' ?
* quelles actions ''wordfence_security_event'' traquées ?
* oui : ''loginLockout'', ''block''
* ??? : ''increasedAttackRate''
* Un daemon/cron qui exploite les DB tables de Wordfence pour reproduire les IPs bloquées en règles pour le FW
* atttention aux évolutions de Wordfence qui pourraient changer le schéma de la DB
* Ou alors une solution qui reste dans la philosophie de Crowdsec:
* générer un fichier de log
* utiliser un scénario pour déclencher les décisions
Les données WF dans la DB
* en synthèse les données ne sont pas disponibles longtemps
* la table ''wfblockediplog'' ne contient que les stats par ip des 30 derniers jours (//champ ''unixday''//)
* la table ''wfhits'' contient par défaut 2000 lignes des attaques
* réglable dans "Tool Options > Live Traffic Options >" avec la combinaison de "Amount of Live Traffic data to store (number of rows)" et "Maximum days to keep Live Traffic data (1-30 days)"
* les actions:
* blocked:wfsn : Blocked by Wordfence Security Network
* blocked:wordfence : Accessed a banned URL, Blocked by login security setting
* learned:waf : "XSS: Cross Site Scripting", "Known malicious User-Agents", "Directory Traversal", "WPGraphQL <= 0.2.3 - Multiple Vulnerable Actions", "Related Posts for WordPress <= 2.0.3 - Reflected Cross-Site Scripting", ...
* lockedOut, loginFailInvalidUsername, loginFailValidUsername, loginOK, logout, lostPassword, scan:detectproxy, user:passwordReset
===== Tech =====
==== WP actions ====
* do_action('wordfence_security_event', '**block**', ['ip', 'reason', 'duration'])
* en rapport avec le ''throttling''
* déclenchée depuis les fonctions ''takeBlockingAction($configVar, $reason)'' et ''do503($secsToGo, $reason, $sendEventToCentral = true)''
* do_action('wordfence_security_event', '**throttle**', ['ip', 'reason', 'duration'])
* déclenchée depuis les fonctions ''takeBlockingAction($configVar, $reason)''
* do_action('wordfence_security_event', '**lostPasswdForm**', ['email', 'ip'])
* sous certaines conditions peut initier un blocage d'ip via l'appel à '''lockOutIP($IP, $reason)''
* do_action('wordfence_security_event', '**loginLockout**', ['ip', 'reason', 'duration'])
* bloquer une IP pour abus sur le login ou lostpassword
* déclenchée depuis les fonctions ''lockOutIP($IP, $reason)'' et ''processBruteForceAttempt($authUser, $username, $passwd)''
* do_action('wordfence_security_event', '**NewLocation**', ['username', 'ip']) aka 'newDevice'
* do_action('wordfence_security_event', '**nonAdminLogin**', ['username', 'ip'])
* do_action('wordfence_security_event', '**adminLogin**', ['username', 'ip'])
* do_action('wordfence_security_event', '**breachLogin**', ['username', 'resetPasswordURL', 'supportURL', 'ip'])
* do_action('wordfence_security_event', '**increasedAttackRate**', ['attackCount', 'attackTable', 'duration', 'ip'])
* do_action('wordfence_security_event', '**autoUpdate**', ['version'])
* do_action('wordfence_security_event', '**wafDeactivated**', ['username', 'ip'])
* do_action('wordfence_security_event', '**wordfenceDeactivated**', ['username', 'ip'])
* do_action_ref_array('wp_authenticate', [&$username, &$password])
* do_action('wfls_xml_rpc_blocked', 2)
* do_action('wfls_registration_blocked', $endpointType)
* do_action('wfls_settings_set', $key, $value)
* do_action('wfls_activation_page_footer')
* do_action('wfls_activation_page_footer')
* do_action('wfls_activation_page_header')