Sedicenti Hacker crescono
O almeno credono di esserlo (hacker)..
Perchè ho la netta impressione che quello che sta tutt’ora provando a bucarmi il server abbia un quoziente intellettivo più o meno come quello di un paguro…
O almeno credono di esserlo (hacker)..
Perchè ho la netta impressione che quello che sta tutt’ora provando a bucarmi il server abbia un quoziente intellettivo più o meno come quello di un paguro…
Vi è mai capitato di pensare "ma sono io scemo o sono gli altri che stanno diventando pazzi?"
No perchè il dubbio inizia ad insinuarsi dentro me…
(cliccare sulla figura per vederla ingrandita)
Questa sera vi illustro come mettere in piedi un server ftp, quasi obbligatorio in server che ospitano servizi web pubblici, con la gestione virtuale delle utenze…

cosa sono e perchè innanzitutto, utilizzare le utenze virtuali?
Beh chi avrà letto le precedenti guide su postfix avrà capito che avere una gestione di utenze virtuali è senza dubbio molto molto più comodo, piuttosto che dover per ogni utente creare una vera e propria utenza reale sul server.
Appoggiandoci difatti ad un database mysql possiamo gestire l’utenticazione dei vari utenti in maniera semplice veloce e più funzionale.
Per questa guida utilizzeremo il software che in ambiente server linux è considerato forse il più sicuro e veloce software di gestione per un server ftp: vsftpd ((Per questa guida è stata utilizzata la versione 4.0 della distribuzione Debian Etch, presupposto che abbiate già effettuato tutti gli aggiornamenti di sistema necessari.))
Generalmente vsftpd è pensato per agire con utenze reali del sistema, con questa guida vedremo come istruire vsftpd per controllare l’autenticazione attraverso MySQL.
Per prima cosa installiamo il server ftp, mysql ed alcune librerie necessarie:
apt-get install vsftpd libpam-mysql mysql-server mysql-client phpmyadmin
adesso, impostiamo la password di root del nostro account root di mysql, dato che di default dopo l’installazione essa non viene inserita.
mysqladmin -u root password rootpassword
Adesso per motivi di sicurezza impostiamo la password di root (la stessa va bene), anche per il nostro dominio, altrimenti chiunque potrebbe entrare e modificare i dati.
mysqladmin -h server.dominio.com -u root password rootpassword
Adesso creeremo un database chiamato vsftpd ed un utente omonimo che il demone ftp utilizzerà per connettersi al database:
mysql -u root -p
dopo aver inserito la password di root per il DB:
CREATE DATABASE vsftpd;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost.localdomain' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
Adesso inseriamo le tabelle necessarie all’interno del tabase:
USE vsftpd;
CREATE TABLE `accounts` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 30 ) NOT NULL ,
`pass` VARCHAR( 50 ) NOT NULL ,
UNIQUE (
`username`
)
) ENGINE = MYISAM ;
quit;
Adesso creeremo un utente senza privilegi, nella cui home directory verranno ospitate le varie dyrectories dei nostri utenti ftp virtuali:
useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd
Adesso creiamo una copia di backup del file di configurazione di vsftpd e poi editiamolo sostituendo l’intero suo contenuto con ciò che seguirà:
cp /etc/vsftpd.conf /etc/vsftpd.conf_orig
vi /etc/vsftpd.conf
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
nopriv_user=vsftpd
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
guest_enable=YES
guest_username=vsftpd
local_root=/home/vsftpd/$USER
user_sub_token=$USER
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd_user_conf
Come possiamo vedere dalla configurazione, l’utente vsftpd verrà rinchiuso in una jail chroot ((Utilizzando questo metodo l’utente vsftpd non avrà possibilità di fare nulla al di fuori della sua jail (prigione, che è la sua home ndr.) cosi se qualche malintenzionato vorrà giocare col nostro server potrà fare danni limitati.))
Mentre con l’ultima istruzione “user_config_dir”, diciamo a vsftpd dove andare a pescare la configurazione per il singolo utente, qualora ne abbiamo bisogno, di modo da gestire alcuni utenti in maniera diversa dagli altri, però dobbiamo anche creare la directory:
mkdir /etc/vsftpd_user_conf
Adesso configureremo PAM per l’autenticazione al database mysql, anzichè usare come normalmente si farebbe il file /etc/passwd, come al solito, creiamo backup e sostituiamo l’intero contenuto del file con quello che seguirà:
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_orig
vi /etc/pam.d/vsftpd
auth required pam_mysql.so user=vsftpd passwd=ftpdpass host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2
account required pam_mysql.so user=vsftpd passwd=ftpdpass host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2
Fatto questo riavviamo il demone ftp per ricaricare la configurazione:
/etc/init.d/vsftpd restart
Purtroppo non c’è un metodo standard automatico per l’inserimento degli utenti nel database mysql, dovremo quindi procedere tramite phpmyadmin o shell, a vostra discrezione:
mysql -u root -p
USE vsftpd;
INSERT INTO accounts (username, pass) VALUES('testuser', PASSWORD('secret'));
quit;
E poi creiamo la directory ftp che l’utente potrà utilizzare sul server:
mkdir /home/vsftpd/testuser
chown vsftpd:nogroup /home/vsftpd/testuser
Ponendo in questo esempio, che l’utente sia “testuser” e abbia la password “secret”.
Adesso aprite il vostro cliente puntate all’indirizzo del server e inserite testuser e secret come credenziali, se riuscite a vedere la vostra directory complimenti! avete appena configurato il vostro ftp server con utenze virtuali
Adesso che abbiamo il nostro MTA bello e funzionante non ci resta che fornire ai nostri utenti i tool necessari per la gestione.

il tool che è stato scelto ha un nome che si presenta da solo: postfixadmin. Con questo tool avremo la possibilità di:
In questi giorni mi sono dedicato al nuovo vps in quanto volevo mettere in piedi un servizio di posta che fosse il più possibile completo…
l’intenzione era infatti di redigere questo how-to, che vi guidasse nella creazione di un MTA completo di pannello di controllo per amministratori, antispam, antivirus, greylisting, webmail, imap, pop, ed ssl per le comunicazioni criptate; e la gestione dei domini e degli utenti sarà virtuale, questo significa che ci appoggeremo ad un server mysql per la loro registrazione anzichè dover creare vere e proprie utenze sul sistema come normalmente di sovrebbe fare, ed inoltre effettueremo un patching di postfix per abilitare la gestione delle quote sulle mailbox degli utenti.
il principio di funzionamento è il seguente: postfix riceve una mail, inizialmente risponde con un errore non definitivo (440) segnalando il greylist, ed invitando a riprovare dopo 5 minuti, al secondo tentativo da parte del mittente, dopo aver controllato tramite saslauthd che l’indirizzo di destinazione sia presente sul database, e quindi valido, effettua una connessione tramite amavisd (in localhost) per passare la mail a clamav e spamassassin per il content filtering, se la mail passa anche questo controllo viene rispedita a postfix che effettuerà il local delivery verso la casella dell’utente.
Il software utilizzato sarà:
Partiamo; come già detto nel titolo, il sistema è rivolto agli utilizzatori di sistemi debian stable (etch, con sarge cambia qualcosina quindi se volete utilizzarlo documentatevi un pò prima ci sono numerosi how-to in giro), teoricamente dovrebbe funzionare anche con ubuntu, al limite può cambiare il nome di qualche pacchetto, anche in questo caso…chiedete a me o documentatevi eventualmente, io farò il possibile per aiutarvi.
Aggiorniamo il sistema se non l’abbiamo già fatto ed installiamo i primi pacchetti (do per scontato che stiate lavorando come root):
apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl postfix-tls libsasl2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql
Con questo comando andremo ad installare il mail server postfix, courier per l’autenticazione tramite pop/imap, saslauthd per la gestione dell’autenticazione in plain text con le librerie sasl, ed infine il database mysql con l’interfaccia phpmyadmin per il management via web-gui del database. Durante la configurazione dei pacchetti ci verranno poste alcune domande:
Create directories for web-based administration ? <– No
General type of configuration? <– Internet Site
Mail name? <– server1.example.com
SSL certificate required <– Ok
Fatto questo dobbiamo applicare una patch ai sorgenti di postfix, con tale patch abiliteremo la gestione delle quote delle caselle, che di default non è presente in postfix.
apt-get install build-essential dpkg-dev fakeroot debhelper libgdbm-dev libldap2-dev libpcre3-dev libssl-dev libsasl2-dev postgresql-dev po-debconf dpatch libdb4.3-dev libmysqlclient15-dev lsb-release libcdb-dev
Dopo avere scaricato i pacchetti necessari scarichiamo i sorgenti di postfix:
cd /usr/src
apt-get source postfix
E poi controlliamo la versione che abbiamo, per scaricare poi la patch apposita:
postconf -d | grep mail_version
Sul mio server ad esempio ho:
logubuntu:~# postconf -d | grep mail_version
mail_version = 2.3.8
milter_macro_v = $mail_name $mail_version
In questo caso quindi, scarichiamo la patch per la versione 2.3.8:
wget http://vda.sourceforge.net/VDA/postfix-2.3.8-vda.patch.gz
gunzip postfix-2.3.8-vda.patch.gz
cd postfix-2.3.8
patch -p1 < ../postfix-2.3.8-vda.patch
Prima di creare il pacchetto però dobbiamo effettuare un piccolo cambiamento al file di changelog, cosi com’è infatti avremo un pacchetto di versione 2.3.8-2 che creerà problemi di dipendenze con il pacchetto postfix-pcre che ha per dipendenza necessaria la versione 2.3.8-2+b1:
nano debian/changelog
e cambiamo nella prima riga 2.3.8-2 con 2.3.8-2+b1 salviamo e chiudiamo:
dpkg-buildpackage
e creiamo il pacchetto deb (in realtà ne verranno creati di diversi) che poi andremo ad installare:
cd ..
dpkg -i postfix_2.3.8-2+b1_i386.deb
dpkg -i postfix-mysql_2.3.8-2+b1_i386.deb
Adesso andremo a preparare il database con le tabelle che conterranno le caselle di posta dei nostri utenti.
Di default mysql server viene installato con l’utenza root senza password, la prima cosa che facciamo è quindi impostarla:
mysqladmin -uroot password propria_password
Adesso creiamo il database di postfix, l’utente mail_admin con i relativi privilegi, e inseriamo le tabelle necessarie:
mysqladmin -u root -p create mail
mysql -u root -p
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;
USE mail;
CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
TYPE=MyISAM;
CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;
CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT '10485760',
PRIMARY KEY (email)
) TYPE=MyISAM;
CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;
quit;
Come è facile immaginare, la tabella domain conterrà i vari domini che gestirà il nostro server, nella tabella forwardings saranno presenti le caselle alias per redirezionare il traffico verso una casella reale, nella tabella users avremo lo username dell’utente, che è poi la stessa casella di posta, la password (criptata ovviamente), e la quota massima che può occupare la casella.
La tabella transport è opzionale, ed è per un utilizzo più avanzato, in questa tabella inseriamo i dati necessari per far si che il server possa reinstradare le mail per una singola casella, o per un intero dominio, verso un altro server.