Große Datenbestände mit lftp synchronisieren

Im letzten Artikel zum File Transfer Protocol wurde die moderne Einrichtung eines FTP-Servers vorgestellt. Jetzt soll ein Verzeichnis des FTP-Servers mit einem lokalen Server synchronisiert werden.

Besonders der Maximaldurchsatz soll dabei errreicht werden. Dazu bieten viele Windows FTP-Clients zwei Modi an.

  • Segmentiert
    bedeutet, dass eine Datei in logische Abschnitte geteilt und mit mehreren Verbindungen heruntergeladen und auf dem Zielcomputer zusammengesetzt wird.
  • Threaded
    bedeutet mehrere Dateien gleichzeitig über mehrere Datenverbindungen herunterzuladen.

Sowohl Threaded wie auch Segmented Übertragungen sollen gegebenfalls vorhandene Durchsatzprobleme bei Verwendung einer einzigen Verbindung umgehen. Das geht doch auch mit Linux?

Im folgenden wird ein Skript vorgestellt, dass lftp so in einer screen Sitzung startet, dass die Vorteile der Segmented und Threaded Verfahren zusammen mit den Vorteilen einer Hintergrundsitzung bietet. Dabei kommt der FTP-Client lftp zum Einsatz, der sich zur Automatisierung besonders gut eignet, weil er umfangreiche Konfigurationsmöglichkeiten bietet.

lftp Konfigurieren

Zuerst muss die notwendige Software installiert werden.

apt-get install lftp screen

Bevor das Skript eingesetzt werden kann, muss lftp konfiguriert werden, indem im Verzeichnis ~/.lftp/ des ausführenden Benutzers eine Datei rc mit folgendem Inhalt angelegt wird.

# GENERAL
set color:use-color true

# FTP
set ftp:list-options -a
set ftp:passive-mode true
# Send multiple commands async.
set ftp:sync-mode false

# SEGMENTED
set pget:default-n 4
set pget:save-status 30

# DIRECTORES
set mirror:order "*.txt [rR]eadme"
set mirror:use-pget-n 4
set mirror:parallel-transfer-count 2
set mirror:parallel-directories true

# Always SSL!
set ftp:ssl-force true

# Foreground cmds first!
set net:connection-takeover true
# Disconnect after 30mins idle!
set net:idle 1800
# Max 32 connections to everywhere!
set net:connection-limit 32

Synchronisations-Skript

Das folgende Skript synchronisiert das Verzeichnis REMOTE_DIR mit dem Verzeichnis LOCAL_DIR. Dafür wird eine screen Sitzung mit dem Namen lftp-sync im Hintergrund gestartet, in der lftp gestartet wird. An diese Sitzung sendet das Skript den mirror Befehl und beendet sich nach dem sichergestellt ist, dass eine solche Sitzung auch existiert.

#!/bin/bash

# Information about the source
HOST="123.123.123.123"
PORT=21
USER="sync"
PASS="foobar"

# download target
LOCAL_DIR="/mnt/123.123.123.123/forschungsdaten"

# source dir
REMOTE_DIR="/forschungsdaten"

function lftpcmd()
{
screen -S lftp-sync -p 0 -X stuff "$1"`echo -ne '\015'` 2>&1 >> /dev/null
}
function lftpkill()
{
screen -ls lftp-sync | grep lftp-sync | cut -d "." -f 1 | sed -e 's/^[ \t]*//' | xargs kill -9 $1
screen -wipe
}

# Start background lftp session if none or more than 1 is found running
if ! [ "`screen -ls lftp-sync | lftp-sync | wc -l`" -eq 1 ]; then
if [ "`screen -ls lftp-sync | grep lftp-sync | wc -l`" -gt 1 ]; then
lftpkill
fi
# Start a new session
screen -dmS lftp-sync lftp
# Set up the connection using commands sent to screen
lftpcmd "open ftp://$USER:$PASS@$HOST:$PORT/"
fi

# Add a new sync to the queue
lftpcmd "queue mirror -x ^\Incoming/$ -p \"${REMOTE_DIR}\" \"${LOCAL_DIR}\""

vsftpd mit virtuellen Benutzern, FXP und Verschlüsselung in 5 Minuten

Manchmal möchte man Benutzern einen FTP-Zugang zur Verfügung stellen, aber nicht gleich einen Systemzugang anlegen. Das geht mit vsftpd besonders einfach. Vorraussetzung ist eine funktionierende Installation von vsftpd und einige kleine Anpassungen. Natürlich darf auch die Sicherheit und nützliche Zusatzfunktionen wie FXP nicht zu kurz kommen.

Zuerst werden alle nötigen Programme installiert.

apt-get install vsftpd apache2-utils ssl-cert libpam-pwdfile

Es muss die Datei /etc/vsftpd.conf wie folgt angepasst werden.

listen=YES
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem

# Virtuelle Benutzer verwenden
nopriv_user=shared
virtual_use_local_privs=YES
guest_enable=YES
user_sub_token=$USER
local_root=/home/shared/pub
chroot_local_user=YES
hide_ids=YES

# FXP erlauben
pasv_promiscuous=YES
pasv_enable=YES
pasv_min_port=49152
pasv_max_port=50000
port_promiscuous=YES

# SSL fuer Daten- und Kontrollverbindung erzwingen
ssl_enable=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES

# Kleiner Scherz 😉 (http://www.exploit-db.com/exploits/15449/)
ftpd_banner=ProFTPD 1.3.3a

Diese Konfigurationsdatei erlaubt es allen angelegten Benutzern das Verzeichnis /home/shared zu sehen. Soll jeder Benutzer nur ein eigenes Verzeichnis sehen können, muss die Option local_root auf den Wert /home/shared/pub/$USERgesetzt werden.

Dann wird das selbst-signierte SSL-Zertifikat für vsftpd angelegt.

make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/private/vsftpd.pem

Nun muss die PAM-Authentifizierung von vsftpd angepasst werden, sodass vsftpd die Daten aus einer Datei liest. Dafür wird der Inhalt der Datei /etc/pam.d/vsftpd gelöscht und durch folgenden Inhalt ersetzt.

auth required pam_pwdfile.so pwdfile /etc/ftpd.passwd
account required pam_permit.so

Die genannte Datei /etc/ftpd.passwd kann durch das Werkzeug htpasswd mit Benutzern und Passwörtern befüllt werden.

# Für den ersten Benutzer
htpasswd -c /etc/ftpd.passwd user1
# Für alle folgenden Benutzer
htpasswd /etc/ftpd.passwd userN

Nach einem Neustart von vsftpd mittels dem Befehl /etc/init.d/vsftpd restart ist der neue FTP-Server einsatzbereit.

BackTrack 5 R3 freigegeben

Vor ein paar Minuten wurde BackTrack, die Distribution für Penetrationstester in einer neuen Version freigegeben. Die aktuelle Version 5 Release 2 wird abgelöst durch Release 3. Was nach einer kleinen Aktualisierung klingt, bringt eine Menge neuer Werkzeuge mit. Wie im Bugtracker des Projekts ersichtlich, gehört dazu nicht nur eine neue Version von Metasploit, sondern auch eine komplett neue Werkzeuggattung.

Download Links gibt es hier (bisher nur Torrent).

Laut BackTrack Entwicklungsteam gibt über 60 neue Werkzeuge und eine neue Kategorie „Physical Exploitation“ für physikalische Angriffe. In dieser Kategorie sind die folgenden Werkzeuge enthalten.

ist eine Prototyping Plattform für eingebettete Systeme.

von Nikhil Mittal, ist in der Lage für Teensy+ Payloads zu erzeugen. Ein Linux emuliert ein HID Gerät, dass als Tastatur oder Maus Eingaben simuliert. kautilya bietet Payloads für diese Funktion, die von hosts Datei bearbeiten bis zu Add a User and enable RDP reichen. Genial!

von nullsecurity, ein Werkzeug um beliebige Programme in den sicheren Bereich von SanDisk USB-Sticks einzufügen.

von Viper Lab, ein Werkzeug um Videotelefonie über IP auf Sicherheit zu prüfen, mit den Hauptfunktionen Session Replay, beliebige AVI-Datei abspielen, oder Denial of Service.

Am Aussehen hat sich nicht viel geändert, im folgenden die ersten Eindrücke von BackTrack 5R3.

Shell Schnipsel: sambaversion

#!/bin/bash
TMPFILE=/tmp/smbrecon-$1

if [ -z $1 ]; then
	echo usage: ./$0 IP
fi

smbclient -L //$1 -N &> ${TMPFILE}
echo "Version: "`head -n1 /tmp/smbrecon-$1 |cut -d "=" -f 4 | cut -d "]" -f 1 | tr -d "[]"`
rm ${TMPFILE}

Ausgabe

root@bt:~# sambaversion 192.168.15.236
Version: Samba 3.0.24

Nützlich, wenn man mehrere dutzend Samba Server per Hand auf Schwachstellen prüfen möchte.

Laufenden Prozess in screen Sitzung verschieben

Was wenn der nur eben laufende Passwort-Angriff oder das schnell gestartete Backup nicht in einer screen Sitzung läuft, es aber sollte weil die SSH-Sitzung beendet werden soll? In diesem Fall hilft das kleine Werkzeug reptyr weiter. Das Programm ist zusammen mit einer kleinen Änderungen in der Datei sysctl.conf in der Lage, den Elterprozess eines Programmes zu ändern.

Diese Änderungen hat den Effekt, dass ein Programm inklusive Ein- und Ausgabe plötzlich statt unterhalb einer SSH-Sitzung unterhalb einer screen Sitzung läuft.

Um sich alle Elter-/Kind-Beziehungen der laufenden Prozesse anzeigen zu lassen, eignet sich der Befehl pstree.

Installation

apt-get install reptyr

In der Datei /etc/sysctl.d/10-ptrace.conf den Wert kernel.yama.ptrace_scope auf 0 setzen oder um das Programm direkt auszuprobieren folgenden Befehl verwenden.

sudo sysctl -w "kernel.yama.ptrace_scope=0"

Verwendung

Die Prozessid (PID) des zu migrierenden Befehl mit den bekannten Werkzeugen wie top oder ps suchen und in der screen Sitzung den folgenden Befehl eingeben.

reptyr pid

Leider ist der Komfort nicht kostenlos, denn es müssen die restriktiven PTrace Einstellungen gelockert werden. Darum unbedingt die Sicherheits-Implikationen in der Datei /etc/sysctl.d/10-ptrace.conf lesen.

TVHeadend mit Monit überwachen

Was nützt ein TV-Server im lokalen Netzwerk, wenn der Dienst nicht genauso gut verfügbar ist, wie das Signal aus der Kabeldose? Oder zumindest annähernd. Die Überwachungssoftware Monit kann TVHeadend überwachen und bei Absturz neustarten.

Monit Installation

Zuest wird die Überwachungssoftware Monit installiert.

apt-get install monit

In der Konfigurationsdatei /etc/monit/monitrc müssen drei Paragraphen wie folgt angepasst werden, indem sie einkommentiert (# Zeichen entfernen) werden.

set daemon  120
     with start delay 240
set eventqueue
     basedir /var/monit
     slots 100
set httpd port 2812 and
     use address $serverIP
     allow $lokalesSubnetz/$cidr

TVHeadend Überwachung

Eine neue Datei in /etc/monit/conf.d/tvheadend wie folgt anlegen.

check process tvheadend with pidfile /var/run/tvheadend.pid
   start program = "/etc/init.d/tvheadend start"
   stop  program = "/etc/init.d/tvheadend stop"
   if failed host localhost port 9981 then restart
   if failed host localhost port 9982 then restart
   if 5 restarts within 5 cycles then timeout

DD-Wrt in Virtualbox verwenden

Für eine virtuelle Umgebung um Penetrationstests durchzuführen, erstelle ich zur Zeit eine komplexe Netzwerktopologie. Virtuell. Abgebildet werden soll das Netzwerk eines kleinen mittelständischen Unternehmens. Dafür soll der Router mit Internetzugang ein DD-Wrt Gerät sein. Geht das in Virtualbox?

Zuerst in der Router Datenbank nach dem Suchbegriff Alix suchen. Dort das Abbild mit dem Namen dd-wrt_public_vga.image herunterladen. Im Verzeichnis mit dem heruntergeladenen Abbild genügt es den folgenden Befehl einzugeben.

vboxmanage convertdd dd-wrt_public_vga.image dd-wrt.vdi

Mit dem Abbild kann jetzt die virtuelle Maschine erstellt werden. Um möglichst nah ein ALIX Router-Board zu simulieren müssen die Hardware-Einstellungen entsprechend gemacht werden. Da die virtuelle Maschine nur circa 10 Megabyte groß ist, gibt es die nach den Spezifikationen erstellte fertige Maschine hier zum Download.

OpenSSH Tunnel im Hintergrund (inkl. Monitoring)

Oft möchte man eine SSH-Verbindung im Hintergrund permanent laufen lassen. Zum Beispiel, um einen Tunnel geöffnet zu halten. Das ist mit öffentlichen Schlüsseln und den Kommandozeilen Paramtern -f und-N leicht möglich.

Hintergrund-Tunnel

Ein Befehl wie der folgende ist dazu in der Lage einen entfernten Port auf dem lokalen Computer zugänglich zu machen (wie zum Beispiel für Munin).

/usr/bin/ssh -fqnN -L4959:localhost:4949 root@irgendwo.im.internet

Die Parameter von links nach rechts haben folgende Bedeutung.

  • -f – In den Hintergrund wechseln, bevor der Befehl ausgeführt wird.
  • -q – Möglichst wenig Ausgaben erzeugen (die aus dem Hintergrund sowieso nicht gelesen werden können)
  • -n – Leitet die Standardeingabe stdin aus /dev/null weiter und ist Voraussetzung für den Betrieb im Hintergrund
  • -N – Führt auf der entfernten Seite keinen Befehl aus (der unnötig Kontingente belasten würde)
  • -L4959:localhost:4949 – Leitet alle Anfragen die lokale an Port 4959 gesendet werden über den Tunnel an den entfernten Server auf dessen Adresse localhost und Port 4949 (Standardport von munin-node)

Der Befehl funktioniert und erlaubt dem lokalen Benutzer den Zugriff auf den entfernten Port mit Verschlüsselung und gegebenenfalls auch Komprimierung (dafür -C den Argumenten hinzufügen).

Monitoring

Was aber, wenn der ssh Client im Hintergrund stirbt, oder die Verbindung aus anderen Gründen beendet wird? Diesem Problem lässt sich mit dem Ubuntu und Debian eigenen start-stop-daemon und einem kleinen Skript namens sshpin beikommen.

#!/bin/bash
USERHOST="root@irgendwo.im.internet"
NAME="haxogen"
TUNNEL_ARGS=" -fqnN -L4959:localhost:4949 ${USERHOST} -MS ~/.ssh/ctl-${NAME}"

# No Changes below here, or they'll haunt you
PATH=/sbin:/usr/sbin:/bin:/usr/bin
SSH="/usr/bin/ssh"
${SSH} -S "~/.ssh/ctl-${NAME}" -O check ${USERHOST} 2> /dev/null
if [ $? -ne 0 ]; then
	echo "Tunnel ${NAME} nicht gefunden, starte neu." | logger -t sshpin
	start-stop-daemon -bv --start --exec ${SSH} -- ${TUNNEL_ARGS} | logger -t sshpin
fi

Das Skript startet den gewünschten Tunnel mit den angegebenen Argumenten, die in der Variable TUNNEL_ARGS hinterlegt werden. Der Clou: Über den wenig bekannten ControlSocket Mechanismus von OpenSSH wird vor dem Starten geprüft, ob bereits eine Instanz von ssh läuft und nur wenn diese weder eine Verbindung aufgebaut hat, noch läuft, wird eine neue Verbindung aufgebaut. Zusätzlich produziert das Skript Einträge unterhalb von /var/log die auf das Problem hinweisen und wie folgt aussehen.

Aug  2 16:16:18 firewall sshpin: Tunnel haxogen nicht gefunden, starte neu.

Das Skript kann angepasst werden und mittels dem Befehl crontab -e wie folgt in die Cron-Tabelle aufgenommen werden.

@hourly /usr/local/sbin/sshpin.haxogen

Natürlich sind auch mehrere Tunnel kein Problem, dafür wird das Skript kopiert und mit anderem Namen in die Cron-Tabelle eingefügt. Jetzt gibt es keine Ausrede mehr für unverschlüsselt lauschende Munin Instanzen, die leider noch relativ oft zu finden sind.

Postfix Header anonymisieren

Wird ein eigener Mailserver betrieben, ob in der Firma oder für eine Arbeitsgruppe, fügt dieser Received: Header dem Kopf der E-Mail hinzu. Diese Header können im Falle eines Penetrationstests oder eines nicht erlaubten Angriffs genutzt werden, um Informationen über das interne Netzwerk oder den Standard eines Absender zu erhalten. Auch der User-Agent: Header wird übertragen, der vom Mailclient hinzugefügt wird.

Da viele E-Mail Clients diese Information nicht anzeigen, hier ein Auszug aus dem Kopf einer E-Mail.


Received: from [172.16.xxx.xxx] (b2b-46-252-xxx-xxx.unitymedia.biz [46.252.xxx.xxx])
(Authenticated sender: josen)
by outpost.paketsequenz.de (Postfix) with ESMTPSA id 8AED91032364B;
Wed, 13 Jun 2012 16:36:27 +0200 (CEST)
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1

Wünschenswert ist es, dass diese Informationen anonymisiert werden. Dafür bietet Postfix die header_checks Variable in der Konfigurationsdatei main.cf an. Das Hinzufügen von Kopfzeilen-Regeln lässt sich durch Hinzufügen einer weiteren Zeile in der main.conf bewerkstelligen, die wie folgt aussieht.

header_checks = pcre:/etc/postfix/header_checks

In der angegebenen Datei können jetzt in diesem Format einfache Aktionen definiert werden. Um die Header Received und User-Agent kommplett zu entfernen reichen die folgenden Zeilen.

/^Received:/ IGNORE
/^User-Agent:/ IGNORE

Diese Lösung funktioniert, ist aber nicht elegant. Zum einen müssen Mailserver nach RFC5321 einen Received Header hinzufügen, und zum anderen werden so bearbeitete E-Mail sofort als Spam enttarnt. Wünschenswert ist eine Anonymisierung des Received Headers, ohne das RFC zu verletzen und ohne als Spam klassifiziert zu werden. Ein Received Header wie der folgende erfüllt diese Anforderungen.

Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: josen) with ESMTPSA id 23DC81017E64E

Und so gehts:

Die folgenden Zeilen in die Datei header_checks einfügen.

/^Received: from \[.*?\] \([\w-.]* \[.*?\]\)\s+\(Authenticated sender: (\w+)\)\s+by outpost.paketsequenz.de \(Postfix\) with (E?SMTPS?A?) id ([A-F\d]+);.*?/
        REPLACE Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: $1) by outpost.pakesequenz.de with $2 id $3
/^User-Agent:/ IGNORE

Zusätzlich muss ein Eintrag in der Postfix main.cf hinzugefügt werden, der wie folgt lautet.

smtpd_sasl_authenticated_header = yes

Hallo Planet Ubuntuusers!

Ab sofort erscheinen ausgewählte Beiträge dieses Blogs auch im Blog Aggregator planet.ubuntuusers. Für die neuen Leser wurde ich gebeten, mich vorzustellen.

Mein Name lautet Falk, ich bin Student der Informatik an der TU-Dortmund. Ich betreibe einen Fachblog unter der Domain http://falkhusemann.de/ zu den folgenden Themen:

Und wie man aus Servern mit teilweise ausgefallenen Mitteln den Maximaldurchsatz herauskitzeln kann. Besonders wichtig ist mir der praktische Nutzen dessen, was ich beschreibe.

Über einen Besuch und ganz besonders Kommentare und Feedback oder Anregungen würde ich mich sehr freuen. Genauso über Themenvorschläge oder Fragen, auch gern hier über das Ubuntuusers Nachrichtensystem oder per E-Mail.