FTP-server met MySQL ondersteuning
In deze handleiding ga ik uitleggen hoe je een ftp server opzet, met mysql ondersteuning, waardoor het makkelijk is instellingen via bijvoorbeeld websites of andere mysql-gebaseerde programma's te beheren. Ook installeren we quota, om schijf limieten in te stellen per gebruiker.
LET OP: Deze installatie is gedaan op een Ubuntu 8.04 Server. De instellingen voor de mysql database en proftpd zijn hetzelfde op elke andere distributie, maar de locatie van bestanden en de manier van installeren kan anders zijn.
1. Proftpd en Quota installeren
Zorg dat je als root bent ingelogd via een terminal. Heb je geen toegang tot root, zet dan sudo voor elk commando dat uitgevoerd wordt (behalve bij het uitvoeren van SQL's) . We gaan er van uit dat je al een mysql database hebt draaien, en dat je daar toegang tot hebt via de terminal of PhpMyAdmin bijvoorbeeld.
We gaan eerst Proftpd en Quota installeren:
apt-get install proftpd proftpd-mysql quota
Als er bij de installatie van proftpd wordt gevraagd te kiezen tussen inetd of standalone, kies dan de standalone.
2. Quota configureren
We gaan quota limieten instellen voor de hardeschijf met mount point /. Hier is dat partitie /dev/sda1, maar dit kan ook hda1 zijn of een ander getal, afhankelijk van het aantal harde schijven en partities.
Bewerk het bestand /etc/fstab, en voeg ,usrquota,grpquota toe aan partitie met mount point /.
Het bestand zal er (ongeveer) als volgt uitzien:
#
# /dev/sda1
/ ext3 relatime,errors=remount-ro,usrquota,grpquota 0 1
# /dev/sda5
swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0
Om Quota nu in te schakelen voer je de volgende commando's uit:
chmod 600 /quota.*
mount -o remount /
quotacheck -avugm
quotaon -avug
3. Mysql configureren
Nu gaan we een database aanmaken voor de ftp-server, en ook een gebruiker. Verander het wachtwoord van de gebruiker in eentje die jezel veilig lijkt, en vergeet niet deze dan ook te veranderen in het mysql-bestand van stap 5.
De volgende SQL's kun je uitvoeren via PhpMyAdmin of via de terminal. Als je via de terminal wilt werken open je deze met het volgende commando, en daarna je root wachtwoord.
mysql -u root -p
Nu we zijn ingelogd gaan we als eerste een nieuwe gebruiker toevoegen. Het wachtwoord dat ik hier gebruik is 'password', maar je kunt deze veranderen. Ook maken we de database 'ftp'.
create database ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
Daarna gaan we de tabellen (ftpgroup, ftpquotalimits , ftpquotatallies en ftpuser) toevoegen in database ftp.
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';
En als je via de de terminal werkte sluit je af met het commando quit;
5. Proftpd Configureren
Nu gaan we de ftp-server zo configureren dat hij overweg kan met quota en de instellingen vanuit de MySQL database.
Om ftp gebruikers toegang te geven tot hun eigen map moeten we ze plaatsen onder een echte systeemgebruiker, hier de ftpuser uit de ftpgroup-groep. Ik gebruik het getal 2001 om deze gebruikers te identificeren, maar als dit getal al in gebruik is kun je deze veranderen.
groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
Proftpd moet nu zo ingesteld worden dat de indeling van de database overeen komt met de indeling uit de database en de schijflimieten ervan overnemen. Standaard staan deze instellingen in het bestand /etc/proftpd/proftpd.conf
, maar wij gaan de mysql instellingen in een apart bestand zetten, /etc/proftpd/mysql.conf
Open het mysql.conf bestand met je favoriete textverwerker en kopieer en plak de volgende inhoud:
SQLAuthTypes Backend
SQLAuthenticate users groups
SQLConnectInfo ftp@localhost proftpd password
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members
SQLHomedirOnDemand on
SQLMinID 500
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser
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
LET OP: Verander bij SQLConnectInfo gebruiker/wachtwoord van de mysql database.
Voor uitleg over het bestand is hetzelfde bestand hier te vinden met Engelse uitleg.
Om nu proftpd te laten weten dat de instellingen voor de database in mysql.conf staan gaan we ook het standaard configuratie bestand /etc/proftpd/proftpd.conf aanpassen:
ServerName "Aprominax' Ftp server"
ServerType standalone
DefaultServer on
Include /etc/proftpd/modules.conf
Include /etc/proftpd/mysql.conf
RootLogin off
RequireValidShell off
Port 21
Umask 022
MaxInstances 30
User proftpd
Group nogroup
DefaultRoot ~
AllowOverwrite on
Zie hier het volledige bestand met uitleg.
6. Gebruikers toevoegen
Nu de server goed is ingesteld gaan we een gebruiker toevoegen zodat we ook daadwerkelijk kunnen inloggen.
Open weer de mysql via de terminal of PhpMyAdmin, en voer de volgende SQL's uit:
Eerst selecteren we de database ftp.
USE ftp;
We gaan eenmalig de groep instellen waaronder ingelogde gebruikers vallen, let op het getal 2001. Als je deze in stap 5 hebt veranderd moet je dat hier ook doen.
INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');
Als je voortaan een nieuwe gebruiker wilt toevoegen moet je dat doen bij de tabellen ftpquotalimits en ftpuser.
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 ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'exampleuser', OLD_PASSWORD('secret'), 2001, 2001, '/home/example', '/sbin/nologin', 0, '', '');
Let op dat de gebruiker exampleuser is, met wachtwoord secret. De homefolder van deze gebruiker is /home/example. Als het goed is wordt die standaard gevormd bij de eerste keer inloggen, maar maak anders een map aan met :
mkdir /home/example
chown ftpuser:ftpgroup /home/example
7. De FTP-server starten
Nu zijn we klaar om de server te starten met de nieuwe installatie:
/etc/init.d/proftpd start
Je kunt nu inloggen via je favoriete ftpclient of gewoon via Firefox (dan is het niet mogelijk bestanden te beheren/uploaden). Een ftpclient voor Windows is SmartFTP, voor Linux bijvoorbeeld Filezilla.
Plaats een reactie
Je moet ingelogd zijn om te reageren.

Artikel Info
Tags
Wow thanx.
met de ubuntu-server die van gemaakt wordt 
Ik was altijd al op zoek naar zoiets dergelijks
Als ik faal-computer2 aan heb gezwengeld (met de faal bios) dan ga ik dit zeker even doen
Graag gedaan hr :). Mijn oude pc draait nu iig, en met een ftp-server :D. Ik ben nog bezig met een PHP beheer systeempje, die zal ik wel plaatsen als hij af is
gr. Aprominax
Ik heb een klein stukje van de howto veranderd. Wachtwoorden staan nu gecodeerd in de MySQL database, voor een beetje extra veiligheid!
Dit gaat voor een grote populatie erg langzaam worden, omdat het database ontwerp niet relationeel opgebouwd is, maar erg plat. Als je het op deze manier doet kun je net zo goed een XML bestand gebruiken.
1) Elke tabel zou een primary key moeten hebben. Dit is niet verplicht, maar volgt uit het feit dat een tabel informatie bevat over een ding en dus te identificeren is.
2) De database opbouw is erg ondoorzichtig.
3) Veel default waarden zijn in strijd met de regels die verzekeren dat de database juiste inhoud bevat.
Door het ontbreken van de juiste sleutels kan het met 100 users al in de seconden kunnen lopen. Ik heb geen testcase gemaakt, maar ik ben weleens vergeten de juiste keys te zetten.
Alain, je hebt gelijk dat tabellen normaal een primary key hebben, en ik was dit even totaal vergeten
. Het lijkt mij inderdaad het slimste om in ieder geval bij de ftpquotalimits en ftpquotatallies het NAME veld als index te zetten, omdat deze waarde uniek is, en hierop gezocht wordt, maar zal eens kijken wat het beste resultaat geeft.
Verder geef ik toe dat de database opbouw niet zeer uitgebreid is, maar wel duidelijk en makkelijk te beheren en samen te voegen met bijvoorbeeld een webapplicatie. Wat een van de redenen was waarom ik dit gebruik.
gr. Aprominax
Mocht je dit willen verbeteren, dan wil ik je wel helpen. (Liefst via een ander medium, want een forum is vaak niet handig om code uit te wisselen)
Hee, ik ben net pas terug van vakantie, sorry daarvoor :oops:. Ik ga er vast wel deze week nog even naar kijken, en dan laat ik nog wel even horen hoe en wat ofzo
Wel bedankt dat je wilt helpen 
Ik stoorde me vandaag kapot aan de snelheid waarmee ik moest inloggen, als je 1x moet inloggen is dat geen probleem, maar na 50x een aantal seconde te wachten wordt je daar kierewiet van! Dus ging ik het internet op, en ben tot de conclusie gekomen dat dit perfect werkte voor mij, (gewoon in proftpd.conf erbij plakken (als je nog geen had, anders daarbij zetten!))
IdentLookups off
UseReverseDNS off
Ik ben al tijden opzoek naar een oplossing aangezien mijn tallies niet worden ge-update.
Hebben meerdere mensen hier last van ?
Ik gebruik dit systeem niet meer, maar kwam er toendertijd ook achter dat deze niet werken. Heb er eventjes naar gekeken, maar niet direct een oplossing gevonden. Waarvoor is het belangrijk, misschien dat we een work-around kunnen vinden?
gr. Aprominax