Toto je starší verze dokumentu!
FTP Server
Jak nainstalovat a nakonfigurovat ftp server s databází a hlídáním využívaného místa, vybral jsem si ProFTPD jako ftp server a postgresql jako databázi.
Instalace
Nejprve si vytvoříme strukturu do postgresql. Vytvoříme se uživatele v databázi.
CREATE USER ftpuser; REVOKE CREATE ON SCHEMA public FROM PUBLIC; REVOKE USAGE ON SCHEMA public FROM PUBLIC; GRANT CREATE ON SCHEMA public TO postgres; GRANT USAGE ON SCHEMA public TO postgres; CREATE DATABASE ftpserver WITH OWNER ftpuser;a změníme si pro uživatele ftpuser heslo
\password ftpuserdále vytvoříme strukturu
CREATE SEQUENCE seq_ftpuser_id START 1;
CREATE TYPE QuotaType AS ENUM ('user','group','class','all');
CREATE TYPE PerSession AS ENUM ('true','false');
CREATE TYPE LimitType AS ENUM ('soft','hard');
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL,
gid smallint NOT NULL default 5500,
members varchar(16) NOT NULL default ''
);
CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type QuotaType NOT NULL default 'user',
per_session PerSession NOT NULL default 'false',
limit_type LimitType NOT NULL default 'soft',
bytes_in_avail bigint NOT NULL default 0,
bytes_out_avail bigint NOT NULL default 0,
bytes_xfer_avail bigint NOT NULL default 0,
files_in_avail integer NOT NULL default 0,
files_out_avail integer NOT NULL default 0,
files_xfer_avail integer NOT NULL default 0
);
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL,
quota_type QuotaType NOT NULL default 'user',
bytes_in_used bigint NOT NULL default 0,
bytes_out_used bigint NOT NULL default 0,
bytes_xfer_used bigint NOT NULL default 0,
files_in_used int NOT NULL default 0,
files_out_used int NOT NULL default 0,
files_xfer_used int NOT NULL default 0
);
CREATE TABLE ftpuser (
id integer NOT NULL DEFAULT nextval('seq_ftpuser_id'),
userid varchar(32) NOT NULL,
passwd varchar(32) NOT NULL,
uid smallint NOT NULL default 2001,
gid smallint NOT NULL default 2001,
homedir varchar(255) NOT NULL,
shell varchar(16) NOT NULL default '/sbin/nologin',
count integer NOT NULL default 0,
accessed TIMESTAMP NOT NULL default current_timestamp,
modified TIMESTAMP NOT NULL default current_timestamp,
PRIMARY KEY (id),
UNIQUE (userid)
);nainstalujeme si ProFTPD jako standalone aplikaciapt-get install proftpd-mod-pgsqlvytvoříme si uživatele a skupinu pro fungování ftp
groupadd -g 2001 ftpgroup useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpusernakonfigurejeme si ftp server, začneme souborem /etc/proftpd/modules.conf, povolíme/zakážeme následující moduly
LoadModule mod_sql.c LoadModule mod_sql_mysql.c LoadModule mod_quotatab_sql.c #LoadModule mod_tls_memcache.cdále upravím /etc/proftpd/proftpd.conf, kde zakomentujeme quoty a odkometujeme to, aby se nám proftpd připojovalo na databázi
#<IfModule mod_quotatab.c> #QuotaEngine off #</IfModule> # # Alternative authentication frameworks # #Include /etc/proftpd/ldap.conf Include /etc/proftpd/sql.confdále si v souboru /etc/proftpd/sql.conf nastavíme připojení na databázi, soubor by měl obsahovat tyto informace
SQLBackend pgsql
SQLAuthTypes Plaintext
SQLAuthenticate users groups
SQLConnectInfo ftpserver@localhost ftpuser heslo
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members
#SQLLogFile /var/log/proftpd/sql.log
SQLMinId 99
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 offdále donutíme uživatele přihlašovat se pouze přes TLS, v configu /etc/proftpd/tls.conf upravíme následující vlastnostiTLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol SSLv23 TLSRSACertificateFile /etc/dovecot/dovecot.pem TLSRSACertificateKeyFile /etc/dovecot/private/dovecot.pem TLSVerifyClient off TLSRequired onještě si vytvoříme adresářovou strukturu, kde budem mít všechny ftp účty
mkdir /home/ftpuser chown ftpuser:ftpgroup /home/ftpusera pak už jen restartujeme proftpd
/etc/init.d/proftpd restart
Přidání uživatele
Přidání uživatele se sestává z vytvoření adresáře a pak následně z přidání záznamu do databáze. Začneme tedy adresářem
mkdir /home/ftpuser/uzivatel chown ftpuser:ftpgroup /home/ftpuser/uzivatelPoté přidáme uživatele do databáze
INSERT INTO ftpuser (userid, passwd, homedir) VALUES ('uzivatel','heslo','/home/ftpuser/uzivatel');