Beiträge mit dem Tag linux

fail2ban – die phpMyAdmin-Sucher bannen

Erstellt von am Freitag, 1 April, 2011

Schaut man sich bei Langeweile mal die Datei [/var/log/apache2/error.log] an, finden sich oft Einträge in der abgebildeten Form.

[error] [client 91.121.xxx.xxx] File does not exist: /var/www/PMA
[error] [client 91.121.xxx.xxx] File does not exist: /var/www/dbadmin
[error] [client 91.121.xxx.xxx] File does not exist: /var/www/pma
[error] [client 91.121.xxx.xxx] File does not exist: /var/www/dbadmin

Irgendwelche Spaßvögel versuchen hier also tapfer das phpMyAdmin-Verzeichnis zu finden – oder auch andere Sachen, wie etwa RoundCube, Foren-Verzeichnisse usw.

Da derartige unnötigen Log-Einträge auf Dauer einfach nur die Übersicht kaputtmachen und irgendwie schlichtweg nerven, wollte ich die gerne künftig weitgehend unterbinden. Nur wie?

fail2ban bringt’s

Des Admins Freund ist hier fail2ban, ein Tool, welches es erlaubt, basierend auf bestimmten Filterregeln Logfiles zu prüfen und bei einem auf den Filter passenden Fund eine bestimmte Aktion auszuführen. fail2ban bringt dabei einige vordefinierte Regeln mit, netterweise auch schon für mein spezielles Problemchen. In der Standard-Einstellung ist die Regel jedoch nicht aktiv – und dazu leider in der Version von fail2ban, die mit Debian Squeeze verfügbar ist, auch noch fehlerhaft. Also ist Nacharbeit angesagt…

filter.d/apache-nohome.conf

Hauptsächlich wichtig zur Konfiguration von fail2ban ist die [/etc/fail2ban/jail.conf] und die einzelnen Dateien unter [/etc/fail2ban/filter.d/].

Der für mich notwendige Filter ist in der Datei [/etc/fail2ban/filter.d/apache-nohome.conf] hinterlegt – das sieht dann so aus:

# Fail2Ban configuration file
#
# Author: Yaroslav O. Halchenko <debian@onerussian.com>
#
# $Revision: 716 $
#

[Definition]

# Option: failregex
# Notes.: regex to match failures to find a home directory on a server, which
# became popular last days. Most often attacker just uses IP instead of
# domain name -- so expect to see them in generic error.log if you have
# per-domain log files.
# Values: TEXT
#
# failregex = [[]client <HOST>[]] File does not exist: .*/~.*
failregex = [[]client (?P<host>\S*)[]] File does not exist:

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =

Die wichtige Zeile ist dabei normalerweise diese hier (von fail2ban vorgegeben):

failregex = [[]client <HOST>[]] File does not exist: .*/~.*

Anhand dieses netten regulären Ausdrucks checkt nun fail2ban die error-Logs auf Einträge in denen der String “File does not exist” vorkommt. Testen kann man das mit dem Tool fail2ban-regex etwa wie folgt:

fail2ban-regex /var/log/apache2/error.log '[[]client <HOST>[]] File does not exist: .*/~.*'

Hier stellte sich bei mir dann Überraschung ein – es wurden keine Treffer gefunden und das trotz deutlich mehr als 100 vorhandenen Einträgen in dieser Form! Irgendwas läuft da also schief. Nur was? Es kann an sich ja nur der reguläre Ausdruck sein… Also einmal den Spürhund Google befragen – und siehe da, da ist tatsächlich ein Fehler drin.

Der korrekte Ausdruck muss wie folgt aussehen, dann funktioniert das auch:

failregex = [[]client (?P<host>\S*)[]] File does not exist:

[Update]

Unter folgendem Link ist auch noch mal eine Config genannt, bei der gezielt auf bestimmte Ordnernamen geprüft wird:

http://www.foosel.org/blog/2008/04/banning_phpmyadmin_bots_using_fail2ban

Außerdem hier noch einige Beispiele direkt aus dem Fail2Ban Wiki:

http://www.fail2ban.org/wiki/index.php/Apache

[Update Ende]

So, damit ist der Filter definiert. Damit fail2ban den Filter auch nutzt, geht’s nun zur jail.conf

jail.conf

[apache-nohome]
enabled = true
port = http
filter = apache-nohome
logpath = /var/log/apache*/*error.log
bantime = 604800
maxretry = 3

bantime gibt dabei an, für wie viele Sekunden eine IP gesperrt werden soll, wenn der Filter greift. Ich bin der Meinung, erwähnten Spaßvögeln soll für eine Woche der Spaß vergehen, daher setze ich die bantime auf 604800 Sekunden.

maxretry wiederum bestimmt, wie oft der Fehler auftreten darf, bevor die Sperre aktiviert wird.

Damit fail2ban die geänderte config berücksichtigt fehlt nur noch ein kurzer Neustart des Dienstes:

/etc/init.d/fail2ban restart

Erfolgs-Kontrolle

Das war’s auch schon – versucht nun jemand das phpMyAdmin-Verzeichnis oder irgendeine beliebige andere Anwendung im Webspace zu finden, ist nach 3 Versuchen Schluss mit lustig.

Kontrollieren lässt sich der Erfolg in der Datei [/var/log/fail2ban.log], hier finden sich bei einem Treffer Einträge ähnlich diesen hier:

fail2ban.actions: WARNING [apache-nohome] Ban 211.220.194.217
fail2ban.actions: WARNING [apache-nohome] Ban 41.203.119.18
fail2ban.actions: WARNING [apache-nohome] Ban 114.207.245.190

Schon werden die anfangs genannten Einträge im Apache Error-Logfile deutlich seltener auftreten, denn nach 3-maligem Auftreten sperrt ja nun fail2ban. Habe fertig!

3 Tipps für Linux-Suchtis

Erstellt von am Dienstag, 10 August, 2010

Kleine Skripte erleichtern das Admin-Leben ungemein. Mir geht’s dann oft nur so, dass ich nach einer gewissen Zeit überlege: “Wie war das gleich noch??”

Einige praktische Infos habe ich daher in diesem Beitrag zusammengefasst – für mich… und alle anderen die evtl. schon genau danach gesucht haben. ;)

Berechtigungen für Dateien und Unterordner rekursiv setzen

Sind die Berechtigungen in einem Ordner für Unterordner oder Dateien vollkommen verwahrlost, weil ein User z. B. in seinem Home-Verzeichnis hoffnungslos gewildert hat, lassen sich die Standard-Berechtigungen schnell wieder herstellen.

Man navigiert in den gewünschten Ordner und führt folgenden Befehl aus, um alle Ordner rekursiv  auf die Berechtigung “755” zu setzen:

find . -type d -exec chmod 755 {} \;

Um alle Dateien rekursiv auf644” zu setzen, wandelt man den Befehl leicht ab:

find . -type f -exec chmod 644 {} \;

Ausschlaggebend ist hier der Buchstabe nach type – “d” = directory und entsprechend  “f” = file.

Netzwerklaufwerke über SSH einbinden mit SSHFS

Die Backups der Server-Daten landen bei mir auf einem Netzlaufwerk, welches ich der Verschlüsselung wegen über SSH einbinde. Idealerweise wird die entsprechende Resource bereits beim Booten als Mount-Point bereitgestellt. Das lässt sich mit SSHFS und einem passenden Eintrag in die fstab sehr elegant  erledigen.

Erstmal SSHFS + Abhängigkeiten installieren:

apt-get install sshfs

Und dann den Eintrag in der fstab für’s “automount”:

sshfs#user_name@server_adresse:/pfad/auf/dem/server /mnt/mountpoint fuse auto,uid=XXXX,gid=XXXX,umask=0,allow_other 0 0

Genannte Angaben sind natürlich nur beispielhaft, “uid=XXXX” und “gid=XXXX” müssen natürlich durch die passenden Daten ersetzt werden. Die Anregung habe ich übrigens aus der Strato FAQ, da ich das bereits früher dieses Jahr getestete HiDrive für die Backups nutze. Unter genanntem Link gibt’s dann eben auch eine vollständige Anleitung.

Wichtiger Hinweis ist da übrigens, einen Eintrag in der /etc/rc.local vorzunehmen, damit das Laufwerk auch wirklich beim Neubooten eingebunden wird:

Sofern der automatische Mountvorgang nach einem Neustart nicht erfolgreich ist, kann es daran liegen, dass das Laufwerk beim Abarbeiten von “fstab” noch nicht bereit ist. Als Abhilfe tragen Sie bitte einfach in die Datei “/etc/rc.local” vor der Zeile “exit 0″ die beiden folgenden Zeilen ein:

sleep 20
mount -a

Den Wert 20 können Sie schrittweise verringern, bis es gerade noch reicht, um Ihr HiDrive nach einem Neustart erfolgreich zu mounten.

Und siehe da, tatsächlich – nach 2-3 Neustarts klappte es dann auch – bei mir steht der Wert jetzt auf 8 Sekunden.

Mail-Versand bei SSH-Login

Eine sehr praktische Sache fand ich den folgenden Tipp, den mir ein Kollege in einer Fachzeitschrift gezeigt hat. Der bewirkt, dass nach einem erfolreichen SSH-Login sofort eine Mail an eine frei festzulegende E-Mail-Adresse geschickt wird. Praktisch, weil ich auf einem Server, den ich betreue, durchaus den SSH-Zugang für bestimmte User erlaube (gezwungenermaßen), aber schon gerne wissen möchte wer denn da dran war, wenn was nicht mehr funktioniert. Nachher will’s ja immer keiner gewesen sein…

Folgende Zeile kommt dafür einfach in die Datei /etc/profile und schon weiß ich, wer’s dann nicht gewesen sein will:

echo 'Login on' `hostname` `date` `who` | mail -s "Login on `hostname` `who | awk '{print $5}'`" email@domain.de

Soweit so gut – hoffe zuvor genannte shortys helfen auch anderen.

Plesk 9.5 – jetzt mit Google Integration

Erstellt von am Freitag, 16 April, 2010
plesk_9.5.1

Parallels Plesk Panel 9.5.1

Alles neu! … ?

Bereits vor 2-3 Tagen erschien kurzzeitig bei einigen Usern in der Update-Verwaltung von Parallels Plesk Panel der Hinweis auf die neuen Version 9.5.1 – kurzzeitig, weil der Eintrag schnell wieder verschwunden war. Laut Plesk-Forum war es wohl ein “Versehen”, dass das Update angezeigt wurde.

Mittlerweile ist es soweit und Plesk 9.5.1 ist offiziell verfügbar. Wie immer bei Updates stellt sich die Frage: was bringen sie für Neuerungen? Für das beliebte Server-AdminPanel gab’s diesmal nicht so besonders viele Neuerungen. In der Hauptsache waren es Bugfixes und neue Versionen der Software. Etwas seltsam fand ich, dass Parallels in der offiziellen Liste der Neuerungen gleich ganze 23 (!) Neuerungen anführt:

  1. Offer hundreds of applications via Application Packaging Standard Catalog
  2. Resellers Level
  3. Parallels Plesk Billing Integration
  4. Postfix Support
  5. Enhanced Interface
  6. Total Control Backup
  7. Overselling/Overuse Capabilities
  8. @Mail Availability
  9. PHP over Fast CGI
  10. Improved Hosting Setup
  11. API RPC Protocol 1.6.0.0
  12. New Operating System Support (OpenSuSE 11, Fedora 11, Debian 5, Windows Server 2008 R2)
  13. Microsoft SQL Server 2008 Support
  14. Greylisting
  15. Migration Utilities
  16. Microsoft Hyper-V Server Compatibility
  17. PCI Compliance
  18. Compatibility with Microsoft Internet Explorer 8
  19. CloudLinux support
  20. Google Services for Websites support (beta)
  21. Upgraded components (on Linux)
    ProFTPD was upgraded to the version 1.3.2b, phpMyAdmin to the version 2.9.11, and Horde Application Framework to the version 3.3.6
  22. Upgraded components (on Windows)
    phpMyAdmin was upgraded to the version 2.9.11, IceWarp (Merak) Mail Server to the version 10, Bind DNS server to the version 9.4.3-P4, PHP to the version 5.2.12, and Horde Application Framework to the version 3.3.6
  23. More virtualization solutions supported

Diese und weitere Infos zum Produkt finden sich übrigens hier auf der offiziellen Firmen-Webseite: Parallels Plesk Panel 9.5

“Seltsam” fand ich es,

weil viele der genannten Funktionen bereits offiziell Bestandteil der Vorversion 9.3 des Plesk Panel waren. So z. B.:

  • den “Application Packaging Standard Catalog”
  • den Reseller Level
  • Plesk Billing Integration
  • Postfix Support
  • Overselling/Overuse Capabilities
  • Atmail Webmailer (@Mail)
  • PHP über Fast CGI
  • Unterstützung der Betriebssysteme OpenSuSE 11, Fedora 11, Debian 5, Windows Server 2008 R2
  • Greylisting (Spam-Schutz)

Ich nutze bspw. bereits seit Monaten unter Plesk 9.3 Postfix als Mailserver, könnte Atmail für Webmail verwenden. Erwartet uns hier evtl. mehr Funktionalität als nur der Webmailer? Von Atmail gibt’s ja eine komplette Groupware – DAS wäre dann natürlich durchaus eine angenehme Neuerung. Meine Webseiten laufen aber auch schon unter Plesk 9.3 mit PHP als Fast CGI und das ganze System an sich auf Debian 5. Greylisting brauchte ich bisher nicht – installiert und somit verfügbar ist es aber.

Was mit der Funktion “Total Control Backup” gemeint sein soll, kann ich gerade nicht so ganz einordnen. Auch Plesk 9.3 hat bereits einen Backup-Manager, der recht ordentlich funktioniert. Er ermöglicht komplette Backups aller Einstellungen und Inhalte die Plesk verwaltet. Alternativ sind auch per Domain selektive Backups möglich. Hier bin ich gespannt, ob mit Plesk 9.5 weitere Funktionen hinzu kommen.

Neu ist “Parallels Premium Antivirus” – könnte man meinen, wenn man im Autoinstaller beim Upgrade den Eintrag liest. Aber auch das ist nicht wirklich neu. Nur ein anderer Name für “Dr.Web” Antivirus, was bei Auswahl der Komponente dann tatsächlich installiert wird.

Wirklich neu…

…sind allerdings die Kompatibilität mit Internet Explorer 8 (bisher wurden hier die Symbole im Adminpanel nicht angezeigt) sowie die Google Integration. Details zu den Funkionen bezüglich Google finden sich (auf Englisch) hier: http://download1.parallels.com/Plesk/PPP9/Doc/en-US/plesk-9.5-administrators-guide/index.htm?fileName=64635.htm.

Das ist so toll und neu, dass Parallels wohl der Meinung war, es wäre eine super Idee, die Twitter-Timeline der Follower zuzuspammen. Innerhalb von etwas mehr als einer Stunde haben die Jungs gleich 12 Tweets zum Thema Google Integration rausposaunt – alle mit einem Link auf ein und denselben Artikel… Nun ja, es sei ihnen vergönnt darauf stolz zu sein.

twitter_dialog_parallels

Twitter-Dialog mit @ParallelsPanel

Neuer Lizenzkey

Das Negative am Update: es wird mal wieder ein neuer Lizenzkey fällig. In meinem Fall läuft der Server bei @STRATO_AG, im Kundenbereich steht hier noch kein neuer Key bereit. Erfahrungsgemäß dauert es immer ein paar Tage, bis der neue Key durch Parallels bereitgestellt und dann zum Download verfügbar ist. Wer ein Update auf Plesk 9.5.1 erwägt, sollte daher lieber noch warten. Führt man das Update aus und ignoriert den Warnhinweis bzgl. der Lizenz steht dann nämlich nur noch der Demo-Key im Panel zur Verfügung und Plesk verweigert die (Verwaltungs-)Arbeit.

Wer nun schon ein Update gemacht hat und vor dem Dilemma steht, braucht wohl ein wenig Geduld. Sobald der neue Key verfügbar ist, kann dieser in Plesk hochgeladen werden und schon geht’s weiter. Plesk “vergisst” die Einstellungen nicht – auch alle Dienste laufen weiter. Nur mit Plesk selbst kann man halt in der Zeit nicht arbeiten.

Just in time…

Nachdem ich mich ein wenig darüber ausgelassen hatte, dass dermaßen viele Tweets zum Plesk-Update gemacht wurden, kam postwendend die Antwort: “So sorry! … I just got excited!” – Da muss die Google-Geschichte ja richtig super gelungen sein. Ich bin gespannt! Auf die Frage, wann den die neuen Lizenzkeys ausgeliefert werden, bekomme ich die Antwort dann wohl noch nachgeliefert. Spannung also auch hier…

Wie sich das Ganze dann in der Praxis macht, dazu später mehr. Sobald ich den entsprechenden neuen Key habe, werde ich die Google-Funktionen ausgiebig testen und hier berichten.

Apache + PHP: stop talking!

Erstellt von am Samstag, 14 November, 2009

Apache + PHP

Bei einer kürzlichen Kontrolle

des Apache-Logfiles fielen mir massenweise folgender Meldungen auf:

[Sat Nov 07 12:00:49 2009] [error]
[client xxx.xxx.xxx.xxx] client sent HTTP/1.1 request without hostname
(see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

Da man Anfragen an einen Server ja in der Regel nicht ohne Grund stellt, ist natürlich die Frage: Was gibt denn der Server für Infos als Header raus, wenn ein HTTP-Request gestellt wird?

Wie ich feststellen musste, sind das in der Standard-Konfiguration jede Menge Infos! Darunter unter Anderem:

  • verwendetes Betriebssystem
  • verwendeter HTTP-Server mit Versionsnummer
  • installierte Mods, wie z. B. Python, SSL, Perl, etc. sowie die jeweilige Version
  • bei Aufruf einer PHP-Seite auch die PHP-Version

Kurz darüber nachgedacht… Wen gehen diese Daten etwas an? Tja, aus Sicherheitsgründen eigentlich niemanden, der nicht direkt aus Verwaltungsgründen oder Programmierfragen etwas mit dem Server zu tun hat. Also – wie bringe ich Apache und PHP bei, nicht so zu tratschen?

Die Lösung

sind zwei Einträge in den Konfigurationsdateien von Apache und PHP.

Zuerst der Eintrag für den Apache – wieviele Infos der Apache preisgeben darf legt man über den Eintrag “ServerTokens” fest. Den kann man z. B. einfach ganz in die letzte Zeile der Datei /etc/apache2/apache2.conf schreiben.

Fünf Einstellungen stehen dabei zur Auswahl:

  • Kein Eintrag oder auskommentiert = Produktname + Version, Betriebssystem und Module
  • OS = Produktname + Version und Betriebssystem
  • Min = Nur Produktname + Version
  • ProductOnly = Nur Produktname
  • Major = Nur Produktname + Haupt-Versionsnummer

Also würde bspw. ein Eintrag in der Form “ServerTokens ProductOnly” dafür sorgen, dass im Header nur noch die Info “Server = Apache” mitgesendet wird.

Die zweite Änderung betrifft die Datei /etc/php5/apache2/php.ini – hier sucht man sich den Eintrag “expose_php =” und setzt diesen auf den Wert “Off“.

Abschließend

folgt noch ein Neustart des Apache-Servers über den Befehl “/etc/init.d/apache2 restart” und schon hat das Getratsche – wie im Bild zu sehen – ein Ende.

ScreenShot Antwort-Header

ScreenShot Antwort-Header