Linux als SOHO-Server

für Linux- und Windows-Clients
http://linux.eusterholz.dyndns.org

Kapitel:

Home
Debian Installation
Debian Etc.
Internet-Zugang
Telnet
FTP
r-Utilities
SSH
Printing
NTP
Nameserver
NFS/NIS/Automount
Samba (SMB-Server)
Apache (WEB-Server)
Modem / ISDN
Backup
Etc.


Gemeinsamkeiten

[ Gemeinsamkeiten ] in.ftpd ] wu-ftpd ] ProFTPD ] vsftpd ] FTP-Clients ]


Unter Debian wird in der Grundinstallation kein FTP-Server mit installiert, er muss separat nach installiert werden. Dabei kommen z.B. folgende FTP-Server in Frage: 'in.ftpd', 'wu-ftpd', 'ProFTPD', 'vsftpd'. Welcher FTP-Server nachinstalliert wird, hängt von den jeweiligen Anspruch und Gegebenheiten ab. Im Verlauf dieser Seite werden die Gemeinsamkeiten der erwähnten FTP-Server erläutert. In den folgenden Unterkapiteln, wird auf die detaillierte Installation / Konfiguration der einzelnen FTP-Server genauer eingegangen.

Grundlagen FTP-Verbindung

Eine FTP-Verbindung durchläuft vier Phasen: Authentifizierung des Benutzers, Aufbau einer Kontrollverbindung, Aufbau eines Datenkanals und Beenden der Verbindung.
Zunächst baut der Client die Verbindung zum FTP-Server auf. Alle FTP-Implementierungen müssen dabei die Standard-Ports: '20' und '21' unterstützen. Verbindungen zu Nicht-Standard-Ports darf nur die Client-Seite initiieren.
Sobald die Verbindung zu Stande gekommen ist, gibt der FTP-Server Informationen über das System aus. Der Server verlangt vom Client die Übermittlung der Benutzerkennung, nimmt diese vom Client entgegen und fordert ihn dann auf, das Passwort zu übermitteln.
Nach erfolgreicher Anmeldung kann sich der Client in der Verzeichnisstruktur bewegen, Verzeichnisse oder Dateien löschen, und Daten zwischen beiden Rechnern übertragen. Alle Aktionen sind dabei abhängig von den Rechten des jeweils eingeloggten Benutzer.
Nachdem der Client alle gewünschten Aktionen ausgeführt hat, schließt der Client die Verbindung. Auch der Server kann Verbindungen trennen, wenn beispielsweise die Kontrollverbindung abreißt oder ein 'Timeout' eintrifft.
Bei der eigentlichen Datenübertragung des FTP wird zwischen zwei Modi unterschieden:

  • Active Mode
    Beim aktiven Mode baut der Server von seinem Port: '20' eine Datenverbindung zu einem vom Client gewählten Endpunkt auf. Dieser Endpunkt ist typischerweise ein Port des Clients der jenseits Port: '1023' liegt, kann aber auch ein anderer Server sein, der seinerseits in den Passive Mode geschaltet wurde, also auf eine Verbindung wartet. Die Kommunikation mit Befehlen erfolgt auf dem Port: '21'.
  • Passive Mode
    Beim passiven Mode baut der Client eine Datenverbindung zum vom Server gewünschten Port auf. Hier wird typischerweise von beiden Seiten ein Port jenseits Port: '1023' benutzt. Diese Technik wird eingesetzt, wenn der Client z.B. hinter einem Router sitzt, da ihm nicht eindeutig eine IP-Adresse zugeordnet werden kann.

Vorbereitungen zur FTP-Server Installation

Aus Sicherheitsgründen sollten alle FTP-Server nicht als Dämon, sondern vom Super-Dämon: 'inetd' gestartet werden. Welchem FTP-Server der 'inetd' bei Bedarf startet, wird in der '/etc/inetd.conf' angegeben. Sofern mit dem Debian-Tool: 'apt-get install ...' gearbeitet wird, werden der entsprechende Eintrag zum Teil automatisch eingefügt. Er sollte jedoch nach der Installation geprüft werden, ob der entsprechende Eintag korrekt ist:

Auszug aus: /etc/inetd.conf (ca. Zeile: 29)

#:STANDARD: These are standard services.
ftp             stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.ftpd

Ist der 'in.ftpd' installiert, sollte die gelb markierte Zeile in der 'inetd.conf' für den Start des FTP-Servers verantwortlich sein. Bei anderen installierten FTP-Servern steht dafür, je nach installierten FTP-Server:

  • Beim 'wu-ftpd':
    ftp             stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/wu-ftpd -l
  • Beim 'ProFTPD':
    ftp             stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/proftpd
  • Beim 'vsftpd':
    ftp             stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/vsftpd

Wurden Änderungen in der Konfigurationsdatei des Super-Dämons: 'inetd.conf' gemacht gemacht, so ist dieser mit: '/etc/init.d/inetd restart' erneut zu starten.

Weiterhin sollte sichergestellt werden, dass die entsprechenden Ports '20' und '21' für den FTP-Transfer in der Datei: '/etc/services' frei geschaltet sind:

Auszug aus: /etc/services (ca. Zeile: 27)

chargen     19/tcp     ttytst source
chargen     19/udp     ttytst source
ftp-data    20/tcp
ftp         21/tcp
fsp         21/udp     fspd

ssh         22/tcp                     # SSH Remote Login Protocol
ssh         22/udp
telnet      23/tcp

Die gelb markierten Ports: '20' und '21' sollten frei geschaltet sein.

Erstellung einer 'Changed-Root-Umgebung'

Soll der FTP-Server einen anonymen Zugang ermöglichen, so sollte dem anonymen Benutzern eine so genannte 'Changed-Root-Umgebung' (chroot) zur Verfügung gestellt werden. Ein eingeloggter Benutzer bekommt ein verändertes root-Verzeichnis angeboten und kann nur von diesem Punkt aus in der Verzeichnisstruktur nur nach unten navigieren. Er kann somit nicht im ganzen Dateisystem des Systems herumsurfen. Die Erstellung einer solchen Umgebung sollte mit Bedacht erfolgen, da der Aufbau aufwendig und mit vielen Rechten behaftet ist.

Wie eine solche 'Changed-Root-Umgebung' erstellt werden kann, wird anhand eines Beispiels im Folgenden vorgestellt. Ausgangspunkt der 'Changed-Root-Umgebung' ist in diesem Fall das Verzeichnis: '/var/ftp'.

mkdir /var/ftp/
useradd -d /var/ftp ftp
chown root.root /var/ftp
chmod 555 /var/ftp

Zunächst ist das Basis-Verzeichnis für die Umgebung zu erstellen. Anschließend ist ein Benutzer: 'ftp' mit home-Verzeichnis des zuvor erstellten Basis-Verzeichnisses anzulegen. Das Basis-Verzeichnis ist mit entsprechenden Eigentümer und Rechten zu versehen.

Nach der Erstellung des Basis-Verzeichnisses und des Benutzers, ist unter diesem eine minimale Struktur, ähnlich wie bei einen Unix-Systems anzulegen. Die Zahlenwerte in den Klammern entsprechen der chmod-Berechtigung.

/var/ftp+--                        (555)
        |  welcome.msg             (644)
        |  .message                (644)
        |  HEADER                  (644)
        |  README                  (644)
        |
        /---bin                    (511)
        |      ls                  (111)
        |      tar                 (111)
        |      gzip                (111)
        |
        /---dev                    (511)
        |      null                (666)
        |
        /---etc                    (511)
        |      passwd              (444)
        |      group               (444)
        |
        /---lib                    (511)
        |      librt.so.1          (555)
        |      libacl.so.1         (555)
        |      libc.so.6           (555)
        |      libpthread.so.0     (555)
        |      ld-linux.so.2       (555)
        |      libattr.so.1        (555)
        |
        |---msgs                   (511)
        |      msg.dead            (644)
        |      welcome.msg         (644)
        |
        /---pub                    (555)
        |      HEADER              (644)
        |      README              (644)
        |
        /---(incomming)            (733)

Da der anonyme Benutzer in seiner 'Changed-Root-Umgebung' noch nicht mal auf Basis-Kommandos wie z.B. 'ls', 'tar' oder 'gzip' vom System aus zugreifen kann, müssen diese ihm im Verzeichnis: '/bin' separat bereitgestellt werden. Die Kommandos brauchen nur kopiert und mit entsprechenden Rechten versehen werden.
Das gleiche muss mit den notwendigen lib-Dateien für die wenigen Kommandos geschehen. Die notwendigen lib-Dateien für ein Kommando können wie folgt bestimmt werden:

experimental:~# ldd /bin/ls
        librt.so.1 => /lib/tls/librt.so.1 (0x4001b000)
        libacl.so.1 => /lib/libacl.so.1 (0x40021000)
        libc.so.6 => /lib/tls/libc.so.6 (0x40029000)
        libpthread.so.0 => /lib/tls/libpthread.so.0 (0x40164000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
        libattr.so.1 => /lib/libattr.so.1 (0x40173000)

Das Bestimmen der notwendigen lib-Dateien sollte mit jedem der angebotenen Kommando unter '/bin' erfolgen. Die lib-Dateien können dann auch einfach in das Verzeichnis: '/lib' kopiert und mit Dateirechten versehen werden.
Im Verzeichnis: '/pub' können die bereitzustellenden Dateien des FTP-Servers abgelegt werden.
Soll dem anonymen Benutzer auch erlaubt werden Daten auf den Server abzulegen, so ist innerhalb der 'Changed-Root-Umgebung' ein Verzeichnis: '/incomming' anzulegen. Damit die anonymen Benutzer nur Dateien in diesem Verzeichnis ablegen können, jedoch keine  Verzeichnisstruktur abrufen können, sollte das /incomming-Verzeichnis mit den Recht 'chmod 733' versehen werden.

Unter weitere Infos kann eine Skript zur Erstellung einer chroot-Umgebung geladen werden (mk_chroot_env.tar). Die Datei ist zu entpacken und das Script ist auszuführen. Weiterhin ist dort eine komplette Umgebung zu findet (chroot_env.tar), die nur ausgepackt werden brauch. Beide Dateien sind für Debian-Sarge abgestimmt. In den Dateien für eine chroot-Umgebung befinden sich auch Beispiele für die Message-Dateien ('welcome.msg','HEADER','README'...), die je nach eingesetzten FTP-Server, anders benutzt werden.

Anmerkungen

Soll in einer chroot-Umgebung automatisch eine Übersicht aller vorhanden Dateien und deren Checksumme erstellt werden, so hilft dieses Skript evtl. weiter:

./mk_ano_ftp_files.sh

#!/bin/sh

##############################################################################
# PATH: /<HOME-ROOT>/bin/mk_anon_ftp_files.sh                                #
# DESCRIPTION: Create the files "ls-lR, ls-lR.gz, MD5SUMS and MD5SUMS.gz     #
# in an anonymous ftp chroot enviroment.                                     #
# USAGE: via cron-job: /<HOME-ROOT>/bin/mk_anon_ftp_files.sh                 #
# AUTHOR: Norbert Eusterholz, NE, <norbert@eusterholz.com>                   #
# HISTORY:                                                                   #
# +------------+----------------------------------------------------+------+ #
# | DATE       | CHANGES                                            | NAME | #
# +============+====================================================+======+ #
# | 2003.12.29 | creation                                           | NE   | #
# +------------+----------------------------------------------------+------+ #
##############################################################################

# Path to chroot enviroment
DIR_FTP_PUB='/var/ftp/pub'

# create 'ls-lR' and 'ls-lR.gz'
TZ=CET LANG= ls -lR $DIR_FTP_PUB > $DIR_FTP_PUB/ls-lR
gzip -9c $DIR_FTP_PUB/ls-lR > $DIR_FTP_PUB/ls-lR.gz

# create 'md5sums' and 'md5sum.gz'
find $DIR_FTP_PUB -type f -exec md5sum {} \; > $DIR_FTP_PUB/MD5SUMS
gzip -9c $DIR_FTP_PUB/MD5SUMS > $DIR_FTP_PUB/MD5SUMS.gz

Das Skript kann als cron-Job zyklisch ausgeführt werden und erstellt so aktuell die Dateien: 'ls-lR', 'ls-lR.gz', 'MD5SUMS', 'MD5SUMS.gz'.

Weitere Infos

Manualseiten zu: inetd man inetd
Erklärung von Aktiv und Passiv FTP http://slacksite.com/other/ftp.html
Skript zur Erzeugung einer chroot-Umgebung mk_chroot_env.tar
Beispiel chroot-Umgebung chroot_env.tar
RFC: 959 http://www.faqs.org/rfcs/rfc959.html
RFC: 765 http://www.faqs.org/rfcs/rfc765.html

Home ] Nach oben ] [ Gemeinsamkeiten ] in.ftpd ] wu-ftpd ] ProFTPD ] vsftpd ] FTP-Clients ]

letzte Änderung: 07. März 2006

 

Copyright © 2004 Norbert Eusterholz