Webmaster proFTPd Server mit virtuellen Usern und MariaDB (verwalten über phpMyAdmin) unter Debian 11 Bullseye (1 Betrachter)

  • Ersteller des Themas
  • #1

treki

Forum-Mitglied
Black-Market: 0 / 0 / 0
29 Mai 2020
199
21 %
Hier wird beschrieben, wie Du einen Proftpd-Server installierst, der virtuelle Benutzer aus einer MySQL-Datenbank anstelle von echten Systembenutzern verwendet.
Dies ist viel leistungsfähiger und ermöglicht es, Tausende von FTP-Benutzern auf einem einzigen Server zu haben und diesen ein Verzeichnis zuzuweisen.
Darüber hinaus wird die Verwendung von Quoten mit diesem Setup gezeigt.

Für die Verwaltung der MariaDB-Datenbank können webbasierte Tools wie phpMyAdmin verwendet werden, die ebenfalls in diesem Howto installiert werden.
phpMyAdmin ist eine komfortable grafische Oberfläche, was bedeutet, dass Du Dich nicht mit der Befehlszeile herumschlagen musst.

Dieses Tutorial basiert auf Debian Bullseye (Debian 11).

Vorbemerkung
In diesem Tutorial verwende ich den Ausdruck IP-Adresse. Dieser ist duch die IP-Adresse Deines Servers zu ersetzen (zBsp 192.193.194.45).

Installiere MariaDB und phpMyAdmin
Dies kann alles mit einer einzigen Zeile installiert werden:
Code:
apt install mariadb-server mariadb-client phpmyadmin apache2 libapache2-mod-php php-cli php-mysql php-zip php-curl php-xml php-mbstring php-zip php-gd unzip -y
Bei den Fragen auswählen:
  • apache2
  • Configure database for phpmyadmin with dbconfig-common? >> Yes
  • MySQL application password for phpmyadmin: Passwort
Hier wirst Du aufgefordert, ein Passwort für den MySQL-Root-Benutzer anzugeben – dieses Passwort gilt auch für den Benutzer [email protected],
sodass wir später kein MySQL-Root-Passwort manuell angeben müssen.

Installiere Proftpd mit MySQL-Unterstützung
Code:
apt install proftpd-mod-mysql
Dann erstellen wir eine FTP-Gruppe (ftpgroup) und einen Benutzer (ftpuser), denen alle unsere virtuellen Benutzer zugeordnet werden.
Wir benennen hier die Gruppen- und Benutzerkennung mit 3002.
Code:
groupadd -g 3002 ftpgroup
useradd -u 3002 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
Erstelle die MariaDB-Datenbank für Proftpd
Jetzt erstellen wir eine Datenbank namens ftp und einen MariaDB-Benutzer namens proftpd, den der proftpd-Daemon später verwendet, um sich mit der ftp-Datenbank zu verbinden:
Code:
mariadb -u root -p
Jetzt Dein oben gewähltes Passwort eingeben.

Folgend passwort mit dem gewählten Passwort ersetzen!!
Code:
CREATE DATABASE ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'passwort';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'passwort';
FLUSH PRIVILEGES;
Ab hier kann Alles 1 zu 1 übernommen werden.
Code:
USE ftp;
Code:
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '5500',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) ENGINE=MyISAM COMMENT='ProFTP group table';
Code:
CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum('user','group','class','all') NOT NULL default 'user',
per_session enum('false','true') NOT NULL default 'false',
limit_type enum('soft','hard') NOT NULL default 'soft',
bytes_in_avail bigint(20) unsigned NOT NULL default '0',
bytes_out_avail bigint(20) unsigned NOT NULL default '0',
bytes_xfer_avail bigint(20) unsigned NOT NULL default '0',
files_in_avail int(10) unsigned NOT NULL default '0',
files_out_avail int(10) unsigned NOT NULL default '0',
files_xfer_avail int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM;
Code:
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user',
bytes_in_used bigint(20) unsigned NOT NULL default '0',
bytes_out_used bigint(20) unsigned NOT NULL default '0',
bytes_xfer_used bigint(20) unsigned NOT NULL default '0',
files_in_used int(10) unsigned NOT NULL default '0',
files_out_used int(10) unsigned NOT NULL default '0',
files_xfer_used int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM;
Code:
CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(32) NOT NULL default '',
uid smallint(6) NOT NULL default '5500',
gid smallint(6) NOT NULL default '5500',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '1970-01-01 00:00:00',
modified datetime NOT NULL default '1970-01-01 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) ENGINE=MyISAM COMMENT='ProFTP user table';
Code:
quit;
Du kannst auf phpMyAdmin unter
Code:
http://IP-Adresse/phpmyadmin/
in einem Browser zugreifen und Dich als admin anmelden.
Dann kannst Du einen Blick in die Datenbank werfen. Später kannst Du phpMyAdmin verwenden, um den Proftpd-Server zu verwalten.

proFTPd konfigurieren
Code:
nano /etc/proftpd/modules.conf
Folgende 3 Module aktivieren:
Code:
[...]
# Install proftpd-mod-mysql or proftpd-mod-pgsql to use this
LoadModule mod_sql.c
[...]
# Install proftpd-mod-mysql to use this
LoadModule mod_sql_mysql.c
[...]
# Install proftpd-mod-pgsql or proftpd-mod-mysql to use this
LoadModule mod_quotatab_sql.c
[...]
Code:
nano /etc/proftpd/proftpd.conf
Kommentiere den Quota Abschnitt ein und die Zeile Include /etc/proftpd/sql.conf aus:
Code:
[...]
#<IfModule mod_quotatab.c>
#QuotaEngine off
#</IfModule>
[...]
#
# Alternative authentication frameworks
#
#Include /etc/proftpd/ldap.conf
Include /etc/proftpd/sql.conf
[...]
Code:
nano /etc/proftpd/sql.conf
Es sollte wie folgt aussehen. Achte darauf, dass in der Zeile SQLConnectInfo passwort das echte Passwort für den MariaDB-Benutzer proftpd steht!
Code:
#
# Proftpd sample configuration for SQL-based authentication.
#
# (This is not to be used if you prefer a PAM-based SQL authentication)
#

<IfModule mod_sql.c>
#
# Choose a SQL backend among MySQL or PostgreSQL.
# Both modules are loaded in default configuration, so you have to specify the backend
# or comment out the unused module in /etc/proftpd/modules.conf.
# Use 'mysql' or 'postgres' as possible values.
#
#SQLBackend        mysql
#
#SQLEngine on
#SQLAuthenticate on
#
# Use both a crypted or plaintext password
#SQLAuthTypes Crypt Plaintext
#
# Use a backend-crypted or a crypted password
#SQLAuthTypes Backend Crypt
#
# Connection
#SQLConnectInfo [email protected] proftpd_user proftpd_password
#
# Describes both users/groups tables
#
#SQLUserInfo users userid passwd uid gid homedir shell
#SQLGroupInfo groups groupname gid members
#
DefaultRoot ~

SQLBackend              mysql
# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes            Plaintext Crypt
SQLAuthenticate         users groups


# used to connect to the database
# [email protected] database_user user_password
SQLConnectInfo  [email protected] proftpd password      #### Hier Passwort anpassen!!! ####


# Here we tell ProFTPd the names of the database columns in the "usertable"
# we want it to interact with. Match the names with those in the db
SQLUserInfo     ftpuser userid passwd uid gid homedir shell

# Here we tell ProFTPd the names of the database columns in the "grouptable"
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo    ftpgroup groupname gid members

# set min UID and GID - otherwise these are 999 each
SQLMinID        500

# create a user's home directory on demand if it doesn't exist
CreateHome on

# Update count every time user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

# Update modified everytime user uploads or deletes a file
SQLLog  STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

# User quotas
# ===========
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

RootLogin off
RequireValidShell off

</IfModule>
Code:
service proftpd restart
Code:
mariadb -u root -p
Jetzt Dein oben gewähltes Passwort eingeben.
Code:
USE ftp;
Code:
INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 3002, 'ftpuser');
Code:
INSERT INTO `ftpquotalimits` (`name`, `quota_type`, `per_session`, `limit_type`, `bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`, `files_in_avail`, `files_out_avail`, `files_xfer_avail`) VALUES ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
Code:
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'testuser', 'testpasswort', 3002, 3002, '/home/testverzeichnis', '/sbin/nologin', 0, NOW(), NOW());
Code:
quit;
Öffne nun den FTP-Client auf Deinem PC (zBsp Filezilla) und versuche, eine Verbindung herzustellen. Als Hostname verwende die IP-Adresse des Servers, der Benutzername ist testuser und das Passwort ist testpasswort.
Das Verzeichnis /home/testverzeichnis in unserem Beispiel sollte automatisch erstellt werden, sobald der User "testuser" etwas hochlädt.

Datenbankverwaltung
Für die meisten Leute ist es einfacher, wenn sie ein grafisches Frontend für die Datenbank haben.
Darum kannst Du hier nun phpMyAdmin unter
Code:
http://IP-Adresse/phpmyadmin/
verwenden, um die ftp-Datenbank zu verwalten.

24674



Um einen neuen User anzulegen ist es am einfachsten, wenn Du hier einen vorhandenen User kopierst und dann die Daten des neuen Users einträgst. Wenn Du fertig bist, unten auf OK klicken.
Man kann mehreren Usern das gleiche Verzeichnis zuweisen.

24675






Um FXP einzuschalten:

Code:
nano /etc/proftpd/proftpd.conf
Einfügen (IP Deines Servers bei MasqueradeAddress eintragen!):
Code:
# FXP erlauben
AllowForeignAddress on
MasqueradeAddress        IP-Adresse
Code:
service proftpd restart


Um den virtuellen Usern nur das Lesen zu erlauben, muss zunächst ein Systemuser erstellt werden, welcher dann auch schreiben/löschen und umbenennen darf.
Nennen wird den mal ftpmaster . Es können auch noch "weitere-user" erstellt werden.
Code:
useradd ftpmaster
Code:
nano /etc/proftpd/proftpd.conf
einfügen:
Code:
# Dieses um Read-only für alle Virtuellen zu erstellen !!!!!!!
<Global>
    RequireValidShell off
</Global>

<Directory ~>
  <Limit WRITE>
    AllowUser ftpmaster,weitere-user
    DenyAll
  </Limit>
</Directory>

DefaultRoot /home ftpgroup
Code:
service proftpd restart
Wenn möglich, gleich einen Reboot machen.

Nun muss der User ftpmaster noch in phpmyadmin angelegt werden, damit er sich überhaupt einloggen kann.

24676


Ich habe hier dem ftpmaster gleich das ganze /home Verzeichnis gegeben. So kann der alle Unterverzeichnisse der virtuellen User verwalten.


Viel Spass
 
Zuletzt bearbeitet:

Dieses Thema betrachten gerade (Benutzer: 0, Gäste: 1)