Proftpd

A bejegyzésből megtanulhatod, hogy hogyan telepítsd a proftpd alkalmazás szervert – Debian8 „Jessie” – rendszerre, mysql adatbázis támogatással és virtuális felhasználó kezeléssel.

Proftpd daemon telepítése

Az ftp szolgáltatás két módon biztosítható.

  1. Aktív mód
  2. Passzív mód

Aktív- és passzív mód esetén is, a vezérlő utasítások az ftp szerver 21-es portjára érkeznek. Azonban az adatok aktív mód esetén a szerver 20-as portjáról kiindulva vándorolnak a kliens valamely portjára, míg passzív mód esetén a szerver egy porttartományból választ egy kaput, és annak a számát, valamint a szerver ip címét küldi el a kliensnek, és a kliens ezen információk birtokában jön vissza az adatokért. Ennyi előzetes információ után kezdjük el a munkát.

Legyen a rendszer naprakész:

sudo apt-get update && sudo apt-get upgrade

Telepítsük fel a programot:

apt-get install proftpd

Telepítéskor két lehetőség közül választhatunk, hogy hogyan kívánjuk használni a programot:

  1. from inetd: A daemon alvó módban van, mindaddig, amíg csatlakozási kérelem nem érkezik.
  2. standalone: Folyamatosan figyel a daemon

Amennyiben kis terheltségű ftp szolgáltatást kívánsz üzemeltetni, az 1. a jó választás, így erőforrást spórolhatsz. Ellenkező esetben értelemszerűen a 2. lehetőséget válaszd.

Telepítés után, állítsuk le a szolgáltatást:

/etc/init.d/proftpd stop

Nyissuk meg a konfigurációs állományt:

nano /etc/proftpd/proftpd.conf

Módosítsunk néhány bejegyzést:

# Zárjuk be a felhasználókat a saját könyvtárukba:
DefaultRoot ~

# Konfigurálnuk a passzív mód porttartományát:
PassivePorts                  20000 21000

# Amennyiben fix ip címmel rendelkezel azt add meg itt, ha nem, akkor regisztrálj egy domain nevet, valamelyik ingyenes DDNS szolgáltatónál és azt deklaráld. 
MasqueradeAddress		ftp.example.com

# Add meg, hogy kinek a nevében fut a daemon
User proftpd
Group nogroup

#Vágül engedélyezd, az sql.conf konfigurációs állomány beillesztését:
Include /etc/proftpd/sql.conf

Virtuális felhasználók a Proftpd-ben

A példám előfeltétele, hogy egy MSQL, vgy MariaDB adatbázis kezelő rendszer legyen a szervereden. Szükségünk lesz egy linux felhasználóra, akinek a tulajdonába kerülnek – alapértelmezetten -, a szerveren tárolt adatok, amit a virtuális felhasználó létrehoz. Egyébként ez a tulajdon átállítható akkor, amikor a virtuális felhasználót létrehozzuk.

Csoport- és felhasználó létrehozása:

groupadd -g 2001 ftpgroup
useradd -u 2001 -g ftpgroup -c "proftpd user" -d /bin/null -s /bin/false ftpuser

Lépjünk be az adatbázis kezelő rendszerbe:

mysql -u felhasználónév  -p jelszó 

Adatbázis-, és a kezelésére jogosult felhasználó létrehozása:

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;
USE ftp;

Táblák létrehozása:

CREATE TABLE IF NOT EXISTS `admin` (
  `id` int(11) NOT NULL,
  `userid` varchar(50) COLLATE utf8_hungarian_ci NOT NULL,
  `password` varchar(255) COLLATE utf8_hungarian_ci NOT NULL,
  `session_id` varchar(255) COLLATE utf8_hungarian_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci;

CREATE TABLE IF NOT EXISTS `ftpgroup` (
  `groupname` varchar(16) COLLATE utf8_hungarian_ci NOT NULL DEFAULT '',
  `gid` smallint(6) NOT NULL DEFAULT '2001',
  `members` varchar(16) COLLATE utf8_hungarian_ci NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci COMMENT='ProFTP group table';

CREATE TABLE IF NOT EXISTS `ftpquotalimits` (
   `name` varchar(30) COLLATE utf8_hungarian_ci DEFAULT NULL,
   `quota_type` enum('user','group','class','all') COLLATE utf8_hungarian_ci NOT NULL DEFAULT 'user',
   `per_session` enum('false','true') COLLATE utf8_hungarian_ci NOT NULL DEFAULT 'false',
   `limit_type` enum('soft','hard') COLLATE utf8_hungarian_ci 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 DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci;

CREATE TABLE IF NOT EXISTS `ftpquotatallies` (
   `name` varchar(30) COLLATE utf8_hungarian_ci NOT NULL DEFAULT '',
   `quota_type` enum('user','group','class','all') COLLATE utf8_hungarian_ci 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 DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci;

CREATE TABLE IF NOT EXISTS `ftpuser` (
   `id` int(10) unsigned NOT NULL,
   `name` varchar(70) COLLATE utf8_hungarian_ci NOT NULL,
   `userid` varchar(32) COLLATE utf8_hungarian_ci NOT NULL DEFAULT '',
   `passwd` varchar(32) COLLATE utf8_hungarian_ci NOT NULL DEFAULT '',
   `address` varchar(100) COLLATE utf8_hungarian_ci NOT NULL,
   `email` varchar(100) COLLATE utf8_hungarian_ci NOT NULL,
   `phone` varchar(20) COLLATE utf8_hungarian_ci NOT NULL,
   `uid` smallint(6) NOT NULL DEFAULT '2001', # Az alapértelmezett linux felhasználónál megadott uid érték!
   `gid` smallint(6) NOT NULL DEFAULT '2001', # Az alapértelmezett linux felhasználónál megadott gid érték! 
   `homedir` varchar(255) COLLATE utf8_hungarian_ci NOT NULL DEFAULT '',
   `shell` varchar(16) COLLATE utf8_hungarian_ci 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'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci COMMENT='ProFTP user table';

ALTER TABLE `admin`	ADD PRIMARY KEY (`id`);
ALTER TABLE `ftpgroup` ADD KEY `groupname` (`groupname`);
ALTER TABLE `ftpuser` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `userid` (`userid`);

A modules.conf állományt módosítsuk:

LoadModule mod_sql.c
LoadModule mod_sql_mysql.c

Az sql.conf állomány módosítása:

 
<IfModule mod_sql.c>
SQLEngine on
SQLBackend mysql 

# A jelszavakat a MysQL-ben crypttel titkosítjuk:
SQLAuthTypes            Crypt Plaintext
 
SQLAuthenticate         on

# Kapcsolódás az MySQL adatbázishoz:
SQLConnectInfo  ftp@localhost proftpd  titok # Adatbázis kapcsolat felépítéséhez szükséges adatok.

# A felhasználói tábl leírása:
SQLUserInfo ftpuser userid passwd uid gid homedir shell

# A csoport tábla leírása:
SQLGroupInfo ftpgroup groupname gid members
 
# Felhasználó könyvtárának létrehozása ha nem létezik:
CreateHome 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

QuotaEngine on
QuotaShowQuotas on
QuotaDirectoryTally on
QuotaDisplayUnits Mb

## SQL utasítások:

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>

Nincs más hátra, mint újraindítani a szolgáltatást:

/etc/init.d/proftpd start

Ellenőrízzük le a szolgáltatás állapotát:

systemctl status proftpd

A kimentből látszani kell, hogy a szolgáltatás hiba nélkül elindult. A továbbiakban létre kell hozni az adatbázisbab a felhasználókat és amennyiben tűzfal mögött használod a szervert, akkor kinyitni a szükséges portokat, természetesen ezt akkor is tedd meg, ha a szervereden futtatod a tűzfalat, bár ez utóbbi nem szerencsés. Remélem tanulságos volt a cikk számodra.