[[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)