Autentisering er inngangsdøren til ditt digitale slott. I 2026 kjøres brute force-angrep av botnett som tester vanlige passord i et tempo ingen menneskelig vaktmester matcher. Denne guiden tar deg fra grunnleggende hygiene (vekke med brukernavnet admin) til lagdelt forsvar med 2FA, passkeys, rate limits, Turnstile og serverregler.
Målet er ikke «militærgrad» som reklameord, men et oppsett du faktisk kan drifte: loggbar, gjenopprettbar, uten å stenge ute redaksjonen. Referanser: Hardening WordPress, WordPress Developer Resources og web.dev om passkeys.
Norske bedriftssider på WordPress treffer ofte samme mønster: installasjonen ble satt opp for mange år siden, brukernavnet admin lever fortsatt, staging og produksjon deler passord, og «sikkerhetsplugin» står på uten at noen leser varslene. Herding av login er derfor både teknikk og driftsrutine.
Vanlige angrep mot WordPress-innloggingssiden
Fire mønstre dekker nesten alt som dukker opp i tilgangslogger:
- Brute force mot
/wp-login.php: boter sender POST til wp-login.php medlog=admin&pwd=.... Trafikken er fordelt på hundrevis av IP-adresser, ofte fra residensielle proxy-nettverk. Grenser per enkelt-IP stopper dem ikke. - Credential stuffing: samme endepunkt, men brukernavn og passord kommer fra offentlige lekkasjesamlinger («Collection #1» til #5, RockYou2024). Du kan komme dette i forkjøpet ved å sjekke nye passord mot haveibeenpwned-API-et når de settes.
- Forsterkning via XML-RPC
system.multicall: én POST til/xmlrpc.phpmed ensystem.multicall-kropp lar angriperen teste hundrevis av passord i ett HTTP-kall, forbi grenser som teller per forespørsel. - Brukeroppramsing via REST API:
?rest_route=/wp/v2/usersog/wp-json/wp/v2/usersreturnerer ekteslug-verdier for hver forfatter med publiserte innlegg. Den sluggen er som regel innloggingsnavnet.
Hvorfor er brukernavnet admin en WordPress-sårbarhet
Hvorfor elsker angripere brukernavnet admin? Fordi det halverer arbeidet. De trenger bare passordet. Mange eldre norske nettsteder ble satt opp med admin som standard under installasjonsveiviseren og ble aldri endret.
Hvorfor er bruker-ID 1 en risiko
Scannere treffer ofte https://ditt-nettsted.no/?author=1. WordPress kan avsløre innloggingsnavnet til forfatteren med lavest ID. Kombinert med admin eller et gjenkjennelig navn blir brute force billigere.
REST-API-et kan gjøre det samme via /wp-json/wp/v2/users for uautentiserte klienter, avhengig av oppsett og plugins. Enumeration er ikke et «hack» i seg selv - det er informasjonslekkasje som gjør passordgjetting billigere.
Hvordan slette admin-brukeren uten å miste innhold
- Opprett en ny administrator med et ikke-gjettbart brukernavn (ikke firmanavn, ikke fornavn).
- Logg inn som den nye brukeren.
- Slett den gamle
admin-brukeren. - Velg Tilskriv alt innhold til den nye brukeren. Glemmer du dette, mister du forfatterskap på gamle innlegg.
Etter byttet: sjekk at cron-jobber, FTP-brukere og eksterne integrasjoner ikke fortsatt forventer den gamle IDen. WooCommerce-ordrehistorikk følger vanligvis med via tilskrivning, men egendefinerte tabeller med user_id bør verifiseres. Ta databasebackup før du sletter kontoen.
Unngå også «synlige» brukernavn som redaktor, webansvarlig eller firmanavnet med årstall. Angripere scraper «Om oss»-sider og LinkedIn. Brukernavn skal være identifikator, ikke merkevare.
Hvordan blokkere brukeroppramsing i kode
Trenger du ikke forfatterarkiver, kan du sende dem til forsiden i functions.php:
// Slår av forfatterarkiver for å ikke lekke brukernavn
add_action('template_redirect', function() {
if (is_author()) {
wp_redirect(home_url(), 301);
exit;
}
});Bruker-endepunktene i REST API-et fjerner du med filteret rest_endpoints:
// Fjerner bruker-endepunktene fra REST API-et
add_filter('rest_endpoints', function($endpoints) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
if (isset($endpoints['/wp/v2/users/(?P<id>[\d]+)'])) {
unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
}
return $endpoints;
});Filteret fjerner endepunktene for alle, også innloggede brukere. Bruker blokkredigeringen eller en integrasjon /wp/v2/users, begrens blokkeringen til uautentiserte forespørsler og test adminpanelet etterpå.
Hvordan sette opp tofaktorautentisering (2FA) i WordPress
Passord alene er utilstrekkelig når credential dumps sirkulerer. Hvis du driver en bedriftsside uten 2FA for administratorer, er risikoen operasjonell, ikke teoretisk.
Hvilken 2FA-metode er sikrest
| Metode | Styrke | Typisk bruk |
|---|---|---|
| E-postkode | Svak | Nødløsning |
| TOTP-app (Authenticator) | God | Standard for team |
| Push / app-godkjenning | God | Bedrifts-SSO |
| Maskinvarenøkkel (YubiKey) | Sterk | Admin / økonomiansvarlig |
| Passkeys | Sterk | Moderne enheter |
TOTP er minimum for admin-rollen. Maskinvarenøkler eller passkeys bør brukes for kontoer som kan installere plugins eller endre DNS via panel. Oppbevar backup-koder offline; en bortkommen telefon uten backup er selvforskyldt nedetid.
Praktisk for norske team: krev 2FA for administrator og redaktør først. Rull ut til forfattere når support har en klar gjenopprettingsprosess. Ikke aktiver 2FA for alle roller samme dag uten reservedører - du vil ikke låse ute hele redaksjonen midt i en kampanje.
Hvordan slå av 2FA for en utestengt bruker
De fleste guider hopper over feilsituasjonen: administratoren mister telefonen, slutter i firmaet, eller TOTP-hemmeligheten lå på en enhet som ble slettet. En dokumentert nødvei via WP-CLI må finnes før du håndhever 2FA, ikke etterpå.
# Nød: slå av 2FA for en utestengt bruker (Two-Factor-pluginen; WP 2FA lagrer egne meta-nøkler)
wp user meta delete <user_id> _two_factor_enabled_providers
wp user meta delete <user_id> _two_factor_provider
wp user meta delete <user_id> _two_factor_totp_key
# Eller se først hva som er satt
wp user meta list <user_id> --keys=_two_factor_enabled_providers,_two_factor_providerNøklene er konstanter i koden til Two-Factor. Kjør kommandoene via SSH. Uten SSH gjenstår terminalen i hostingpanelet eller en spørring mot wp_usermeta. Uten servertilgang beskriver plugin-siden på WordPress.org veien via panelet: en annen administrator redigerer profilen og fjerner hakene under Two-Factor Options.
Hvilke 2FA-plugins finnes for WordPress
- Two-Factor (WordPress.org): lett plugin publisert av WordPress.org. Ifølge plugin-siden støtter den TOTP-apper, e-postkoder og reservekoder. FIDO U2F ble fjernet etter at nettleserne sluttet å støtte det; maskinvarenøkler og passkeys kommer via tilleggspluginen WebAuthn Provider for Two Factor.
- WP 2FA (Melapress): gratisversjon med TOTP, veiviser og 2FA-krav per rolle.
- Kadence Security (tidligere Solid Security, før det iThemes Security): bred sikkerhetspakke med TOTP, e-post og reservekoder.
- Duo Security: bedriftsløsning med push, telefonoppringning og maskinvaretokens, sentral brukerstyring for flere nettsteder.
Hvordan revidere applikasjonspassord i WordPress
WordPress-kjernen har siden versjon 5.6 applikasjonspassord: 24 tegn lange tokens for REST API- og XML-RPC-klienter. Ifølge integrasjonsguiden på make.wordpress.org er de som standard bare tilgjengelige på nettsteder som serveres over HTTPS. De omgår 2FA med vilje: Two-Factor slipper inn API-forespørsler fra en 2FA-bruker nettopp når brukeren autentiserte seg med et applikasjonspassord. Slike tokens havner i .env-filer i offentlige repoer og i krasjrapporter limt inn på supportforum. Gå gjennom dem hvert kvartal:
wp user application-password list <user_id>
wp user application-password delete <user_id> <uuid>Bruker du ikke REST API-et til autentiserte skriveoperasjoner, slå dem helt av med add_filter( 'wp_is_application_passwords_available', '__return_false' ); i en mu-plugin.
Hvordan bruke passkeys for WordPress-innlogging
Passkeys bruker enhetens biometri eller plattform-autentikator (Touch ID, Windows Hello). Det finnes ingen delt hemmelighet å fiske via en falsk login-side på samme måte som et passord. Støtte i WordPress-økosystemet kommer via plugins og host-integrasjoner; test på staging før du tvinger hele redaksjonen over.
Praktisk råd for norske team: start med admin + økonomi, deretter redaktører. Ikke skru på «passkey only» før support har verifisert gjenoppretting. Dokumenter hva som skjer når en ansatt bytter Mac eller mister telefonen. Passkeys uten reservedør er bare en annen form for låsing.
Passkeys bygger på WebAuthn-standarden. Ved registrering lager enheten en privat nøkkel som blir på enheten og en offentlig nøkkel som sendes til serveren. Ved innlogging sender serveren en utfordring, enheten signerer den med den private nøkkelen, og serveren verifiserer signaturen med den lagrede offentlige nøkkelen. Den private nøkkelen er bundet til domenet, derfor virker den ikke på en falsk login-side. Mer om oppsettet i WordPress står i guiden vår om passkeys.
Les mer hos web.dev om passkeys før du velger leverandør. Sjekk at valgt løsning støtter flere enheter per bruker og eksport/backup der det er relevant for organisasjonen.
Hvordan stoppe brute force-angrep i flere lag
Selv når 2FA stopper selve overtakelsen, binder brute force uten grenser opp PHP-FPM-prosesser og MySQL-tilkoblinger. På delt hosting kan det ta ned siden uten at et eneste passord knekkes. Rekkefølgen etter effekt: kanten (Cloudflare), serveren (Nginx eller Fail2Ban), applikasjonen (plugin).
Lag 0: rate limiting i Cloudflare
Står siden bak Cloudflare, er dette regelen med størst effekt. Free-planen tillater én rate limiting-regel med fast telleperiode på 10 sekunder og 10 sekunders blokkering. Vinduet på 1 minutt og blokkeringen på 1 time nedenfor krever Pro, som også tillater en regel nummer to (Cloudflare-dokumentasjonen). Regelen lages i panelet under Security, WAF, Rate limiting rules:
- Felt: URI Path
- Operator: equals
- Verdi:
/wp-login.php - Når: 5 forespørsler per minutt fra samme IP
- Da: Managed Challenge (eller Block i 1 time)
Legg en regel til på /xmlrpc.php hvis du beholder det. Fordelen over Fail2Ban: forespørslene stoppes i kanten før de når serveren.
Lag 1: rate limiting med plugin
Installer et vedlikeholdt rate-limit-plugin (for eksempel Limit Login Attempts Reloaded eller tilsvarende som teamet allerede stoler på). Sett lave terskler for wp-login.php og xmlrpc.php. Varsle på e-post ved gjentatte blokkeringer, så du ser om det er angrep eller en kollega med feil passord.
Unngå «alt-i-ett» sikkerhetssuiter som skrur på femti moduler uten at noen eier konfigurasjonen. Et smalt rate-limit-verktøy pluss WAF er ofte mer forutsigbart enn en tung suite som også endrer filtilganger og skanner media.
Lag 2: CAPTCHA med Cloudflare Turnstile
Cloudflare Turnstile er usynlig for de fleste ekte brukere og filtrerer bots før de treffer PHP. Kombiner med Cloudflare WAF-regler mot kjente bad bots. På managed WordPress-hosting uten Fail2Ban er dette ofte det laget som faktisk tar støyen.
Sett Turnstile på login og gjerne på «mistet passord». Angripere bruker reset-flyten til å spam-bombe brukere eller teste e-postadresser. Husk at CAPTCHA ikke erstatter sterke passord eller 2FA - det er støyfilter.
Lag 3: Fail2Ban på servernivå
Fail2Ban leser logger og stenger ute IP-er i brannmuren når mønsteret «mange mislykkede POST mot wp-login» dukker opp. Krever shell og kontroll. På rent administrert hosting uten SSH bruker du hostens verktøy i stedet for å late som du har Fail2Ban.
En detalj mange guider bommer på: en mislykket POST til wp-login.php returnerer HTTP 200 (siden vises på nytt med feilmelding), en vellykket returnerer 302 (videresending til wp-admin). Et filter på POST med 200 teller altså bare mislykkede forsøk. Det skiller likevel ikke en bot fra en administrator som skriver feil passord tre ganger innenfor findtime, så legg kontor- og VPN-adresser i ignoreip.
/etc/fail2ban/filter.d/wordpress.conf:
[Definition]
failregex = ^<HOST> .* "POST /wp-login\.php.*" 200
^<HOST> .* "POST /xmlrpc\.php.*" 200
ignoreregex = ^<HOST> .* "POST /wp-login\.php.*" 302/etc/fail2ban/jail.local:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
backend = auto
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 3
bantime = 86400Backend auto er bevisst. Kommentarene i Fail2Bans jail.conf sier at backend systemd leser systemd-journalen og at logpath ikke er gyldig for den, så en jail som leser Nginx-tilgangsloggen trenger en filbasert backend. Status sjekker du med sudo fail2ban-client status wordpress, og en feilaktig utestenging oppheves med sudo fail2ban-client set wordpress unbanip <ip>.
På Nginx gir limit_req en grense før PHP i det hele tatt starter:
# I http-blokken
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
location = /wp-login.php {
limit_req zone=login burst=5 nodelay;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}# Stopp author-scans i Apache
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} (author=\d+) [NC]
RewriteRule .* - [F]
</IfModule>Nginx-varianter hører i server-config, ikke i WordPress .htaccess. Blokkering av ?author= stopper enumeration; den erstatter ikke sterke passord.
Når bør du blokkere xmlrpc og REST user-enumeration
xmlrpc.php er fortsatt et yndet brute-force-mål via system.multicall. Deaktiver XML-RPC hvis du ikke trenger Jetpack-remote eller gamle mobilapper. REST user-endepunkter kan lekke brukernavn; begrens for uautentiserte klienter når det passer produktet.
Å bare endre login-URL (/min-hemmelige-dor/) uten rate limit er security-teater. Bots treffer fortsatt wp-login.php-aliaser, XML-RPC og REST. Skjul gjerne URL-en som ekstra friksjon, men ikke som eneste tiltak.
Hvis du må beholde XML-RPC for Jetpack: begrens til Cloudflare-kjente områder, rate-limit endepunktet, og overvåk system.multicall. «Av for alle unntatt» er bedre enn «åpent fordi Jetpack en gang ble brukt».
Hvordan beskytte wp-admin med IP-tillatelsesliste og WAF
Jobber teamet fra noen få faste IP-adresser (kontor, VPN), fjerner en CIDR-tillatelsesliste på /wp-admin/ og /wp-login.php den offentlige angrepsflaten. Alt utenfor listen får 403 før WordPress lastes. Prisen er reell: administratorer på reise, frilansere på hotell-wifi og nødinnlogging fra mobil slutter å virke. Bruk det bare med en dokumentert og stabil VPN.
location ^~ /wp-admin/ {
allow 203.0.113.0/24; # kontor
allow 198.51.100.42/32; # VPN-utgang
deny all;
}Bak Cloudflare gjør du det samme med en WAF-regel: http.request.uri.path matches "^/wp-(admin|login)" og not ip.src in {203.0.113.0/24}.
To konstanter i wp-config.php stenger den vanligste eskaleringen etter en overtatt konto, nemlig redigering av tema- og plugin-PHP fra panelet:
define( 'DISALLOW_FILE_EDIT', true ); // skjuler filredigeringen
define( 'DISALLOW_FILE_MODS', true ); // blokkerer også installasjon og oppdatering av plugins og temaerDISALLOW_FILE_MODS slår av oppdateringer med ett klikk, så den hører hjemme der kode rulles ut via CI og oppdateringer kjøres med WP-CLI.
En WAF filtrerer ondsinnet trafikk før den når WordPress: Cloudflare WAF (gratisplanen har et administrert regelsett, Pro legger til OWASP CRS), Sucuri med virtuelle patcher for WordPress, eller ModSecurity med OWASP CRS på egen server, der paranoia level 1 er et praktisk utgangspunkt fordi høyere nivåer gir mange falske alarmer i Gutenberg.
Hvordan logge, varsle og gjenopprette etter innbrudd
Det du overvåker: mislykkede innlogginger per brukernavn og IP (mange brukernavn fra én IP er typisk credential stuffing), alle vellykkede admin-innlogginger med tid og sted, endringer i passord og roller, nye brukere, og innlogginger fra uventede land. Kilder er tilgangsloggen i Nginx eller Apache, Fail2Ban-varsler, hostens panel og eventuelt loggaggregering som Loggly, Splunk eller Datadog. Behold sikkerhetslogger i minst 90 dager, og avklar lagringstiden mot GDPR, siden IP-adresser er personopplysninger.
Sikkerhet uten gjenoppretting er ufullstendig:
- Daglige backups (filer + database) med testet restore
- Audit-log for innlogginger, rolleendringer og plugin-installasjoner
- Uptime / integrity-overvåking som varsler ved ukjente admin-brukere
- Incident-runbook: hvem roterer passord, hvem kontakter host, hvem sjekker ordrer
Etter et mistenkt innbrudd: alle admin-passord roteres, aktive sesjoner drepes, plugins sammenlignes med kjente checksums, og wp-config.php-nøkler vurderes byttet. Dokumenter tidslinjen; forsikring og kunder spør om den.
Test restore minst kvartalsvis. En backup som aldri er gjenopprettet er en antagelse, ikke en kontroll. Noter hvor lang tid restore tok sist - det er tallet ledelsen faktisk bryr seg om når noe går galt.
Sjekkliste for WordPress-påloggingssikkerhet i 2026
- Ingen bruker heter
admin; ID 1 er ikke en gjettbar konto - 2FA på alle administratorer (TOTP minimum)
- Rate limit på login + XML-RPC begrenset eller av
- Turnstile eller tilsvarende bot-filter aktivt
- User enumeration (
?author=) blokkert eller dempet - Backup restore testet siste 90 dager
- Ansvarlig person navngitt for security-varsler
- Staging og produksjon har ulike passord og nøkler
- Tidligere ansatte har mistet tilgang samme dag som sluttdato
Vanlige sikkerhetsfeil ved WordPress-innlogging
- Samme admin-passord på staging og produksjon
- «Midlertidig» FTP-bruker som aldri ble slettet
- Redaktører som deler en felles admin-konto (umulig å auditere)
- Security-plugin med alle moduler på, så siten blir treg uten at brute force faktisk begrenses
- Ingen prosess for når en ansatt slutter (kontoen lever i måneder)
- Hosting-panel-passord lagret i delt Slack-kanal
- WooCommerce-butikk uten 2FA på kontoer som kan eksportere ordre
- «Vi skjuler wp-admin» som eneste tiltak etter et angrep
Hjelp med sikring av WordPress-innlogging
Trenger du en konkret herding av login, WAF og backup-rutiner, ta kontakt via kontaktsiden. Relatert: WordPress-sikkerhetsrevisjon.




