längerer Kurztipp: Schutz gegen einfache DOS Attacken mit mod_evasive

Ein alter Hut, ich kannte es bis heute nicht. Mit mod_evasive kann man einfache DOS Angriffe blocken. Getestet mit dem guten, alten Squeeze.

$ apt-get install libapache2-mod-evasive
$ a2enmod mod-evasive
$ zless /usr/share/doc/libapache2-mod-evasive/README.gz
$ mkdir /var/log/mod_evasive
$ chown www-data /var/log/mod_evasive
$ ln -s /usr/bin/mail /bin/mail

$ joe /etc/apache2/mods-available/mod-evasive.conf

<ifmodule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSLogDir /var/log/mod_evasive
DOSEmailNotify thisis@waste.land
DOSWhitelist 127.0.0.1
</ifmodule>

$ ln -s /etc/apache2/mods-available/mod-evasive.conf /etc/apache2/mods-enabled/mod-evasive.conf
$ /etc/init.d/apache2 reload

Zum testen einfach mal irgendeine Seite aufrufen und ein paar mal schnell F5 drücken bis man ein 403 Forbidden erhält. Dann im logdir schauen und eigentlich sollte man auch eine mail bekommen. Im syslog sollte ein Eintrag der Art
Mar 14 11:36:15 webserver  mod_evasive[15723]: Blacklisting address 123.123.123.123: possible DoS attack
aufauchen.
Mit DOSSystemCommand kann man noch einen Befehl definieren, der ausgeführt werden soll wenn eine IP geblockt wird, also z.B. iptables Regel zum sperren der IP („sudo /sbin/iptables -A INPUT -s %s -j REJECT„) oder was auch immer.
Die Meinungen zum Einsatz von mod_evasive gehen etwas auseinander, daher sollte man es erst mal  unter Beobachtung laufen lassen und am besten vorher mal ein bisschen googlen.
Zusammen mit HAproxy oder Nginx als Reverseproxy funktioniert mod_evasive nicht. Da kann man sich  mal das Nginx Modul HttpLimitReq anschauen. mod_evasive blacklisted zwar die IPs, mehr aber leider nicht.

Links:

http://www.linux-magazin.de/Ausgaben/2005/12/Friede-im-Indianerland

http://pc-freak.net/blog/secure-apache-against-basic-denial-of-service-attacks-with-mod_evasive-on-debian/

http://spielwiese.la-evento.com/xelasblog/archives/56-Apache-DOS-Attacken-erschweren-mit-mod_evasive.html

Bugfix Release für Galera

Es gibt ein Galera Update. Primär ein Bugfix Release. Ein neues Feature klingt aber recht viel versprechend:

„Plus new experimental feature: weighted quorum (lp:1010225). Weight can be an integer in the range 0-255. Nodes with zero weight don’t participate in quorum calculation. By default all nodes have weight 1.“

http://www.codership.com/content/mysql-wsrep-5529-2373-and-galera-2324-released

Updaten lief ohne Probleme.

ioioio makes the server slow

Arbeitet man mit Virtualisierung (ESX, KVM & Co) sollte man auf den VMs immer den iowait im Auge haben. Egal was die Hostmaschinen an schönen  Daten ausgeben, hat die VM einen zu hohen iowait gibt es früher oder später Probleme. Ich nutze dafür den check_cpu_stats  Check von Steve Bosek für Nagios. Der Check liefert  noch einige Daten mehr. Als Ergebnis bekommt man in etwa Folgendes:

$ /usr/lib/nagios/plugins/check_cpu_stats.sh -w 20 -c 40
CPU STATISTICS OK : user=0.50% system=1.01% iowait=3.27% idle=95.21% nice=0.00% steal=0.00% | CpuUser=0.50;CpuSystem=1.01;CpuIoWait=3.27;CpuIdle=95.21;CpuNice=0.00;CpuSteal=0.00;20;40

Bei Debian&Co sollte sysstat installiert sein. Mit den Zahlen lassen sich  schöne Grafiken bei Centreon erzeugen:

loadwait

Hinweise auf bessere Checks sind natürlich willkommen.

 

Centreon mit Custom Views

Ich hatte das zwar schon vor einiger Zeit  im monitoring-portal geschrieben, aber totzdem auch nochmal hier.

Ab Centreon 2.4.0 kann man sich nun „Custom Views“ mit Widgets für den Startbildschirm zusammenstellen.

Eine Dokumentation gibt es unter
http://documentation.centreon.com/docs/centreon/en/latest/extending/widgets/index.html
Dort steht auch wie man eigene Widgets schreibt.

Die Widgest gibt es unter
http://www.centreon.com/Content-Download/centreon-widgets
Dort liegen schon neuere Versionen. Ich habe noch die Widgets von http://forge.centreon.com/projects/centreon-widgets/files installiert. Werde die neuen Versionen gleich mal installieren und berichten falls es größere Unterschiede gibt.

Wie aufwendig so ein Widget zu schreiben ist kann ich nicht abschätzen. Auf jeden Fall ein nettes Feature was sicherlich noch ausgebaut wird. Super wäre es natürlich wenn man ein Widget für nagvis Karte hätte.

Custom Views:

screenshot15

Diese Widgets gibt es bisher bei Centreon:

screenshot16

 

Update 1: Nutzt man nicht den Centreon Broker sondern ndo, werden beim service-monitoring widget (1.1.0) alle services  4mal Angezeigt. Das der Centreon Broker dies Problem behebt habe ich nur im Centreon Forum gelesen aber noch nicht ausprobiert.

Kurztipp: Raspbmc und ssh über WAN

Will man von außerhalb des lokalen Netzwerks auf den Raspberry Pi zugreifen, muss man die lokale Firewall von raspbmc etwas anpassen. Zu finden sind die Einstellungen unter /etc/network/if-up.d/secure-rmc

$ tail -n 7  /etc/network/if-up.d/secure-rmc
logger -t iptables "Configuring ip tables for interface $IFACE"
if [ "$IFACE" != "lo" ]; then
NETMASK=$(get_subnet $IFACE)
iptables -A INPUT -s $NETMASK -i $IFACE -j ACCEPT
iptables -A INPUT -i $IFACE -j DROP
fi

Das kann man dann nach eigenen Wünschen anpassen. Also z.B. ein

$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT 

vor der DROP Regel. Warum droppen eigentlich immer alle Leute!? Ich finde ein REJECT ist viel schicker und sinniger als so ein dämliches DROP ;-).

Am besten vorher mal ein

$ iptables -I INPUT -p tcp --dport 22 -j ACCEPT

eingeben um zu testen ob Portforwarding vom Router usw. überhaupt richtig eingetragen ist und funktioniert. Und nun das wichtigste:
ÄNDERT das Default Passwort

Natürlich kann man die Regeln dementsprechend anpassen und nur bestimmten IPs Zugriff erlauben, iptables ist bekannterweise ein weites Feld.

p.s. raspbmc gefällt mir um einiges besser als openelec

update: Nun kann man auch die Firewall direkt via raspbmc addon im xbmc deaktivieren.

Kurztipp: zu viele sleeping connections bei MySQL

Hat man zu viele sleeping Connections bei MySQL, hilft eventuell ein Heruntersetzen des Wertes für die wait_timeout Variable. Default ist diese auf stolze 28800 Sekunden gesetzt. Vorher anschauen ob es überhaupt Probleme mit der Anzahl der Connections gibt, denn der Aufbau einer neuen Connection kostet  immer etwas mehr als eine bestehende zu nutzen. Ein einfaches Erhöhen der max_connections Variable ist eventuell sinnvoller. Im laufenden Betrieb kann man den wait_timeout  einfach mit

 mysql> set global wait_timeout = 3600;

hoch setzen. Das ist natürlich nur eine „Schraube“ an der man drehen kann. Je nach Anwendung ist es auch sinnvoll sich die MySQL Einstellungen in der /etc/php5/apache2/php.ini anzuschauen,  also mysql.allow_persistent & co.
Die Auswirkungen der Einstellungen könnten dann z.B. so aussehen (kurz nach 11 Uhr):

screenshot13

Die Werte dabei sind in keiner Weise kritisch, verdeutlichen aber den Unterschied.

 

update: Eventuell kann ein zu niedriger Wert negative Auswirkungen auf Replikationen haben

Wenn es mal wieder einfach und schnell gehen soll…Music Browser

Im Laufe der letzten Jahre habe ich mir Netjuke, Jinzora, Subsonic, Tin Can Jukebox und natürlich Ampache zur Musikverwaltung angeschaut. Netjuke hat mir damals sehr gut gefallen, wurde dann aber nicht mehr weiter entwickelt und ist irgendwie mit Jinzora „fusioniert“. Jinzora war einfach nur gruselig und dabei habe ich mir wirklich Mühe gegeben es zu mögen. Subsonic und Tin Can Jukebox habe ich nur kurz installiert und dann zeit nah wieder entfernt. Ampache ist super, auch wenn die Entwicklung zur Zeit etwas stagniert. Es gibt für fast jede Plattform einen Client und die Funktionen reichen vollkommen aus. Nervig bei Ampache ist, dass man saubere MP3 Tags haben muss, dies ist z.B. bei Hörbüchern nicht immer der Fall. Eine sehr einfache, aber meiner Meinung nach gute Lösung ist Music Browser. Dabei wird zwar auf vieles verzichtet, aber das Wesentliche funktioniert gut. Ein paar Vorteile sind z. B.:

Keine Datenbank
Keine MP3 Tags
Klein und schnell
Keine überflüssigen Optionen

Eventuell auch eine nette Anwendung für den Raspberry Pi…und ja ich weiß, es gibt zwei Fantastilliarden Möglichkeiten Musik übers Netz abzuspielen und zu verwalten.

Ein vhost verschickt spam mails…aber welcher nur?

Um den Übeltäter zu finden, können zwei Einträge in der /etc/php5/apache2/php.ini helfen:

mail.add_x_header = On
mail.log = /var/log/phpmail.log

mail.add_x_header ist eigentlich per default aktiviert bei Debian. Im phpmail.log findet man dann:

mail() on [/var/www/vhosts/domain.com/httpdocs/pages/modules/system/system.mail.inc:83]: To: jeff@domain.co.uk -- Headers: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes Content-Transfer-Encoding: 8Bit X-Mailer: Drupal Sender: jeff@domain.co.uk From: jeff@domain.co.uk

Darauf achten das der Webuser auch in das Log schreiben darf.
Das ganze gibt es erst seit PHP 5.3.

Tatsächlich hilft auch ab und an mal ein

$ clamscan -i -r *
docroots/profiles.php: PHP.Trojan.WebShell-9 FOUND

Clamscan findet eine ganze Reihe von PHP Shells und auffälligen Code.

Mehr Infos findet an

http://blog.rimuhosting.com/2012/09/20/finding-spam-sending-scripts-on-your-server

http://php.net/manual/en/mail.configuration.php

Kurztipp: Raspberry Pi mit Openelec – Force HDMI

Es erscheint mir etwas überflüssig solche Tipps zu geben, da jeder Besitzer eines solchen Gerätes in der Regel weiß wo er schauen muss. Trotzdem ein einfacher Tipp. Falls man das Teil direkt via HDMI an einen AV Receiver anschließen will und kein HDMI Display anschließen will/kann, man aber trotzdem Musik hören will:

$ mount /flash -o remount,rw

und
# Force HDMI even if unplugged or powered off
hdmi_force_hotplug=1

auskommentieren in der /flash/config.txt

reboot…keine Ahnung ob es irgendwie ohne reboot geht, ich meine nicht. Als Fernbedienung bietet sich yatse an. Zum rumspielen ganz witzig, mal schauen was da noch so möglich ist.

Legt man das Teil auf den AV Reciever sollte man die Temperatur im Auge behalten ;-).

Pacemaker – Nodes sehen sich nicht nach IP takeover

Ein paar Informationen zur Umgebung und zu den Konfigurationsdateien:
Zwei nodes (lb1,lb2) via ESX virtualisiert. Jeweils nur ein Interface je node.

Meine alte corosync.conf:

...
interface {
 ringnumber: 0
 bindnetaddr: 192.168.1.0
 mcastport: 5405
 mcastaddr: 226.94.1.10
 }
...

Folgendes Problem:

Zwei nodes lb1 und lb2 und eine Ressource FAILOVER-ADDR (Cluster IP). Auf beiden läuft Pacemaker. Beide sehen sich und eigentlich sieht alles ok aus. Mache ich nun ein

lb1$ crm resource migrate FAILOVER-ADDR lb2

Wird FAILOVER-ADDR auf lb2 geschwenkt. Alles wunderbar, aber sobald die Aktion vollzogen ist sehen sich lb1 und lb2 nicht mehr via multicast. Ich habe nicht herausfinden können warum, falls jemand  Ideen hat immer her damit.

lb1$ ping 226.94.1.10
 64 bytes from 192.168.1.11: icmp_req=878 ttl=64 time=0.021 ms
 64 bytes from 192.168.1.11: icmp_req=879 ttl=64 time=0.020 ms

wird nur noch von der IP des jeweiligen nodes beantwortet. Vor dem Schwenk tauchte dort  noch richtigerweise die IP des anderen nodes auf.

lb1$ ping 226.94.1.10
 64 bytes from 192.168.1.11:  icmp_req=878 ttl=64 time=0.021 ms
 64 bytes from 192.168.1.12: icmp_req=879 ttl=64 time=0.020 ms

Das ganze hat mich schon sehr (sehr) genervt.
Nun zur recht „einfachen“ Lösung.
Die corosync.conf wird folgendermaßen angepasst:

...
interface {
member {
memberaddr: 192.168.1.11
}
member {
memberaddr: 192.168.1.12
}
# The following values need to be set based on your environment
ringnumber: 0
bindnetaddr: 192.168.1.0
mcastport: 5405

}
transport: udpu
...

ttl habe ich dabei extra nicht gesetzt.  Multicast wird so nicht mehr genutzt und ein broadcast ins ganze Netz findet (hoffentlich) nicht statt. Seit den Anpassungen gab es keinerlei Probleme mehr mit schwenken von Ressourcen.

Notizen:

echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

nicht vergessen

Dokuwiki Jabber Bot – Jabber Dokuwiki Bot

Liebe Leute,
ich und alle anderen Menschen auf dem Planeten Erde wünschen sich (neben Feldfrieden und universellem Glück für alle) folgendes zu Weihnachten:
Einen Jabber-Dokuwiki-Bot.
Der Jabberbot soll Eingaben direkt in ein Dokuwiki posten. Diese Eingaben sollen sich mit Tags verschlagworten lassen. Es soll die Möglichkeit geben neue Wikiseiten über den Bot anlegen zu lassen oder Text an bestehende Seiten anzuhängen. Andersherum soll der Bot auch anzeigen können was er zu bestimmten Tags bereits im Wiki stehen (Seitennamen wo z.B. die Tags vorkommen) hat und es soll auch die Möglichkeit geben den Text von kompletten Wikiseiten anzeigen zu lassen.

Ich hoffe es wird ungefähr klar was gemeint ist. Es sind noch fünf Tage bis Weihnachten, also genug Zeit eine erste Alpha bereit zustellen. Mit technischen Ressourcen kann ich gerne helfen. Als Belohnung gibt es eine selbst gebackene Urwaldtorte in Göttingen.

Meine Status.net Installation hat so einen bot, aber halt leider nur für Status.net.

Nagios Plugin für glb max connections

Ein recht einfaches Nagios Plugin für glb den Loadbalancer für Galera. Getestet mit glb-0.9.0beta2. Das ganze ist schnell zusammengeschrieben, also nicht über Fehler wundern. Zum download gibt es das hier:

http://exdc.net/nagios/check_glbd_connections

Ausgabe:

$ /usr/lib/nagios/plugins/check_glbd_connections 100 450
Warning current connections:257 | 'connections'=257 'maxconnections'=493

$ /usr/lib/nagios/plugins/check_glbd_connections 100 250
Critical current connections:257 | 'connections'=257 'maxconnections'=493

$ /usr/lib/nagios/plugins/check_glbd_connections 100 250
OK current connections:1 | 'connections'=1 'maxconnections'=493

Das Skript:


#!/bin/bash
#########################################################################
# Script:       check_glbd_connections                                  #
# Author:       Thomas Linnemann (mail@exdc.net) http://exdc.net        #
# Purpose:      Monitor GLBS Connections status with Nagios             #
# Thanks to:    Bjoern Herbold, Alexey Yurchenko                        #
# History:      2012.12.18 version 0.0.1                                #
#                                                                       #
#########################################################################

print_usage() {
echo "Usage: check__glbd_connections warning critical  "
echo "e.g.  check_glbd_connections 350 450"
}

if [ $# -lt 2 ]; then
print_usage
exit 3
fi

conn_info=$(echo "getinfo" | nc -q 1 127.0.0.1 4041|grep Destinations)
conn=$(echo "$conn_info" | cut -d " " -f 5)
maxcon=$(echo "$conn_info" | cut -d " " -f 7)

if [[ $conn -ge $1 && $conn -lt $2 ]]
then
echo "Warning current connections:$conn | 'connections'=$conn 'maxconnections'=$maxcon"
exit 1

elif [ $conn -ge $2 ]
then
echo "Critical current connections:$conn | 'connections'=$conn 'maxconnections'=$maxcon"
exit 2
else
echo "OK current connections:$conn | 'connections'=$conn 'maxconnections'=$maxcon"
exit 0
fi

Performancedaten für Centreon werden auch geliefert (ja gelb ist eine tolle Farbe ich weiß)

galera-lb-1-glbd connections

Kurztipp: Text zwischen zwei Strings anzeigen

Will man den Text zwischen zwei Strings angezeigt bekommen, kann man das recht einfach mit awk machen:

$ awk '/Dec 17 16:35:17/,/Dec 17 17:55:17/' /var/log/syslog
Dec 17 16:35:17 jabber -- MARK --
Dec 17 16:55:17 jabber -- MARK --
Dec 17 17:01:01 jabber /USR/SBIN/CRON[24012]: (root) CMD (ntpdate ntps1.gwdg.de  >/dev/null 2>&1)
Dec 17 17:15:17 jabber -- MARK --
Dec 17 17:17:02 jabber /USR/SBIN/CRON[24252]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Dec 17 17:35:17 jabber -- MARK --
Dec 17 17:55:17 jabber -- MARK --

Wenn man es braucht hat man es eh wieder vergessen, aber ich wollte es mal erwähnt haben ;-).

Nagios Plugin für Galera wsrep_flow_control_paused

Ein sehr (sehr, sehr…) einfaches Plugin für den wsrep_flow_control_paused Wert bei Galera. Vielleicht hilft es irgendwem.

#!/bin/bash
if [ $# != 4 ]; then
        echo "Bitte IP,Port, MySQLuser und Passwort eines Galera Nodes angeben"
        exit 1
else
gstat1=$(mysql -h$1 -P$2 -u$3 -p$4 -e "show status like 'wsrep_flow_control_paused'"|grep wsrep_flow_control_paused|cut -f 2)
 if [ $gstat1 == "0.000000" ]
        then
                echo "OK flow_control_paused:$gstat1 | flow_control_paused=$gstat1"
                exit 0
        else
                echo "Achtung flow_control_paused:$gstat1 | flow_control_paused=$gstat1"
                exit 1
 fi
fi

Die wichtigen Werte findet man unter:
http://www.codership.com/wiki/doku.php?id=monitoring&s[]=monitoring

siehe auch:

http://exdc.net/2012/08/24/galera-cluster_size-nagios-check/
http://exdc.net/2012/09/14/galera-nagios-plugin/