PureFTPd + MySQL + Virtual Quotas HOWTO

Šiandien nusprendžiau pasidalinti savo patirtimi instaliuojant ir konfigūruojant pureftpd su MySQL vartotojais. Vartotojų “laikymas” MySQL lentelėje yra naudingas tuo, kad nereikia kurti UNIX sistemos vartotoju ir tuo, kad labai lengvą tvarkyti ftp vartotojus. Negana to, galima pasirašyti web aplikaciją, kurios pagalba vartotojų tvarkymas taps dar spartesnis.

Dažniausiai virtualūs FTP vartotojai naudojami tam, kad būtų galima teikti tinklapių talpinimo (hostingo) paslaugą.

Intro

Neketinu aprašinėti (bent jau šiandien), kaip reiktų instaliuoti MySQL serverį ir jį paleistį. Tad Jūsų sistemoje jis jau turėtų būti sukonfigūruotas ir veikti.

Pradedam

Pradžiai reikia instaliuoti pureftpd. Tai ir padarome:

main# cd /usr/ports/ftp/pure-ftpd/
main# make config

Pažymime MYSQL ir išsirenkame OK. Taip pat galite išsirinkti ir kitus parametrus, jei Jums to reikia. Tada instaliuojame:

main# make install clean

pure-ftpd.conf konfigūracija

Dabar reikia susikonfigūruoti pureftpd demoną. Pirmiausiai nukopijuojame konfigūracijos failą:

main# cd /usr/local/etc/
main# cp pure-ftpd.conf.sample pure-ftpd.conf

Dabar su teksto redaktoriumi atsidarykite pure-ftpd.conf (aš naudoju ee):

main# ee pure-ftpd.conf

Atsidarė konfigūracijos failas. Jame matote daug instrukcijų ir komentarų. Aptarsiu pagrindines (ir mums reikalingas) instrukcijas:

ChrootEveryone – jeigu yes, tai prisijungęs vartotojas bus chroot’inimas prie savo namų direktorijos, jeigu no – prisijungęs vartotojas galės naršyti po visą sistemą.

TrustedGID – nurodomas vartotojų grupės ID, kurie gali būti ne chroot’inimi. Naudojamas kartu su ChrootEveryone, jei pastarasis yra no. Jeigu norite, kad visi vartotojai nebūtų chroot’inami, tai užkomentuokite ChrootEveryone ir TrustedGID instrukcijas.

BrokenClientsCompatibility – nurodoma yes arba no. Jeigu yes – ftp demonas bus suderinamas su netvarkingais ftp klientais, kurie neatitinka ftp protokolo reikalavimų.

MaxClientsNumber – maksimalus prisijungusių vienu metu vartotojų kiekis.

Daemonize – nurodoma yes arba no. Parametras nurodo serveriui, ar jam veikt kaip demonui background’e.

MaxClientsPerIP – maksimalus klientų iš vieno IP skaičius.

DisplayDotFilesyes arba no. Nurodo, ar rodyti failus / direktorijas, kurių pavadinimai prasideda tašku (paslėpti).

AnonymousOnlyyes arba no. Nurodo, ar serveris veiks tik anoniminių vartotojų rėžimų. Jei yes, tai sistemos vartotojai negalės prisijungti per ftp.

NoAnonymousyes arba no. Nurodo, ar leidžiama prisijungti kaip anoniminiam vartotojui. Jeigu yes – draudžiama, jeigu no – leidžiama.

MySQLConfigFile – kelias iki MySQL virtualių vartotojų konfigūracijos failo.

UnixAuthenticationyes arba no. Nurodoma, ar leisti prisijungti sistemos vartotojams.

CreateHomeDiryes arba no. Nurodoma, ar sukurti vartotojų namų (home) direktorijas, jeigu jos neegzistuoja.

MinUID – bus leidžiama jungtis tik tiems vartotojams, kurių UID yra didesnis nei nurodytas.

Mūsų konfigūracijai yra svarbūs šie parametrai:

MySQLConfigFile – nurodome /usr/local/etc/pureftpd-mysql.conf.

CreateHomeDir – nurodome yes.

MinUID – aš nurodau 80, nes mano virtualūs MySQL vartotojai priklauso www (80), kurią naudoja apache, grupei.

pureftpd-mysql.conf konfigūracija

Susikuriame konfigūracijos failą (vis dar esame /usr/local/etc/ direktorijoje):

main# ee pureftpd-mysql.conf

Į jį įrašome:

MYSQLServer 127.0.0.1
MYSQLPort 3306
MYSQLUser MYSQLVARTOTOJAS
MYSQLPassword MYSQLSLAPTAZODIS
MYSQLDatabase MYSQLDB
MYSQLCrypt md5
MYSQLGetPW SELECT password FROM ftpusers WHERE username=”\L” AND active=”1″
MYSQLGetUID SELECT sysuid FROM ftpusers WHERE username=”\L” AND active=”1″
MYSQLGetGID SELECT sysgid FROM ftpusers WHERE username=”\L” AND active=”1″
MYSQLGetDir SELECT homedir FROM ftpusers WHERE username=”\L” AND active=”1″
MySQLGetQTAFS SELECT fileslimit FROM ftpusers WHERE username=”\L” AND active=”1″
MySQLGetQTASZ SELECT quota FROM ftpusers WHERE username=”\L” AND active=”1″
MySQLGetBandwidthUL SELECT uploadspeed FROM ftpusers WHERE username=”\L” AND active=”1″
MySQLGetBandwidthDL SELECT downloadspeed FROM ftpusers WHERE username=”\L” AND active=”1″
MySQLTransactions Off

Konfigūracijos faile naudojamų instrukcijų aprašymas:

MYSQLServer – MySQL serverio adresas (99%, kad nereikės keist).

MYSQLPort – MySQL serverio portas (99%, kad nereikės keist).

MYSQLUser – MySQL vartotojas (pasikeiskite).

MYSQLPassword – MySQL slaptažodis (pasikeiskite).

MYSQLDatabase – MySQL duomenų bazės vardas (pasikeiskite).

MYSQLCrypt -slaptažodžių šifravimo algoritmas.

MYSQLGetPW – MySQL užklausa gaut vartotojo slaptažodžiui.

MYSQLGetUID – MySQL užklausa gaut virtualiam vartotojui priskirta sistemos UID.

MYSQLGetGID – MySQL užklausa gaut virtualiam vartotojui priskirta sistemos GID.

MYSQLGetDir – MySQL užklausa gaut virtualaus vartotojo namų direktorijai.

MySQLGetQTAFS – MySQL užklausa gaut maksimaliam failų kiekiui, t.y. failų skaičius, kiek maksimaliai iš viso gali turėti vartotojas.

MySQLGetQTASZ – MySQL užklausa gaut maksimaliam sunaudojamos vietos limitui.

MySQLGetBandwidthUL – MySQL užklausa gaut maksimaliam išsiuntimo greičiui (KB/s).

MySQLGetBandwidthUL – MySQL užklausa gaut maksimaliam parsiuntimo greičiui (KB/s).

MySQLTransactions – jeigu MySQL serveris palaiko transakcijas – On, jeigu ne arba nežinote, kas tai – Off.

P.S. MySQL užklausos (kaip ir MySQL vartotojų lentelė) gali būti kitokios. Tai visiškai priklauso nuo Jūsų. Daugiau apie tai galite paskaityti pureftpd-mysql.conf.sample faile.

MySQL lentelės sukūrimas

Prisijunkite prie MySQL serverio, sukurkite savo ftp serveriui duomenų bazę ir šią lentelę:

CREATE TABLE `ftpusers` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(30) collate utf8_lithuanian_ci NOT NULL default ”,
`password` varchar(32) collate utf8_lithuanian_ci NOT NULL default ”,
`sysuid` varchar(10) collate utf8_lithuanian_ci NOT NULL default ‘www’,
`sysgid` varchar(10) collate utf8_lithuanian_ci NOT NULL default ‘www’,
`homedir` varchar(150) collate utf8_lithuanian_ci NOT NULL default ”,
`fileslimit` int(5) NOT NULL default ‘2000′,
`quota` int(5) NOT NULL default ‘20′,
`uploadspeed` int(3) NOT NULL default ‘64′,
`downloadspeed` int(3) NOT NULL default ‘64′,
`comment` tinytext collate utf8_lithuanian_ci NOT NULL,
`active` enum(’1′,’0′) collate utf8_lithuanian_ci NOT NULL default ‘0′,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_lithuanian_ci COMMENT=’FTP vartotojai’;

Dabar įrašykite vartotoją į lentelę:

INSERT INTO `ftpusers` VALUES (”, ‘test’, MD5(’testpw’), ‘80′, ‘80′, ‘/usr/home/test/’, 1000, 10, 64, 64, ‘Test vartotojas’, ‘1′);

FTP demono paleidimas

Į /etc/rc.conf įrašykite:

pureftpd_enable=”YES”

Dabar galite paleisti FTP demoną:

main# /usr/local/etc/rc.d/pure-ftpd.sh start

Išbandykite FTP demoną:

main# ftp localhost
Trying ::1…
Connected to localhost.
220-FTP server ready.
220 This is a private system – No anonymous login
Name (localhost:vaidas): test
331 User test OK. Password required
Password:
230-Your bandwidth usage is restricted
230-User test has group access to: webserve
230-This server supports FXP transfers
230-OK. Current restricted directory is /
230-0 files used (0%) – authorized: 1000 files
230 0 Kbytes used (0%) – authorized: 10240 Kb
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit
221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
221 Logout.
main# ls /home/test/
.ftpquota
main#

Kaip matote viskas veikia: prisijungti galime, vartotojo direktorija taip pat buvo automatiškai sukurta.

Resursai internete

Outro

Nepamirškite ištrinti test vartotojo ir pradėkite naudotis naujuoju ftp serveriu ;-)

Taip pat nepamirškite, kad pureftpd naudoja virtual quotas, todėl galimi nukrypimai, jei failai yra perkeliami / trinami ne per FTP klientą arba jie kuriami per web failų menedžerį. Kad išvengt tokiu nesusipratimu, yra naudojamas pure-quotacheck:

pure-quotacheck -u www /home/test/

Čia su -u nurodoma sistemos (ne virtualus) vartotojas, kuriam priklauso failai. Paskui nurodoma virtualaus vartotojo namų direktorija.
Beje, comments are welcome čia po straipsniu arba el. paštu vaidas at zlotkus dot com.

Tags: , ,

7 Responses to “PureFTPd + MySQL + Virtual Quotas HOWTO”

  1. mid says:

    ehr, kažkaip turiu proftpd ir problemų nesimato. tad jeigu trumpai, kokie pureftpd pliusiukai vs proftpd?

  2. Didžiausias pliusas, kuris lėmė mano pasirinkimą, tai, kad galima padaryti virtualius vietos limitus. Nereikia naudoti sisteminių vietos ribojimų ir apskritai sisteminių useriu.

    Taip pat kiti pliusiukai:
    Daug paprastesnė konfigūracija ir gal net daugiau konfigūracijos opcijų
    Dažniau atnaujinamas nei proftpd
    Mažiau naudoja CPU
    Visokiu “pribumbasų” palaikymas (pavyzdžiui, uploadinant failą, jį uploadina su random tmp pavadinimų ir paskui baigus uploadą ji staigiai pervadiną ir pakeičią senajį nauju – labai naudinga, jei uploadinami dideli php failai)

    Vienintelis minusas tik tas, kad neina nurodyti IP acl’ų. Bent jau šito tai aš pasigedau… Gal ir yra daugiau minusiukų, ale to nepastebėjau.

  3. mid says:

    joo, porą savaitgalių atgal iškeičiau proftpd į pureftpd (o apache2 į lighttpd) ir dabar džiaugiuos paprasta konfiguracija, uploadais ir mažesniu resursų naudojimu (cpu 400mgz, tai jaučias kartais:)) ateityje, tikiuosi, dar daugiau pliusų išlys.

  4. Tadas says:

    Sveiki,

    na sia konfiguracija naudoju senai, gal ji MySQL bazeje paprastesne, nes nereikejo limitu srautui. Bet mane neramina kitas aspektas, www vartotojas. Jei yra keleta direktoriju sakikym

    drwxr-xr-x 6 www www /hosting/www/domenas1.lt
    drwxr-xr-x 6 www www /hosting/www/domenas2.lt
    drwxr-xr-x 6 www www /hosting/www/domenas3.lt

    ir viename is tu saitu yra php puslapis kuriame sakykim nurodytas klaidingai kelia, kuris daro keitimus ar irashymus i direktorija. Ar jis neprirasis ir nenutrins kitoje direktorijoje, ne jam priklausanchius failus?

  5. tadckus says:

    sveiki,

    kaip pasidaryti simbolinius linkus? t.y. kad keli useriai prieitu prie tos pacios direktorijos? tarkim

    /home/ftp/user1
    /home/ftp/user2
    /home/ftp/bendras

    ir kad abu useriai galetu dira “bendras” tvarkyti.
    zinau, kad galima uzmountinti direktorija, bet man tas budas nelabai patinka.

    ar yra kitu budu?
    Dekui is anksto!

  6. pureftpd dokumentacijoj galima rasti tai apie ./configure parametrus:

    –with-virtualchroot: usually, when an user is chrooted (-A and -a
    options), it’s impossible to go out of his home directory. Enabling that
    feature makes it possible: symbolic links are always followed, even if they
    are pointing to directories not located in the user’s home directory. This
    is very useful for having shared directories (for instance, have a symbolic
    link to /var/incoming in every home directory) .
    This feature isn’t enabled by default.

  7. Romka says:

    Dėkui labai geras aprašymas man padėjo.

Leave a Reply