Schlagwort-Archive: Linux

Automatisches Update für einen Debian Server

In der Windows Welt ist es ganz normal, dass man nach der Installation gefragt wird, ob sich das System selbst mit (Sicherheits-) Updates versorgen soll. Auf einem Debian System ist dies etwas anderst und bedarf einer kurzen Konfiguration. Ich empfehle für diesen Zweck die Installation des Tools „unattended-upgrades“:

# apt-get install unattended-upgrades

Die Grundkonfiguration ist an sich schon nicht schlecht, da ich jedoch gerne weiß was auf meinem System passiert lasse ich mir die logs der updates zuschicken. Dies erreicht man durch die Anpassung der Zeile:

Unattended-Upgrade::Mail "root";

In der Konfigurationsdatei

#/etc/apt/apt.conf.d/50unattended-upgrades

Zum aktivieren der automatischen Updates führt man nun noch folgenden Befehl aus:

# dpkg-reconfigure -plow unattended-upgrades

oder legt alternativ die Datei

#/etc/apt/apt.conf.d/02periodic

mit folgendem Inhalt von Hand an:

// Enable the update/upgrade script (0=disable)
APT::Periodic::Enable "1";

// Do "apt-get update" automatically every n-days (0=disable)
APT::Periodic::Update-Package-Lists "1";

// Do "apt-get upgrade --download-only" every n-days (0=disable)
APT::Periodic::Download-Upgradeable-Packages "1";

// Run the "unattended-upgrade" security upgrade script
// every n-days (0=disabled)
// Requires the package "unattended-upgrades" and will write
// a log in /var/log/unattended-upgrades
APT::Periodic::Unattended-Upgrade "1";

// Do "apt-get autoclean" every n-days (0=disable)
APT::Periodic::AutocleanInterval "7";

Das war es auch schon – nun sollten die Sicherheitsupdates automatisch auf dem System eingespielt werden und entsprechende Benachrichtungen zu root gesendet werden.

iptables – Debian Firewall Regeln für einen Webserver

In diesem Artikel werde ich erklären wie man die Firewall iptables auf einem Debian Linux einrichten um nur Zugriffe auf die erwarteten Dienste (HTTP, HTTPS und SSH) zu erlauben.

Firewall Grundlagen

Iptables bestimmt wie die meisten Firewalls ob ein Packet durch darf oder nicht indem es das eingerichtete Regelwerk von oben noch unten durchgeht. Sobald die erste Regel gefunden wird, die auf das Packet passt, wird diese Angewendet. Wenn unser Regelwerk also wie folgt aussehen würde, dann würden nur SSH Verbindungen zustande kommen und keine HTTP Verbindungen:

  1. Erlaube alle SSH Verbindungen
  2. Verbiete alle Verbindungen
  3. Erlaube HTTP Verbindungen

Es ist also wichtig auf die Reihenfolge der Regeln zu achten und am Schluss sollte immer eine Regel stehen “Verbiete alle Verbindungen” (Deny All).

 IPv4 vs IPv6

Die meisten Webserver sind heute sowohl über eine IPv4 wie auch eine neue IPv6 Adresse erreichbar. Die neue Protokollversion wird jedoch oft sträflich vernachlässigt obwohl diese auf den Systemen aktiv ist. Dies ist bei Firewalls im besonderen ein Problem. Wenn wir bei dem Beispiel oben bleiben und in der Standardkonfiguration von IPtables nun via IPv6 eine HTTP Verbindung öffnen würden, so würden wir bis zu dem Webserver kommen. Da IPv6 die Zukunft ist empfehle ich daher explizit nicht einfach alle solchen Verbindungen zu verbieten sondern die Regeln auch für dieses Protokoll einzurichten. Bei iptables ist dies besonders einfach, da die meisten Befehle in beiden Versionen funktionieren und das einzige was man ändern muss ist der Programmname (von iptables zu ip6tables). In meinem Beispielen führe ich daher jeweils beide Befehlssätze (IPv4 & IPv6) auf.

System Vorbereiten

Viel ist nicht nötig um mit der Konfiguration anfangen zu können. Wir müssen im wesentlichen nur ein Packet installieren (welches häufig schon vorhanden ist):

apt-get install iptables iptables-persistent

Filterregeln erstellen

Es gibt bei iptables im wesentlichen zwei Möglichkeiten Regeln zu erstellen. Man kann diese entweder in eine Datei schreiben und diese vom System automatisch laden lassen oder man schreibt die Regeln in den (flüchtigen) Speicher von iptables und lässt iptables am Ende das File schreiben. Ich bevorzuge und verwende hier letzteren Weg, da man hier bei einem Fehler das System nur neustarten muss um einen Weitere Versuch zu erhalten.

Derzeitiges Regelwerk anschauen

Um sich das aktuell vorhandene Regelwerk anzuschauen genügt ein einfacher Befehl. Im Auslieferungszustand sollte das Ergebnis wie folgt aussehen:

IPv4

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

IPv6

# ip6tables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Regel für SSH Zugang und den Loopback Verkehr einrichten

Die erste Regel sollte immer für den Loopback Verkehr und dann für den Remotezugang verwendet werden. So wird verhindert, dass man sich zu einem späteren Zeitpunkt durch eine falsche Regel aussperrt bzw das System zu viel Zeit verbraucht um z. B. Verbindungen zum lokalen Datenbankserver aufzubauen.

IPv4

# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
# iptables -I INPUT -i lo -j ACCEPT

IPv6

# ip6tables -I INPUT -p tcp --dport 22 -j ACCEPT
# ip6tables -I INPUT -i lo -j ACCEPT

Alle nicht explizit erlaubten Verbindungen ignorieren

Nachdem die SSH Regel gesetzt wurde können wir iptables scharf schalten und in der base policy einstellen, dass nur explizit erlaubte Verbindungen an unseren Server heran kommen dürfen.

IPv4

# iptables -P INPUT DROP

IPv6

# ip6tables -P INPUT DROP

Regeln für den Webserver anhängen

Für unseren Webserver erlauben wir nun noch HTTP und HTTPS Verbindungen auf den Ports 80 und 443:

IPv4

# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp --dport 443 -j ACCEPT

IPv6

# ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
# ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
# iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED

Im Gegensatz zu dem Befehl den wir zum Anlegen der SSH Regel verwendet haben, haben wir hier den Parameter –I durch den Parameter –A ersetzt. Dies bewirkt, dass die Regel an das Regelwerk angehängt (append) wird.

Etablierte Verbindungen zulassen

Mit dem bestehenden Regelwerk würde der Webserver und der SSH Server wie erwartet funktionieren. Allerdings würdet Ihr vermutlich recht schnell über Fehlermeldungen z. B. von apt fallen, da hier verschiedene Verbindungen nicht durch gehen würden. Es ist daher ratsam noch folgende Regel hinzuzufügen:

IPv4

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

IPv6

# ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ip6tables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Filterregeln permanent speichern

Alle Regeln die wir bis jetzt eingerichtet haben wären nach einer Reboot wieder weg. Um diese zu speichern ist ein kurzer Befehl notwendig:

# iptables-save > /etc/iptables/rules.v4
# ip6tables-save > /etc/iptables/rules.v6

Nach einem Reboot werden die Regeln nun automatisch wieder gelesen und geladen. Zur Sicherheit sollte man das System neustarten und prüfen ob dies auch der Fall ist.

Alles in einem Script für Schreibfaule

Um das setzen der Regeln zu vereinfachen habe ich alle Befehle in eine bash Datei geworfen. Ihr müsste diese also nur auf euer System herunter laden, die Datei ausführbar machen (chmod +x [name]) und danach ausführen. Den Schritt um die Regeln zu persistieren habe ich nicht mit aufgenommen um Fehlern vorzubeugen.

Datei herunterladen

Rechte von Dateien und Verzeichnissen unterschiedlich setzen

Hi,

… nachdem ich gerade etwas länger gebraucht habe um die Verzeichnisse eines Linux Webservers abweichenden zu den darin enthaltenen Dateien zu berechtigen – hier die Befehle um das zu erledigen:

Berechtigungen für alle Dateien und Ordner (rekursiv) setzen:

chmod -R 755 ordner/

Berechtigungen für alle Dateien (und nur diese) rekursiv setzen:

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

Backtrack 4 USB Stick Installation

Seit kurzem steht Backtrack 4 in einer Pre Final Version zur Verfügung. Anlass genug die Installation auf einem USB Stick auszutesten. Das Vorgehen hat sich dabei trotz der Änderung der Basis nicht stark geändert. Um meinen USB Stick zu erstellen habe ich ein Backtrack 4 in eine VM gebootet (bei VMWare werden die USB Sticks durchgereicht).

Vorweg: Backtrack ist kein LiveLinux für Anfänger! Die Software bietet sehr viele Möglichkeiten Systeme und Netze auf Ihre Sicherheit zu prüfen – man sollte allerdings sehr genau wissen was man tut. Ich habe daher in meinem HowTo darauf verzichtet z. B. zu erklären wie man mit vi umgeht – wer daran scheitert sollt besser die Finger von BackTrack lassen 😉

Anzeigen der vorhandenen Datenträger im System

fdisk -l

bt4_01_fdisk-300x224-3713629

Aufruf des Diskmanagers

fdisk /dev/sdb

Löschen der vorhandenen Partitionstabelle und erstellen einer leeren (o)

bt4_02_fdisk-300x189-6303980

bt4_03_fdisk-300x213-1704003

bt4_04_fdisk-300x122-4646454

Formatieren der ersten Partition mit vfat

mkfs.vfat -F 32 -n BT4 /dev/sdb1

Formatieren der zweiten Partition mit ext3

mkfs.ext3 -L casper-rw /dev/sdb2

bt4_05_mkfs-300x241-3315672

Erstellen des Mountpoints und mounten der ersten Partition

mkdir /mnt/sdb1
mount /dev/sdb1 /mnt/sdb1

Kopieren der BT4 Daten vom CD auf die soeben gemountete Partition

rsync -avh /media/cdrom/ /mnt/sdb1

bt4_06_mkdir_mount_rsync-300x57-1787326

Info: Der Slash hinter cdrom ist wichtig. Sonst erhält man eine Fehlermeldung:

rsync: symlink "/mnt/sdb1/cdrom" -> "cdrom0" failed: Operation not permitted (1)"

Installieren des Bootloaders Grub

grub-install --no-floppy --root-directory=/mnt/sdb1 /dev/sdb

bt4_07_grub-300x186-4519226

Bootmenü anpassen

vi /mnt/sdb1/boot/grub/menu.list

Den default Booteintrag auf 5 ändern (zudem würde ich das splashimage raus löschen – sonst erkennt man die ausgewählten Einträge im Bootmenü nur schwer…):

bt4_08_grub-9550734

Im 5. Eintrag den Rechtschreibfehler in der Überschrift fixen und vga=0x317 in der kernel Zeile hinzufügen:

bt4_09_grub-300x27-8128172

Nun muß der USB Stick nur noch geunmountet werden:

umount /dev/sdb1

… und fertig.

Debian hinter einem Proxy

Um Debian hinter einem Proxy betreiben zu können, ist es notwendig diesen einzurichten. Die entsprechenden Variablen findet man in der Datei /etc/environment. Hier müssen folgende Werte gesetzt werden:

http_proxy=http://proxy.fragmichnicht.de:8080
ftp_proxy=http://proxy.fragmichnicht.de:8080

Um speziel den Proxy für die Updates via APT einzurichten kann man den Konfigurationswizard von APT verwenden:

apt-setup