Linux & PHP: Script zum Anlegen von FTP-Benutzern und Zugängen
Dieser Beitrag wurde vor über 1 Jahr zuletzt überarbeitet. Es kann daher durchaus vorkommen, dass Verlinkungen nicht mehr gültig sind, sich Oberflächen verändert haben oder Funktionen gar nicht mehr so funktionieren, wie hier erklärt. Es wäre daher super, wenn du in so einem Falle über die Fehler melden-Funktion Feedback geben würdest. Vielen Dank!

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:

DOWNLOAD


War dieser Artikel hilfreich?

0
EurenikZ

EurenikZ

Ich bin Janis, 21 Jahre jung und komme aus Frankfurt am Main. Aktuell mache ich eine Ausbildung zum Fachinformatiker für Systemintegration. Neben meinem vServer beschäftige ich mich viel mit Coden und meinen Webseiten. Zocken ist ebenfalls eine meiner Leidenschaften, mein Lieblings-Genre ist Battle Royale und Survival.

Zuletzt aktualisiert

21.01.2020