===== 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 strukturuCREATE 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í ftpgroupadd -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# #QuotaEngine off # # # 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 informaceSQLBackend 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 on ješ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ářemmkdir /home/ftpuser/uzivatel chown ftpuser:ftpgroup /home/ftpuser/uzivatelPoté přidáme uživatele do databázeINSERT INTO ftpuser (userid, passwd, homedir) VALUES ('uzivatel','heslo','/home/ftpuser/uzivatel');pokud uživateli chceme ještě přidat quotuINSERT 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 ('uzivatel','user','false','hard',524288000,0,0,0,0,0);