Daniels Blog
24Okt/110

Howto: Quick and dirty DHCP-Server und DNS-Cache mit dnsmasq unter Debian

DHCP im LAN ist praktisch. Man muss nicht mehr die Netzwerkkonfiguration jedes einzelnen Rechners im Netzwerk an den Clients selbst verwalten, sondern hat alles schön zentral auf dem Server. Durch DNS-Caching sparen die Clients ein wenig Zeit beim Auflösen von Hostnames, da die Anfragen für bekannte Hostnames vom lokalen Cache übernommen werden können und nicht mehr an einen Server im Internet gestellt werden müssen.

Ein kleiner DHCP-Server ist mit dnsmasq sehr schnell eingerichtet.

# dnsmasq installieren
apt-get install dnsmasq

Die Konfiguration findet zentral in der Datei /etc/dnsmasq.conf statt. Man sollte sich vor den geballten Konfigurationsoptionen in der Datei nicht abschrecken lassen. So gut wie alles dient nur als Beispiel und ist per default auskommentiert. Eine sehr kurze Konfig reicht bereits für ein funktionierendes Setup:

DHCP

# DHCP netmask
# Clients bekommen 255.255.255.0 als Netmask
dhcp-option=1,255.255.255.0

# default gateway
# Clients bekommen als Gateway 192.168.1.251
dhcp-option=3,192.168.1.251

# dns
# Clients bekommen als Nameserver 192.168.1.4
# Falls man dnsmasq auch als DNS-Cache benutzen möchte, sollte dies die
# IP des Servers sein, auf dem dnsmasq läuft
dhcp-option=6,192.168.1.4


# Für bekannte Rechner immer dieselbe IP anhand der MAC-Adresse vergeben:
# Hier bekommt der Rechner mit der MAC 00:11:22:33:44:55 die IP 192,168.1.1 für 12 Stunden

dhcp-host=00:11:22:33:44:55,lobby,192.168.1.1,12h
dhcp-host=00:11:22:33:44:66,lobby2,192.168.1.2,12h

# Alle Rechner, die nicht per MAC identifiziert werden können, erhalten IPs
# aus dem Pool 192.168.1.120 bis 150

dhcp-range=192.168.1.120,192.168.1.150,12h

DNS

Die DNS-Funktionalität von dnsmasq benötigt eigentlich keine Konfiguration.
dnsmasq besorgt sich seine Nameserver aus /etc/resolv.conf . Hier sollten die
bekannten Nameserver des Providers eingetragen werden und evtl noch als Fallback
die 8.8.8.8 für Googles DNS-Server.

Weitere Hostnames, die im lokalen Netz gelten sollen, können dnsmasq in der Datei
/etc/hosts bekannt gemacht werden. Hier eingetragene Hostnames stehen allen Rechnern
im LAN zur Verfügung.

Fallstricke

dnsmasq muss nach Konfigänderungen seine Konfigurationsdateien neu einlesen

/etc/init.d/dnsmasq restart

Falls Clients noch eine Lease vom alten DHCP-Server haben, kann man sie manuell dazu bringen, einen neuen DHCP-request zu starten.

#Linux
dhclient eth0

#Windows
ipconfig /RELEASE
ipconfig /RENEW

Dringend muss man darauf achten, den bisher genutzen DHCP-Server (meistens im Router zum Internet) zu deaktivieren. 2 DHCP-Server im LAN können viel Chaos generieren.

5Okt/110

Wlan für EEE 1000H rt2860 unter Ubuntu

Mit irgendeinem Update in letzter Zeit wurde das WLAN auf meinem EEE PC 1000H unter Ubuntu recht instabil. Dauernde Verbindungsabbrüche, kein WLAN nach Suspend, langsame Verbindung, etc.

Ich bin mir nicht ganz sicher woran es liegt, wahrscheinlich hat der rt2860 Treiber mit irgendeinem Update einen Bug bekommen.

Zum Glück kann das Problem durch die Installation der Windows-Treiber mit ndiswrapper gelöst werden.

Dies ist nur eine etwas verkürzte deutsche Übersetzung der englischen Originalanleitung von nevdelap aus dem Ubuntuforum. (Vielen Dank)

1. Windows Treiber saugen und entpacken (comm_driver_gigabyte_mimobility_v.1.3.1.0.15.zip)

2. Linux Treiber blacklisten

#/etc/modprobe.d/blacklist.conf


blacklist rt2x00lib
blacklist rt2x00pci
blacklist rt2x00usb
blacklist rt2400pci
blacklist rt2500pci
blacklist rt2500usb
blacklist rt2800lib
blacklist rt2800pci
blacklist rt2800usb
blacklist rt61pci
blacklist rt73usb
blacklist rt2600
blacklist rt2860 # Asus eee 1000H has an rt2860. To be loaded by ndiswrapper.
blacklist b43
blacklist b43legacy
blacklist ssb
blacklist r8192s_usb

3. Mit ndisgtk den Windowstreiber aus drivers/GN-WI30N_WP30N_WS30N_WS30HN_WS31N/WINXP2k installieren

sudo ndisgtk

4. Grub konfigurieren

#/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="pciehp.pciehp_force=1 pciehp.pciehp_poll=1 quiet splash"
sudo update-grub2

5. Powermanagement Rule erstellen

#/etc/pm/sleep.d/ndiswrapper


#!/bin/bash
case "$1" in
    hibernate|suspend)
        sudo rmmod ndiswrapper
        ;;
    thaw|resume)
        sudo modprobe ndiswrapper
        ;;
    *)
        ;;
esac
exit $?
chmod +x /etc/pm/sleep.d/ndiswrapper


6. Reboot

Danach läuft das WLAN schnell und stabil.

29Jul/110

PHP Spickzettel

Hier sammele ich nützliche PHP Codeschnipsel

Pseudo Multithreading mit screen

#!/usr/bin/php5

for ($i=1;$i<50;$i++)
{
echo "starting $i\n";
exec("screen -d -m /usr/bin/php5 ./thread.php");
}

MySQL Server has gone away in lange laufenden PHP-Shellscripten

#/etc/php5/cli/php.ini
mysql.allow_persistent = On
mysql.max_persistent = -1
mysql.max_links = -1
mysql.connect_timeout = -1
veröffentlicht unter: Linux keine Kommentare
19Jun/110

XS UMTS Stick W14 unter Ubuntu

no images were found

Der XS Stick W 14 unter Ubuntu zickte ein wenig herum. Gelegentlich erkannte der Network-Manager ihn als USB-Modem, dann konnte er allerdings trotzdem keine Verbindung herstellen. Nach ein wenig erfolgloser Frickelei bin ich auf das Sakis3G Script gestoßen, das verspricht mit fast allen Sticks eine Verbindung herstellen zu können. Und tatsächlich: Es hat mit Sakis3G sofort funktioniert. Empfehlenswert, wahrscheinlich auch für andere Sticks.

TYPENSCHILD

XS Stick W14
P/N 3000.000056.00
www.4g-systems.com
#lsusb
Bus 002 Device 006: ID 1c9e:9603
# /var/log/syslog beim Einstecken

Jun 19 20:41:04 box kernel: [74186.796148] usb 2-2: new high speed USB device using ehci_hcd and address 7
Jun 19 20:41:04 box kernel: [74186.946031] scsi11 : usb-storage 2-2:1.0
Jun 19 20:41:05 box usb_modeswitch: switching 1c9e:f000 (USB Modem: USB Modem)
Jun 19 20:41:06 box kernel: [74189.293850] usb 2-2: USB disconnect, address 7
Jun 19 20:41:07 box kernel: [74189.660069] usb 2-2: new high speed USB device using ehci_hcd and address 8
Jun 19 20:41:07 box kernel: [74189.819348] option 2-2:1.0: GSM modem (1-port) converter detected
Jun 19 20:41:07 box kernel: [74189.819577] usb 2-2: GSM modem (1-port) converter now attached to ttyUSB0
Jun 19 20:41:07 box kernel: [74189.819802] option 2-2:1.1: GSM modem (1-port) converter detected
Jun 19 20:41:07 box kernel: [74189.819950] usb 2-2: GSM modem (1-port) converter now attached to ttyUSB1
Jun 19 20:41:07 box kernel: [74189.820220] option 2-2:1.2: GSM modem (1-port) converter detected
Jun 19 20:41:07 box kernel: [74189.820395] usb 2-2: GSM modem (1-port) converter now attached to ttyUSB2
Jun 19 20:41:07 box kernel: [74189.821414] scsi12 : usb-storage 2-2:1.3
Jun 19 20:41:07 box modem-manager[10480]:   (ttyUSB1) opening serial port...
Jun 19 20:41:07 box modem-manager[10480]:   (ttyUSB0) opening serial port...
Jun 19 20:41:07 box modem-manager[10480]:   (ttyUSB2) opening serial port...
Jun 19 20:41:08 box usb_modeswitch: switched to 1c9e:9603 (USB Modem: Modem Configuration)
Jun 19 20:41:08 box kernel: [74190.823474] scsi 12:0:0:0: Direct-Access     USBModem Disk             2.31 PQ: 0 ANSI: 2
Jun 19 20:41:08 box kernel: [74190.825402] sd 12:0:0:0: Attached scsi generic sg3 type 0
Jun 19 20:41:08 box kernel: [74190.833436] sd 12:0:0:0: [sdc] Attached SCSI removable disk

15Jun/110

12 Maßnahmen um einen Linux root LAMP Apache MySQL PHP Webserver abzusichern


Die Hacking-Frequenz ist in den letzten Monaten stark angestiegen. Besonders viele Daten werden abgegriffen durch Hacks auf Webserver. Sogar der SONY-PSN-Hack nutzte Schwachstellen in einem ungepatchten Apache-Webserver. Deshalb sammele ich hier Maßnahmen, die den eigenen Server etwas sicherer gegen Angriffe von außen machen können. Natürlich bieten auch diese keinen 100%igen Schutz, aber es ist besser, den bösen Buben das Spiel ein wenig schwieriger zu machen. Einige der Maßnahmen benötigen nur einen minimalen Installations- und Wartungsaufwand. Andere benötigen viel Zeit und Kenntnisse von PHP um zu greifen. Man sollte immer auf das Kosten-Nutzen-Verhältnis bei der Auswahl der Sicherheitsmaßnahmen achten. Es macht keinen Sinn, eine kleine, private Website so abzusichern wie die Federal Reserve Bank. Allerdings können wenige gezielte Änderungen am System bereits ein großes Mehr an Sicherheit bedeuten. Und das sollte man sich schon gönnen, bevor es zu spät ist....

Alle Tipps und Codesnips beziehen sich auf eine aktuelle Debian-Kiste.

1. Die Firewall - erst einmal alles verbieten

Die meisten Linux-Distributionen öffnen in ihren Standardinstallationen keine Ports nach außen, die nicht unbedingt notwendig sind. Diese Situation kann man jedoch schnell selbst ändern, wenn man am Server
herumspielt und Dinge ausprobiert. Plötzlich lauscht auch der Mediaserver im Internet oder die Datenbank
nimmt Verbindungen aus dem Internet entgegen. Deshalb ist es nicht verkehrt sich selbst zu disziplinieren und eine sehr restriktive Firewall aufzusetzen, die grundsätzlich erst einmal alle Verbindungen von außen verbietet und nur (selbst) ausgewählte Verbindungen gestattet. Zum Glück ist das mit iptables schnell erledigt. Auf diese Art und Weise kann man nicht mehr aus versehen Dienste der Welt zugänglich machen, die dort nichts zu suchen haben. Man bezahlt leider mit etwas Komfort - die Firewall muss jedes Mal angepasst werden, wenn man neue Dienste anbieten möchte. Trotzdem ist der Aufwand klein und der Nutzen groß.

#!/bin/bash
# Bestehende Tables löschen
iptables -F

# Alle eingehenden Verbindungen verbieten
iptables -P INPUT DROP
iptables -P FORWARD DROP

# Alle ausgehenden erlauben
iptables -P OUTPUT ACCEPT

# SSH erlauben
iptables -A INPUT -j ACCEPT -p tcp --dport 22

# HTTP erlauben
iptables -A INPUT -j ACCEPT -p tcp --dport 80

# Weiteren Dienst (UDP) erlauben, zum Beispiel Gameserver
iptables -A INPUT -j ACCEPT -p udp --dport 4534

# Alles von Localhost erlauben. (Damit der Server selbst ungehindert auf seine Dienste zugreifen kann,
# zum Beispiel PHP auf die lokale Datenbank
iptables -A INPUT -j ACCEPT -s 127.0.0.1

# Bereits aufgebaute Verbindungen werden an jedem Port akzeptiert
# (Damit Antworten auf Anfragen, die vom Server kommen immer zurückkommen können)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Dieses kleine Grundgerüst kann man einfach weiter ausbauen und eigene Dienste hinzufügen. Bei Arbeiten an der Firewall sollte man immer für den Fall vorsorgen, dass man sich selbst aussperrt. Besonders bei Remote-Servern, auf die man keinen physischen Zugriff hat, ist es sehr ärgerlich, durch eine mißglückte Firewallregel den eigenen Zugriff zu verlieren. Um diesem Problem aus dem Weg zu gehen, kann man bei Arbeiten an der Firewall einfach temporär einen Cronjob starten lassen, der die Firewall alle paar Minuten zurücksetzt oder den Server neu startet. Sind die Regeln später getestet und geliebt, kann der Cronjob wieder deaktiviert werden und die neuen Regeln bleiben permanent aktiv.

Um herauszufinden, welche Dienste gerade auf dem eigenen Server herumlauschen, kann man netstat benutzen:

#Für TCP-Sockets:
netstat -lpn | grep tcp

#Analog für UDP:
netstat -lpn | grep udp

Um zu testen ob die Firewall wirklich funktioniert, kann man den eigenen Server von einem anderen Rechner aus portscannen. Hat alles geklappt, sollten im Ergebnis nur die selbst geöffneten Ports auftauchen:

#Für TCP:
nmap -p1-65535 meinserver.de
#Für UDP:
nmap -sU -p1-65535 meinserver.de

2. SSH Logins verbieten

Am eigenen root-Server hat man uneingeschränkten SSH-Zugriff. Das ist recht praktisch, da man von jedem SSH-Client aus mal eben auf den Server kann um an ihm zu arbeiten. Der Nachteil davon ist, dass das natürlich auch jeder andere kann, der unglücklicher Weise irgendwie an das eigene Passwort gelangt ist. Es ist viel sicherer SSH-Logins nur mit einer gültigen Schlüsseldatei zu erlauben. Dafür wird der öffentliche Schlüssel des Clients auf den Server kopiert und interaktive Logins per Passworteingabe werden deaktiviert.

# Auf dem Client einen öffentlichen Schlüssel erstellen
# Wird bei der Generierung ein Passwort angegeben, benötigt man zum
# einloggen später die Schlüsseldatei UND das Passwort. Ansonsten wird
# nur der Schlüssel benötigt.

ssh-keygen -t rsa

# Den erstellten Schlüssel danach auf den Server kopieren

ssh-copy-id -i ~/.ssh/id_rsa.pub root@meinserver.de

# Danach auf dem Server /etc/ssh/sshd_config anpassen
.
.
PasswordAuthentication no
.
.

# Danach SSh neu starten
/etc/init.d/ssh restart

Auch hier sollte man Vorkehrungen treffen, um sich nicht selbst auszusperren, falls etwas nicht funktioniert.
Der Public Key auf einem USB-Stick mit dem dazugehörigen Passwort im eigenen Kopf macht es sehr viel schwerer für böse Buben eine Shell zu erhalten.

3. SSH Bruteforcing verhindern mit denyhosts

Falls Tipp 2 nicht praktikabel ist und man den Komfort von passwortgestützten Logins nicht aufgeben will, kann man zumindest das automatisierte Passwortraten von Angreifern auf dem Server verhindern. Sehr viele Bots im Internet machen den ganzen Tag nichts anderes als nach SSH-Servern zu suchen und bei Ihnen verschiedenste Passwörter durchzuprobieren. Mit einem halbwegs sicheren Passwort ist das kein großes Problem, trotzdem gibt es ein besseres Gefühl, wenn nicht einmal das möglich ist. Außerdem schützt man so auch seine User, falls auf dem Server auch Useraccounts bestehen. Hier kann man sich nicht darauf verlassen, dass die Benutzer sichere Passwörter verwenden. denyhosts überprüft ständig Logins auf dem ssh und sperrt Benutzer für eine gewisse Zeit, die ihr Passwort wiederholt falsch angegeben haben. Die IP's dieser Nutzer landen temporär in /etc/hosts.deny, so dass für sie kein Zugriff mehr möglich ist. Damit wird SSH-Bruteforcing zu einer sehr langwierigen und wenig erfolgversprechenden Aufgabe.

apt-get install denyhosts

# denyhosts funktioniert direkt nach der Installation. Man kann es
# in der Datei /etc/denyhosts.conf feintunen

4. Blacklisten benutzen, um bekannte Problem-IPs auszusperren

Im Internet werden verschiedene Blacklisten gepflegt, die eine große Anzahl von kriminellen/gehackten/spammenden/betrügerischen Servern auflisten. Diese IP-Listen können direkt in die Firewall eingetragen werden, so dass von diesen bekanntermaßen nicht vertrauenswürdigen Rechnern überhaupt keine Verbindung mehr zum eigenen Server möglich ist. So kann man das Spamaufkommen auf dem eigenen Server drastisch verringern und auch das eine oder andere Script-Kiddie aussperren, weil sein Russland-Proxy plötzlich nicht mehr funktioniert. Wie man das macht habe ich bereits in einem anderen Blog-Artikel am Beispiel der Blacklist von Infiltrated.net beschrieben.

5. Kein FTP benutzen für die Arbeit am Server

FTP ist ein Relikt aus besseren Zeiten in denen das Internet noch ein kleines vertrauenswürdiges Dörfchen war. Viele Admins von Webseiten nutzen nach wie vor FTP um Dateien zum Server zu übertragen oder um an der eigenen Website zu arbeiten. Das ist leider sehr unsicher, da FTP alle Daten ungesichert übertragt. Passwörter und Daten können an jedem Hop zwischen Server und Client ohne Probleme mitgelesen werden. Viel sicherer geht es mit sshfs. Hiermit kann man sich per SSH ein Verzeichnis des Remote-Servers in sein lokales Dateisystem mounten. Man kann danach auf dem Server so arbeiten, als sei er auf dem lokalen Rechner. Alle Dateizugriffe auf Dateien auf dem Server sind komplett transparant, man kann also auch mit dem lokalen Grafikprogramm ein Bild auf dem Server direkt öffnen, bearbeiten und wieder speichern. Mehr Komfort und mehr Sicherheit ohne großen Aufwand.

#sshfs installieren
apt-get install sshfs

#mountpoint im lokalen Dateisystem anlegen
mkdir /media/meinserver

#Server ins lokale Dateisystem mounten
sshfs www-data@mein-server.de:/var/www /media/meinserver

#Nun ist das Verzeichnis /var/www auf meinserver lokal unter /media/meinserver verfügbar

6. Updates installieren

Ein super abgesichertes System hilft nichts, wenn das System selbst fehlerhaft ist und eine bekannte Sicherheitslücke ausgenutzt werden kann. Meist werden diese Sicherheitslücken schnell geschlossen, oft vergessen Admins jedoch regelmäßige Updates des Systems zu machen. Ob man automatische Updates auf Linux-Servern aktivieren sollte oder nicht ist ein strittiges Thema. Einige würden es niemals tun, da es natürlich mit viel Pech auch sein kann, dass die Updates das System unbrauchbar machen. Dies ist mir in über 10 Jahren Arbeit an Debian-Systemen allerdings niemals passiert und ich schätze den Nutzen von zeitnahen und regelmässigen Updates viel höher ein, als die daraus entstehende Gefahr.

#Diese Zeile in der /etc/crontab aktualisiert das System täglich um 6 Uhr morgens
0 6 * * *       root    apt-get update && apt-get -y upgrade

Diese Quick-and-dirty Methode funktionierte bei mir bisher immer gut. Vor kurzem habe ich gelesen, dass im Debian Repository auch das Paket unattended-upgrades existiert, das die Aufgabe wohl etwas eleganter löst, ich habe es allerdings bisher nicht getestet.

Auch bei diesen vollautomtischen Systemupdates ist man nicht komplett aus dem Schneider. Falls ein Kernel-Update ausgeliefert wurde, muss man das System trotzdem noch per Hand neu booten, da ansonsten die Änderungen nicht aktiv werden.

Benutzt man fremden PHP-Code auf dem Server, wie zum Beispiel ein Open-Source CMS oder ein Forum, ist es natürlich absolut notwendig auch diesen Code mit neuen Versionen aktuell zu halten. Da Debian mit seinen Updates Änderungen an diesen Applikationen in der Regeln nicht abdeckt, ist hier Handarbeit nötig. Am besten liest man die Mailinglisten der entsprechenden Produkte mit um immer auf dem Laufenden zu sein.

7. PHP einsperren mit open_basedir

Viele Hacks basieren darauf, dass eine Sicherheitslücke im PHP-Code ausgenutzt wird, um auf Dateien im Dateisystem zuzugreifen, die nicht zur Website gehören, sondern zum System selbst. Deshalb sollte man PHP einsperren, so dass es nur in explizit erlaubten Verzeichnissen lesen und schreiben darf. Dafür bietet die php.ini die Konfigurationsoption open_basedir. PHP hat nach setzten der Option nur noch Zugriff auf die dort erlaubten Verzeichnisse. Dateien wie /etc/passwd werden unerreichbar. Hostet man auf einem Server mehrere Webseiten sollte man open_basedir in der jeweiligen VirtualHost-Konfiguration pro Seite setzen.

# Global per php.ini:
# /etc/php5/apache2/php.ini
open_basedir = /var/www/:/tmp/

# Per Site in der VirtualHost Config:
php_value open_basedir /var/www/site/:/tmp/

Wichtig ist zu prüfen ob wirklich alle Orte eingetragen wurden, auf die die Skripte normalerweise Zugriff haben müssen, ansonsten kann es sein, dass man auch legitime Funktionen der PHP-Applikation behindert.

8. Für Websites einen eigenen MySQL-Benutzer anlegen

Benutzt die eigene PHP-Applikation MySQL, sollte man unbedingt für die Apllikation einen eigenen MySQL-Benutzer anlegen und auf keinen Fall den MySQL-root-Benutzer für Zugriffe nutzen. Außerdem sollte man die Rechte des Benutzers so weit einschränken, dass wirklich nur noch Operationen erlaubt sind, die das PHP-Skript benötigt. CREATE TABLE und DROP TABLE werden zum Beispiel häufig bei SQL-Injections genutzt und werden in den meisten PHP-Applikationen nie benötigt. Hostet man mehrere Websites mit mehreren Datenbanken auf einem Server, sollte man für alle Datenbanken eigene Benutzer anlegen. So hat ein Angreifer nach einem erfolgreichen Angriff nur Zugriff auf eine der Datenbanken und nicht direkt auf alle. Wenn man nicht die Kommandozeile bemühen möchte, um die MySQL-Useraccounts zu verwalten, funktioniert das Usermanagement auch recht einfach mit PHPmyAdmin unter der Registerkarte "Rechte".

9. PHP Fehlermeldungen abschalten

PHP-Fehlermeldungen können einem Angreifer viel über den eigenen Server verraten: Verzeichnisstrukturen, Datenbankstrukturen, Konfigurationsfehler, etc. Außerdem sehen sie für den Benutzer sehr unprofessionell aus. Aus diesem Grund sollte man sie auf einem Live-Webserver grundsätzlich abschalten, da man sie ohnehin weiterhin in den Logs sehen kann.

# Global per php.ini:
# /etc/php5/apache2/php.ini
display_errors = Off

# Per Site in der VirtualHost Config:
php_flag display_errors Off

# Fehlermeldungen trotzdem lesen:
cat /var/log/apache2/error.log | grep PHP

10. Angriffsfläche für SQL-Injections einschränken mit modSecurity

SQL-injections sind die wohl am häufigsten genutzte Angriffsmethode auf Webserver. Der Zugriff erfolgt direkt über die Webapplikation und es genügt ein Browser um sie durchzuführen. Dabei werden über vom User übermittelte Variablen geschickt SQL-Abfragen eingebaut, die mit den Rechten des Datenbankbenutzers alles an der eigenen Datenbank nach belieben auslesen, löschen oder bearbeiten können. Ein wirklicher echter Schutz gegen SQL-Injections besteht nur, wenn der PHP-Code der Site im Hinblick auf diese Angriffe geschrieben wurde. Jede Variable aus Benutzereingaben, die in eine SQL-Abfrage gelangen könnte, muss geprüft und escaped werden. PHP bietet dafür die Funktion real_mysql_escape_string().

Ist man nicht sicher, ob der Code sauber ist, kann mod_security für den Apache helfen eine große Menge dieser Angriffe trotzdem abzuwehren. mod_security überprüft ständig alle Requests an den Webserver und reagiert auf vorgefertigte Muster mit denen viele SQL-Injection-Angriffe abgewehrt werden können. Leider funktioniert auch mod_security nur gut mit manuellem Aufwand. Oft blockt mod_security nach einer frischen Installation auch gewünschte (normale) Funktionen des eigenen PHP-Codes, so dass einem nichts anderes übrig bleibt, als die komplette Applikation nach der Installation einmal durchzutesten. Nur so findet man heraus, ob mod_security nicht eventuell auch gewünscht Funktionen blockt. Ist das der Fall, muss die Filterliste angepasst werden, so dass die false-positives verschwinden.

Die Konfiguration von mod_security ist etwas komplizierter und würde den Umfang dieses Artikels sprengen, es gibt aber massenweise gute Tutorials zu mod_security im Internet.

11. Ausweiskontrolle - Der Apache sagt nicht mehr, wer er ist
Dies ist keine wirklich wirkungsvolle Methode gegen einen Hack, sie macht es automatisierten Skripten, die nach Server-Versionen suchen aber etwas schwerer. Normalerweise zeigt der Apache auf Seiten mit Fehlermeldungen (z.B. 404 Not Found) seine Serversignatur.

Apache/2.2.16 (Debian) Server at www.daniel-ritter.de Port 80

So erhalten potentielle Angreifer zumindest schon einmal Informationen über den eigesetzten Webserver und den Versionsstand. Die Serversignatur ist schnell ausgeschaltet:

#/etc/apache2/conf.d/security
ServerSignature Off

12. Nicht benutze Apache-Module deaktivieren

Per default hat der Apache einige Module geladen, die fast nie benötigt werden. Unter Debian findet man die geladenen Module
als Softlinks in /etc/apache2/mods-enabled.

Fast immer entfernt werden können:

mod_cgi

Dient dem ausführen von CGI-Skripten. Diese Technik stammt noch aus den Urzeiten des Web und war der Vorvater der modernen Skriptsprachen um dynamische Webseiten zu ermöglichen. mod_cgi ist auf 99% der PHP-Websites unnötig und bei einer fehlerhaften Apache-Config eine potentielle Sicherheitslücke

a2dismod cgi

mod_status

Ermöglicht es Browsern Statusinformationen über den Apache auszulesen. Es wird so gut wie nie für "normale" Sites genutzt, bietet Angreifern aber Statusinformationen über den Apache.

a2dismod status

mod_autoindex

mod_autoindex sorgt dafür, dass Verzeichnisse auf dem Webserver aufgelistet werden können, wenn es keine gültige Index-Seite in dem entsprechenden Verzeichnis gibt. Falls diese Funktionalität nicht erwünscht ist, sollte man sie abschalten, da durch sie ganze Verzeichnisbäume auf dem Webserver nach aussen sichtbar werden können.

a2dismod autoindex
9Jun/110

Linux Server mit der Scam/Spam/Crime Blacklist von Infiltrated.net absichern

Im Internet gibt es viele böse Buben: Scammer, Hacker, Viagrabuden, Scriptkiddies, etc.

Infiltrated.net pflegt eine recht umfangreiche Liste auffällig gewordener Server unter http://www.infiltrated.net/blacklisted.

Wenn man Zugriff auf seinen Server oder auch sein Heimnetz von diesen IP's unterbindet, hat man bereits sehr viele Russen Proxies, Spammer und anderes Gesindel ausgesperrt.

Das folgende kleine Script saugt sich automatisch die aktuelle Liste und trägt die Hosts in die Firewall ein.

Mit einem Cronjob regelmässig gestartet, ermöglicht es ein Quentchen mehr Sicherheit für die eigenen Dienste.

#!/usr/bin/php
<?
# Zuerst bereits bestehende (eigene) Firewallrules ausführen
exec("/root/scripts/meine_standard_firewall_rules");

# Blacklist saugen
exec("wget -O /tmp/infiltrated_blacklist http://www.infiltrated.net/blacklisted");

$list = file("/tmp/infiltrated_blacklist");

$i = 1;

# Ein bisschen auseinanderschnibbeln und ab in Iptables
foreach ($list as $line)
{
$line = trim($line);
$line = str_replace("\t"," ",$line);

$line = explode(" ",$line);
$line = $line[0];

$firstchar = substr($line,0,1);
if (!is_numeric($firstchar))continue;

exec ("iptables -I INPUT -s $line  -j DROP");
$i++;
}

echo "done. $i rules set.";
?>

veröffentlicht unter: Linux keine Kommentare
10Feb/110

USB Spickzettel: So sehen USB Stecker aus

Im Bild zu sehen von links nach rechts: Micro USB "B" - Mini USB "B" - Mini USB "B" 5 Pin - USB "A" weiblich - USB "A" männlich - USB "B" männlich

27Jan/110

Out of the box mit Ubuntu – LogiLink WL0049A Wireless N USB Wifi WLAN Stick

no images were found

Es ist mal wieder an der Zeit für Out-Of-The-Box Hardware für Ubuntu. Der Low-Budget USB WLAN-Stick von LogiLink funktioniert sofort ohne Konfiguration und Treiberinstallation unter einem aktuellen Ubuntu 10.10. Nach dem Einstecken ist im Netzwerkmanager sofort die Liste der verfügbaren WLANs verfügbar. Nicht schlecht für einen absoluten Low-Budget Stick (ca. 10 Euro). Mit den teureren von Netgear und Konsorten hat man leider einige Probleme mehr. Lediglich die Empfangsstärke ist nicht berauschend. Falls sich der Accesspoint oder Router im selben Raum befindet, hat man jedoch keine Probleme.

So meldet sich der Stick nach dem Einstecken:

Jan 27 15:15:48 box kernel: [50425.764049] usb 2-1: new high speed USB device using ehci_hcd and address 7
Jan 27 15:15:48 box kernel: [50425.916061] === pAd = f89cc000, size = 472668 ===
Jan 27 15:15:48 box kernel: [50425.916063] <-- RTMPAllocAdapterBlock, Status=0
Jan 27 15:15:48 box kernel: [50426.212122] <-- RTMPAllocTxRxRingMemory, Status=0
Jan 27 15:15:48 box kernel: [50426.214376] -->RTUSBVenderReset
Jan 27 15:15:48 box kernel: [50426.214495] <--RTUSBVenderReset
Jan 27 15:15:48 box kernel: [50426.495844] 1. Phy Mode = 0
Jan 27 15:15:48 box kernel: [50426.495847] 2. Phy Mode = 0
Jan 27 15:15:48 box kernel: [50426.495849] NVM is Efuse and its size =2d[2d0-2fc] 
Jan 27 15:15:48 box kernel: [50426.556586] RTMPSetPhyMode: channel is out of range, use first channel=1 
Jan 27 15:15:48 box kernel: [50426.573077] 3. Phy Mode = 0
Jan 27 15:15:48 box kernel: [50426.578953] MCS Set = 00 00 00 00 00
Jan 27 15:15:48 box kernel: [50426.638326] <==== rt28xx_init, Status=0
Jan 27 15:15:48 box kernel: [50426.639953] 0x1300 = 00073200
Jan 27 15:15:49 box kernel: [50426.924845] ---> RTMPFreeTxRxRingMemory
Jan 27 15:15:49 box kernel: [50426.924866] <--- RTMPFreeTxRxRingMemory
Jan 27 15:15:49 box kernel: [50427.195749] <-- RTMPAllocTxRxRingMemory, Status=0
Jan 27 15:15:49 box kernel: [50427.198006] -->RTUSBVenderReset
Jan 27 15:15:49 box kernel: [50427.198133] <--RTUSBVenderReset
Jan 27 15:15:49 box kernel: [50427.484608] 1. Phy Mode = 0
Jan 27 15:15:49 box kernel: [50427.484610] 2. Phy Mode = 0
Jan 27 15:15:49 box kernel: [50427.484612] NVM is Efuse and its size =2d[2d0-2fc] 
Jan 27 15:15:49 box kernel: [50427.557222] 3. Phy Mode = 0
Jan 27 15:15:49 box kernel: [50427.563097] MCS Set = 00 00 00 00 00
Jan 27 15:15:49 box kernel: [50427.625962] <==== rt28xx_init, Status=0
Jan 27 15:15:49 box kernel: [50427.627588] 0x1300 = 00073200
Jan 27 15:15:54 box kernel: [50432.648580] ===>rt_ioctl_giwscan. 3(3) BSS returned, data->length = 483
Jan 27 15:15:59 box kernel: [50437.679264] ===>rt_ioctl_giwscan. 2(2) BSS returned, data->length = 308
Jan 27 15:15:59 box kernel: [50437.679356] ==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x8b04] (Channel=1)

19Jan/110

Mehrere Videos synchron ferngesteuert übers Netzwerk starten mit VLC

Eine befreundete Designstudentin wollte für die Präsentation ihrer Diplomarbeit eine Videoinstallation aufbauen. Auf im Raum angeordneten Fernsehern sollten parallel 3 von ihr erstellte Filme laufen und gleichzeitig gestartet werden. Die 3 Filme sind so geschnitten, dass sie gemeinsam ein Gesamtkunstwerk (und hoffentlich eine gute Abschlussnote) ergeben. Ein Veranstaltungsunternehmen verlangte für den Aufbau einige 1000 Euro. Das überstieg das Budget meiner Bekannten leider um einige 1000 Euro, deshalb haben wir den Aufbau selbst mit Open Source Software zusammengefrickelt. 3 (Windows)-Notebooks wurden per HDMI an die jeweiligen Fernseher angeschlossen und über einen Switch vernetzt. Ein viertes (Linux)-Notebook diente als zentraler Steuerrechner. Der VLC Media-Player bietet neben einer hervorragenden Unterstützung fast aller Videoformate auch viele weitere nützliche Funktionen. In diesem Aufbau kam das Remote Control Interface des VLC zum Einsatz, das es ermöglicht, den Player übers Netzwerk oder das Internet komplett fernzusteuern.

Die Windows Rechner bekamen die IP's 192.168.0.1 bis 192.168.0.3. Der Linux-Steuer-Rechner die IP 192.168.0.100.
Das Fernsteuerungsskript ist angelehnt an das Tutorial von Markus Berg (vielen Dank).

#/bin/bash

ip[0]="192.168.0.1"
ip[1]="192.168.0.2"
ip[2]="192.168.0.3"

port=20000

function send_cmd {

for address in ${ip[@]} 
	do 
                echo "$1" | nc $address $port &
	done

}


while ( [ 1 ] )
do
clear
echo "Video Command"
echo
echo " s  | START"
echo " p  | PAUSE/PLAY"
echo " z  | ZURUECKSPULEN"
echo " zp | ZURUECKSPULEN + PAUSE"
echo " f  | VOLLBILD AN/AUS"
echo " b  | Beenden"
echo
echo

echo
echo -n "Kommando? "
read command

case "$command" in
     s)
	   send_cmd play
           ;;
     p)
	   send_cmd pause
           ;;
     z)
	   send_cmd prev
           ;;
     zp)
	   send_cmd prev
	   perl -e 'select(undef,undef,undef,.3)'
	   send_cmd pause
           ;;
     f)
	   send_cmd fullscreen 
           ;;
     b)
	   exit
	   ;;
esac
done;

Dieses Skript auf dem Steuerungsrechner ergibt dieses spartanische menü:

Video Command

 s  | START
 p  | PAUSE/PLAY
 z  | ZURUECKSPULEN
 zp | ZURUECKSPULEN + PAUSE
 f  | VOLLBILD AN/AUS
 b  | Beenden



Kommando? 

Auf den Windowsrechner musste nun nur noch aus der Windows-Konsole heraus VLC im Remote Control Modus gestartet werden:

vlc --extraintf oldrc --rc-host 192.168.0.1:20000

Nun wurde noch das Video in die jeweilige VLC-Playlist eingefügt. Die Fernsteuerung war fertig.

Leider gab es (wie fast immer) einige Fallstricke. Bei unseren Tests zickte zunächst die Windows-Firewall herum. Für die Präsentation musste diese deaktiviert werden. Generell war Windows keine besonders gute Wahl für die Präsentation, da Update-Meldungen, Avira-Popups und andere Nervereien natürlich im Video ziemlich peinlich wirken. Die Windows-Rechner mussten ziemlich kastriert werden. Firewalls, Virenscanner und Automatische Updates wurden deaktiviert. Zahlreiche Programme, die es sich im Tray gemütlich gemacht hatten, wurden deinstalliert. Im Endeffekt würde ich beim nächsten Mal das Abspielen auch mit Linux Clients realisieren, die aber wegen des Zeitdrucks nicht verfügbar waren.

25Okt/100

Milestone flashen unter Linux mit sbf_flash

Ich habe bisher Windows nur noch für eine einzige Sache benötigt: Um mein Motorola Milestone mit neuer Firmware zu beflashen. Dafür waren bisher ein spezieller USB-Treiber und ein Flashtool von Motorola notwendig. Diese gab es nur für Windows und aus VirtualBox heraus haben sie nicht funktioniert. [mbm], ein Android Hacker aus #milestone-modding auf irc.freenode.net hat jetzt eine Binary zusammengebastelt, mit der es auch wunderbar unter Linux funktioniert. Getestet wurde es von mir unter Ubuntu 10.10. Leider gibt es keinen Quelltext zu der App, aber es funktioniert einwandfrei. Viele andere User bestätigen das hier in der offiziellen Bekanntmachung: http://blog.opticaldelusion.org/2010/05/sbfflash.html

Download: Original | Lokaler Mirror

So sieht ein Flashvorgang mit sbf_flash aus:

box-root-18:01:33 /home/ww/Desktop -> ./sbf_flash ./GOT_DACH_GERMANY_2_2_1FULL.sbf 
SBF FLASH 1.08 (mbm)

=== GOT_DACH_GERMANY_2_2_1FULL.sbf ===
00: RDL03 0x82000000-0x8204CFFF 2FC7 AP
01:  CG31 0xB01C0000-0xB01C47FF 24FE AP
02:  CG33 0xD13FB000-0xD1BB783F E479 AP
03:  CG34 0xB03A0000-0xB03A47FF CC19 AP
04:  CG35 0xB07A0000-0xB0A607FF 888E AP
05:  CG36 0xF0B7D000-0xF0BE083F 6799 AP
06:  CG37 0xE4034000-0xE40379BF 9325 AP
07:  CG39 0xD1D64000-0xDADE583F 6DA8 AP
08:  CG40 0xDD2E4000-0xDD2E483F FDFF AP
09:  CG42 0xB06A0000-0xB06DFFFF 73E3 AP
10:  CG45 0xB0B20000-0xB0E207FF 79ED AP
11:  CG47 0xB0EE0000-0xB12A07FF 679E AP
12:  CG53 0xCFD80000-0xCFD807FF FDFF AP
13:  CG61 0xB0640000-0xB06607FF 6C74 AP

Milestone found.
 >> uploading RDL03
Uploading: 100% OK
 >> verifying ramloader
 -- OK
 >> executing ramloader
Milestone found.
 >> sending erase
 >> uploading CG31
Uploading: 100% OK
 >> uploading CG33
Uploading: 100% OK
 >> uploading CG34
Uploading: 100% OK
 >> uploading CG35
Uploading: 100% OK
 >> uploading CG36
Uploading: 100% OK
 >> uploading CG37
Uploading: 100% OK
 >> uploading CG39
Uploading: 100% OK
 >> uploading CG40
Uploading: 100% OK
 >> uploading CG42
Uploading: 100% OK
 >> uploading CG45
Uploading: 100% OK
 >> uploading CG47
Uploading: 100% OK
 >> uploading CG53
Uploading: 100% OK
 >> uploading CG61
Uploading: 100% OK
 >> verifying CG31
 -- OK
 >> verifying CG33
 -- OK
 >> verifying CG34
 -- OK
 >> verifying CG35
 -- OK
 >> verifying CG36
 -- OK
 >> verifying CG37
 -- OK
 >> verifying CG39
 -- OK
 >> verifying CG40
 -- OK
 >> verifying CG42
 -- OK
 >> verifying CG45
 -- OK
 >> verifying CG47
 -- OK
 >> verifying CG53
 -- OK
 >> verifying CG61
 -- OK
 >> rebooting

veröffentlicht unter: Android, Linux, Ubuntu keine Kommentare
21Okt/100

100 Gründe warum ich Linux mag

1. Keine Viren
2. Keine andauernden Infobubbles und Popups
3. zentrales Softwaremanagement
4. zentrale vollautomatische Updates
5. frei
6. Compiz ist so cool
7. SSH ist perfekt für fast alles
8. gute Performance
10. wird nicht langsamer mit der Zeit
11. alles ist automatisierbar
12. keine nervigen Installer die Browsertoolbars installieren
13. BASH ist praktisch
14. Asterisk!
15. Radiotray
16. stabil stabil stabil
17. einfache komplette Systemverschlüsselung
18. eigener Mailserver
19. gutes RAID-Monitoring
20. super Entwicklungstools
21. sehr gute Software fast immer kostenlos
22. yakuake
23. screen
24. rtorrent
25. echtes Plug and Play für Drucker
26. CTRl-ALT-F1
27. mehrere Desktops
28. guter Spirit
29. wenig Abzocke
30. kein Defragmentieren
31. schnell
32. sehr grosse Community
33. portables Homeverzeichnis
34. vollautomatische Softwareinstallation
35. Live-CD's
36. beste Netzwerktools
37. standardkonform
38. Geeks
39. Tunnel
40. FUSE
41. Konversation
42. Twinkle
43. LAMP
44. alt und reif
45. prima Releasezyklen
46. gute Unterstützung für mehrere Monitore
47. große Anzahl von Treibern im Kernel
48. wenig Augenwischerei
49. macht einen nicht zum Idioten
50. booten übers Netzwerk
51. Installation übers Netzwerk
52. spamassassin
53. dnsmasq
54. CTRL-ALT-Drucken-K
55. reboot now
56. nmap
57. wireshark
58. viel Klickibunti oder auch gar kein Klickibunti
59. Nautilus Elementary
60. zsnes
61. ein gutes Glas wine zum zocken
62. hübsche Designs
63. OpenOffice
64. SimpleScan
65. KRename
66. einfache Backups
67. ffmpeg
68. Arista Transcoder
69. shutdown -h now
70. sudo
71. root
72. /etc
73. Flash wird langsam besser
74. ubuntuusers.de
75. mySQL
76. WordPress
77. gparted
78. rsnapshot
79. partimage
80. unabhängigkeit von einer Firma
81. wenig Kommerz -> mehr Experimente
82. ext4
83. loyal
84. die Welt funktioniert damit
85. Virtualisierung
86. keine Registry
87. logisch
88. geht auch bei DAU's nicht kaputt
89. Tux
90. 0 Euro
91. läuft auf langsamer Hardware schnell
92. läuft auf schnellerer Hardware schneller
93. keine andauernden Nachfragen
94. sinnvolle Fehlermeldungen (meistens)
95. nutzbare Logfiles
96. tail -f
97. bootet schnell
98. fährt schnell runter
99. bringt mir viel über Computer bei
100. läuft solange, bis die Hardware kaputt geht

veröffentlicht unter: Linux, Ubuntu keine Kommentare
1Okt/100

Endlich eine neue Kiste!

Nach fast sieben Jahren mit meinem guten alten Asus M6n (1,6Ghz Single Core und ATI-Grafik). Habe ich das Erscheinen von Starcraft 2 zum Anlass genommen mir endlich mal wieder eine neue Kiste zu gönnen. Da ich kaum noch mit dem PC gespielt habe, war eigentlich keine schnellere Hardware nötig, aber der Unterschied, auch auf dem Desktop ist schon ziemlich geil. Meine Zusammenstellung funktioniert zu 100% unter Ubuntu, lediglich die Grafikkarte funktioniert nicht mit dem Nouveau-Treiber, auf den ich aber Dank des proprietären NVidia-Treibers ohne Probleme verzichten kann. Nice.

veröffentlicht unter: Dies und das, Linux, Ubuntu keine Kommentare