Hallo zusammen!
Ich stehe vor einem für mich unlösbarem Problem, da mir die Erfahrung mit Regular Expressions fehlt:
Ich muss dem proftpd beibringen, dass im Userverzeichnis nur Ordner aber keine Dateien hochgeladen werden können.
Zudem darf der Ordnernamen nur die Zeichen a-z, A-Z, 0-9 und _ enthalten und nicht länger als 30 Zeichen sein.
In diesen Ordner dürfen dann Dateien mit längeren Dateinamen hochgeladen werden.
Ich hab es zwar geschafft, dass nur die erlaubten Zeichen und die länge des Namens akzeptiert werden, allerdings können momentan sowohl Dateien als auch Ordner hochgeladen werden und das gilt dann leider auch für alle Unterverzeichnisse (was ja unerwünscht ist).
Ich bin für jeden Tipp dankbar.
proftpd regular expressions für verzeichnisrechte
Re: proftpd regular expressions für verzeichnisrechte
Ich versteh zwar den Sinn nicht, wozu das gut sein soll, aber nur so ein Geistesblitz:
Ev:
Siehe http://www.proftpd.org/docs/directives/ ... ilter.html
Da steht:
So unterdrückst du das allgemine Hochladen. Ein Ordner hochladen ist ja im Prinzip kein Hochladen sondern wird mit "MKD" gehandhabt...
Versuchs einfach mal ;)
Gruss
Simon, der sich über diesen Post wundert :roll:
//EDIT:
Bullshit, besser mit:
Ev:
Code: Select all
DenyFilter "STOR"Da steht:
Aber nix von STOR ;)Notes: The 'PASV' command cannot be blocked using this directive.
So unterdrückst du das allgemine Hochladen. Ein Ordner hochladen ist ja im Prinzip kein Hochladen sondern wird mit "MKD" gehandhabt...
Versuchs einfach mal ;)
Gruss
Simon, der sich über diesen Post wundert :roll:
//EDIT:
Bullshit, besser mit:
Code: Select all
<Directory /dein/pfad>
<Limit STOR>
DenyAll
</Limit>
</Directory>Re: proftpd regular expressions für verzeichnisrechte
Erstmal danke für die Antwort :)
In meinem Fall macht es schon Sinn, da ich einen FTP-Verteiler betreibe der Uploads von Agenturen entgegennimmt und dann an mehrere Redaktionen automatisch verteilt.
Und Vorgabe der Redaktionen ist es halt, dass keine einzelnen Dateien sondern Themengebundene Ordner mit Dateien übertragen werden müssen.
Und wenn ich nun den Kunden schon beim Upload zwinge diese Vorgaben einzuhalten, dann habe ich bei der weiteren Verteilung keine Probleme mehr :)
Ich gebe zu, das ist kein alltägliches Szenario, aber sowas gibts tatsächlich :)
Dank Deiner Antwort sieht meine Lösung nun so aus:
Müsste eigentlich funtionieren.
Also nochmal danke für den Denkanstoss.
In meinem Fall macht es schon Sinn, da ich einen FTP-Verteiler betreibe der Uploads von Agenturen entgegennimmt und dann an mehrere Redaktionen automatisch verteilt.
Und Vorgabe der Redaktionen ist es halt, dass keine einzelnen Dateien sondern Themengebundene Ordner mit Dateien übertragen werden müssen.
Und wenn ich nun den Kunden schon beim Upload zwinge diese Vorgaben einzuhalten, dann habe ich bei der weiteren Verteilung keine Probleme mehr :)
Ich gebe zu, das ist kein alltägliches Szenario, aber sowas gibts tatsächlich :)
Dank Deiner Antwort sieht meine Lösung nun so aus:
Code: Select all
<Directory /srv/www/vhosts/xxxxxx.de/ftp/>
<Limit STOR>
DenyAll
</Limit>
PathAllowFilter ^[a-zA-Z0-9_]{1,30}$
</Directory>
<Directory /srv/www/vhosts/xxxxxx.de/ftp/*>
<Limit STOR>
AllowAll
</Limit>
PathAllowFilter ^[a-zA-Z0-9_]{1,100}$
</Directory>
Also nochmal danke für den Denkanstoss.
Re: proftpd regular expressions für verzeichnisrechte
Das geht mir meiner Variante aber nicht. Ich hab zuerst verstanden, dass du gar keine File-Uploads zulassen willst.lupo1959 wrote:keine einzelnen Dateien sondern Themengebundene Ordner mit Dateien
Aber was du willst lässt sich nicht mit proftpd umsetzen, für den FTP-Server ist zwischen deinen genannten Vorgaben technisch gesehen kein Unterschied.
Wenn du einen ganzen Ordner in einem FTP-Programm hochladen willst, macht das Programm nicht anderes als jedes File einzeln hochladen.
Auf der Command-Line kannst du das schön sehen, dass sich per FTP nicht per-se einen Ordner sammt Inhalt hochladen lässt:
Code: Select all
$ ftp
> open ftp.deinserver.de
> user deineuserid
> pass deinpw
> lcd /zu/meinem/lokalen/pfad/mit/inhalt
> stor meinordnername
Re: proftpd regular expressions für verzeichnisrechte
Geht schon :D/
(Natürlich nicht der Befehl STOR ordnername sondern die komplette Problemlösung).
Wie Du selbst erwähnt hast, ist Upload und Verzeichnis erstellen ein Unterschied.
Und wenn man nun einen mit Dateien gefüllten Ordner hochlädt, dann wird eben zuerst ein Verzeichnis erstellt, dann in dasselbige gewechselt und dann die Dateien hochgeladen.
Ich hatte nur einen Denkfehler mit dem * am ende des zweiten Directory-Blocks.
Ich habe sogar noch eine Anforderung erfüllen können: Im hochgeladenen Ordner dürfen keine weiteren Ordner enthalten sein!
Sollte jemand mal ne ähnlich komische Aufgabe haben, hier nochmal die Zusammenfassung der etwas ungewöhnlichen Anforderung:
1. Benutzer dürfen im Startverzeichnis nur Ordner aber keine Dateien anlegen/uploaden.
2. Innerhalb dieser Ordner dürfen nur Dateien aber keine weiteren Ordner hochgeladen werden.
3. Die Ordnernamen dürfen ausser einem Punkt und dem Unterstrich keine Sonderzeichen enthalten und nicht länger als 31 Zeichen sein.
4. Für die Dateinamen gilt dasselbe mit der Ausnahme dass diese 100 Zeichen lang sein dürfen.
Die Lösung:
Erklärung:
Im ersten Directory-Block wird der Upload (STOR) komplett verboten und mit dem Filter den Ordnernamen-Vorgaben Genüge getan.
Im zweiten Block welcher sich auf so angelegten Ordner bezieht, wird zuerst der Upload erlaubt, dann das Erstellen von Ordnern (MKD) verboten und zum Schluss wieder mit dem Filter die Vorgabe der Dateinamenskonventionen erzwungen.
Beweis:
1. User lädt ein Verzeichnis mit einer Datei hoch:
2. User will Datei direkt ins Hauptverzeichnis uppen:
3. User versucht im Ordner einen Ordner anzulegen:
Dass auch die Namenskonventionen funktionieren ist ja nicht weiter verwunderlich und war ja auch nicht die Nuss, welche es zu knacken galt.
Dank deines Geistesblitzes mit den LIMIT-Blöcken ist es mir endlich geglückt dieses Problem zu lösen :-D
Tut mir leid, dass dieser Beitrag so lang wurde aber ich so könnte er auch Anderen mal hilfreich sein.
(Natürlich nicht der Befehl STOR ordnername sondern die komplette Problemlösung).
Wie Du selbst erwähnt hast, ist Upload und Verzeichnis erstellen ein Unterschied.
Und wenn man nun einen mit Dateien gefüllten Ordner hochlädt, dann wird eben zuerst ein Verzeichnis erstellt, dann in dasselbige gewechselt und dann die Dateien hochgeladen.
Ich hatte nur einen Denkfehler mit dem * am ende des zweiten Directory-Blocks.
Ich habe sogar noch eine Anforderung erfüllen können: Im hochgeladenen Ordner dürfen keine weiteren Ordner enthalten sein!
Sollte jemand mal ne ähnlich komische Aufgabe haben, hier nochmal die Zusammenfassung der etwas ungewöhnlichen Anforderung:
1. Benutzer dürfen im Startverzeichnis nur Ordner aber keine Dateien anlegen/uploaden.
2. Innerhalb dieser Ordner dürfen nur Dateien aber keine weiteren Ordner hochgeladen werden.
3. Die Ordnernamen dürfen ausser einem Punkt und dem Unterstrich keine Sonderzeichen enthalten und nicht länger als 31 Zeichen sein.
4. Für die Dateinamen gilt dasselbe mit der Ausnahme dass diese 100 Zeichen lang sein dürfen.
Die Lösung:
Code: Select all
<Directory /srv/www/vhosts/xxxxxx.de/ftp/>
<Limit STOR>
DenyAll
</Limit>
PathAllowFilter ^[a-zA-Z0-9_.]{1,31}$
</Directory>
<Directory /srv/www/vhosts/xxxxxx.de/ftp/*/*>
<Limit STOR>
AllowAll
</Limit>
<Limit MKD>
DenyAll
</Limit>
PathAllowFilter ^[a-zA-Z0-9_.]{1,100}$
</Directory>
Im ersten Directory-Block wird der Upload (STOR) komplett verboten und mit dem Filter den Ordnernamen-Vorgaben Genüge getan.
Im zweiten Block welcher sich auf so angelegten Ordner bezieht, wird zuerst der Upload erlaubt, dann das Erstellen von Ordnern (MKD) verboten und zum Schluss wieder mit dem Filter die Vorgabe der Dateinamenskonventionen erzwungen.
Beweis:
1. User lädt ein Verzeichnis mit einer Datei hoch:
Code: Select all
Status: Verbindung hergestellt, warte auf Willkommensnachricht...
Antwort: 220 ProFTPD 1.3.0 Server (ProFTPD)
Befehl: USER xxxxx
Antwort: 331 Password required for xxxxx.
Befehl: PASS ********
Antwort: 230 User xxxxx logged in.
Status: Verbunden
Status: Starte Upload von D:testORDNER123456789012345678901testDATEI_1234567890123456789012345678901234567890.txt
Befehl: CWD /ftp/testORDNER123456789012345678901/
Antwort: 550 /ftp/testORDNER123456789012345678901/: No such file or directory
Befehl: CWD /ftp/
Antwort: 250 CWD command successful
Befehl: MKD testORDNER123456789012345678901
Antwort: 257 "/ftp/testORDNER123456789012345678901" - Directory successfully created
Befehl: CWD /ftp/testORDNER123456789012345678901/
Antwort: 250 CWD command successful
Befehl: PWD
Antwort: 257 "/ftp/testORDNER123456789012345678901" is current directory.
Befehl: TYPE A
Antwort: 200 Type set to A
Befehl: PASV
Antwort: 227 Entering Passive Mode (xxxxx).
Befehl: STOR testDATEI_1234567890123456789012345678901234567890.txt
Antwort: 150 Opening ASCII mode data connection for testDATEI_1234567890123456789012345678901234567890.txt
Antwort: 226 Transfer complete.
Status: Dateitransfer erfolgreich
Code: Select all
Status: Starte Upload von D:testdatei.txt
Befehl: CWD /ftp/
Antwort: 250 CWD command successful
Befehl: PWD
Antwort: 257 "/ftp" is current directory.
Befehl: TYPE A
Antwort: 200 Type set to A
Befehl: PASV
Antwort: 227 Entering Passive Mode (xxxxx).
Befehl: STOR testdatei.txt
Antwort: 550 testdatei.txt: Permission denied
Code: Select all
Status: Erstelle Ordner '/ftp/testORDNER123456789012345678901/TestOrdner/'...
Befehl: MKD TestOrdner
Antwort: 550 TestOrdner: Permission denied
Befehl: MKD /ftp/testORDNER123456789012345678901/TestOrdner/
Antwort: 550 /ftp/testORDNER123456789012345678901/TestOrdner/: Forbidden filename
Dank deines Geistesblitzes mit den LIMIT-Blöcken ist es mir endlich geglückt dieses Problem zu lösen :-D
Tut mir leid, dass dieser Beitrag so lang wurde aber ich so könnte er auch Anderen mal hilfreich sein.