.htaccess mit PHP bearbeiten

  • Hallo zusammen!

    Mit HTML und CSS kenne ich mich zwar halbwegs aus, mit PHP aber quasi gar nicht...

    Mal von Anfang an...

    Aktuell leite ich diverse User-agents und Aufrufe (bestimmte Dateiendungen usw.) via mod_rewrite auf ein PHP-Script um, welches mir eine access.log mit den bösen Buben (bad bots wie Scraper, security checker usw.) erstellt. Das ganze ist aktuell eine Spielerei um die "Jungs" zu loggen und nicht auf die Seite zu lassen. Das Script stammt von hier, ich habe es nur etwas modifiziert/erweitert und an meine Bedürfnisse angepasst...woraus dann folgendes wurde:

    Der nächste Schritt wäre jetzt, die IPs der bösen Buben in die .htaccess unter "deny from all" einzutragen. Ich habe schon nach Ansätzen gesucht, aber nichts brauchbares gefunden...kann mir jmd. helfen, die geloggten IPs in die .htaccess zu bekommen?

    Viele Grüße
    soggi

  • "Deny from all" kennt keine IPs als Parameter, einfach weil es genau das tut: Den Zugang für alle in dem Pass, in dem die Deny Direktiven abgearbeitet werden zu verweigern. Das ist ein three-pass Vorgang, deswegen hat man üblicherweise auch eine "Order" Direktive in der .htaccess.

    Der erste Pass verarbeitet alle Direktiven, die den ersten Parameter der Order-Direktive matchen. Pass 2 verarbeitet alle, die den zweiten Parameter matchen, und Pass 3 den Rest.

    So z.B.:

    Code
    order deny,allowdeny from allallow from 12.34.56.78

    Apache würde in Pass 1 zuerst alle sperren, dann in Pass 2 ausdrücklich nur 12.34.56.78 Zugang gewähren und in Pass 3 leer durchlaufen, da es keine weiteren Direktiven gibt. Das Endergebnis ist also, daß nur 12.34.56.78 auf den Host darf und sonst niemand.

    Sprich, es gibt keine "Deny from all Liste". Was du willst ist eine Host-spezifische "Deny from" Liste, und das ist recht einfach. Den Code um Zeug in eine Datei zu schreiben hast du schon. IPs in fertigen Log Files hast auch. Alles was du tun mußt ist es, die aus den Logs zu fetchen und zeilenweise in deine .htaccess zu schreiben, so wie du auch deine $today . "_log.txt" baust, ausgehend von einer ansonsten leeren oder von Order/Allow/Deny Direktiven freien .htaccess. Alternativ von einer die mit "Order Allow,Deny" und "Allow from all" beginnt.

    Ich schlage daher folgendes vor (ohne das auf Funktion geprüft zu haben, das obliegt dir! ;) Da sind sicher noch genug Bugs drin, wie immer bei komplett ungetestetem Zeug von einem der sowieso kein PHP programmieren kann:

    Das geht her, liest alle deine *.txt Log Files (in dem Folder sollte sonst nichts liegen!) ein, fetched die IP Adressen raus, und schreibt sie als "deny from" Lines in deine .htaccess! Oder das sollte er. Laufen tut das eben sicher nicht, wer weiß wo ich überall kleine Fehler hab. Na jedenfalls solltest die verarbeiteten Logs dann aus dem Logordner wegschieben oder löschen, damit beim nächsten Run keine doppelten Einträge in der .htaccess entstehen.

    Hierfür gibt es übrigens auch fertige Lösungen für *nix Server, die das auf Basis von iptables machen (brauchst einen root Server), wie etwa [fail2ban].

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

  • Hey GAT,

    danke für Deine Mühe, ich hatte den Thread schon als "begraben" gesehen! :thumbup:

    Mir sind in den letzten Wochen zum Thema drei Sachen klar geworden, warum mein Ansatz für meine Situation eigentlich Käse ist.

    1. Die meisten IPs sind dynamic von ISPs (meist infizierte Rechner!?)...die sollte man höchstens temporär sperren.
    2. Basierend auf 1. bräuchte ich einen Mechanismus, der die IPs wieder entfernt.
    3. Die .htaccess wird dann zu 95% eine Liste aus IPs sein.

    -> Ohne fundierte Programmier-Kenntnisse (vll auch mit?) ist das einfach auf diesem Weg nicht zu bewerkstelligen.

    Den Umgang mit "order deny,allow" <-> "order allow,deny" hab ich mir schonmal angesehen, die Funktionsweise ist mir also grundsätzlich klar. Ich werde mich demnächst mal erneut damit auseinandersetzen und mir das Script reinziehen, versuchen es zu verstehen und mir was nützliches zusammenbauen.

    Wenn Du das alles selbst geschrieben hast, dann kannst Du auf jeden Fall wesentlich mehr PHP programmieren als ich...ich komm grad so mit dem Verständnis und Umbau des von mir verwendeten Scripts klar und das ist wohl echt nen ziemlich billiges Teil. :topmodel:

    Zu iptables hab ich auch schon Sachen gelesen...bringt mir aber halt nichts, da shared Hosting. :(

    Als Alternative bleibt dann nur noch was über MySQL...das wird wohl aber noch schwieriger...da muss ich nochmal fundiert recherchieren.

    Viele Grüße
    soggi

  • Abgesehen davon, dass 30 Tage viel zu lange wären - 24h müssten reichen - übersteigt das meine Kenntnisse glaube extrem. Da muss ich mich Suchmaschinentechnisch nochmal kundig machen. :(

    Viele Grüße
    soggi

  • Da brauch man doch direkten Zugriff auf den Datenbank-Server? Hat man nicht bei Strato. SSH-Tunnel geht auch nicht...das Passwort dafür wurde geändert und mir nicht mitgeteilt. Bin nur mietfreier Gast auf dem Host.

    Aber das Tool werd ich mir mal für die Zukunft merken.

    Viele Grüße
    soggi

  • Das Script habe ich geschrieben, ja, tlw. abgeleitet aus dem von dir geposteten Code. Aber auf mein PHP Wissen - oder nennen wir es lieber "gefährliches Halbwissen" - sollte man sich trotzdem nicht ungeprüft verlassen!

    Schade ist halt, daß du dir fail2ban nicht installieren kannst am Host, das erledigt die Aufgabe super. Diese tarpit hab ich auch auf der Arbeit für OpenSSH laufen, und die macht den Job in Verbindung mit iptables super. Nutzt dir halt leider nichts. Klar könnte man das Verhalten einfach nachstellen über das Skript und mit .htaccess, datenbankgestützt ist das natürlich gleich noch viel besser. Aber das ist für jemanden ohne nennenswerte Übung schon eine gewisse Arbeit. :(

    Hab ich beim Aufmotzen der ursprünglich von Umlüx geschriebenen x264 Benchmarkliste auch gemerkt, wie mühsam sowas ist wenn man keinen Plan hat. ;)

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

  • Was Du haben willst ist fail2ban. Das tut genau das geforderte (Logs auswerten und darauf reagieren) und bannt dann aber auch direkt auf IP-Ebene in der Firewall (iptables), nicht auf Applikationsebene. Auch das automatische Entfernen der IP nach vorgebener Zeit macht er automatisch.
    Wenns darüberhinaus gehen soll und Du z.B. auch noch benachrichtigt werden willst, wäre OSSEC eine Variante.

    Merke: Egal was Du willst, es hat schon jemand gebaut ;)

    Edit: Ups, GAT hat's schon geschrieben. Lesen bildet... sorry.

    We are Microsoft of Borg. Assimilation is imminent. Resistance is... Error in Borg.dll. Press OK to abort.

  • Jo, er hat halt leider keinen root Server, das is das Problem..

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

  • Genau so wie GAT sagt ist es...es gibt auch schon fertige Sachen auf PHP<->MySQL Basis...die hauen mir aber zu viele Bots raus, die ich gewähren lassen würde...ich muss mal schauen, ob es eine nackte Lösung gibt.

    Wenn ich mir das so vorstelle, müsste ich dann sicher in alle htms ein PHP Schnipsel einbauen und die Dateien in *.(phtml|php) umbenennen. mich ängstigt auch etwas die Bearbeitungszeit...jeder Zugriff erzeugt einen Datenbankzugriff. :wacko:

    Mal so nebenbei...hat jmd von euch Erfahrungen mit uberspace.de? Falls ich doch mal wieder umziehen muss...erscheint mir ziemlich kompetent und schön nerdy...müsste mich sicher noch schön in shell/SSH-Kram einarbeiten...aber hätte ich irgendwie auch mal Bock drauf. Die größere Frage ist whs eher wie die Performance bei den Jungs ist.

    Danke für eure Vorschläge!

    Viele Grüße
    soggi

  • Wenn ich mir das so vorstelle, müsste ich dann sicher in alle htms ein PHP Schnipsel einbauen und die Dateien in *.(phtml|php) umbenennen. mich ängstigt auch etwas die Bearbeitungszeit...jeder Zugriff erzeugt einen Datenbankzugriff. :wacko:

    Wenn du wüßtest, wieviele Datenbankzugriffe und wieviel miesen PHP Code manche Pentium Pro Prozessoren aushalten müssen... :topmodel: Aber generell: Jedes moderne Web ist auch nichts anderes: Foren, CMS', usw., und die sind sicher viel intensiver.

    Generell ist MySQL aber sehr schnell und sehr sparsam mit CPU Ressourcen, wenn man keine idiotischen und extrem verschachtelten Queries auf Monsterdatenbanken losläßt. Selbst bei sehr wenig Code wird das PHP noch eher Last fabrizieren, was sich aber durch Bytecodecaches wie eAccelerator oder Zend Cache stark reduzieren läßt.

    Uberspace kenne ich leider nicht, bzw. ich kenn's nur namentlich, hab's aber nie verwendet. Hätte sonst auf die JiffyBox verwiesen, aber irgendwie scheinen die übernommen worden zu sein, schade. Aber die hatten ein super Managementinterface, man konnte sogar per Browser in eine root Shell auf der Box - sofern man dem traut. ;) Rechnen sekundengenau ab, nur weiß ich jetzt nicht, ob dir die ~15€/Monat Maximalpreis für die kleinste Box nicht schon zuviel sind.

    1-6000-banner-88x31-jpg

    Stolzer Besitzer eines 3dfx Voodoo5 6000 AGP Prototypen:

    • 3dfx Voodoo5 6000 AGP HiNT Rev.A-3700

    [//wp.xin.at] - No RISC, no fun!

    QotY: Girls Love, BEST Love; 2018 - Lo and behold, for it is the third Coming; The third great Year of Yuri, citric as it may be! Edit: 2019 wasn't too bad either... Edit: 2020... holy crap, we're on a roll here~♡!

    Quote Bier.jpg@IRC 2020: "Je schlimmer der Fetisch, desto besser!"

  • Wie du schon mitbekommen hast, bin ich da halt etwas ängstlich. Bzw. will ich nicht unnütz Ressourcen verschwenden...das ist irgendwie schon immer mein Credo.

    Dieses Jiffybox wurde wohl von domainfactory übernommen. Ein Umzug ist noch nicht absehbar...mich hat nur Uberspace von der Beschreibung her gereizt...klang nach Freaks, die einfach ihr Ding aufbauen und durchziehen wollen, ziemlich technikaffin, kein Marketing-Geblubber.

    Ich hab halt finanziell überhaupt keine sichere Zukunft, deswegen scheue ich mich grundsätzlich erstmal vor zusätzlichen Ausgaben...aber wenn's irgendwann nicht anders geht, muss es halt. Ich hatte vor 1 1/2 Jahren mal überlegt @Hetzner für günstig (3,90 EUR glaube)...aber irgendwie kein gutes Gefühl dabei.

    Wenn ich mal wieder Zeit hab, werd ich wohl mal Richtung PHP<->MySQL schielen, geht halt vorwiegend darum Bots mit wechselnden UAs bzw solche, die in meine Falle tappen für einen gewissen Zeitraum per IP zu blocken.

    Viele Grüße
    soggi

  • Da die meisten unerwünschten Zugriffe von irgendwelchen Server-Farmen kommen, löse ich das Ganze erstmal über die .htaccess:

    Mit dem HTTP 403 raffen die es vll mal, dass sie nicht erwünscht sind. In die 403.php werde ich dann auch das bewährte Log-Script einbauen. Es werden sicher noch "einige" IP-Ranges hinzukommen. :topmodel:

    BTW krass, dass durch die reservierten Bereiche, die nicht geroutet werden, erstmal ~600 Mio IPv4 Adressen verpulvert werden. 8o

    Viele Grüße
    soggi