Virtuális FTP szerver Proftpd és MySQL alapokon

Ebben a leírásban egy FTP szervert hozok létre Ubuntu 8.04 LTS disztribúción, Proftpd-vel, és a felhasználókat MySQL-ben tárolódnak. A felhasználókra beállítható lesz kvóta is.
A felhasználó kezelése phpMyAdmin-al valósul meg.
A leírás feltételez egy már feltelepített és konfigurált Ubuntu Servert (leírás itt). A szerver neve gaia, és a teszt.local tartományba van (tehát a gép teljes neve gaia.teszt.local), IP címe 10.0.2.15.

Jelentkezzünk be a szerverre (akár helyileg akár távolról), majd szerezzünk magunknak egy root konzolt:

sudo -s

Majd változtassuk meg az alapértelmezett shellt:

ln -sf /bin/bash /bin/sh

Erre azért van szükség, mert a /bin/sh egy symlink a /bin/dash-re, azonban most a /bin/bash kell, nem a /bin/dash.
Tiltsuk le az AppArmor-t:

/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
 

Az AppArmor egy biztonsági megoldás, hasonló mint a SELinux. Azonban most nincs rá szükség, és csak problémákat okozhat, ezért szükséges a letiltása.
Telepítsük az phpMyAdmin-t és a MySQL-t:

apt-get install mysql-server mysql-client libmysqlclient15-dev phpmyadmin apache2

A New password for the MySQL „root” user: kérdésre írjuk be a jelszavunkat,
a Web server to reconfigure automatically: kérdésre válasszuk ki az apache2-t (menjünk rá, és nyomjuk le a szóközt)
Telepítsük a Proftpd-t:

apt-get install proftpd-mysql

A Run proftpd kérdésre a standalone-t válasszuk ki.
Most hozzuk létre egy ftp felhasználót és csoportot:

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

Ha a rendszerünkben a 2001-es UID és GID nem lenne szabad, válasszunk egy másikat.
Hozzuk létre a proftpd adatbázisát. Ehhez lépjünk be a mysql konzoljába (jelszavunkat meg kell majd adni):

mysql -u root -p

Majd hozzuk létre az adatbázist:

create database ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'jelszo';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'jelszo';
FLUSH PRIVILEGES;

A ‘jelszo’ részt cseréljük le arra, amit az adatbázis eléréséhez szeretnénk használni!
Majd hozzuk létre a táblákat:

USE ftp;
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)
) TYPE=MyISAM COMMENT='ProFTP group table';
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 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 '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';
quit;

Most nyissuk meg a /etc/proftpd/proftpd.conf fájlt, és tiltsuk le az IPv6 részét a ProFTPd-nek:

nano /etc/proftpd/proftpd.conf

Kerressük meg az UseIPv6 opciót, majd on-ról írjuk át off-ra.
Majd ezt írjuk be a konfigurációs fájl végére, úgy, hogy az SQLConnectInfo sorban a jelszót, az ftp adatbázis létrehozásakor megadott jelszóra írjuk át, és a végén üssunk entert, egy új üres sorért:

DefaultRoot ~
SQLBackend              mysql
# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes            Plaintext Crypt
SQLAuthenticate         users groups
# used to connect to the database
# databasename@host database_user user_password
SQLConnectInfo  ftp@localhost proftpd jelszo
# 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

indítsuk újra a proftpd-t:

/etc/init.d/proftpd restart

Most töltsük fel adatokkal az adatbázist, és próbáljuk ki az ftp hozzáférést:

mysql -u root -p

Adjuk meg a jelszavunkat, majd:

USE ftp;

Először létrehozunk egy ftpgroup nevű csoportot, amin keresztül a virtuális csoportot megfeleltetjük az igazinak, melyet a leírás elején hoztunk létre (ha más UID/GID-et használtunk a 2001 helyett, akkor itt is írjuk át!)

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');

Most hozzunk létre egy felhasználót. A felhasználóneve peldauser lesz, jelszava titkosjelszo, és a /home/www.pelda.com mappához fér hozzá, valamit 15 MiBájtos kvótája lesz.

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 ('peldauser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
INSERT INTO 'ftpuser' ('id', 'userid', 'passwd', 'uid', 'gid', 'homedir', 'shell', 'count', 'accessed', 'modified') VALUES (1, 'peldauser', 'titkosjelszo', 2001, 2001, '/home/www.pelda.com', '/sbin/nologin', 0, '', '');

Ha megvan léjünk ki a mysql konzolból:

quit;

Most már beléphetünk az előbb létrehozott felhasználóval. A felhasználó mappája az első bejelentkezéskor fog létrejönni!
A felhasználóket létrehozhatjuk, törölhetjük, szerkeszthetjük a phpMyAdminon keresztül is. Ehhez írjuk be a kedvenc böngészőnkbe, hogy http://10.0.2.15/phpmyadmin (vagy ha más a szerver IP címe, akkor azt), és lépjünk be a leírás elején létrehozott proftpd felhasználóval, és annak jelszavával.
A felhasználók kezelése szempontjából csak az ftpquotalimits és ftpuser táblákkal kell foglalkozni.
ftpuser tábla:

  • userid: A virtuális felhasználó felhasználói neve (pl. peldauser).
  • passwd: A felhasználó jelszava
  • uid: A gépen létező ftp felhasználó azonosítója (2001 volt, ha a gépen nem volt olyan azonosító korábról).
  • gid: A gépen létező ftp csoport azonosítója (ugyanaz mint fent, 2001).
  • homedir: A felhasználó mappája, pl. /home/peldauser. Ha nem létezik, az első bejelentkezéskor automatikusan létrejön. A felhasználó a mappájából nem tud kilátni.
  • shell: /sbin/nologin legyen

ftpquotalimits tábla:

  • name: Az ftp felhasználó felhasználó neve (akire az adott kvóta vonatkozik)
  • quota_type: user vagy group, normál esetben user
  • per_session: true vagy false. Ha true (igaz) akkor a kvóta csak az adott sessionra, munkamenetre vonatkozik, ha fals (hamis) akkor a kvóta mindig akkora marad.
  • limit_type: hard vagy soft. Hard kvótát nem lehet átlépni, míg a soft kvótát időlegesen át lehet lépni.
  • bytes_in_avail: Feltöltési limit bájtban. 0 esetén korlátlan.
  • bytes_out_avail: Letöltési limit bájtban. 0 esetén korlátlan.
  • bytes_xfer_avail: Forgalm ilimit bájtban. Le és feltöltések együtt. 0 esetén korlátlan.
  • files_in_avail: Feltöltési korlát fájlok számában. 0 esetén korlátlan.
  • files_out_avail: Letöltési korlát fájlok számában. 0 esetén korlátlan.
  • files_xfer_avail: Forgalmi korlát fájlok számában. 0 esetén korlátlan.

22 thoughts on “Virtuális FTP szerver Proftpd és MySQL alapokon

  1. Hali…
    Én feltelepítettem igy a proftpd-t… és minden jó is… de egy bajom van… azt, hogy lehet megoldani, hogy legyen egy olyan user aki mindenhova tud mászkálni a winyón és midnent tud csinálni (törölni, másolni…stb..)?

    1. homedirnek a / adod meg (vagy ahová be van csatolva a merevlemez). Azonban ez nem egy biztonságos megoldás.

  2. Helló
    nagyszerű, ez a leírás. először is köszi szépen. másodszor pedig, meg tudnád mondani, hogyan oldjam meg azt, hogy a userek csak olvasni tudják a könyvtárakat.
    Nem tudom fontos-e de leírom hogy a könyvtáruk a /media/partíció ntfs fájlrendszerrel
    a választ előre is köszi.

  3. Jó a leírás, de nálam a következő hibát írja ki a terminál:
    unknown configuration directive ‘SQLBackend’
    Ötlet, hogy mit csináljak?

  4. regota igy futtatom a proftpd-t, de csak ma tunt fel hogy nem updateli a quotat…
    ftpquotatallies resznel nem valtozik h ki mennyit hasznal 🙁
    mar uj proftpd-t is raktam, ugy forgattam hogy mod_quotatab_sql is legyen benne mindenkeppen
    a mysql logban pl az latszik hogy updateli a count-ot hogy ki hanyszor lepett be, de semmi UPDATE a quota-ra 🙁
    van vkinek 5lete hogy mit nezzek még meg?

  5. Na, fixálva, updateli a quota-t, most már csak a kiiras nem jelenik meg ftpn h mennyit hasznalt mennyibol (ez erdekes elotte ment!)

  6. Köszönöm a leírást, ez alapján én is beállítottam az ftp-t, de a felhasznált quota nálam sem jelenik meg (Debian – Lenny).
    Keksz: neked sikerült ezt megoldani?

  7. Sziasztok!
    Nekem ubuntu 10.04 LTS – Lucid Lynx-em van és elakadok annál a lépésnél, mikor a proftpd.conf dokumentumot kell módosítani. Módosítás ok, on-t átírom off-ra, bemásolom a szöveget, átírom a jelszót és mentés … Jön az újraindítás és kijön a hiba:
    Fatal: unknown configuration directive ‘SQLBackend’ on line 175 of ‘/etc/proftpd/proftpd.conf’
    vagy ha kiveszem ezt a sort (más weboldalról néztem, hogy ott nincs, akkor: Fatal: unknown configuration directive ‘SQLAuthTypes’ on line 177 of ‘/etc/proftpd/proftpd.conf’)
    Mi lehet a baj?
    Segítségeteket előre is köszönöm!

  8. Nem volt, de most beleírtam. Most ez a hibaüzenet:
    warning: unable to include ‘/etc/proftp/modules.conf’: No such file or directory
    A modules.conf-ba minden LoadModule sor előtt kivettem a # jelet, de akkor ilyeneket írt ki:
    Fatal: LoadModule: error loading module ‘mod_sql_sqlite.c’: Permission denied on line 43 of ‘/etc/proftpd/modules.conf’
    És sorba minden olyan Module előtt, ami előtt eredetileg ott volt a # jel. Most visszaírtam oda a # jeleket, ahol ott voltak, de így se megy :S

  9. Üdv én is 10.04 alatt probáltam
    proftpd ujrainditás után: Fatal: unknown configuration directive ‘SQLBackend’ on line 178 of ‘/etc/proftpd/proftpd.conf’
    Ha valakinek van ötlete kérem írjon.

  10. hali
    ha az sql.conf-ba írod és a proftpd.conf ba engedélyezed hogy használhassa az sql.conf-fájlt akkor menni fog:)

  11. Sziasztok!
    Nekem ezt irja ki a konfiguralas utan:
    root@server:/# /etc/init.d/proftpd restart
    * Stopping ftp server proftpd [ OK ]
    * Starting ftp server proftpd – mod_dso/0.4: module ‘mod_ctrls_admin.c’ already loaded
    – Fatal: LoadModule: error loading module ‘mod_ctrls_admin.c’: Operation not permitted on line 15 of ‘/etc/proftpd/modules.conf’
    [fail]
    Amit itt javasoltatok kiprobaltam es nem segitett sajnos. Charlie van otleted? Koszonom,
    Gabor

  12. Sziasztok !
    Nekem olyan gondom van hogy hozzáadok egy felhasználót és lát minden könyvtárat a szervren :S Östlet ?

  13. No már meg is találtam a hibát. Valahogy lemaradt 2 sor.
    de ha másnak is lenne hasonló problémája akkor elárulom Én mit rontottam el. Csupán ez maradt ki
    Még jó hogy átnéztem a configot sorról sorra
    DefaultRoot ~
    SQLBackend mysql

  14. Sziasztok,
    hogy lehet megcsinalni, hogy ne csak letolteni lehessen, hanem feltolteni es torolni is tudjon a felhasznalo.

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

Ez az oldal az Akismet szolgáltatást használja a spam csökkentésére. Ismerje meg a hozzászólás adatainak feldolgozását .