Besonders praktisch zum Übertragen von Daten für seine Kunden und umgekehrt ist ein FTP-Zugang. Mit folgendem PHP-Script lässt sich über eine Website ein Benutzer anlegen und die Zeit angeben, wie lange der Zugang bestehen bleiben soll. Nach einer Woche werden alle Daten per Cronjob gelöscht.
Ich übernehme keinerlei Haftung für eventuell vorhandene Sicherheitslücken, Bugs und dergleichen. Das Script samt der Umsetzung ist ein von mir erstelltes Projekt gewesen und wurde nicht im Produktivbetrieb verwendet.
Über das Script
Über die Website gibt man die Zeit an, wie lange der Zugang bestehen bleiben soll. Nach Ablauf ist das Anmelden per FTP nicht mehr möglich, der Ordner bleibt jedoch zunächst bestehen.
Eine Ausgabe gibt alle notwendigen Anmeldedaten aus, ebenfalls mit FTP-Internetadresse, welcher direkt im Windows-Explorer als Pfad angegeben werden kann. Im Verzeichnis /home/ftp/ werden per PHP-Script ein Ordner und ein dazugehöriger System-Benutzer mit den Berechtigungen auf den Ordner angelegt. Der Benutzer kann sich per FTP verbinden und Daten hochladen und herunterladen. Nach einer Woche wird der Ordner per Cronjob gelöscht. Die Anmeldung ist nur mit FTP möglich, die Shell beispielsweise funktioniert nicht.
Voraussetzungen
Debian / Ubuntu Server
Apache2
PHP 7
ProFTPD
Installation und Einrichtung von ProFTPD
Falls ProFTPD noch nicht installiert ist, wird dieses erst einmal installiert:
apt install proftpd-basic
Das Programm wird als Servermodus installiert.
Im Verzeichnis /etc/proftpd/conf.d/ wird nun eine neue Datei namens ftpuser.conf erstellt:
nano /etc/proftpd/conf.d/ftpuser.conf
Hier wird folgender Inhalt eingefügt:
<Global> RequireValidShell off </Global> UseIPv6 off DefaultRoot ~
Anschließend wird die Datei gespeichert und der ProFTPD-Server neu gestartet:
systemctl restart proftpd.service
Vorbereitung und Einrichtung
Zunächst wird in /home/ ein neuer Ordner namens ftp erstellt, indem die Ordner später automatisch angelegt werden. Jetzt werden noch die Berechtigungen gesetzt, dafür werden Gruppe und Eigentümer für den www-data Benutzer gesetzt:
www-data [33]
Da der User www-data, welcher beim Aufruf des PHP-Scripts standardmäßig verwendet wird, keine Berechtigungen für beispielsweise useradd hat, müssen in visudo alle notwendigen Befehle für das Anlegen hier eingetragen werden, sodass er mit sudo und ohne Passwort-Eingabe des Root-Benutzers alle notwendigen Befehle ausführen darf:
visudo
Hier folgende Zeile eintragen:
www-data ALL=NOPASSWD:/usr/sbin/useradd, /usr/sbin/chpasswd, /bin/chown, /usr/sbin/usermod, /usr/bin/at, /usr/sbin/userdel, /bin/echo, /usr/bin/ftpwho
Damit FTP-Ordner, die älter als 1 Woche sind, gelöscht werden, wird ein Cronjob erstellt:
crontab -e
Hier folgende Zeile eingetragen:
0 * * * * find "/home/ftp/"* -mtime +8 -delete
Das Script
Zunächst gibt es eine index.php, welche in einen neuen Ordner namens ftpuser gehört und in welcher folgender Inhalt stehen muss:
<?php if(isset($_SESSION['success'])) { echo $_SESSION['success']; unset($_SESSION['success']); }else{ ?> <p>Zum Anlegen eines neuen FTP-Benutzers hier auswählen wie lange dieser bestehen soll, bis er samt Daten gelöscht wird.</p> <form id="create" method="POST" action="create.php"> <select name="expireHours"> <option value="1">1 Stunde</option> <option value="3">3 Stunden</option> <option value="6">6 Stunden</option> <option value="24">1 Tag</option> <option value="48">2 Tage</option> <option value="36">3 Tage</option> <option value="168">1 Woche</option> </select> <button type="submit">Benutzer erstellen</button> </form> <?php } ?>
Das PHP-Script als create.php kommt in dasselbe Verzeichnis. Unter der Zeile Einstellungen hier vornehmen müssen die jeweiligen Werte ersetzt werden:
<?php session_start(); # Einstellungen hier vornehmen $servername = 'FTP_SERVER_HIER_EINTRAGEN'; # Im meisten Falle die IP-Adresse des Servers $usernamelength = 4; # Länge der Zahl des Benutzernamens, der generiert wird. Standardmäßig 4. Beispiel: ftp4269 # Ausgabe für Ablaufdatum if($_POST['expireHours'] == 1) $expireHours = '1 Stunde'; if($_POST['expireHours'] == 3) $expireHours = '3 Stunden'; if($_POST['expireHours'] == 6) $expireHours = '6 Stunden'; if($_POST['expireHours'] == 24) $expireHours = '1 Tagen'; if($_POST['expireHours'] ==48) $expireHours = '2 Tagen'; if($_POST['expireHours'] == 36) $expireHours = '3 Tagen'; if($_POST['expireHours'] == 168) $expireHours = '1 Woche'; # Benutzername generieren $Chars = '123456789'; $tmp = str_shuffle($Chars); $username = substr($tmp, 0, $usernamelength); $username = 'ftp'.str_shuffle($username); # Passwort generieren $Chars = 'aAbB1cCdD2eEfF3gGhH4LmMnN5pPqQ6rRsS7tTuU8vVwW9xXyYzZ'; $tmp = str_shuffle($Chars); $passwd = substr($tmp,0,8); $passwd = str_shuffle($passwd); # Benutzer anlegen, Ordner erstellen, Rechte setzen, Ablaufdatum des Benutzers festlegen shell_exec("sudo useradd '".$username."' -d /home/ftp/".$username." -s /bin/bash"); shell_exec("echo '".$username.":".$passwd."' | sudo chpasswd"); shell_exec("mkdir /home/ftp/".$username.""); shell_exec("sudo chown -c ".$username." /home/ftp/".$username.""); shell_exec("sudo echo 'userdel ".$username."' | sudo at now + ".$_POST['expireHours']." hour"); # HTML-Ausgabe erstellen $_SESSION['success'] = '<table> <tr> <td style="padding-right: 30px;">Rechnername:</td> <td><b>'.$servername.'</b></td> </tr> <tr> <td>Benutzername:</td> <td><b>'.$username.'</b></td> </tr> <tr> <td>Passwort:</td> <td><b>'.$passwd.'</b></td> </tr> <tr> <td>Port:</td> <td><b>21</b></td> </tr> <tr> <td>Login läuft ab in:</td> <td><b>'.$expireHours.'</b></td> </tr> </table>'; $_SESSION['success'] .= ' <input type="text" id="output" style="font-size: 150%; text-align: center;" onClick="this.select();" value="ftp://'.$username.':'.$passwd.'@'.$servername.'">'; $_SESSION['success'] .= '<a href="index.php">Neuen Benutzer anlegen</a>'; header('Location: /ftpuser/'); ?>
Alternativ lassen sich beide Dateien auch als ZIP-Archiv herunterladen:
Bei Fragen oder Anregungen freue ich mich natürlich über eure Kommentare.
Über mich
Ich bin Janis (aka. EurenikZ), 25 Jahre alt und komme aus der Nähe von Frankfurt am Main. Ich habe eine abgeschlossene IHK-Ausbildung zum Fachinformatiker für Systemintegration und arbeite als Junior IT-Administrator in einem IT-Systemhaus. Neben meinem IT-Blog beschäftige ich mich viel mit diversen IT-Themen und meinen Webseiten sowie Telegram Bots und biete IT-Dienstleistungen an.