HowTo: Directory und Limit

Dieses HowTo basiert auf zwei Anleitungen von Castaglia:

www.castaglia.org/proftpd/doc/contrib/ProFTPD-mini-HOWTO-Limit.html

www.castaglia.org/proftpd/doc/contrib/ProFTPD-mini-HOWTO-Limit.html

 

Anregung und Kritik bitte ins Forum.




Konfigurieren der Directory Anweisung

Die Verwendung der Directory Anweisung ist im allgemeinen sehr einfach, einige Dinge sollten dabei jedoch beachtet werden:

 

Zunächst ist es nicht notwendig die Directory Anweisungen zu verschalteln, ProFTPD würde dieses auch nicht erlauben. ProFTPD bestimmt automatisch den Bezug von "Directory" Pfad Angaben, abhängig des angegebenen Verzeichnisses und der umliegenden Konfiguration Anweisungen.

 

Benutze immer die normalen, absoluten Pfad Angeben für eine Directory Anweisung, unabhängig davon, ob das Verzeichnis ggf. in einer geCHROOTed Umgebung angesprochen wird, also durch Anonymous oder defaultroot. Es gibt zwei erlaubte Ausnahmen von dieser Regel: wenn die Pfad Angabe einen

"~" Prefix hat oder innerhalb eines "Anonymous" Bereichs vorkommt. Sollte die Anweisung in einem "Anonymous" Bereich vorkommen, darf die Pfad Angabe auch relativ starten (also ohne das führende "/") und wird dann relativ zur Anonymen Verzeichnissangabe ausgewertet.

 

Wie auch in der Direktiven Anleitung erwähnt, verändert ein "/*" Suffix die Interpretation der "Directory" Anweiung ein wenig. Zum Beispiel:

 

<Directory /path/to/dir>

 

in diesem Fall werden die Anweisungen für das Verzeichnis und den Inhalt (also Files etc) ausgewertet.

 

<Directory /path/to/dir/*>

 

in diesem Fall werden die Anweisungen nur für den Inhalt des Verzeichnisses, nicht jedoch für das Verzeichnis selber ausgewertet.

Dieses ist zwar nur ein kleiner, aber feiner Unterschied und kann oft Probleme erzeugen. Daher sollte mal im Allgemeinen, ausser man weiss genau was man tut, auf das "/*" verzichten.

 

Eine weitere Tatsache die ein Admin wissen sollte ist das Vethalten bei APPE, RETR, STOR und dem STOU FTP Befehl. In diesem Fall wird die "Directory" Pfadangabe mit angehängten Dateinamen überprüft. Dieses wird meistens keine Auswirkung haben, jedoch gibt es Sonderfälle. Angenommen der Admin verwendet "/*" um die Limit Anweisungen auf die Unterverzeichnisse eines Verzeichnisse zu beschränken, nicht jedoch auf das Verzeichnis selber. Zum Beispiel möchte der User anonyme Uploads nur in Unterverzeichnisse von "upload/" erlauben:

 

<Anonymous ~ftp>

User ftp

Group ftp

 

UserAlias anonymous ftp

 

<Limit WRITE>

DenyAll

</Limit>

 

<Directory upload/*>

<Limit STOR>

AllowAll

</Limit>

</Directory>

</Anonymous>

 

Die Konfigutation sieht auf den ersten Blick ok aus und erlaubt scheinbar nur das Uploaden in Unterverzeichnisse von "upload/". Wie oben beschrieben, hängt ProFTPD den Filenamen an den Pfad wenn er die "Directory" Anweisungen ausführt, das bedeutet das "/upload/dateiname" entspricht "/upload/*" und der Upload wird zugelassen.-

 

In diesem Beispiel wäre folgende Syntax korrekt:

 

<Directory upload/*/*>

<Limit STOR>

AllowAll

</Limit>

</Directory>

 

die nur Uploads in Unterverzeichnisse von "/uploads" erlauben würde. An dieser Stelle möchte ich noch ".ftpaccess" files hinweisen, die Anweisungen in der proftpd.conf für bestimmte Verzeichnisse überschreiben können.

 


<Limit> Anweisungen

Die <Limit> Anweisungen von ProFTPD erlauben sehr komplexes, detaillierte Zugriffsrechte wer welchen FTP Befehl ausführen kann. Die Anweisungen können sehr komplex werden, daher sind einige Anmerkungen zu berücksichtigen:

 

Rangfolge:

Der vielleicht schwierigste Teil ist das Verständnis für die Reihenfolge, in der <Limit> Anweisungen ausgewertet werden, und die dadurch erzeugten Einschränkungen. Zunächst einmal unterscheiden wir zwischen drei Arten von Befehlen: raw (eigentlichen) FTP Befehlen, Gruppen von FTP Befehlen und dem "ALL" Keyword.

 

"Raw" FTP Befehle sind die eigentlichen FTP Befehle, einschliesslich der RFC Konformen "X" Varianten, die oft in der Config vergessen werden.
Gruppen von FTP Befehle sind:
DIRS : FTP Befehle die mit Verzeichnissen zu tun haben. Dazu gehören die Befehle: CDUP, CWD, LIST, MDTM, NLST, PWD, RNFR, STAT, XCUP, XCWD, XPWD
LOGIN : client logins
READ : FTP Befehle, die mit dem lesen zu haben - jedoch nicht das listen von Verzeichnissen: RETR, SIZE
WRITE : FTP Befehle, die mit dem schreiben zu haben: APPE, DELE, MKD, RMD, RNTO, STOR, STOU, XMKD, XRMD
ALL : alle FTP Befehle

 

<Limit> Anweisungen die direkte "raw" FTP Befehle verwenden, haben die höchste Priorität, gefolgt von Limit Anweisungen die Befehlsgruppen verwenden. Anweisungen mit dem "ALL" Keyword haben die geringste Priorität.  Sollte eine <Limit> Anweisung sowohl direkte (raw) FTP Befehle als auch Gruppen enthalten, dann kommt es auf die Reihenfolge der <Limit> Anweisungen in der proftpd.conf an, die die FTP Befehl verwenden.

 

Vererbung:

Die meisten <Limit> Blöcke werden innerhalb einer <Directory> Anweisung in der proftpd.conf verwendet. Das bedeutet, die Limit Anweisung auch für die Unterverzeichnisse rekursiv gültig ist, solange keine "bessere"  <Limit> Anweisung gefunden wird, dessen Directory Angabe besser passt. Das bedeutet, das man z.B. erst einmall alle FTP Befehle verbietet, um dann in Unterverzeichnissen die notwendigen READ oder WRITE Befehle zu erlauben  (z.B. in pub/ oder incoming/)

 

Verwendung von AllowUser

Einen Haken gibt es bei Verwendung der "AllowUser" User Anweisung, primär wenn eine einzelne "AllowUser" Anweisung benutzt wird um einem einzelnen User bestimmte Befehle ausführen zu lassen. ProFTPD benutzt die gleiche Funktion um "AllowUser" und "AllowGroup" (und andere Befehle) auszuwerten. Die Auswertung erfolgt als logisches UND und so müssen alle Angaben stimmen, damit der Befehl ausgeführt werden darf. Für "AllowGroup" macht das soweit sinn und erleichtert die Sache, leider macht es keinen Sinn bei "AllowUser", da ein User ja eindeutig ist. Dieses kann man auf zwei Wege umgehen: Entweder werden die User einzeln aufgelistet, also statt:

AllowUser bob,dave,wendy

 

wird folgende Syntax benutzt:

AllowUser bob

AllowUser dave

AllowUser wendy

 

oder ab Version 1.2.10 RC1 steht auch ein AND bzw. OR Keyword zur Verfügung:

 AllowUser OR  dave,bob,wendy

 

Reihenfolge:

Ein weitere wichtiger Unterschied zwischen ProFTPD undApache ist die Reihenfolge der Allow und Deny Einträge. Bei Apache die Reihenfolge "Allow,Deny" bedeutet, dass der Zugang grundsätzlich verweigert wird, ausser dass der Zugang vorher explizit erlaubt wird. Die Reihenfolge "Deny,Allow" hingegen erlaubt bei Apache grundsätzlich den Zugang, ausser dass dieser vorher ausdrücklich verboten wurde. Dieses ist bei ProFTPD anders. Bei ProFTPD erlaubt die Reihenfolge "Allow,Deny" grundsätzlich den Zugang, solange er nicht durch eine Deny Direktive verboten wird. In diesem Sinne verweigert "Deny,Allow" grundsätzlich den Zugang, sofern nicht ausdrücklich erlaubt. Die Entwickler von ProFTPD denken, dass dieses eher dem allgemeinen Verständnis der Logik entspricht.

Hier nun ein Beispiel zur Verwendung von <Limit>. Zunächst eine sehr häufige Konfiguration: Ein Verzeichnis nur zum uploadenÖ

 

<Directory /path/to/uploads>

<Limit ALL>

DenyAll

</Limit>

 

<Limit CDUP CWD XCWD XCUP>

AllowAll

</Limit>

 

<Limit STOR STOU>

AllowAll

</Limit>

</Directory>

 

Der erste <Limit ALL> Bereich blockt die Verwendung aller FTP Befehle innerhalb des /path/to/uploads Verzeichnisses. Anschliessend definieren wir, welche FTP Befehle wir explizit erlauben wollen. Die "CDUP" und "CWD" Befehle (und deren X Varianten) sollten erlaubt werden, damit die User in dieses Verzeichnis wechseln können und wieder heraus. Anschliessen werden "STOR" und "STOU" erlaubt, so dass die User Files in das Verzeichnis hochladen können (sofern die Rechte des Filesystems dieses erlauben). Man könnte auch die Gruppe "WRITE" nehmen, diese Gruppe erlaubt aber auch das erstellen und löschen von Verzeichnissen.

 

Im nächsten Beispiel wird erstellen wir ein "blindes" Verzeichnis, in dem der User zwar Dateien up- und downloaden kann, jedoch nicht sieht, was in dem Verzeichnis ist:

<Directory /path/to/dir>

<Limit LIST NLST>

DenyAll

</Limit>

</Directory>

 

Mehr braucht man nicht. Per Default sind alle Befehle erlaubt, wir blockieren nun nur die beiden FTP Befehle die zum listen des Verzeichnisses benutyt werden  (LIST und NLST). Nun kann der User sich nicht mehr den Inhalt des Verzeichnis anzeigen lassen.

 

Man kann so auch den FTP Zugang nur für bestimmte User freigeben. Die Befehlsgruppe "LOGIN" kann hierfür verwendet wierden:

 

<Limit LOGIN>

AllowUser barb

AllowUser dave

AllowGroup ftpuser

DenyAll

</Limit>

 

Dieses erlaubt nur den Usern "barb" und "dave" sich einzuloggen, allen anderen Usern wird der Zugang verweigert. 

 

Eine weitere Frage die oft gestellt wird ist das Einrichten eines Accounts, dem es erlaubt ist Dateien in ein Verzeichnis zu uppen oder downzuloaden, jedoch nicht gestattet ist in dem Verzeichnis Files zu löschen. Durch die normalen Unix Filesystem Rechte ist dieses nicht möglich, da Schreibrechte gleichzeitig das Löschen der Datei erlauben. Dieses kann wie folgt erreicht werden:

 

<Directory /path/to/dir>

<Limit DELE>

AllowUser ftpadm

DenyAll

</Limit>

</Directory>

 

Dieses erlaubt nur dem user "ftpadm" das löschen von Dateien, allen anderen nicht.