====== 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')