Beskyt WordPress login med .htaccess password

WordPress har ikke som standard en mekanisme der begrænser antallet af login-forsøg til brugerkonti - herunder admin brugere. WordPress login-siden er derfor et yndet mål for ondsindede scripts der forsøger at finde frem til admin-brugerens password ved at prøve sig frem. Hvis det lykkes at finde frem til en kombination af brugernavn og password der fungerer, så er næste skridt typisk defacement af hjemmesiden eller indsættelse af forskellige former for spam i hjemmesidens kode.

Disse scripts fungerer typisk på den måde at de løber igennem en (meget lang) liste over kendte kombinationer af brugernavne og passwords og prøver dem alle sammen fra en ende af. De er derfor også ret simple at beskytte sig imod - sørg for altid at bruge sikre passwords,  og brug aldrig det samme password flere steder. (Vi anbefaler 12 eller flere tegn i et password, og en blanding af små/store bogstaver, tal og specialtegn. Og et sikkert sted at gemme passwords, f.eks. i LastPass eller tilsvarende).

Det kan også være en god ide ikke at bruge "Admin" som administratorbruger. Opret en anden bruger i WordPress med admin-rettigheder, og ret dernæst "Admin" brugeren så den blot er en almindelig, upriviligeret bruger.

Når vi bliver opmærksom på denne type af angreb, så forsøger vi også at blokere IP-adressen på den angribende computer i vores firewall. Det er imidlertid ikke altid muligt, da der af og til er tale om distribuerede angreb hvor login-forsøgene kommer fra mange forskellige computere. I disse tilfælde er vi nødt til at enten at finde en anden måde at bremse angriberne på, eller blot afvente at de bliver trætte af at prøve at knække vores (sikre) admin-password og går videre til et lettere offer.

En simpel måde at gøre livet mere besværligt for scripts af denne type er at beskytte WordPress' login med et ekstra niveau af sikkerhed. Hvis webserveren ellers er konfigureret så den tillader det, så kan man begrænse adgangen til wp-login.php filen via . htaccess direktiver. Det kan man gøre i to trin:

  1. Tilføj nogle linjer til .htaccess filen i roden af WordPress-installationen.
  2. Opret en fil med et eller flere brugernavn/password kombinationer der giver adgang til WordPress' login. Denne fil bør placeres udenfor webhotellets rod, så den ikke kan downloades via browseren.

Herefter skal brugeren opgive et brugernavn og et password til Apache inden vedkommende får adgang til at forsøge at logge ind i WordPress.

I det første trin skal man redigere .htaccess i samme mappe som wp-login.php er placeret i. Indsæt følgende linjer øverst i filen:

<Files "wp-login.php">
  ErrorDocument 401 default
  AuthType Basic
  AuthUserFile /home/h2g2/passwords (rettes med den korrekte sti til "passwords" filen)
  AuthName "WPAdmin"
  require valid-user
</Files>

Ovenstående fortæller Apache at den skal bede om brugernavn/password inden wp-login.php behandles. Hvis de korrekte informationer bliver indtastet, så vises WordPress sædvanlige login, ellers vises Apaches standard 401 fejlside. I ovenstående eksempel hentes brugernavne og passwords fra filen "passwords" der er placeret i mappen "/home/h2g2/".

Næste trin er at oprette "passwords" filen. Filnavnet er underordnet, men den bør placeres udenfor roden af hjemmesiden. På en cPanel server er webroden typisk mappen "publichtml" eller "www", i vores eksempel er webroden placeret i "/home/h2g2/publichtml".

Den sikreste metode til at oprette "passwords" filen er ved at bruge Apaches "htpasswd" kommando. Syntaksen er for at oprette en ny "passwords" fil med brugeren "adminbruger" og password "cVFp7$ZcMd64" er:

htpasswd -c passwords adminbruger

Herefter skriver man det nye password ved prompten. Hvis man herefter kigger på indholdet af "passwords" filen, så vil man se noget i denne retning:

adminbruger:$apr1$uUgfIcIh$rsecBVqwiCYTpK3/PDuAf1

Man kan genkende brugernavnet "adminbruger", mens kodeordet er gemt i et krypteret format ("$apr1$" angiver at password er hashet med en Apache-specifik algoritme baseret på MD5)

Hvis man ønsker at tilføje flere brugere til "password" filen, så kan man bruge samme kommando uden "-c" flaget:

htpasswd passwords andenadminbruger

Brugernavne og passwords i "passwords" filen er helt uafhængige af WordPress brugernavne og passwords. Som i alle andre tilfælde bør disse passwords være unikke - det er en MEGET dårlig ide at genbruge et admin-password fra WordPress til dette formål!

Hvis man kører WordPress på delt hosting, så har ofte ikke adgang til kommandolinjen på serveren. Man kan evt. installere en apache-stak på sin egen computer (f.eks. WampServer), generere "passwords" filen lokalt og så uploade den til serveren med FTP. Alternativt findes der flere websites rundt omkring der stiller htpasswd-lignende værktøjer til rådighed i browseren, men her skal man selvfølgelig bruge sin sunde fornuft og gøre op med sig selv om man tør stole på ejeren af den pågældende hjemmeside.

Ovenstående fremgangsmåde giver et niveau af ekstra sikkerhed der kan forhindre simple script-baserede angreb. Metoden har desuden den fordel at den reducerer belastningen på serveren fra de gentagne login forsøg til WordPress (ofte bliver vi opmærksom på at noget er i gang når vi få besked fra vores overvågning om at serverbelastningen er steget kraftigt).

Metoden er mest anvendelig hvis der kun er et begrænset antal brugere der skal have adgang til at logge ind i WordPress. Hvis man har mange WordPress brugere, bliver det hurtigt en belastning at vedligeholde "passwords" filen, især hvis man ønsker at disse brugere skal have hvert sit brugernavn og password.

Opdateret den 29. april: Hvis du ønsker at beskytte hele din blog så den kun er synlig når man har indtastet et brugernavn og password, så se her hvordan det gøres.

På vores egen server har metoden i øvrigt den fordel at mislykkede .htaccess login-forsøg trackes af vores firewall, så vi kan automatisk blokere forsøg på brute-force hacking af admin-brugeren på serverniveau, uden at vi behøver gøre noget i WordPress.

Opdateret den 3. maj: Hvis man undrer sig over hvorfor nogen bruger kræfter på at hacke usikre WordPress admin-logins, så er der et godt eksempel i denne artikel. Her har man først skaffet sig adgang til forskellige WordPress hjemmesider for at lægge sin egen kode på. Umiddelbar ser hjemmesiden urørt ud, men besøgende computere inficeres med malware der stjæler personlige oplysninger, giver adgang til computerens webcam og som gør computeren til en del af et botnet der kan bruges til at angribe andre websites.