vsFTPd auf Debian kompilieren

Vorwort

Debian schön und gut, allerdings gibt es manchmal Situationen, in denen es ein neueres Produkt als in den Repositories sein soll. In meinem Fall der very secure file transfer daemon, welcher derzeit in der Version 2.0.7 vorliegt. Warum ist mir ein Rätsel, nunja. Auf gehts' zum manuellen Update :-)

Software

Zum Einsatz kommen:

  • Debian „Lenny“ 5.0 (derzeit aktuellste STABLE Version)
  • vsFTPd 2.2.2 (derzeit aktuellste STABLE Version)

Vorbereitung

Sourcen

Zu allererst bemüht man sich um die notwendigen Bibliotheken, wobei einem der Paketmanager behilflich ist (wie üblich als root):

apt-get build-dep vsftpd

Sofern nicht vorhanden lädt man noch die Tools zur Kompilation und Erstellung des Debian-Paketes herunter:

aptitude install build-essential checkinstall

Soweit so gut, nun den Source holen, Entpacken und in das neue Verzeichnis wechseln:

wget ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.2.2.tar.gz
tar xf vsftpd-2.2.2.tar.gz
cd vsftpd-2.2.2/

Es findet sich unter den Sourcen die Datei builddefs.h, welche noch folgendermaßen angepasst werden muss:

#ifndef VSF_BUILDDEFS_H
#define VSF_BUILDDEFS_H
 
#define VSF_BUILD_TCPWRAPPERS
#define VSF_BUILD_PAM
#define VSF_BUILD_SSL
 
#endif /* VSF_BUILDDEFS_H */

Damit wird u.A. die Unterstützung für SSL/TLS mit einkompiliert.

Das mitgelieferte Makefile würde so wie es ist nicht fehlerfrei durchlaufen, der install-Anker ist entsprechend an das Debian'sche Dateisystem anzupassen:

install:
    if [ -x /usr/sbin ]; then \
        $(INSTALL) -m 755 vsftpd /usr/sbin/vsftpd; fi
    if [ -x /usr/share/man ]; then \
        $(INSTALL) -m 644 vsftpd.8 /usr/share/man/man8/vsftpd.8; \
        $(INSTALL) -m 644 vsftpd.conf.5 /usr/share/man/man5/vsftpd.conf.5; fi
    if [ -x /etc/xinetd.d ]; then \
        $(INSTALL) -m 644 xinetd.d/vsftpd /etc/xinetd.d/vsftpd; fi
    if [ ! -d /var/run/vsftpd ]; then \
        $(INSTALL) -m 755 var/run/vsftpd; fi
    if [ ! -e /etc/vsftpd.conf ]; then \
        $(INSTALL) -m 644 vsftpd.conf /etc/vsftpd.conf; fi
    if [ ! -e /etc/ftpusers ]; then \
        $(INSTALL) -m 644 ftpusers /etc/ftpusers; fi
    if [ ! -x /etc/init.d/vsftpd ]; then \
        $(INSTALL) -m 755 init.d.vsftpd /etc/init.d/vsftpd; fi
    if [ ! -x /etc/logrotate.d/vsftpd ]; then \
        $(INSTALL) -m 644 logrotate.d.vsftpd /etc/logrotate.d/vsftpd; fi
    if [ ! -x /etc/pam.d/vsftpd ]; then \
        $(INSTALL) -m 644 pam.d.vsftpd /etc/pam.d/vsftpd; fi

Debian-spezifische Dateien

Die nachfolgenden Dateien mit entsprechendem Inhalt sind noch selbst anzulegen:

Nutzer, denen man schon von Haus aus den Zugriff verweigern möchte, landen in dieser Datei. Diess dient der Systemsicherheit und sollte mitgeliefert werden.

ftpusers
# /etc/ftpusers: list of users disallowed FTP access. See ftpusers(5).
 
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
nobody

PAM mischt beim Authentifizierungsvorgang mit:

pam.d.vsftpd
# Standard behaviour for ftpd(8).
auth    required        pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
 
# Note: vsftpd handles anonymous logins on its own.  Do not enable
# pam_ftp.so.
 
# Standard blurb.
@include common-account
@include common-session
 
@include common-auth
auth    required        pam_shells.so

Der Daemon benötigt natürlich auch ein Startskript:

init.d.vsftpd
#!/bin/sh
### BEGIN INIT INFO
# Provides:          vsftpd
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Very secure FTP server
### END INIT INFO
# /etc/init.d/vsftpd
#
# Written by Sander Smeenk <ssmeenk@debian.org>
# Modified by Rogério Brito <rbrito@ime.usp.br>
 
set -e
 
# Exit if vsftpd.conf doesn't have listen=yes or listen_ipv6=yes
# (mandatory for standalone operation)
if [ -f /etc/vsftpd.conf ] && ! egrep -iq "^ *listen(_ipv6)? *= *yes" /etc/vsftpd.conf; then 
    exit 0
fi
 
DAEMON=/usr/sbin/vsftpd
NAME=vsftpd
PATH=/sbin:/bin:/usr/sbin:/usr/bin
 
test -x $DAEMON || exit 0
 
case "$1" in
  start)
    echo -n "Starting FTP server: $NAME"
    [ -d /var/run/vsftpd ] || mkdir -p /var/run/vsftpd
    start-stop-daemon --start --background -m --pidfile /var/run/vsftpd/vsftpd.pid --exec $DAEMON
    echo "."
    ;;
  stop)
    echo -n "Stopping FTP server: $NAME"
    start-stop-daemon --stop --pidfile /var/run/vsftpd/vsftpd.pid --oknodo --exec $DAEMON
    rm -f /var/run/vsftpd/vsftpd.pid
    echo "."
      ;;
  restart)
    echo -n "Restarting FTP server: $NAME"
    start-stop-daemon --stop --pidfile /var/run/vsftpd/vsftpd.pid --oknodo --exec $DAEMON
    rm -f /var/run/vsftpd/vsftpd.pid
    start-stop-daemon --start --background -m --pidfile /var/run/vsftpd/vsftpd.pid --exec $DAEMON
    echo "."
    ;;
  reload|force-reload)
    echo "Reloading $NAME configuration files"
    start-stop-daemon --stop --pidfile /var/run/vsftpd/vsftpd.pid --signal 1 --exec $DAEMON
    echo "."
    ;;
  *)
    echo "Usage: /etc/init.d/$NAME {start|stop|restart|reload}"
    exit 1
    ;;
esac
 
exit 0

Als Server-Dienst macht man auch Gebrauch von logrotate:

ogrotate.d.vsftpd
/var/log/vsftpd.log {
    # ftpd doesn't handle SIGHUP properly
    nocompress
    missingok
    notifempty
    rotate 4
    weekly
}

Damit wären alle nötigen Vorbereitungen getroffen.

Kompilation

Jetzt wirds spannend :-) Dann stampfen wir mal ein ausführbares Programm daraus:

make

Sollte ohne Fehler durchlaufen.

Installation

Auch wenn das jetzt unerwartet kommt: wir benutzen nicht make install sondern das CLI-Tool checkinstall, damit ein Debian-Paket aus dem Binary, den Man-Pages und den restlichen Dateien gebaut und installiert wird. Dazu genügt die Eingabe von

checkinstall

Die darauf folgenden Dialoge können Default gelassen werden, nach dem Durchlauf des Programms ist der vsFTPd installiert und ein Paket erstellt worden.

Das fertige Debian-Paket

Für alle die zu faul/ungeschickt für dieses HowTo waren hier das fertige Paket:

Quellen

Kommentare