Install PureFTPd and Set Up MySQL

PureFTPd Image

Step 1: Install PureFTPd and Create FTP Group/User

apt-get install pure-ftpd-mysql
groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g ftpgroup ftpuser
    

Step 2: Set Up MySQL Database and Permissions

mysql -u root -p
CREATE DATABASE pureftpd;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'ftpdpass';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';
FLUSH PRIVILEGES;

USE pureftpd;

CREATE TABLE ftpd (
    User varchar(16) NOT NULL DEFAULT '',
    status enum('0','1') NOT NULL DEFAULT '0',
    Password varchar(64) NOT NULL DEFAULT '',
    Uid varchar(11) NOT NULL DEFAULT '-1',
    Gid varchar(11) NOT NULL DEFAULT '-1',
    Dir varchar(128) NOT NULL DEFAULT '',
    ULBandwidth smallint(5) NOT NULL DEFAULT '0',
    DLBandwidth smallint(5) NOT NULL DEFAULT '0',
    comment tinytext NOT NULL,
    ipaccess varchar(15) NOT NULL DEFAULT '*',
    QuotaSize smallint(5) NOT NULL DEFAULT '0',
    QuotaFiles int(11) NOT NULL DEFAULT 0,
    PRIMARY KEY (User),
    UNIQUE KEY User_unique (User)
) ENGINE=MyISAM;
quit;
    

Step 3: Configure PureFTPd to Use MySQL

cp /etc/pure-ftpd/db/mysql.conf /etc/pure-ftpd/db/mysql.conf_orig
cat /dev/null > /etc/pure-ftpd/db/mysql.conf
vi /etc/pure-ftpd/db/mysql.conf

MYSQLSocket /var/run/mysqld/mysqld.sock
#MYSQLServer localhost
#MYSQLPort 3306
MYSQLUser pureftpd
MYSQLPassword ftpdpass
MYSQLDatabase pureftpd
#MYSQLCrypt md5, cleartext, crypt() or password() - md5 is VERY RECOMM
ENDABLE uppon cleartext
MYSQLCrypt md5
MYSQLGetPW SELECT Password FROM ftpd WHERE User="\L" AND status="
1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetUID SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AN
D (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetGID SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND
(ipaccess = "*" OR ipaccess LIKE "\R")

MYSQLGetDir SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND
(ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND st
atus="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND st
atus="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTASZ SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="
1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTAFS SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status=
"1" AND (ipaccess = "*" OR ipaccess LIKE "\R")

echo "yes" > /etc/pure-ftpd/conf/ChrootEveryone
echo "yes" > /etc/pure-ftpd/conf/CreateHomeDir
vi /etc/default/pure-ftpd-common

# Configuration for pure-ftpd
# (this file is sourced by /bin/sh, edit accordingly)

# STANDALONE_OR_INETD
# valid values are "standalone" and "inetd".
# Any change here overrides the setting in debconf.
STANDALONE_OR_INETD=standalone

# VIRTUALCHROOT:
# whether to use binary with virtualchroot support
# valid values are "true" or "false"
# Any change here overrides the setting in debconf.
VIRTUALCHROOT=false

# UPLOADSCRIPT: if this is set and the daemon is run in standalone mod
e,
# pure-uploadscript will also be run to spawn the program given below

# for handling uploads. see /usr/share/doc/pure-ftpd/README.gz or
# pure-uploadscript(8)

# example: UPLOADSCRIPT=/usr/local/sbin/uploadhandler.pl
UPLOADSCRIPT=

# if set, pure-uploadscript will spawn $UPLOADSCRIPT running as the
# given uid and gid
UPLOADUID=
UPLOADGID=
    

Step 4: Modify /etc/inetd.conf and Restart Services

vi /etc/inetd.conf

[...]
#:STANDARD: These are standard services.
#ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbi
n/pure-ftpd-wrapper
[...]

/etc/init.d/openbsd-inetd restart
/etc/init.d/pure-ftpd-mysql restart
    

Step 5: Create a FTP User

INSERT INTO `ftpd`(`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`,
`ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`,
`QuotaFiles`)
VALUES ('utilisateur1', '1', 'motdepasse1', '1001', '1001',
'/home/utilisateur1', '0', '0', 'Utilisateur FTP numéro 1', '*',
'1024', '100');
    
How to Install LAMP Apache, MySQL, PHP on Debian 11 ? Install and Configure Nagios on Debian 11 Install Certbot Connect with SSH Keys Using Putty Configuring Virtual Hosts on Debian 11 with Apache and OpenSSL