Skip to content

Security

Lumber Mill ships a set of must-use plugins that harden WordPress out of the box. They live in web/app/mu-plugins as instance-* files, load on every request, and cannot be deactivated from the admin.

Each of them is a plain file with hooks in it — read it, change it, delete it. The pages below explain what each one does and why, so you can tell whether a rule belongs on your project.

PluginDoesDocumented in
instance-login-limiterLocks out repeated failed logins per address, released only over WP-CLILogin Limiter
instance-security-hardeningBlocks user enumeration, stops the login form naming which half of the credentials was wrongHardening
instance-security-headersSends a baseline set of security headers on every responseHardening
instance-disable-rest-apiUnregisters the core REST namespaces and their discovery linksHardening
instance-force-active-pluginsKeeps security critical plugins active and undeactivatableTwo Factor
instance-wp-2fa-key-guardRefuses to run WP 2FA unless its encryption key comes from the environmentTwo Factor
instance-audit-logWrites security relevant actions to the PHP error log or syslog as JSON linesAudit Log
instance-simple-history-configRetention and capability defaults for the in-admin activity logAudit Log

Two of these behave differently per environment, so local work does not need a second factor or a password reset after three typos.

Featuredevelopmentstagingproduction
Login limiter
Forced 2FA
Hardening, headers, REST, audit log

Both read WP_ENV, which is set from .env. The exempt list is a filter in each plugin, so add local to it if that environment is in use on your project.

  1. .env — secrets and per-server values: WP2FA_ENCRYPT_KEY, INSTANCE_LOGIN_LIMITER_ALLOWLIST.

  2. config/application.php — turns those variables into constants.

  3. Filters in your theme — behaviour: thresholds, header values, which REST namespaces stay registered. Every plugin exposes filters rather than settings screens, so the configuration lives in version control.