Beveiligde website op Synology NAS

Doel

Zelf je WordPress website veilig hosten op Synology NAS achter FritzBox router. Een uitgebreide, maar niet per se volledige, beschrijving van de maatregelen die genomen kunnen worden. Voor andere omgevingen kan het aanleiding zijn om te controleren hoe één en ander is geregeld.

Aanleiding/overwegingen

  • Het is best een beetje eng om je NAS zomaar aan het internet te hangen. Uitvoerige monitoring laat zien dat deze vele malen per dag benaderd wordt door nieuwsgierige robots en scriptjes vanuit alle uithoeken in de wereld. Gezien de activiteiten gebeurt dat vaak met minder goede bedoelingen.
  • In de loop der jaren heb ik steeds meer maatregelen kunnen nemen om de beveiliging verder te verbeteren op grond van eigen ervaring en onderzoek of op grond van artikelen die ik tegenkwam en waarvan ik goede raad heb toegepast.
  • De rode draad in het hele verhaal is eigenlijk om op alle gebieden alleen beschikbaar te stellen wat nodig is voor de gewenste functionaliteit en alle mogelijke misbruik te weren.
  • Ik beschrijf van buiten naar binnen de maatregelen die kunnen worden genomen op FritzBox router, Synology NAS, Apache webserver, WordPress CMS.
  • Ook al maak je gebruik van een andere configuratie, dan nog zijn een aantal elementen uit onderstaand verhaal toe te passen.
  • Alle overwegingen van een goede performance, een goede SEO (Search Engine Optimization) en dergelijke zijn evenzeer van belang. Ik probeer het vooral te houden bij de maatregelen van beveiliging tegen ongewenst bezoek. Vooral gericht op de website, maar zijdelings blijken veel zaken ook voor de veiligheid van het thuisnetwerk en de overige functionaliteiten van de NAS van belang.

Maatregelen op FRITZ!Box

De FRITZ!Box heeft een compleet gesloten firewall voor bescherming tegen ongewenste benadering vanaf internet. Alle inkomende en uitgaande gegevenspakketten worden gecontroleerd en ongevraagde gegevens van internet automatisch tegengehouden (Stateful Packet Inspection). Apparaten in het thuisnetwerk zijn niet zichtbaar op internet, zodat vanaf internet ook geen directe toegang tot de apparaten mogelijk is. Alle TCP-of UDP-poorten zijn standaard gesloten. Met pakketfilters voorkomt de FRITZ!Box dat gegevenspakketten (bijvoorbeeld NetBIOS) die informatie over apparaten in het thuisnetwerk bevatten, het internet bereiken.
Voor website en NAS die toegankelijk moeten zijn vanaf internet, kun je portforwarding configureren voor specifieke poorten.
Als de FRITZ!Box ongevraagde aanvragen vanaf internet moet afwijzen in plaats van te antwoorden met ICMP-controle berichten, kun je de optie “Firewall in stealth mode” inschakelen.
Als opties niet wordt weergegeven, schakel dan eerst de geavanceerde weergave in.
Bron: https://nl.avm.de.

Een aantal belangrijke opties om de veiligheid te bevorderen.

Aanmelding

  • Systeem FRITZ!Box gebruiker Aanmelding bij het thuisnetwerk.
  • Zorg allereerst dat toegang tot de FRITZ!Box met een sterk wachtwoord is beveiligd. Gebruik een lang wachtwoord met hoofdletters, kleine letters, getallen, speciale tekens en interpunctie.
  • Je kunt zelfs voor uitvoering van bepaalde instellingen bijkomende bevestiging vragen. Hetzij via een knop op de router (lastig bij benaderen op afstand), hetzij door gebruik te maken van Google Authenticator app.

Push services

  • Systeem Push service Push services en Afzender
  • Zorg dat je notificaties per E-mail krijgt van tal van gebeurtenissen op de router. Dan kan niets zomaar ongemerkt aan je voorbij gaan.

Updates

  • Systeem Update
  • Zorg dat je geïnformeerd wordt over nieuwe FRITZ!OS versies. En houd deze voor de veiligheid up to date. Het updaten voer ik het liefst zelf uit na het maken van een back-up, maar dat kan ook automatisch plaatsvinden.

Filter instellingen

  • Internet Filter Lijsten Globale filterinstellingen
  • Activeer alle onderstaande opties tenzij er een reden is om een filter niet te activeren.
  • Firewall in stealth mode
    De FRITZ!Box-firewall verwerpt in stealth-modus ongevraagde aanvragen uit het internet.
  • E-mailfilter via poort 25 actief
    Dit filter blokkeert e-mailverzending via de onbeveiligde poort 25.
  • NetBIOS-filter actief
    Dit filter blokkeert NetBIOS-pakketten die normaal gesproken niet nodig zijn voor de communicatie op internet..
  • Teredo-filter actief
    Deactiveer het filter alleen als een netwerkapparaat Teredo absoluut vereist en de beveiliging van de FRITZ!Box IPv6-firewall tegen ongewenste Teredo-verbindingen niet gewenst is.
  • WPAD-filter actief
    Deactiveer het filter alleen wanneer u een proxyserver in het thuisnetwerk gebruikt die onder Windows automatisch moet worden herkend en gebruikt.

Port forwarding

  • Internet Toegang verlenen Poortvrijgaven
  • Geef hier op welke poorten doorgegeven moeten worden aan de NAS. Voor de website zijn poort 80 (http) en poort 443 (https) van belang.
  • Als bij de domein DNS instellingen niet alleen het IPv4 adres, maar ook het IPv6 adres doorgezet wordt, kunnen genoemde poorten voor de website ook voor IPv6 worden opgegeven.
  • Voor elke doorverwezen poort verschijnt er een vrijgave regel.
    Zet uitsluitend de poorten open, die daadwerkelijk in gebruik zijn en vanaf het internet moeten kunnen worden benaderd.
  • Overweeg bepaalde functionaliteit niet zomaar naar buiten open te zetten, maar via een VPN verbinding van “binnenuit” te benaderen.

Internet toegang

  • Internet Toegang verlenen FRITZ!Box-diensten Internettoegang
  • Geef geen directe toegang van buitenaf tot de FRITZ!Box.
  • Als het al gewenst is vanaf een andere locatie via het internet toegang te hebben tot de FRITZ!Box, zet dan een VPN (Virtual Private Network) verbinding op. Daarmee heb je een veilige toegang tot het interne netwerk. Daarna kun je vanuit het interne netwerk de FRITZ!Box alsnog benaderen.

WiFi veiligheid

  • WiFi Veiligheid
  • Selecteer de optie onderaan om de WiFi-toegang tot de bekende WiFi apparaten te beperken. Bij toevoegen van een nieuw apparaat kan dit tijdelijk worden opgeheven om toegang te geven. Daarna weer uit, zodat nooit ‘zomaar’ een onbekend apparaat toegang tot het netwerk verkrijgt.
  • Bij het tabblad WPS-Snel verbinding het vinkje voor WPS actief uitzetten. Anders is iemand in staat met een druk op de knop van de router via deze functie toegang tot het netwerk te verkrijgen. Heb je een apparaat dat op deze wijze toegang moet krijgen, dan kun je het tijdelijk aan zetten.

Gast toegang

  • WiFi WiFi-Toegang voor gasten
  • Geef niet zomaar iedereen via WiFi toegang tot je interne netwerk. De behoefte daaraan is misschien wel minder geworden nu velen met een databundel toegang op het mobiele telefoon netwerk hebben.
  • Zet anders deze optie van het gastnetwerk aan om toch een privé WiFi internet toegang voor gasten te maken. Geef het een herkenbare SSID (Naam voor het draadloze gastnetwerk) en geef een toegangscode als Wifi-netwerksleutel op.
  • Die toegangscode kun je aan je gasten bekend maken. Een onbekende die in je voortuin staat hoeft niet per se over jouw bandbreedte toegang te kunnen verkrijgen. Hou het dus op een beveiligde verbinding.
  • Voordeel van het gastnetwerk is dat het afgescheiden is van het eigen internet netwerk en al of niet genode gasten dus geen toegang tot Computer, NAS en andere aan het netwerk apparatuur kunnen krijgen.
  • Van de FRITZ!Box krijg je een notificatie mail als iemand op het gastnetwerk verbinding maakt.

Diagnose

  • Diagnose Veiligheid.
  • Check hier het overzicht van alle instellingen

Logboek

  • Systeem Gebeurtenissen
  • Controleer hier regelmatig de log van de FRIT!Box, zodat je ongewone zaken sneller opmerkt.

Herstel acties

Maatregelen om situaties te kunnen herstellen:

  • Om op een makkelijke en snelle manier zo nodig op afstand de FRITZ!Box en de FRITZ!Repeater (als accesspoint voor bovenverdieping in gebruik) te kunnen herstarten, heb ik een script gemaakt, dat ik met een knop vanuit mijn domotica systeem (Domoticz) kan starten.
  • De repeater heeft dezelfde instellingen als de router en kan ook vanuit Domoticz via een Z-wave bediende tussenstekker worden in/uitgeschakeld.

Maatregelen op Synology NAS

Een NAS (Network Attached Storage) is tegenwoordig heel veel meer dan alleen een file server. Feitelijk is het een Linux server, waarop eenvoudig configureerbaar via een web interface tal van pakketten aangeboden kunnen worden. Zo creëer je je eigen cloud, kan je op afstand bij je foto’s en documenten, host je je eigen website en veel meer. We zullen hieronder de algemene beveiligings maatregelen doornemen en dan vooral toegespitst naar het gebruik van de website.

Aanmelding en rechten

  • Configuratiescherm Groep
  • Controleer hier de standaard rechten van vooral de groep ‘Users’.
  • Schakel uit wat (voor de hele groep) niet nodig is.
  • Configuratie scherm Gebruiker
  • Ook t.a.v. de NAS beginnen we bij de gebruikers toegang. Zorg dat er een gebruikers account is met Administrator bevoegdheden.
  • Over het algemeen wordt aanbevolen om het standaard Admin gebruiker en gast account uit te schakelen.
  • Zorg dat gebruikers uitsluitend behoren tot gebruikersgroep die nodig zijn voor wat zij moeten kunnen doen.
  • Zorg dat gebruikers uitsluitend lees en schrijf rechten hebben op mappen die nodig zijn voor wat zij moeten kunnen doen.
  • Zorg dat gebruikers uitsluitend rechten hebben voor de toepassingen die nodig zijn voor wat zij moeten kunnen doen.
  • Beperk indien gewenst snelheidslimieten en quota.
  • Configuratiescherm Gebruiker Geavanceerd
  • Stel regels voor wachtwoordinstellingen streng in. Sluit naam en beschrijving van gebruiker uit. zorg voor afdwingen van kleine/hoofdlstters, Numerieke tekens, Speciale tekens, en een aanzienlijke minimale lengte. Sluit gebruik van Zwakke wachtwoorden uit.
  • Optioneel: Schakel een wachtwoord verval met termijn in, waardoor gebruikers om de x aantal dagen een nieuw wachtwoord moeten opgeven.
  • Optioneel – aanbevolen: Schakel 2-stapverificatie in.

Bestand services en DSM-instellingen

  • Configuratiescherm Bestandservices
  • Zet alleen benodigde services aan.
  • Kies waar mogelijk, zoals b.v. onder FTP dat alleen de veilige SSL/TLS verbinding geactiveerd wordt.
  • Configuratiescherm Netwerk DSL-instellingen
  • Selecteer automatisch de HTTP-verbinding omleiden naar HTTPS op DSM desktop.
  • Selecteer HTTP/2 inschakelen om de snelheid van website te verbeteren.
  • Schakel checkbox uit bij: De “Server”-header in HTTP antwoorden inschakelen, of vul hier een eigen tekst in. Dat maakt het lastiger te achterhalen onder welke server applicatie de website werkt.

Beveiligingsinstellingen

  • Configuratiescherm Beveiliging Beveiliging
  • Op het eerste algemene tabblad zijn een aantal opties, die de beveiliging verbeteren.

  • Configuratiescherm Beveiliging Firewall
  • Schakel de Firewall in en maak een eigen profiel zoals hieronder voor de bescherming van NAS (inclusief Website).
  • Houd er rekening mee dat de regels van boven naar onder worden afgewerkt en dat de uitvoering stopt indien er sprake is van een match.
  • Regel 1: Voorkom dat je jezelf buitensluit. Begin daarom met een regel, die alle toegang vanuit je interne netwerk toestaat.
  • Regel 2: Weiger daarna toegang tot alle poorten die je niet naar buiten beschikbaar hoeft te stellen. Dan zit de zaak al aardig op slot.
  • Regel 3: Toestaan in Nederland van de poorten die je voor de NAS wel naar buiten toe beschikbaar wilt stellen. Voor het bron IP bestaat daarbij ook de mogelijkheid om landen aan te vinken. Beperk het tot wat nodig is. NB. Tijdens buitenlandse reizen voeg ik betreffende land(en) daar tijdelijk aan toe. Open hierbij in elk geval ook poort 80 en 443 voor Web Station en wat verder nodig is.
  • Regel 4: Hier weiger ik alle toegang vanuit een aantal landen, waaruit ik veel directe aanvallen heb ervaren. Dat is geen alles omvattende blokkade, want men kan via een VPN verbinding voordoen of men elders vandaan komt, maar ik zag wel een directe vermindering van langskomend potentieel onheil. Die komen dus niet meer bij de NAS en ook niet meer bij de website of bij mijn domotica.
  • Regel 5: Toestaan (voor alle overige landen) van toegang tot Web Station.
  • Regel 6: Weiger alle overige verkeer.
  • Configuratiescherm Beveiliging Bescherming
  • Onder dit tabblad is het mogelijk om een beveiliging tegen DoS (Deniel of Service) aanvallen in te schakelen. Deze wordt achter de schermen (in ‘iptables’) toegevoegd aan de Firewall instellingen.

  • Configuratiescherm Beveiliging Account
  • Onder dit tabblad kan een automatische blokkade worden ingeschakeld.

    Voeg daaronder in de Lijst toestaan/blokkeren de vaste IP adressen van je PC in interne netwerk in om te voorkomen dat deze geblokkeerd worden. Je zou anders jezelf kunnen buiten sluiten.
  • Stel ook een limiet voor onbetrouwbare en vertrouwde clients,

  • Configuratiescherm Beveiliging Certificaat
  • Voeg via Let’s Encrypt of op andere wijze een SSL certificaat toe, die geldig is voor de beveiligde verbinding naar het domein waaronder de NAS bereikbaar is. Het voorkomt dat verkeer (inclusief inloggegevens) door derden te onderscheppen is. Dit certificaat wordt niet alleen gebruikt voor de website, maar ook de NAS applicaties die via HTTPS benaderd worden. Het is dan ook aanbevolen de HTTPS verbinding voor die applicaties af te dwingen. Anders heeft dat nog geen zin.

  • Configuratiescherm Beveiliging Geavanceerd
  • Onder dit tabblad wordt HTTP compressie ingeschakeld om de performance van de website te verbeteren. Ook wordt hier TLS/SSL profiel op het hoogste niveau ingesteld.

Meldingen

  • Configuratiescherm Melding E-mail
  • Onder dit tabblad kan een E-mail profiel worden ingesteld, waarnaar de automatische notificaties van de NAS worden gezonden. Het invullen spreekt voor zich. Ook kun je de goede werkking hier eenvoudig testen. NB. Deze instellingen zijn ook beschikbaar voor PHP, dat ik gebruik om vanuit PHP~ of Bash scripts E-mails te verzenden. Uiteraard worden ook hier beveiligde verbindingen gebruikt.
  • Configuratiescherm Melding Geavanceerd
  • Onder dit tabblad (klap alle onderdelen open) kunnen alle situaties worden aangevinkt waarvan je per E-mail een notificatie wilt ontvangen. Beter royaal beginnen en later wat hinderlijke overbodige meldingen weghalen, dan belangrijke gebeurtenissen te missen.

Hardware en stroom

  • Configuratiescherm –> Algemeen
  • Je zult de NAS, zeker als er een website op draait, in principe altijd aan hebben staan. Check dan, ook zoals hieronder te zien, de optie dat het systeem automatisch weer zal herstarten als het na een stroomstoring is uitgevallen.
  • Hierboven is ook te zien dat de functie Wake On Lan (WOL) is ingeschakeld. Mocht de NAS per ongeluk zijn uitgeschakeld, dan is het mogelijk via het netwerk een WOL commando te zenden, waarop de NAS weer zal starten. Zie hieronder een voorbeeld hoe dit vanaf de router kan.

    Alleen al om deze reden is er meer voor te zeggen om de VPN mogelijkheid van de router te gebruiken en deze dan niet op de NAS te activeren. Immers, als de router uit staat, dan kan je so wie so niks meer, maar als de NAS uit staat, dan kan je deze vanaf de router weer activeren.
  • Zelf heb ik de NAS ook nog eens op een FRITZ!Dect 200 tussenstekker gezet. Daarmee kan ik dus indien nodig ook op afstand via de router de stroomvoorziening van de NAS bedienen. Ik heb een keer gehad dat de hele handel niet meer toegankelijk was. Dan is het handig om op afstand met een andere techniek (DECT) de stroom te kunnen bedienen vanuit de router. Want als de NAS uit staat of niet functioneert, is ook mijn Domoticz niet meer operationeel en kan ik dus Z-wave niet meer gebruiken om te schakelen.
    Van deze deze stekker kan het stroomverbruik worden gemeten (met de gratis beschikbare temperatuur meting) wordt deze door Domoticz uitgelezen. Bij een te hoge temperatuur krijg ik uiteraard van Domoticz een mailtje.

Updates

  • Configuratiescherm Bijwerken en herstellen DSM bijwerken
  • Zorg altijd dat de handel up to date is. Ook dat kan onder de veiligheidsmaatregelen worden gerekend. Regelmatig zijn er bug fixes of worden kwetsbaarheden gevonden en opgelost.
  • Ik houd altijd graag zelf de regie. Laat de handel niet herstarten als er bezoekers op de website zijn en vergewis mij van een verse backup van alle gegevens op de NAS. Deze wordt inclusief configuratie instellingen en databases dagelijks gemaakt.
  • Met onderstaande instellingen ontvang ik een berichtje wanneer een nieuwe update klaar staat.

Terminal

  • Configuratiescherm Terminal en SNMP
  • Onder dit tabblad kan de SSH toegang worden ingeschakeld. Dat is onontbeerlijk voor het werk op de command line en het maken of uitvoeren van scripts. Er wordt wisselend gedacht over het nut van het wijzigen van de standaard poort (22). Het wijzigen daarvan zal de eerste de beste voorbijganger, die uitsluitend naar standaard poorten kijkt in elk geval langs laten gaan. Een echte hacker zal er niet door gehinderd worden, maar deze veel beproefde poort is daarom natuurlijk niet beschikbaar in de router port forwarding. Ook wordt hij door de firewall tegengehouden. En als je de toegang niet al te vaak gebruikt, kan je hem ook nog uit zetten en met een extra stapje alleen activeren voor het moment dat het nodig is. Tot slot zit hij bij mij natuurlijk niet werkelijk op poort 22222 🙂

Toepassingsportaal

  • Configuratiescherm Toepassingsportaal
  • Ook hier met een fake poortnummer 33333 een voorbeeld van hoe je voor diverse toepassingen HTTPS kunt afdwingen. Eventueel met opgave van een aangepast poortnummer.

Maatregelen op Apache server

Bestandsrechten

De basis van het verschaffen van rechten voor de website ligt in het bestandssysteem. De hier toegekende rechten bepalen of iemand toegang heeft en of een bestand kan worden gelezen of ook mag worden bewerkt. Het is natuurlijk niet verstandig om bezoekers alle rechten toe te kennen.

Onder linux worden de rechten uitgedrukt in drie cijfers. Het eerste voor de User, het tweede voor de Group en het derde voor Overige.
0 = — geen rechten
1 = –x recht om uit te voeren
2 = -w- recht om te schrijven
3 = -wx recht om te schrijven en uit te voeren
4 = r– recht om te lezen
5 = r-x recht om uit te voeren en te lezen
6 = rw- recht om te lezen en te schrijven
7 = rwx recht om te lezen, te schrijven en uit te voeren

Instellen op 644 betekent dus dat de Eigenaar mag lezen en schrijven, de groep mag lezen en overigens mogen lezen. Bijvoorbeeld voor sitemap.xml. Hieronder de weergave zoals het programma FileZilla dit toont.

Op de NAS heb ik dat met een script als volgt geregeld:

#!/bin/bash
# All directories and files are owned by group http and user http
 chown -R http:http /volume1/web/mijnwebsite

# All directories = type d shoud be 755 or 750
 find /volume1/web/mijnwebsite/ -type d -exec chmod 750 {} \;

# All files = type f should be 644 or 640
 find /volume1/web/mijnwebsite/ -type f -exec chmod 640 {} \;

# Exception: .htaccess, .htpasswd and wp-config.php should be 440 or 400
 find /volume1/web/mijnwebsite/ -name .htaccess -exec chmod 400 {} \;
 find /volume1/web/mijnwebsite/ -name .htpasswd -exec chmod 400 {} \;
 chmod 400 /volume1/web/mijnwebsite/wp-config.php

# Everyone can read robots.txt and sitemap.xml
 chmod 644 /volume1/web/mijnwebsite/robots.txt
 chmod 644 /volume1/web/mijnwebsite/sitemap.xml

Toelichting op de regels

  • Regel 3: Het commando ‘chown’ zet met de optie -R recursief voor de gehele website de groep http en de user http als eigenaar van alle directories en bestanden.
  • Regel 6: Via het commando ‘find’, worden (recursief) van alle gevonden directories (type d) de rechten ingesteld op 750.
  • Regel 9: Via het commando ‘find’, worden (recursief) van alle gevonden files (type f) de rechten ingesteld op 640.
  • Regel 12-13: Via het commando ‘find’, worden (recursief) van alle gevonden .htaccess en .htpasswd bestanden de rechten ingesteld op 640
  • Regel 14: De rechten voor wp-config.php worden op 400 gezet.
    Het bevat informatie voor toegang tot de wordpress database en kan beter niet voor iedereen in te zien zijn.
  • Regel 17-18: De rechten voor robotx.txt en sitemap.xml worden op 644 gezet. In robots.txt worden aanwijzingen gegeven voor robots, die de site verkennen voor zoekmachines. In sitemap.xml is een overzicht van alle URL’s van pagina’s en berichten op de website.

Maatregelen in robots.txt

Robotx.txt is een bestandje dat in de root directory van de website wordt geplaatst. het bevat aanwijzingen voor robots, die de website verkennen en willen indexeren ten behoeve van zoekmachines. Daardoor wordt de website gevonden. Nuttig dus. Maar je wilt misschien niet alles in deze index opgenomen zien. Voor wat betreft de beveiliging: Het bevat slechts aanwijzingen die ook genegeerd kunnen worden.

User-agent: *
Disallow: /images/
Disallow: /downloads/
Disallow: /wp-admin/
Disallow: /wp-includes/
Disallow: /wp-content/plugins
Disallow: /wp-login.php
Disallow: /xmlrpc.php

Sitemap: https://ict.peppink.nl/sitemap.xml

Toelichting op de regels

  • Regel 1: Laat alle user-agents toe.
  • Regel 2-8: Sluit genoemde directories en bestanden uit.
  • De laatste regel wijst op de locatie van het sitemap.xml bestand, waarin alle URL’s die kunnen worden geïndexeerd.
    Zie sitemap van deze website.

Maatregelen in http.conf en .htaccess bestanden

De karakter definities – syntax voor .htaccess

Het is haast ondoenlijk om alle voorbeelden die nog volgen ook nog eens geheel uit te pluizen en toe te lichten met de betekenis van alle karakters. Daarom als naslag onderstaand overzicht maar meegenomen, waarin dit wordt beschreven. Over elk van de onderdelen is op internet veel informatie te vinden. Ik plaats hieronder vooral de maatregelen bij elkaar.

###################################################################
# HTACCESS Character definitions from https://htaccessbook.com/htaccess-character-definitions/
###################################################################
# Character/Flag	Definition
# #		Instructs the server to ignore the line. Used for including comments.
# [F]		Forbidden: instructs the server to return a 403 Forbidden to the client.
# [L]		Last rule: instructs the server to stop rewriting after the preceding directive is processed.
# [N]		Next: instructs Apache to rerun the rewrite rule until all rewriting is complete.
# [G]		Gone: instructs the server to deliver Gone (no longer exists) status message.
# [P]		Proxy: instructs server to handle requests by mod_proxy.
# [C]		Chain: instructs server to chain the current rule with the previous rule.
# [R]		Redirect: instructs Apache to redirect to the specified URL.
#		Note that the default status-code for the [R] flag is 302 (temporary redirect);
#		for permanent redirects use [R=301].
# [NC]		No Case: defines any associated argument as case-insensitive.
# [PT]		Pass Through: instructs mod_rewrite to pass the rewritten URL for further processing.
# [OR]		Or: specifies a logical "or" that ties two expressions together such that either one proving
# true		will cause the associated rule to be applied.
# [NE]		No Escape: instructs the server to parse output without escaping characters.
# [NS]		No Subrequest: instructs the server to skip the directive if internal sub-request.
# [QSA]		Append Query String: directs server to add the query string to the end of the expression.
# [S=x]		Skip: instructs the server to skip the next "x" number of rules if a match is detected.
# [E=var:value]	Environmental Variable: instructs the server to set the variable "var" to "value".
# [T=MIME-type]	Mime Type: declares the mime type of the target resource.
# [xyz]		Character class: any character within square brackets will be a match.
#		For example, "[xyz]" will match any of the characters x, y, or z.
# [xyz]+	Character class in which any combination of items within the brackets will be a match.
#		For example, "[xyz]+" will match any number of x’s, y’s, z’s, or any combination thereof.
# [^xyz]	Not within a character class. For example, [^xyz] will match any character that isn’t x, y, or z.
# [a-z]		A dash "-" between two characters within a character class denotes the range of characters between them.
#		For example, [a-zA-Z] matches all lowercase and uppercase letters.
# a{n}		Exact number, n, of the preceding character, a. For example, x{3} matches exactly three x’s.
# a{n,}		Specifies n or more of the preceding character. For example, x{3,} matches three or more x’s.
# a{n,m}	Specifies a range of numbers, between n and m, of the preceding character, a.
#		For example, x{3,7} matches three, four, five, six, or seven x’s.
# ()		Used to group characters together, thereby considering them as a single unit.
#		For example, (htaccess)?book	will match "book", with or without the "htaccess" prefix.
# ^		Denotes the beginning of a regular expression. For example, "^Hello" will match any string
#		that	begins with "Hello". Without the caret "^", "Hello" would match anywhere in the string.
# $		Denotes the end of a regular expression. For example, "world$" will match any string
#		that ends with "world". Without the dollar sign "$", "world" would match anywhere in the string.
# ?		Declares as optional the preceding character. For example, "monzas?" will match "monza" or "monzas".
#		In other words, "x?" matches zero or one of "x".
# !		Declares negation. For example, "!string" matches everything except "string".
# .		A literal dot (or period) indicates any single arbitrary character.
# -		Instructs Apache to NOT rewrite the URL. Example syntax: "example.com - [F]"
# +		Matches one or more of the preceding character. For example, "G+" matches one or more G’s,
#		while "+" will match one or more characters of any kind.
# *		Matches zero or more of the preceding character. For example, use ".*" as a wildcard.
# |		Declares a logical "or" operator. For example, "(x|y)" matches "x" or "y".
# \		Escape special characters such as: ^ $ ! . * | ( ) [ ] { }
# \.		Indicates a literal dot (escaped).
# /*		Zero or more slashes.
# .*		Zero or more arbitrary characters.
# ^$		Defines an empty string.
# ^.*$		The standard pattern for matching everything.
# [^/.]		Defines one character that is neither a slash nor a dot.
# [^/.]+	Defines any number of characters that contains neither slash nor dot.
# http://	This is a literal statement - in this case, the literal character string, "http://".
# ^example.*	Matches a string that begins with the term "example", followed by any character(s).
# ^example\.com$	Defines the exact string, "example.com".
# -d		Tests if string is an existing directory.
# -f		Tests if string is an existing file.
# -s		Tests if file in test string has a non-zero value.
# 
# Server status-codes used whenredirecting and rewriting URLs
# 301	Moved Permanently
# 302	Moved Temporarily
# 403	Forbidden
# 404	Not Found
# 410	Gone
###################################################################

Blokkeer ongewenste IP adressen

In het configuratie bestand httpd24.conf, worden een aantal algemeen geldende zaken geregeld. Normaliter is het niet direct nodig hier aanpassingen in aan te brengen. Ik heb dat wel gedaan om voor elke website die op mijn NAS draait bepaalde instellingen van kracht te laten zijn. Dan hoef je dat niet voor elke website afzonderlijk steeds opnieuw te regelen. In dit geval gaat het om een blacklist van IP adressen, die ik zelf middels een script aanleg. In het kort gezegd: IP adressen van bezoekers, scripts, robots, die zich niet houden aan ingestelde regels en buiten die regels toch bestanden trachten te benaderen of anderszins tegen een van de ingestelde blokkades of detectie aanlopen, komen in de log terecht. Met een script vis ik ze daaruit vandaan om ze toe te voegen in een bestand ‘htaccess-ipdenied.txt’. Alle IP adressen in dat bestand worden voortaan tegengehouden.

# This file is created by CatchSynoDeniedIP.sh on Synology
# It is included in /volume1/@appstore/Apache2.4/usr/local/etc/apache24/conf/httpd24.conf
<Files *>
<RequireAll>
	Require all granted
	Require not ip 1.111.111.111
	< cut list with over 1400 detected IP addresses >
	Require not ip 2.222.222.222
</RequireAll>
</Files>

Steekproefsgewijze heb ik veel van die IP adressen gecontroleerd op Abuseipdb.com. Ze bleken dan allemaal in die database al bekend te zijn. Automatische controle hierop bij Abuseipdb.com via een API is overigens ook mogelijk, maar daar zal ik nu niet verder over uitweiden. Voor deze IP adressen heeft het geen zin om voor een tweede keer terug te komen en andere pogingen te ondernemen. Ze zijn meteen in de blacklist gezet en verder bezoek aan de websites op de NAS wordt niet toegestaan. Je hoeft je op mijn website dus maar een keer te misdragen.
Deze lijst kan vervolgens ook worden geïmporteerd in de blokkering lijst van de Synology onder Configuratiescherm -> Beveiliging -> Account.
Dat kan handmatig of via een script (met sqlite3 in /etc/synoautoblock.db). Dan worden deze IP adressen voortaan ook voor andere applicaties van de NAS geweerd. Ze zijn zichtbaar in de Blokkering lijst.

Voor Apache wordt de gegenereerde lijst aangeroepen in httpd24.conf met:

Include /volume1/path-to-scripts/htaccess-ipdenied.txt

Uiteraard is dit getest en werkend bevonden.

Blokkeer toegang tot een aantal bestanden

Hieronder stap voor stap een reeks maatregelen in de .htaccess bestand in de hoofd directory van de website. NB. Per directory kunnen selectief aanvullende maatregelen worden getroffen, door ook daar een .htaccess bestand te plaatsen.

###################################################################
# Hide your .htaccess file from public view.
# STRONG (case sensitive) .htaccess and .htpasswd protection
# And block access to multiple file types .log | .php | .ini | .sh
# We are also denying access to xmlrpc.php, which hs a lot of attacks.
# So if you are not using this feature, deny access to it and protect your site/server.
<FilesMatch "(wp-config.php|xmlrpc.php|\.log|\.ini|\.bak|\.un~|\.sed|\.sh|[hH][tT][aApP].*)">
	Require all denied
</FilesMatch>

# Protect wp-login.php
<Files wp-login.php>
	Require all denied
	Require ip 111.222.333.444
</Files>

# Disable unauthorized directory browsing 
 Options All -Indexes

Toelichting op de regels

  • Regel 1-6: Geeft uitleg. Het gaat mij daarbij niet direct om het te verstoppen (hide), maar vooral om zeker te stellen dat men er geen toegang toe kan verkrijgen, aanpassen of wissen.
  • Regel 8: Blokkeert de toegang tot genoemde bestanden, bestanden met opgesomde extensies en .htaccess of .htpasswd (hoe dan ook geschreven). Uw IP adres wordt gelogged en u komt in mijn blacklist.
  • Regel 13: Weert alle toegang tot het in regel 12 genoemde wp-login.php bestand.
  • Regel 14: … behalve voor mijn eigen IP adres.
    Zelfs al weet iemand mijn IP adres te faken (ip-spoofing), dan nog heb je natuurlijk het gebruikers account met zeer sterke wachtwoord nodig om verder te komen. Het gros van de bezoekers staat voor die tijd al in de blacklist.
  • Zie deze wp-login maatregel in combinatie met selectief login-menu op https://ict.peppink.nl/inlog-en-uitlog-in-menu/ dat alleen met het eigen IP adres zichtbaar is.
    Iemand die toch naar https://mijndomein.nl/wp-login.php gaat heeft duidelijk de bedoeling in te loggen op de site, terwijl mijn website geen gebruikers accounts heeft. Ik heb liever dat men de voorkant van de website bewonderd.
  • Regel 18: zorgt ervoor dat het niet mogelijk is om door de directories van de website te browsen of de inhoud ervan te zien. Op die manier kan alle inhoud ook echt alleen maar via de website zelf benaderd worden.

Rewrite rules – IfModule mod_rewrite.c

Blokkeer op grond van HTTP_USER_AGENT

Met de volgende lijst worden bezoekers actief tegengehouden, wanneer een HTTP_USER_AGENT zich meld met een naam waarin aan de RewriteConditie wordt voldaan. Als dat het geval is wordt de actie in de laatste regel uitgevoerd, die de bezoeker tegenhoud.
In mijn geval wordt dan het IP adres meteen weer toegevoegd aan de hierboven beschreven blacklist ‘htaccess-ipdenied.txt’. en hoeven daarna in geen enkele vorm meer terug te komen.

# Ultimate htaccess Blacklist from Perishable Press
# Deny domain access to spammers and other scumbags
 RewriteCond %{HTTP_USER_AGENT} ^Anarchie [OR]
 RewriteCond %{HTTP_USER_AGENT} ^ASPSeek [OR]
 RewriteCond %{HTTP_USER_AGENT} ^attach [OR]
 RewriteCond %{HTTP_USER_AGENT} ^autoemailspider [OR]
 RewriteCond %{HTTP_USER_AGENT} ^BackWeb [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Bandit [OR]
 RewriteCond %{HTTP_USER_AGENT} ^BatchFTP [OR]
 RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Bot\ mailto:craftbot@yahoo.com [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Buddy [OR]
 RewriteCond %{HTTP_USER_AGENT} ^bumblebee [OR]
 RewriteCond %{HTTP_USER_AGENT} ^CherryPicker [OR]
 RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [OR]
 RewriteCond %{HTTP_USER_AGENT} ^CICC [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Collector [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Copier [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Crescent [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Custo [OR]
 RewriteCond %{HTTP_USER_AGENT} ^DA [OR]
 RewriteCond %{HTTP_USER_AGENT} ^DIIbot [OR]
 RewriteCond %{HTTP_USER_AGENT} ^DISCo [OR]
 RewriteCond %{HTTP_USER_AGENT} ^DISCo\ Pump [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Download\ Demon [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Download\ Wonder [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Downloader [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Drip [OR]
 RewriteCond %{HTTP_USER_AGENT} ^DSurf15a [OR]
 RewriteCond %{HTTP_USER_AGENT} ^eCatch [OR]
 RewriteCond %{HTTP_USER_AGENT} ^EasyDL/2.99 [OR]
 RewriteCond %{HTTP_USER_AGENT} ^EirGrabber [OR]
 RewriteCond %{HTTP_USER_AGENT} email [NC,OR]
 RewriteCond %{HTTP_USER_AGENT} ^EmailCollector [OR]
 RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR]
 RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Express\ WebPictures [OR]
 RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [OR]
 RewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [OR]
 RewriteCond %{HTTP_USER_AGENT} ^FileHound [OR]
 RewriteCond %{HTTP_USER_AGENT} ^FlashGet [OR]
 RewriteCond %{HTTP_USER_AGENT} FrontPage [NC,OR]
 RewriteCond %{HTTP_USER_AGENT} ^GetRight [OR]
 RewriteCond %{HTTP_USER_AGENT} ^GetSmart [OR]
 RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [OR]
 RewriteCond %{HTTP_USER_AGENT} ^gigabaz [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Go\!Zilla [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [OR]
 RewriteCond %{HTTP_USER_AGENT} ^gotit [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Grabber [OR]
 RewriteCond %{HTTP_USER_AGENT} ^GrabNet [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Grafula [OR]
 RewriteCond %{HTTP_USER_AGENT} ^grub-client [OR]
 RewriteCond %{HTTP_USER_AGENT} ^HMView [OR]
 RewriteCond %{HTTP_USER_AGENT} ^HTTrack [OR]
 RewriteCond %{HTTP_USER_AGENT} ^httpdown [OR]
 RewriteCond %{HTTP_USER_AGENT} .*httrack.* [NC,OR]
 RewriteCond %{HTTP_USER_AGENT} ^ia_archiver [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Image\ Stripper [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Image\ Sucker [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Indy*Library [OR]
 RewriteCond %{HTTP_USER_AGENT} Indy\ Library [NC,OR]
 RewriteCond %{HTTP_USER_AGENT} ^InterGET [OR]
 RewriteCond %{HTTP_USER_AGENT} ^InternetLinkagent [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Internet\ Ninja [OR]
 RewriteCond %{HTTP_USER_AGENT} ^InternetSeer.com [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Iria [OR]
 RewriteCond %{HTTP_USER_AGENT} ^JBH*agent [OR]
 RewriteCond %{HTTP_USER_AGENT} ^JetCar [OR]
 RewriteCond %{HTTP_USER_AGENT} ^JOC\ Web\ Spider [OR]
 RewriteCond %{HTTP_USER_AGENT} ^JustView [OR]
 RewriteCond %{HTTP_USER_AGENT} ^larbin [OR]
 RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [OR]
 RewriteCond %{HTTP_USER_AGENT} ^LexiBot [OR]
 RewriteCond %{HTTP_USER_AGENT} ^lftp [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Link*Sleuth [OR]
 RewriteCond %{HTTP_USER_AGENT} ^likse [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Link [OR]
 RewriteCond %{HTTP_USER_AGENT} ^LinkWalker [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Mag-Net [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Magnet [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Mass\ Downloader [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Memo [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Microsoft.URL [OR]
 RewriteCond %{HTTP_USER_AGENT} ^MIDown\ tool [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Mirror [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Mister\ PiX [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*Indy [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*NEWT [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Mozilla*MSIECrawler [OR]
 RewriteCond %{HTTP_USER_AGENT} ^MS\ FrontPage* [OR]
 RewriteCond %{HTTP_USER_AGENT} ^MSFrontPage [OR]
 RewriteCond %{HTTP_USER_AGENT} ^MSIECrawler [OR]
 RewriteCond %{HTTP_USER_AGENT} ^MSProxy [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Navroad [OR]
 RewriteCond %{HTTP_USER_AGENT} ^NearSite [OR]
 RewriteCond %{HTTP_USER_AGENT} ^NetAnts [OR]
 RewriteCond %{HTTP_USER_AGENT} ^NetMechanic [OR]
 RewriteCond %{HTTP_USER_AGENT} ^NetSpider [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [OR]
 RewriteCond %{HTTP_USER_AGENT} ^NetZIP [OR]
 RewriteCond %{HTTP_USER_AGENT} ^NICErsPRO [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Ninja [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Octopus [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Offline\ Explorer [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Offline\ Navigator [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Openfind [OR]
 RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Papa\ Foto [OR]
 RewriteCond %{HTTP_USER_AGENT} ^pavuk [OR]
 RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Ping [OR]
 RewriteCond %{HTTP_USER_AGENT} ^PingALink [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Pockey [OR]
 RewriteCond %{HTTP_USER_AGENT} ^psbot [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Pump [OR]
 RewriteCond %{HTTP_USER_AGENT} ^QRVA [OR]
 RewriteCond %{HTTP_USER_AGENT} ^RealDownload [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Reaper [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Recorder [OR]
 RewriteCond %{HTTP_USER_AGENT} ^ReGet [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Scooter [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Scrapy [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Seeker [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Siphon [OR]
 RewriteCond %{HTTP_USER_AGENT} ^sitecheck.internetseer.com [OR]
 RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [OR]
 RewriteCond %{HTTP_USER_AGENT} ^SlySearch [OR]
 RewriteCond %{HTTP_USER_AGENT} ^SmartDownload [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Snake [OR]
 RewriteCond %{HTTP_USER_AGENT} ^SpaceBison [OR]
 RewriteCond %{HTTP_USER_AGENT} ^sproose [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Stripper [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Sucker [OR]
 RewriteCond %{HTTP_USER_AGENT} ^SuperBot [OR]
 RewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Surfbot [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Szukacz [OR]
 RewriteCond %{HTTP_USER_AGENT} ^tAkeOut [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Teleport\ Pro [OR]
 RewriteCond %{HTTP_USER_AGENT} ^URLSpiderPro [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Vacuum [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Vagabondo [OR]
 RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Web\ Image\ Collector [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Web\ Sucker [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebAuto [OR]
 RewriteCond %{HTTP_USER_AGENT} ^[Ww]eb[Bb]andit [OR]
 RewriteCond %{HTTP_USER_AGENT} ^webcollage [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebCopier [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Web\ Downloader [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebEMailExtrac.* [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebFetch [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebGo\ IS [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebHook [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebMiner [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebMirror [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebReaper [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebSauger [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Website [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Website\ eXtractor [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Website\ Quester [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Webster [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebStripper [OR]
 RewriteCond %{HTTP_USER_AGENT} WebWhacker [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WebZIP [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Wget [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Whacker [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Widow [OR]
 RewriteCond %{HTTP_USER_AGENT} .*wise-guys.nl/ [OR]
 RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
 RewriteCond %{HTTP_USER_AGENT} ^x-Tractor [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Xenu [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Zeus.*Webster [OR]
 RewriteCond %{HTTP_USER_AGENT} ^Zeus 
 RewriteRule ^.* - [F,L]
Toelichting op de regels
  • Regel 3-178: Elke regel beschrijft een conditie voor de naam van een http_user_agent. waarop wordt gecontroleerd. Wanneer er een match is wordt in de laatste regel de RewriteRule toegepast.
  • Regel 179: Geeft aan dat de opgegeven url (^.*) niet wordt aangepast (-), maar dat de toegang wordt tegengehouden (F), waarna verdere verwerking van het .htaccess bestand stopt (L). Zie de eerder gegeven karakter definities.

Blokkeer op grond van HTTP_REFERER

Een specifieke lastpost kwam steeds weer terug en wordt tegengehouden.
Als site.ru zich meld, gaat hij ook in de bittenbak. Zoek bij de karakter definities de betekenis op van de \, de /? en de [NC] in regel

# Block access from site.ru as referer
 RewriteCond %{HTTP_REFERER} site\.ru/? [NC]
 RewriteRule ^.* - [F,L]
Toelichting op de regels
  • Regel 2: We checken of site.ru zich meldt. (Zoek bij de karakter definities de betekenis op van de \, de /? en de [NC].)
  • Regel 3: Als aan de conditie wordt voldaan gaat ook hij in de ‘bittenbak’.

Blokkeer verschillende aanvallen

#From https://dev.to/kevinmel2000/stop-sql-injection-from-htaccess-1ki7
#Block suspicious request methods
 RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK|DEBUG) [NC]
 RewriteCond %{REMOTE_ADDR} !^83\.161\.146\.134
 RewriteRule ^(.*)$ - [F,L]

#Block WP timthumb hack
 RewriteCond %{REQUEST_URI} (timthumb.php|phpthumb.php|thumb.php|thumbs.php) [NC]
 RewriteRule . - [S=1]

#Block suspicious user agents and requests
 RewriteCond %{HTTP_USER_AGENT} (libwww-perl|python|nikto|curl|scan|java|winhttp|clshttp|loader) [NC,OR]
 RewriteCond %{HTTP_USER_AGENT} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
 RewriteCond %{HTTP_USER_AGENT} (;|<|>|'|"|\)|\(|%0A|%0D|%22|%27|%28|%3C|%3E|%00).*(libwww-perl|wget|python|nikto|curl|scan|java|winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR]
 RewriteCond %{THE_REQUEST} \?\ HTTP/ [NC,OR]
 RewriteCond %{THE_REQUEST} \/\*\ HTTP/ [NC,OR]
 RewriteCond %{THE_REQUEST} etc/passwd [NC,OR]
 RewriteCond %{THE_REQUEST} cgi-bin [NC,OR]
 RewriteCond %{THE_REQUEST} (%0A|%0D) [NC,OR]
#
##Block MySQL injections, RFI, base64, etc.
 RewriteCond %{HTTP_REFERER} (%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
 RewriteCond %{HTTP_REFERER} \.opendirviewer\. [NC,OR]
 RewriteCond %{HTTP_REFERER} users\.skynet\.be.* [NC,OR]
 RewriteCond %{QUERY_STRING} (./|../|.../)+(motd|etc|bin) [NC,OR]
 RewriteCond %{QUERY_STRING} (;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode) [NC,OR]
 RewriteCond %{QUERY_STRING} (\./|\../|\.../)+(motd|etc|bin) [NC,OR]
 RewriteCond %{QUERY_STRING} (\.\./|\.\.) [OR]
 RewriteCond %{QUERY_STRING} (\<|%3C).*embed.*(\>|%3E) [NC,OR]
 RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR]
 RewriteCond %{QUERY_STRING} (\<|%3C).*object.*(\>|%3E) [NC,OR]
 RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
 RewriteCond %{QUERY_STRING} (<|%3C)([^e]*e)+mbed.*(>|%3E) [NC,OR]
 RewriteCond %{QUERY_STRING} (<|%3C)([^i]*i)+frame.*(>|%3E) [NC,OR]
 RewriteCond %{QUERY_STRING} (<|%3C)([^o]*o)+bject.*(>|%3E) [NC,OR]
 RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
 RewriteCond %{QUERY_STRING} (<|%3C).iframe.(>|%3E) [NC,OR]
 RewriteCond %{QUERY_STRING} (<|%3C).script.(>|%3E) [NC,OR]
 RewriteCond %{QUERY_STRING} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
 RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
 RewriteCond %{QUERY_STRING} (NULL|OUTFILE|LOAD_FILE) [OR]
 RewriteCond %{QUERY_STRING} (sp_executesql) [NC]
 RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
 RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC,OR]
 RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
 RewriteCond %{QUERY_STRING} =PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)/self/(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^(.*)cPath=http://(.*)$ [NC,OR]
 RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>|%3c|%3e|%5b|%5d).* [NC,OR]
 RewriteCond %{QUERY_STRING} ^.*(\x00|\x04|\x08|\x0d|\x1b|\x20|\x3c|\x3e|\x5b|\x5d|\x7f).* [NC,OR]
 RewriteCond %{QUERY_STRING} _REQUEST(=|[|\%[0-9A-Z]{0,2}) [OR]
 RewriteCond %{QUERY_STRING} =|w| [NC,OR]
 RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [NC,OR]
 RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]
 RewriteCond %{QUERY_STRING} concat[^\(]*\( [NC,OR]
 RewriteCond %{QUERY_STRING} ftp: [NC,OR]
 RewriteCond %{QUERY_STRING} http: [NC,OR]
 RewriteCond %{QUERY_STRING} https: [NC,OR]
 RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC,OR]
 RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR]
RewriteRule ^(.*)$ - [F,L]

##############################################
# Blocks some XSS attacks
# The following code snippet protects your site against some common XSS attacks,
# namely script injections and attempts to modify global and request variables.
# Unless you use XSS, it is always a good idea to disable it.
 RewriteCond %{QUERY_STRING} (\|%3E) [NC,OR]
 RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
 RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
 RewriteRule .* index.php [F,L]

# Block wp-includes folder and files
# The wp-includes folder contains the core WordPress files.
# There are no good reason for anyone to have access, including the owner and administrator.
# So to harden security its best to restrict all access to it.
 RewriteRule ^wp-admin/includes/ - [F,L]
 RewriteRule !^wp-includes/ - [S=3]
 RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
 RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
 RewriteRule ^wp-includes/theme-compat/ - [F,L]

#For woocommerce without accounts. Deny login through "mijn-account"
 RewriteRule ^mijn-account/?$ - [F,L]

## Switch from http to https
## Following line causes an infinite loop on mobile devices
## RewriteCond %{HTTPS} !=on 
## Therefore I use....
 RewriteCond %{SERVER_PORT} 80 
 RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301] 

# BEGIN WordPress
# De richtlijnen (regels) tussen "BEGIN WordPress" en "END WordPress" worden
# dynamisch gegenereerd en zouden alleen aangepast mogen worden via WordPress filters.
# Alle wijzigingen aan de richtlijnen tussen deze markeringen worden overschreven.
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

# Add trailing slash except when an existing file or / is already present.
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_URI} !/$
 RewriteRule ^(.*)$ $1/ [NC,R=301,L]

# Prevent image hotlinking script. Replace last URL with any image link you want.
 RewriteCond %{HTTP_REFERER} !^$
 RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?ict.peppink.nl [NC]
 #Replace with https://i.imgur.com/MlQAH71.jpg
 RewriteRule \.(jpg|jpeg|png|gif)$ http://i.imgur.com/MlQAH71.jpg [NC,R,L]
Toelichting bij de regels
  • Volgt nog

Header rules – IfModule mod_headers.c

# HTTPOnly instructs the browser to trust the cookie only by the server, which adds a layer of protection against XSS attacks
# The secure flag in cookie instructs the browser that cookie is accessible over secure SSL channels, which add a layer of protection for the session cookie
 Header always edit Set-Cookie (.*) "$1; HTTPOnly; Secure"

# From https://htaccessbook.com.
# Protect against cross-site scripting attacks
 Header set X-XSS-Protection "1; mode=block"

# From https://htaccessbook.com.
# Protect against page-framing and click-jacking. Page can be displayed in a frame only if the frame is on the same domain.
 Header always append X-Frame-Options SAMEORIGIN

# From https://htaccessbook.com.
# Protect against content-sniffing
 Header set X-Content-Type-Options nosniff
Toelichting bij de regels
  • Volgt nog.

Maatregelen in WordPress

Backup

  • Volgt nog

Updates

  • Volgt nog.

Inlognamen en sterke wachtwoorden

  • Volgt nog.

Tips

Volgt nog.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Meer informatie over hoe uw reactiegegevens worden verwerkt.