[[oktatas:linux:ftp_szerver|< FTP szerver]]
====== ProFTPd ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2011, 2019, 2021
* [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]]
* Web: https://szit.hu
===== Telepítés =====
apt install proftpd
* A következő felhasználót veszi fel: ''proftpd''
* A proftpd felhasználót a ''nogroup'' csoportba teszi.
* A következő felhasználót hozza létre: ''ftp'' (UID 112)
* Az ftp felhasználót a ''nogroup'' csoportba teszi.
* Készít egy ''/srv/ftp'' könyvtárat.
A ''/srv/ftp/welcome.msg'' állományban létrehoz egy üzenetet.
Telepítés után minden linuxos felhasználó beléphet saját
könyvtárába.
===== Lehetséges hibák =====
* A hostnév nem oldható fel IP címmé.
===== Beállítások =====
A beállítások a következő helyen vannak:
/etc/proftpd/proftpd.conf
Ha megváltoztatjuk a beállításokat, ellenőrizzük azokat:
proftpd -t
Jöhet egy újraindítás:
systemctl restart proftpd
===== Használható parancsok =====
Felhasználók is:
* ''ftpcount''
* ''ftpdctl''
* ''ftptop''
* ''ftpwho''
Rendszergazdák:
* ''ftpasswd''
* ''ftpquota''
* ''ftpscrub''
* ''ftpshut''
* ''ftpstats''
* ''proftpd-gencert''
===== Anonymous =====
Az anonymous felhasználók számára automatikusan létrejön a következő könyvtár:
/srv/ftp
A ''/etc/proftpd/proftpd.conf'' állomány végén az anonymous rész előtt a megjegyzést el kell távolítani.
nano /etc/proftpd/proftpd.conf
...
User ftp
Group nogroup
UserAlias anonymous ftp
RequireValidShell off
MaxClients 10
DisplayLogin welcome.msg
DisplayChdir .message
DenyAll
===== Linuxos felhasználó shell nélkül =====
Vegyünk fel egy felhasználót, például sarga. Szeretnénk
lehetővé tenni, hogy a /srv/www/sarga.lan/ könyvtárba
feltölthessen.
mkdir /srv/www/sarga.lan/
useradd -d /srv/www/sarga.lan/htdocs -s /bin/false sarga
chown /srv/www/sarga.lan/sarga
Szerkesszük a proftpd.conf állományt,
keressünk egy RequireValidShell beállítást, vegyük ki a megjegyzést előle.
nano /etc/proftpd/proftpd.conf
...
RequireValidShell off
...
===== Kapcsolat irányok vizsgálata =====
Adott a szerver: 192.168.5.102, és egy kliens 192.168.5.5:
192.168.5.0/24
.5 .102
[kliens]--------------[szerver]
apt install tcpick
tcpick
# tcpick
important: `man 8 tcpick' explains all options available
Starting tcpick 0.2.1 at 2021-04-30 23:53 CEST
Timeout for connections is 600
tcpick: listening on enp0s3
1 SYN-SENT 192.168.5.5:43126 > 192.168.5.102:ftp
1 SYN-RECEIVED 192.168.5.5:43126 > 192.168.5.102:ftp
1 ESTABLISHED 192.168.5.5:43126 > 192.168.5.102:ftp
2 SYN-SENT 192.168.5.102:ftp-data > 192.168.5.5:43895
2 SYN-RECEIVED 192.168.5.102:ftp-data > 192.168.5.5:43895
2 ESTABLISHED 192.168.5.102:ftp-data > 192.168.5.5:43895
2 FIN-WAIT-1 192.168.5.102:ftp-data > 192.168.5.5:43895
2 TIME-WAIT 192.168.5.102:ftp-data > 192.168.5.5:43895
2 CLOSED 192.168.5.102:ftp-data > 192.168.5.5:43895
A fentiekben egy kapcsolódást és egy ls parancsot látunk.
Bekapcsolva passzívmód: passive, majd ls:
3 SYN-SENT 192.168.5.5:34414 > 192.168.5.102:44863
3 SYN-RECEIVED 192.168.5.5:34414 > 192.168.5.102:44863
3 ESTABLISHED 192.168.5.5:34414 > 192.168.5.102:44863
3 FIN-WAIT-1 192.168.5.5:34414 > 192.168.5.102:44863
3 TIME-WAIT 192.168.5.5:34414 > 192.168.5.102:44863
3 CLOSED 192.168.5.5:34414 > 192.168.5.102:44863
Ha nevek helyett kérhetünk számokat is:
tcpick -n
===== Virtuális felhasználók =====
Hozzunk létre egy új konfigurációs állományt a pureftpd számára:
nano /etc/proftpd/conf.d/virtualUser.conf
Írjuk a fájlba a következőket:
# A felhasználóknak ne kelljen shell:
RequireValidShell off
# Jelszó és csoportfájl:
AuthUserFile /etc/proftpd/ftpd.passwd
AuthGroupFile /etc/proftpd/ftpd.group
# Zárjuk be a felhasználót a saját könyvtárába:
DefaultRoot ~
AuthOrder mod_auth_file.c
Hozzuk létre a csoportfájlt:
touch /etc/proftpd/ftpd.group
Hozzunk létre például egy feri nevű felhasználót:
ftpasswd \
--passwd \
--name=feri \
--home=/home/vftp/feri \
--shell=/bin/false \
--uid=111 \
--gid=65534 \
--file=/etc/proftpd/ftpd.passwd
Az --uid utáni szám meg kell egyezzen a proftpd uid azonosítóval.
Adjuk a könyvtárat a proftpd démonnak:
chown proftpd.nogroup /home/vftp/feri
Ha fontos, az azonosítás sorrendjét is beállíthatjuk:
...
AuthOrder mod_auth_file.c
Beállítások után ellenőrizzük a konfigurációt:
proftpd -t
Indítsuk újra a szervert:
systemctl restart proftpd
Csoport felvétel a ftpasswd paranccsal:
ftpasswd
--group
--name=nogroup
--file=/etc/proftpd/ftpd.group
--gid=111
--member feri
Jelszó módosítása:
ftpasswd \
--passwd \
--file=/etc/proftpd/ftpd.passwd \
--name=feri \
--change-password
===== SSL =====
cd /etc/proftpd/ssl
openssl req -new -x509 -days 365 -nodes -out ftpd-rsa.pm -keyout ftpd-rsa-key.pem
A ''/etc/proftpd/proftpd.conf'' állományban megkeressük a következő sort:
#Include /etc/proftpd/tls.conf
A kettőskeresztet eltávolítjuk.
A ''/etc/proftpd/tls.conf'' fájlt pedig ehhez hasonlóan alakítjuk:
TLSEngine on
TLSLog /var/log/proftpd/proftpd-tls.log
TLSProtocol TLSv1
# Megköveteljük a kliensektől a TLS kapcsolatot?
TLSRequired off
TLSRSACertificateFile /etc/proftpd/ssl/ftpd-rsa.pem
TLSRSACertificateKeyFile /etc/proftpd/ssl/ftpd-rsa-key.pem
# Szükséges azonosítás a TLS használatához?
TLSVerifyClient off
A TLSProtocol értéke esetleg: SSLv23
===== ProFTPd MySQL =====
Ellenőrzésre szoruló rész!
Szükséges telepítés:
apt install proftpd-mod-mysql
Szükséges felhasználó és csoport:
groupadd -g 5001 ftpgroup
useradd -u 5001 -g ftpgroup -c "proftpd user" -d /bin/null -s /bin/false ftpuser
MySQL-ben szükséges:
CREATE DATABASE ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'titok';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'titok';
FLUSH PRIVILEGES;
Használjuk az FTP adatbázist:
USE ftp;
A következő táblákat hozzuk létre:
CREATE TABLE groups (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '5500',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) TYPE=MyISAM COMMENT='ProFTPd csoport tabla';
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 int(10) unsigned NOT NULL default '0',
bytes_out_avail int(10) unsigned NOT NULL default '0',
bytes_xfer_avail int(10) 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'
) TYPE=MyISAM;
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user',
bytes_in_used int(10) unsigned NOT NULL default '0',
bytes_out_used int(10) unsigned NOT NULL default '0',
bytes_xfer_used int(10) 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'
) TYPE=MyISAM;
CREATE TABLE users (
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 '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) TYPE=MyISAM COMMENT='ProFTP user table';
A ftpquotatallies táblát a proftpd használja, ahhoz nem kell nyúlni.
==== Modulok engedése ====
Modulok engedélyezése:
nano /etc/proftpd/modules.conf
Vegyük ki a megjegyzést a következő sorok esetén:
...
LoadModule mod_sql.c
...
LoadModule mod_sql_mysql.c
...
==== SQL beállítás ====
Készítsünk egy új konfigurációs fájlt.
nano /etc/proftpd/con.d/mysqlUser.conf
A felhasználókat saját könyvtárukba zárjuk
DefaultRoot ~
A fő konfigurációs fájlban keressük meg a Include /etc/proftpd/sql.conf sorokat,
vegyük ki a megjegyzést előle:
Include /etc/proftpd/sql.conf
Szerkesszük a sql.conf fájlt:
nano /etc/proftpd/sql.conf
SQLBackend mysql
SQLEngine on
SQLAuthenticate on
# A jelszavakat a MysQL-ben crypttel titkosítjuk:
SQLAuthTypes Crypt Plaintext
# Kapcsolódás az MySQL adatbázishoz:
SQLConnectInfo ftp@localhost proftpd titok
# A felhasználói tábla leírása:
SQLUserInfo users userid passwd uid gid homedir shell
# A csoport tábla leírása:
SQLGroupInfo groups groupname gid members
Ha szükséges még ez is a fentiekhez:
# Felhasználó könyvtárának létrehozása ha nem létezik:
SQLHomedirOnDemand on
# Minimális UID és GID
SQLMinID 500
# A számláló növelése, ha egy felhasználó belép
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser
# A módosítás feljegyzése feltöltésről vagy törlésről
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser
Ugyancsak a fentiekhez ha kell kvóta:
QuotaEngine on
QuotaShowQuotas on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
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
==== Felhasználó felvétele ====
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 ('mari', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
INSERT INTO 'ftpuser' ('id', 'userid', 'passwd', 'uid', 'gid',
'homedir', 'shell', 'count', 'accessed', 'modified')
VALUES (1, 'mari', 'titok', 5001, 5001, '/srv/vftp/mari',
'/sbin/nologin', 0, '', '');
===== Irodalom =====
* http://www.proftpd.org/docs/ (2019)
* http://www.proftpd.org/docs/howto/VirtualUsers.html
* http://www.proftpd.org/docs/howto/SQL.html
* http://www.debian-administration.org/articles/228
* http://www.linuxvilag.hu/content/files/cikk/26/cikk_26_68_69.pdf
* http://www.howtoforge.com/proftpd-tls-debian-etch
* http://www.besy.co.uk/debian/how_to_setup_proftpd_with_mysql_virtual_users_and_ssl_protocol_data
* http://www.debuntu.org/how-to-ftp-virtual-host-with-proftpd-mysql
* [[https://www.digitalocean.com/community/tutorials/how-to-set-up-proftpd-with-a-mysql-backend-on-ubuntu-12-10|https://www.digitalocean.com/]] (2019)
* https://ixnfo.com/en/configuring-proftpd-with-virtual-users-in-a-file.html (2019)
* https://www.howtoforge.com/virtual-hosting-with-proftpd-and-mysql-debian-lenny-p2 (2019)