Web Server
1
Web Server
Centos FTP Server
2
Web Server
3
Web Server
Indice Prefazione...................................................................................................................pag. 6 Caratteristiche del Server..........................................................................................pag. 7 Installazione del server Vsftpd...................................................................................pag. 8 Configurare Vsftpd con credenziali utente e accesso condiviso................................pag. 10 Configurare vsftpd con home directory utente...........................................................pag. 14 Creare utenti virtuali con PAM..................................................................................pag. 18 Creare utenti virtuali con DB MySQL........................................................................pag. 25 Vsftpd con certificato SSL..........................................................................................pag. 39 Creare un applicazione in PHP per gestire gli utenti virtuali...................................pag. 41 Installare Clamav antivirus e tools contro i rootkit...................................................pag. 62 Installare Clamav antivirus........................................................................................pag. 62 Installare Rkhunter.....................................................................................................pag. 64 Installare Chrootkit....................................................................................................pag. 65 Installare server ssmtp per invio delle mail...............................................................pag. 66
4
Web Server
5
Web Server
6
Web Server
Prefazione Perchè un server FTP? L'FTP server è ancora oggi uno strumento molto utilizzato, non solo presso i servizi web, infatti che gestisce un sito internet sa che questo è il modo più veloce per poter trasferire file all'interno del proprio sito. Il servizio FTP viene usato anche come un grande disco per la condivisione dei file questo permette agli utenti interni ed esterni di poter condividere con altri utenti. In questa guida vedremo come mettere in piedi un servizio FTP utilizzando vari metodi, come l'FTP Anonymous, ovvero dove non viene richiesta alcuna autenticazione, questo può essere utile quando vogliamo condividere file con tutti, oppure utilizzando il servizio in modo tradizionale con autenticazione, anche qui vedremo tre tipi di autenticazione, la prima sarà quella locale, ovvero l'utente dovrà essere creato localmente sul server ftp poi vedremo due autenticazioni con utenti virtuali, con metodo pam e mysql, qui gli utenti saranno inseriti o in una lista nel primo caso o all'interno di un database. L'FTP in se è un servizio poco sicuro e le sue informazioni viaggiano in chiaro sulla rete e sul web, oltre al suo normale funzionamento sulla porta TCP 21, vederemo anche come realizzare una connessione sicura tramite ssl in modo da avere una comunicazione dei dati criptata. Un'ultima cosa sulla sicurezza, se pensate di mettere un servizio FTP in produzione, ricordatelo di porlo nella rete DMZ.
7
Web Server
Caratteristiche del server Le caratteristiche date al nostro server FTP sono identiche a quelle utilizzate per il web server Apache, il server si chiama srvftp, il suo indirizzo IP è 172.16.200.170. Anche qui per motivi di testing iniziamo come abbiamo già visto in precedenza ad disabilitare il firewall e SELinux, in modo da non evidenziare inutili problemi di funzionamento durante il setup del server. # nano /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted Impostiamo accanto a SELINUX la parola disabled al posto di enforcing, disabilitiamo anche il firewall con il comando:
# system-config-firewall-tui Togliamo il simbolo * da firewall [] Abilitato, diamo ok, selezioniamo si e premiamo invio
8
Web Server
Installazione del server vsftpd Eseguita questa operazione preliminare, iniziamo con l'installazione del server FTP, CentOS, utilizza come server predefinito vsftpd, (acronimo di Very Secure FTP Daemon), uno dei programmi più usati e sicuri per l'implementazione di questo servizio. L'installazione è semplice, visto che si trova già nei repository del sistema, pertanto da terminale ci basterà digitare: # yum install vsftpd --> Running transaction check ---> Package vsftpd.i686 0:2.2.2-11.el6_4.1 will be installed --> Finished Dependency Resolution Dependencies Resolved ======================================================= ========================= Package Arch Version Repository Size ======================================================= ========================= Installing: vsftpd i686 2.2.2-11.el6_4.1 base 157 k Transaction Summary ======================================================= ========================= Install 1 Package(s) Total download size: 157 k Installed size: 344 k Is this ok [y/N]: y Downloading Packages: vsftpd-2.2.2-11.el6_4.1.i686.rpm Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : vsftpd-2.2.2-11.el6_4.1.i686 Verifying : vsftpd-2.2.2-11.el6_4.1.i686
| 157 kB
00:00
1/1 1/1
Installed: vsftpd.i686 0:2.2.2-11.el6_4.1 Complete! You have new mail in /var/spool/mail/root E diamo y per iniziare il download e l'installazione, ad installazione conclusa facciamo si che il 9
Web Server server FTP si avvia automaticamente ad ogni avvio della macchina, poi successivamente avviamone il servizio: # chkconfig vsftpd on # service vsftpd start Avvio di vsftpd per vsftpd:
[ OK ]
Bene il nostro server è già pronto per l'uso ed in ascolto sulla porta di base TCP 21. Vsftpd, è impostato per default a funzionare come server anonymous, ovvero fa in modo che gli utenti possano visualizzarne il contenuto senza eseguire un login, visualizzando ed eseguendo il download solo dei documenti presenti, ma non gli è concesso effettuare l'upload dei file, ecco come si presenta se lo visualizziamo dal browser, (Attenzioni ogni browser visualizza a suo modo i file), pertanto digitiamo sulla barra degli indirizzi l'IP del server ponendo a monte di quest'ultimo la sigla ftp://, in questo modo ftp://172.16.200.170, ecco cosa dovremmo visualizzare utilizzando Firefox:
La cartella pub che vediamo la troviamo nel seguente percorso o path /var/ftp, se dobbiamo inserire del materiale è qui che dobbiamo andare: # cd /vat/ftp/pub Se provate a cliccare più volte sulla voce “vai alla cartella superiore” noterete che non è possibile visualizzare le altre folder del file system del server, questo perché la cartella pub si trova all'interno di una gabbia chroot. Abbiamo visto come sia semplice mettere in piedi un ftp anonimo ora passiamo a configurare un ftp che chieda le credenziali d'accesso.
10
Web Server
Configurare VSFTP per accesso con credenziali utente a cartella condivisa Per poter permettere agli utenti di accedere al server ftp tramite credenziali di accesso, dobbiamo mettere mano al file di configurazione che troviamo in /etc/vsftpd, comunque prima di apportare modiche eseguiamo una copia del file originale, pertanto digitiamo: # cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.orig # cd /etc/vsftpd # ls ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh vsftpd.conf.orig Bene ora possiamo procedere con le modifiche del file di configurazione che si presenta cosĂŹ: # nano /etc/vsftpd/vsftpd.conf # Example config file /etc/vsftpd/vsftpd.conf # # The default compiled in settings are fairly paranoid. This sample file # loosens things up a bit, to make the ftp daemon more usable. # Please see vsftpd.conf.5 for all compiled in defaults. # # READ THIS: This example file is NOT an exhaustive list of vsftpd options. # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's # capabilities. # # Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=YES # # Uncomment this to allow local users to log in. local_enable=YES # # Uncomment this to enable any form of FTP write command. write_enable=YES # # Default umask for local users is 077. You may wish to change this to 022, # if your users expect that (022 is used by most other ftpd's) local_umask=022 # # Uncomment this to allow the anonymous FTP user to upload files. This only # has an effect if the above global write enable is activated. Also, you will # obviously need to create a directory writable by the FTP user. #anon_upload_enable=YES # # Uncomment this if you want the anonymous FTP user to be able to create # new directories. #anon_mkdir_write_enable=YES # 11
Web Server # Activate directory messages - messages given to remote users when they # go into a certain directory. dirmessage_enable=YES # # The target log file can be vsftpd_log_file or xferlog_file. # This depends on setting xferlog_std_format parameter xferlog_enable=YES # # Make sure PORT transfer connections originate from port 20 (ftp-data). connect_from_port_20=YES # # If you want, you can arrange for uploaded anonymous files to be owned by # a different user. Note! Using "root" for uploaded files is not # recommended! #chown_uploads=YES #chown_username=whoever # # The name of log file when xferlog_enable=YES and xferlog_std_format=YES # WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log #xferlog_file=/var/log/xferlog # # Switches between logging into vsftpd_log_file and xferlog_file files. # NO writes to vsftpd_log_file, YES to xferlog_file xferlog_std_format=YES # # You may change the default value for timing out an idle session. #idle_session_timeout=600 # # You may change the default value for timing out a data connection. #data_connection_timeout=120 # # It is recommended that you define on your system a unique user which the # ftp server can use as a totally isolated and unprivileged user. #nopriv_user=ftpsecure # # Enable this and the server will recognise asynchronous ABOR requests. Not # recommended for security (the code is non-trivial). Not enabling it, # however, may confuse older FTP clients. #async_abor_enable=YES # # By default the server will pretend to allow ASCII mode but in fact ignore # the request. Turn on the below options to have the server actually do ASCII # mangling on files when in ASCII mode. # Beware that on some FTP servers, ASCII support allows a denial of service # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd # predicted this attack and has always been safe, reporting the size of the # raw file. # ASCII mangling is a horrible feature of the protocol. 12
Web Server #ascii_upload_enable=YES #ascii_download_enable=YES # # You may fully customise the login banner string: #ftpd_banner=Welcome to blah FTP service. # # You may specify a file of disallowed anonymous e-mail addresses. Apparently # useful for combatting certain DoS attacks. #deny_email_enable=YES # (default follows) #banned_email_file=/etc/vsftpd/banned_emails # # You may specify an explicit list of local users to chroot() to their home # directory. If chroot_local_user is YES, then this list becomes a list of # users to NOT chroot(). #chroot_local_user=YES #chroot_list_enable=YES # (default follows) #chroot_list_file=/etc/vsftpd/chroot_list # # You may activate the "-R" option to the builtin ls. This is disabled by # default to avoid remote users being able to cause excessive I/O on large # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume # the presence of the "-R" option, so there is a strong case for enabling it. #ls_recurse_enable=YES # # When "listen" directive is enabled, vsftpd runs in standalone mode and # listens on IPv4 sockets. This directive cannot be used in conjunction # with the listen_ipv6 directive. listen=YES # # This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6 # sockets, you must run two copies of vsftpd with two configuration files. # Make sure, that one of the listen options is commented !! #listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES Iniziamo ad apportare alcune semplici modifiche, per fare in modo di creare un utente, o piĂš utenti che si colleghino alla cartella pub dell'FTP, questa sarĂ una cartella di condivisione. Iniziamo con l'apportare alcune piccole modifiche al file di configurazione, entriamo in /etc/vsftpd/vsftpd.conf e iniziamo a modificare queste voci # Allow anonymous FTP? (Beware - allowed by default if you comment this out).
13
Web Server anonymous_enable=NO (qui indichiamo che l'utente dovrà loggarsi) # Uncomment this to allow local users to log in. local_enable=YES (indichiamo che gli utenti locali sono abilitati) # You may fully customise the login banner string: ftpd_banner=Benvenuti in questo servizio FTP. (personalizziamo il banner) Salviamo il file e usciamo, andiamo a creare ora l'utente test che si connetterà alla cartella ftp/pub # useradd -d /var/ftp/pub test La lettera -d indica che l'utente dovrà utilizzare questo percorso come propria home, creiamo ora la password per l'utente test nel esempio ho dato la password “1234” senza virgolette: # passwd test Cambio password per l'utente test. Nuova password: PASSWORD ERRATA: E' troppo breve PASSWORD ERRATA: è troppo semplice Reimmettere la nuova password: passwd: tutti gli authentication token sono stati aggiornati con successo. Creiamo ora un file di testo nella cartella pub # cat > /var/ftp/pub/test.txt Riavviamo il server e poi testiamo: # service vsftpd restart Dovremmo vedere la richiesta di password:
14
Web Server loghiamoci e dovremo vedere il file in esso contenuto
Possiamo ora creare altri utenti che avranno accesso per condividere i dati.
Creare un FTP server con cartelle utente Visto che precedentemente abbiamo eseguito una copia di backup del file vsftpd.conf, è ora di riprenderla ed iniziare una nuova configurazione, prima però eseguiamo un backup della nostra configurazione, chissà magari ci servirà un giorno. # mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf-ftpCondiv Ora riportiamoci il file originale tenendo sempre disponibile una copia originale # cp /etc/vsftpd/vsftpd.conf.orig /etc/vsftpd/vsftpd.conf Iniziamo ora con l'editare il file vsftpd.conf ed apportare alcuni cambiamenti, del tipo: • Impostiamo anonymous_enable=NO • de commentiamo le voci ascii_upload_enable=YES e ascii_download_enable=YES • de commentiamo ftpd_banner=(scriviamo al posto di Welcome quello che vogliamo) • de commentiamo la voce chroot_local_enable=YES (questo permetterà agli utenti di vedere solo la loro cartelle FTP. • de-commentiamo la voce ls_recurse_enable=YES 15
Web Server •
aggiungiamo in fondo la voce use_localtime=YES anonymous_enable=NO ascii_upload_enable=YES ascii_download_enable=YES ftpd_banner=Welcome to FTP service chroot_local_enable=YES ls_recurse_enable=YES use_localtime=YES
apportate le modifiche salviamo e usciamo dal file di configurazione. Ora andiamo a gli utenti locali, nel nostro esempio l'utente si chiameranno utente1 e utente2. # adduser utente1 # adduser utente2 Specifichiamo le password per i due utenti per utente1 ho dato una password semplice “12345” senza virgolette e per l'utente2 diamo la password “password” # passwd utente1 Cambio password per l'utente utente1. Nuova password: PASSWORD ERRATA: E' troppo breve PASSWORD ERRATA: è troppo semplice Reimmettere la nuova password: passwd: tutti gli authentication token sono stati aggiornati con successo. # passwd utente2 Cambio password per l'utente utente2. Nuova password: PASSWORD ERRATA: E' troppo breve PASSWORD ERRATA: è troppo semplice Reimmettere la nuova password: passwd: tutti gli authentication token sono stati aggiornati con successo. Creiamo all'interno di ogni utente un file di riconoscimento esempio utente1.txt e utente2.txt # cd /home/utente1 # echo > utente1.txt # cd .. 16
Web Server # cd utente2 # echo > utente2.txt Riavviamo il server vsftpd con il solito comando: # service vsftpd restart Per testare la connettività in locale scarichiamo l'utility ftp # yum install ftp Dopo di che eseguiamo il test in locale primo con un utente e poi per sicurezza con il secondo # ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 Benvenuti in questo servizio FTP. Name (127.0.0.1:root): utente1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 "/" ftp> exit 221 Goodbye. Se durante la procedura di autenticazione è questo che vedete allora significa che la configurazione effettuata è corretta, se cosi non fosse è probabile che abbiate saltato qualche passaggio. Ora possiamo controllare anche tramite browser, digitando sulla barra degli indirizzi ftp://ip_server, alla richiesta delle credenziali, digitante e dovreste entrare nella cartella dell'utente con la quale vi siete loggati, questo è quanto si vede:
17
Web Server
Per permettere agli utenti di inserire o scaricare file dal ftp, possiamo utilizzare, un client ftp completamente opensource come Filezilla che è possibile scaricare da questo url (http://sourceforge.net/projects/filezilla/files/FileZilla_Client/). Una volta terminato il download , installate il client e apritelo, Filezilla vi mostrerà la sua semplice e chiara interfaccia, come vediamo nell'immagine qui sotto:
L'uso del programma è alquanto semplice, dove vedete host, inserite l'IP del server, nel nostro caso 172.16.200.170, dove trovate nome utente inserite utente1, e poi chiaramente alla voce passowrd 18
Web Server inserite la password dell'utente1 nel nostro caso 12345, lasciate pure vuota la casella dove è indicata la porta visto che quella di default è la 21, dopo di che premete sul tasto connessione rapida ed ecco che siamo all'interno del nostro ftp. Le due grandi finestre che vediamo, indicano quella di destra il nostro computer locale e quella di sinistra il nostro server, ora non dobbiamo far altro che muoverci all'interno delle nostre cartelle dalla finestra destra e quando troviamo il file o la cartella da importare sul server ftp non facciamo altro che trascinarla verso la finestra a sinistra. Tutto qua.
Vediamo ora come creare un'altra categoria di utenti, questa volta non fisici ma virtuali.
Creare utenti virtuali con PAM Partiamo nuovamente da una situazione nuova, pertanto anche qui eseguiamo rinominiamo il file vsftpd.con in vsftpd.conf-locUser e rinominamo nuovamente il file vsftpd.con.orig in vsftpd.conf. # mv vsftpd.conf vsftpd.conf-locUser # cp vsftpd.conf.orig vsftpd.conf Eliminiamo ora gli utenti creati precedentemente con le loro home # userdel -f -r utente1 # userdel -f -r utente2 # cd /home # ls 19
Web Server Ora che la home è vuota dagli utenti creati precedentemente, possiamo iniziare la nuova configurazione, ma prima scarichiamo il Barkeley databse(db4(version4), se questo non è già installato. # yum install db4-utilis db4 Creiamo ora il file databse per gli utenti virtuali, prima creeremo un file di testo che chiameremo virtual_uesr.txt all'interno della directory /home e poi in un secondo momento lo trasformeremo in un database criptato. # nano virtual_users.txt Creiamo ora al suo interno un utente virtuale che sarà utente0 con password centos, gli utenti vanno creati singolarmente uno per uno, ora ne abbiamo creato uno solo , ma se ne dobbiamo creare di più ricordiamoci di creare la nostra lista prima di creare il db, se dobbiamo aggiungerne uno in un secondo momento, ci basta aggiungerlo nel file txt e poi ricreare il db. utente0 centos Salviamo e usciamo, trasformiamo ora il file txt nel database criptato # db_load -T -t hash -f /home/virtual_users.txt /etc/vsftpd/virtual_users.db Creiamo ora un PAM file, questo consente l'uso degli utenti virtuali nel file db appena creato. # nano /etc/pam.d/vsftpd_virtual E aggiungiamo le seguenti linee #%PAM-1.0 auth required account required session required
pam_userdb.so db=/etc/vsftpd/virtual_users pam_userdb.so db=/etc/vsftpd/virtual_users pam_loginuid.so
Salviamo e usciamo. Configuriamo ora il file vsftpd.conf # nano /etc/pam.d/vsftpd_virtual Apportando le seguente modifiche: • •
anonymous_enable=NO aggiungiamo la voce guest_enable=YES 20
Web Server • • • • • • • •
de commentiamo le voci ascii_upload_enable=YES e ascii_download_enable=YES de commentiamo ftpd_banner=Welcome to blah FTP service. De commentiamo chroot_local_user=YES de commentiamo ls_recurse_enable=YES aggiungiamo la voce virtual_use_local_privs=YES modifichaimo la voce pam_service_name=vsftpd con il file creato precedentemente vsftpd_virtual aggiungiamo le seguenti voci per la home directory degli utenti virtuali user_sub_token=$USER e local_root=/home/virtual/$USER aggiungiamo per ultimo la voce hide_ids=YES anonymous_enable=NO guest_enable=YES ascii_upload_enable=YES ascii_download_enable=YES ftpd_banner=Welcome to blah FTP service chroot_local_user=YES ls_recurse_enable=YES virtual_use_local_privs=YES pam_service_name=vsftpd_virtual user_sub_token=$USER local_root=/home/virtual/$USER hide_ids=YES
Questo è il file vsftpd che dovremo avere: Example config file /etc/vsftpd/vsftpd.conf # # The default compiled in settings are fairly paranoid. This sample file # loosens things up a bit, to make the ftp daemon more usable. # Please see vsftpd.conf.5 for all compiled in defaults. # # READ THIS: This example file is NOT an exhaustive list of vsftpd options. # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's # capabilities. # # Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=NO # # Uncomment this to allow local users to log in. local_enable=YES # ## Enable virtual users guest_enable=YES # ## Virtual users will use the same permissions as anonymous virtual_use_local_privs=YES 21
Web Server # # Uncomment this to enable any form of FTP write command. write_enable=YES # ## PAM file name pam_service_name=vsftpd_virtual # ## Home Directory for virtual users user_sub_token=$USER local_root=/home/virtual/$USER # # Default umask for local users is 077. You may wish to change this to 022, # if your users expect that (022 is used by most other ftpd's) local_umask=022 # # Uncomment this to allow the anonymous FTP user to upload files. This only # has an effect if the above global write enable is activated. Also, you will # obviously need to create a directory writable by the FTP user. #anon_upload_enable=YES # # Uncomment this if you want the anonymous FTP user to be able to create # new directories. #anon_mkdir_write_enable=YES # # Activate directory messages - messages given to remote users when they # go into a certain directory. dirmessage_enable=YES # # The target log file can be vsftpd_log_file or xferlog_file. # This depends on setting xferlog_std_format parameter xferlog_enable=YES # # Make sure PORT transfer connections originate from port 20 (ftp-data). connect_from_port_20=YES # # If you want, you can arrange for uploaded anonymous files to be owned by # a different user. Note! Using "root" for uploaded files is not # recommended! #chown_uploads=YES #chown_username=whoever # # The name of log file when xferlog_enable=YES and xferlog_std_format=YES # WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log #xferlog_file=/var/log/xferlog # # Switches between logging into vsftpd_log_file and xferlog_file files. # NO writes to vsftpd_log_file, YES to xferlog_file 22
Web Server xferlog_std_format=YES # # You may change the default value for timing out an idle session. #idle_session_timeout=600 # # You may change the default value for timing out a data connection. #data_connection_timeout=120 # # It is recommended that you define on your system a unique user which the # ftp server can use as a totally isolated and unprivileged user. #nopriv_user=ftpsecure # # Enable this and the server will recognise asynchronous ABOR requests. Not # recommended for security (the code is non-trivial). Not enabling it, # however, may confuse older FTP clients. #async_abor_enable=YES # # By default the server will pretend to allow ASCII mode but in fact ignore # the request. Turn on the below options to have the server actually do ASCII # mangling on files when in ASCII mode. # Beware that on some FTP servers, ASCII support allows a denial of service # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd # predicted this attack and has always been safe, reporting the size of the # raw file. # ASCII mangling is a horrible feature of the protocol. ascii_upload_enable=YES ascii_download_enable=YES # # You may fully customise the login banner string: ftpd_banner=Welcome to blah FTP service. # # You may specify a file of disallowed anonymous e-mail addresses. Apparently # useful for combatting certain DoS attacks. #deny_email_enable=YES # (default follows) #banned_email_file=/etc/vsftpd/banned_emails # # You may specify an explicit list of local users to chroot() to their home # directory. If chroot_local_user is YES, then this list becomes a list of # users to NOT chroot(). chroot_local_user=YES #chroot_list_enable=YES # (default follows) #chroot_list_file=/etc/vsftpd/chroot_list # # You may activate the "-R" option to the builtin ls. This is disabled by # default to avoid remote users being able to cause excessive I/O on large # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume 23
Web Server # the presence of the "-R" option, so there is a strong case for enabling it. ls_recurse_enable=YES # # When "listen" directive is enabled, vsftpd runs in standalone mode and # listens on IPv4 sockets. This directive cannot be used in conjunction # with the listen_ipv6 directive. listen=YES # # This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6 # sockets, you must run two copies of vsftpd with two configuration files. # Make sure, that one of the listen options is commented !! #listen_ipv6=YES #pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES # Hide ids from user hide_ids=YES max_clients=10 salviamo e usciamo. Creiamo ora la home dell'utente virtuale # mkdir -p /home/virtual/utente0 E diamo alla cartelle utente e gruppo corretto per il suo funzionamento, in questo caso è ftp: # chown -R ftp:ftp /home/virtual/utente0 Anche qui creiamo un file che ci conferma la connessione. # cd /home/virtual/utente0 # echo > utente0.txt Riavviamo il server e proviamo il collegamento con utility ftp # service vsftpd restart
# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 Welcome to blah FTP service. Name (127.0.0.1:root): utente0 331 Please specify the password. Password: 24
Web Server 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 "/" Bene ci siamo connessi, proviamo da browser ora:
Accesso con Filezilla:
25
Web Server
anche con il client è riuscito. Vediamo ora un ultimo metodo per creare utenti virtuali, questa bolta gli utenti verranno inseriti un un database mysql.
Utenti virtuali con MySQL In quest'ultimo esempio di configurazione degli utenti per un server ftp, vediamo la creazione di quest'ultimi basata su MySQL, iniziamo con l'installare mysql server # yum install mysql-server configuriamo il database, iniziamo ora con l'impostazione del server MySQL, impostiamo la password di root, digitiamo il comando: # mysqladmin -u root password tuapassword Nel nostro caso saraĂ ,123456. Se questo non dovesse bastare allora usiamo quest'altro metodo per configurare mysql. # mysql_secure_installation Se il comando dovesse darvi errore avviate prima mysql e ripetete il comando # service mysqld start Seguiamo ora i passi di configurazione, la prima richiesta ci indica se vogliamo creare una password per l'utente root, premiamo invio per accettare NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MySQL to secure it, we'll need the current password for the root user. If you've just installed MySQL, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): Ci viene ora richiesto se vogliamo settare la password per root, ovviamente rispondiamo si e inseriamo una password forte per l'utente root di mysql
26
Web Server Set root password? [Y/n] <-- ENTER New password: <-- digirare la vostra password di root Re-enter new password: <-- digitate nuovamente la password Password updated successfully! Reloading privilege tables.. ... Success! Per default Mysql ha abilitato all'accesso l'utente anonynous, qui di seguito dopo aver inserito la password di root ci viene chiesto se vogliamo disabilitare l'utente anonynous, ovviamente rispondiamo con un Y By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] <-- ENTER ... Success! Normalmente root deve essere impostato solo come utente locale e non deve essere abilitato come utente d'accesso remoto Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] <-- ENTER ... Success! Alla domanda rispondiamo con Y. Come tutti i database anche Mysql possiede un database chiamato test, da qui può accedere chiunque pertanto è buona norma rimuoverlo. By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] <-- ENTER - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Riavviamo ora i privilegi delle tabelle Reloading the privilege tables will ensure that all changes made so far 27
Web Server will take effect immediately. Reload privilege tables now? [Y/n] <-- ENTER ... Success! Cleaning up... Con mysql abbiamo terminato ora la configurazione di base è sicura e non ci resta che usarlo. Configuriamo ora l'interfaccia grafica di Mysql ovvero PhpMyAdmin in modo che ci permettà un accesso remoto per poter lavorare sul server, prima di tutto accediamo a questo path: # yum install phpmyadmin # nano /etc/httpd/conf.d/phpmyadmin.conf Dovremo visualizzare una situazione simile a questa: # # Web application to manage MySQL # <Directory "/usr/share/phpmyadmin"> Order Deny,Allow Deny from all Allow from 127.0.0.1 </Directory> Alias /phpmyadmin /usr/share/phpmyadmin Alias /phpMyAdmin /usr/share/phpmyadmin Alias /mysqladmin /usr/share/phpmyadmin Apportiamo le modifiche che vediamo qui sotto: # # Web application to manage MySQL # #<Directory "/usr/share/phpmyadmin"> # Order Deny,Allow # Deny from all # Allow from 127.0.0.1 #</Directory> Alias /phpmyadmin /usr/share/phpmyadmin Alias /phpMyAdmin /usr/share/phpmyadmin Alias /mysqladmin /usr/share/phpmyadmin Salviamo e usciamo. 28
Web Server Cambiamo ora la tipologia di autenticazione di PhpMyAdmin da cookie a http: # nano /usr/share/phpmyadmin/config.inc.php Cambiamo in questo modo:
[...] /* Authentication type */ $cfg['Servers'][$i]['auth_type'] = 'http'; [...] Salviamo, A. questo punto non ci resta che provare la connesione verso PhpMyAdmin inserendo nel borwser la stringa: Ipserver o nomeserver/phpmyadmin, dovremmo visualizzare la richiesta di utente e password da parte di quest'ultimo.
Accediamo al database e creiamo la nostra tabella per gli utenti, # mysql -u root -p Digitare la password creata precedentemente, ovvero “123456”, inizimao con la creazione del database vsftpd, l'utente si chiamerà vsftpd e la password sarà genius Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
29
Web Server Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> CREATE DATABASE vsftpd; Query OK, 1 row affected (0.01 sec) mysql> GRANT SELECT ON vsftpd. IDENTIFIED BY 'genius'; Query OK, 0 rows affected (0.01 sec)
*
TO
'vsftpd'@'localhost'
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec) Cambiamo ora il database e costruiamo la tabella degli utenti Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> CREATE DATABASE vsftpd; Query OK, 1 row affected (0.01 sec) mysql> GRANT SELECT ON vsftpd. IDENTIFIED BY 'genius'; Query OK, 0 rows affected (0.01 sec)
*
TO
'vsftpd'@'localhost'
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec) USE vsftpd; Database changed mysql> CREATE TABLE `accounts` ( -> `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , -> `username` VARCHAR( 30 ) NOT NULL , -> `pass` VARCHAR( 50 ) NOT NULL ,
30
Web Server -> UNIQUE ( `username` ) -> ) ENGINE = MYISAM ; Query OK, 0 rows affected (0.10 sec) mysql> exit; Creato un database senza privilegi, andiamo a definire la home root degli utenti virtuali, nel nostro esempio sarà /home/virtual appartenente al gruppo users. Vsftpd viene eseguito con i privilegi di questo utente così rischio per il sistema è ridotto al minimo e le directory FTP dei nostri utenti virtuali sarà /home/virtual, per esempio “home/virtual/utente1, /home/virtual/utente2 ecc..) # useradd -G users -s /sbin/nologin -d /home/virtual vsftpd Ora possiamo configurare il file vsftpd.conf, anche qui partiamo da una situazione nuova, ed è opportuno eseguire una copia del file originale. # cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf-orig Svuotiamo ora il file originale # cat /dev/null > /etc/vsftpd/vsftpd.conf Apriamo il file ed editiamolo in questo modo # No ANONYMOUS users allowed anonymous_enable=NO # Allow 'local' users with WRITE permissions (0755) local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES
# if you want to LOG vsftpd activity then uncomment this log_ftp_protocol # log_ftp_protocol=YES
connect_from_port_20=YES
# uncomment xferlog_file and xferlog_std_format if you DIDN'T use the line above # with log_ftp_protocol - it must be excluding each other # The name of log file when xferlog_enable=YES and xferlog_std_format=YES # WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log #xferlog_file=/var/log/xferlog #
31
Web Server # xferlog_std_format Switches between logging into vsftpd_log_file and xferlog_file files. # NO writes to vsftpd_log_file, YES to xferlog_file # xferlog_std_format=YES
# # You may change the default value for timing out an idle session (in seconds). #idle_session_timeout=600 # # You may change the default value for timing out a data connection (in seconds). #data_connection_timeout=120 # # define a unique user on your system which the # ftp server can use as a totally isolated and unprivileged user. nopriv_user=vsftpd
chroot_local_user=YES
listen=YES
# here we use the authentication module for vsftpd to check users name and passw pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
# If userlist_deny=YES (default), never allow users in this file # /etc/vsftpd/user_list , and do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied. userlist_deny=yes
# here the vsftpd will allow the 'vsftpd' user to login into '/home/vsftpd/$USER directory guest_enable=YES guest_username=vsftpd local_root=/home/virtual/$USER user_sub_token=$USER virtual_use_local_privs=YES user_config_dir=/etc/vsftpd/vsftpd_user_conf
force_local_data_ssl=NO force_local_logins_ssl=NO
# PASV - passive ports for FTP (range 44000 - 44100 ; 100 PASV ports,
32
Web Server # REMEMBER to OPEN FIREWALL FOR ALLOWING FTP Passive CONNECTIONS # check "how to enable Passive FTP in IPTABLES"
pasv_enable=YES pasv_min_port=44000 pasv_max_port=44100
# No ANONYMOUS users allowed anonymous_enable=NO # Allow 'local' users with WRITE permissions (0755) local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES # if you want to LOG vsftpd activity then uncomment this log_ftp_protocol # log_ftp_protocol=YES connect_from_port_20=YES # uncomment xferlog_file and xferlog_std_format if you DIDN'T use the line above # with log_ftp_protocol - it must be excluding each other # The name of log file when xferlog_enable=YES and xferlog_std_format=YES # WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log #xferlog_file=/var/log/xferlog # # xferlog_std_format Switches between logging into vsftpd_log_file and xferlog_file files. # NO writes to vsftpd_log_file, YES to xferlog_file # xferlog_std_format=YES # # You may change the default value for timing out an idle session (in seconds). #idle_session_timeout=600 # # You may change the default value for timing out a data connection (in seconds). #data_connection_timeout=120 # # define a unique user on your system which the # ftp server can use as a totally isolated and unprivileged user. nopriv_user=vsftpd chroot_local_user=YES listen=YES # here we use the authentication module for vsftpd to check users name and passw 33
Web Server pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES # If userlist_deny=YES (default), never allow users in this file # /etc/vsftpd/user_list , and do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied. userlist_deny=yes # here the vsftpd will allow the 'vsftpd' user to login into '/home/vsftpd/$USER directory guest_enable=YES guest_username=vsftpd local_root=/home/virtual/$USER user_sub_token=$USER virtual_use_local_privs=YES user_config_dir=/etc/vsftpd/vsftpd_user_conf force_local_data_ssl=NO force_local_logins_ssl=NO # PASV - passive ports for FTP (range 44000 - 44100 ; 100 PASV ports, # REMEMBER to OPEN FIREWALL FOR ALLOWING FTP Passive CONNECTIONS # check "how to enable Passive FTP in IPTABLES": here or here pasv_enable=YES pasv_min_port=44000 pasv_max_port=44100 con le voci pasv_enable e la configurazione delle porte , indichiamo al server ftp che l'accesso è possibile anche in passive mod, se siamo dietro ad un firewall. Con l'opzione user_config_dir è possibile specificare una directory per i file di configurazione perutente che sostituiscono parti delle impostazioni globali. Questo è totalmente opzionale siete voi a decidere se utilizzare questa funzione. Creiamo questa directory # mkdir /etc/vsftpd/vsftpd_user_conf Anche in questa configurazione vogliamo che ogni utente abbia la suo home, ma se vogliamo qualcosa di diverso come impostazione, diciamo per l'”utente1” andiamo a crearla in questo modo: # nano /etc/vsftpd/vsftpd_user_conf/utente1 Al suo interno editeremo quanto segue:
34
Web Server dirlist_enable=YES download_enable=YES # full path della directory usata dall' 'utente1' local_root=/home/users/utente1 write_enable=YES Creiamo la directory per l'utente user1 se vogliamo che questo acceda. # mkdir /home/users/utente1 Diamo ora i permessi alla cartella # chmod 700 /home/users/utente1 # chown vsftpd:users /home/users/utente1 Così ora utente ha 'dir home' in '/ home/users/utente1' invece di '/ home/virtual/utente1' il file di configurazione dell'utente può essere cambiato come più vi aggrada. Configuriamo ora il file PAM (password Authentication) per gli utenti del database MySQL, il file PAM di configurazione lo posizioneremo in /etc/pam.d/vsftpd. Anche qui come sempre effetuiamo una copia di backup del file già esistente: # cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd-orig Anche in questo file cancelliamo le impostazioni scritte e poi editiamolo con le nuove impostazioni # cat /dev/null > /etc/pam.d/vsftpd # nano /etc/pam.d/vsftpd E inseriamo queste righe, facendo attenzione ad inserire l'utente e password che abbiamo creato per il database vsftpd, ovvero utente vsftpd e password genius #%PAM-1.0 session optional pam_keyinit.so force revoke auth required pam_mysql.so user=vsftpd passwd=genius host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3 account required pam_mysql.so user=vsftpd passwd=genius host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3 Per poter lavorare PAM e Mysql, abbiamo bisogno di scaricare il pacchetto pam_mysql per farlo dobbiamo abilitare i repository EPEL 35
Web Server
# yum install pam_mysql Running transaction check ---> Package pam_mysql.i686 1:0.7-0.12.rc1.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved ======================================================= ========================= Package Arch Version Repository Size ======================================================= ========================= Installing: pam_mysql i686 1:0.7-0.12.rc1.el6 epel 38 k Transaction Summary ======================================================= ========================= Install 1 Package(s) Total download size: 38 k Installed size: 85 k Is this ok [y/N]: y Downloading Packages: pam_mysql-0.7-0.12.rc1.el6.i686.rpm Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : 1:pam_mysql-0.7-0.12.rc1.el6.i686 Verifying : 1:pam_mysql-0.7-0.12.rc1.el6.i686
| 38 kB
00:00
1/1 1/1
Installed: pam_mysql.i686 1:0.7-0.12.rc1.el6 Complete! Se il pacchetto è installato correttamente dovremmo vedere quanto segue al suo interno # ls -la /lib/security/pam_m* -rwxr-xr-x. 1 root root 13668 22 nov 15:02 /lib/security/pam_mail.so -rwxr-xr-x. 1 root root 9568 22 nov 15:02 /lib/security/pam_mkhomedir.so -rwxr-xr-x. 1 root root 5488 22 nov 15:02 /lib/security/pam_motd.so -rwxr-xr-x 1 root root 39604 14 ago 2011 /lib/security/pam_mysql.so
36
Web Server Finalmente, possiamo creare il nostro primo utente virtuale: mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> USE vsftpd; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> INSERT INTO accounts (username, pass) VALUES('utente1', md5('segreto')); Query OK, 1 row affected (0.00 sec) mysql> L'utente che abbiamo creato l'abbiamo chiamato utente1 e la password impostata con crittografia md5 è segreto, vediamo come si presenta la tabella utenti del database vsftpd. mysql> select * from accounts; +----+----------+----------------------------------+ | id | username | pass | +----+----------+----------------------------------+ | 1 | utente1 | 525d5d4f0cfb94d045c48971aa1aa974 | +----+----------+----------------------------------+ 1 row in set (0.00 sec) exit; Creiamo ora un secondo utente, ma questa volta nella local root di defaul ovvero /home/virtual, vi ricordo che per l'utente1 è stato creato un apposito file e filesystem che non sfruttavano la local root di base ma una preferenziale, accediamo al database mysql -u root -p Enter password: 37
Web Server Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> USE vsftpd; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> INSERT INTO accounts (username, pass) VALUES('utente2', md5('segreto12')); Query OK, 1 row affected (0.00 sec) mysql> exit; L'utente creato si chiama utente2 con password segreto12, visto che l'utenza virtuale non crea direttamente le direcoty, dobbiamo farlo noi manualmente: # mkdir /home/virtual/utente2 Diamo i permessi alla cartella # chmod 700 /home/users/utente2 # chown vsftpd:users /home/virtual/utente2 Creiamo ora due file per distingure gli accessi, uno da mettere nella home dell'utente1 e l'altro per l'utente2 # cd /home/users/utente1 # echo utente1nellacartellapreferenziale.txt # cd ../../.. # cd /home/virtual/utente2 # echo utente2_homedir_base.txt Creati i file proviamoli via browser, prima accediamo come utente1
38
Web Server
bene accediamo tranquillamente, e ora proviamo l'utente2
anche qui abbiamo ottenuto l'accesso desiderato. Ora con Filezilla è possibile eseguire l'upload e il download dei file.
39
Web Server Fino ad ora abbiamo visto vari metodi di configurazione degli utenti e abbiamo visto come sia semplice spostare il path delle cartelle in cui gli utenti possono accedere alle loro cartelle, il servizio FTP è uno servizio essenziale nelle aziende, ma la sua vulnerabilità è che tutto viene trasmesso in chiaro, fino ad ora abbiamo lavorato sulla porta di default del server ovvero la TCP 21, nell'ultimo capitolo vedremo come creare una connessione criptata tramite ssl ed avere un ftps sicuro.
VSFTP con certificato SSL Per fare in modo che il nostro server FTP diventi un FTPS, ovvero un server protetto da criptatura, dobbiamo creare prima di tutto un certificato, oppure meglio ancora acquistarne uno valido, per il momento vediamo come crearne uno auto firmato. Iniziamo con il creare la folder che conterrà il certificato: # mkdir /etc/vsftpd/ssl Creiamo ora il certificato, sarà un certificato a 128bit della durata di un anno, (nessuno ci impedisce di creare un certificato con criptatura più alta. # openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/vsftpd/ssl/vsftpd.pem -out /etc/vsftpd/ssl/vsftpd.pem Una volta creato il certificato, vediamo di apportare le dovute modifiche al file vsftpd.conf # nano /etc/vsftpd/vsftpd.conf Spostiamoci in fondo al file e inseriamo il path dei certificati rsa_cert_file=/etc/vsftpd/ssl/vsftpd.pem rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.pem Dopodiché abilitiamo vsftpd al collegamento ssl, sempre in fondo a file di configurazione vsftpd.conf inseriamo queste voci: ssl_enable=YES force_local_data_ssl=YES force_local_logins_ssl=YES Successivamente, limiteremo il tipo di connessione TLS, che è più sicuro di SSL. Lo faremo, consentendo esplicitamente TLS e negando l'uso di SSL aggiungendo queste voci: ssl_tlsv1=YES ssl_sslv2=YES ssl_sslv3=YES
40
Web Server Prima di terminare aggiungiamo anche alcune opzioni, queste ci eviteranno problemi con alcuni client ftp come Filezilla. require_ssl_reuse=NO ssl_ciphers=HIGH Salviamo e chiudiamo il file e riavviamo il servizio FTP # service vsftpd restart Proviamo la nostra connessione con Filezilla, apriamolo e clicchiamo su l'icona site manager
Nell interfaccia che si apre clicchiamo sul pulsante new site
Inseriamo ora l'indirizzo del server FTP, e nella finestra Encryption abilitate la voce Require explicit FTP over TLS, inserite successivamente l'utente e la password e cliccate su connect.
A questo punto ci verrà mostrato il certificato, accettiamo cliccando su Ok e siamo connessi in modalità sicura. Non è possibile effettuare questa operazione da browser perché esso con contempla il protocollo FTPS.
41
Web Server
Finalmente abbiamo terminato, ora siamo in grado di creare un server FTP con svariate configurazione utente e con accesso protetto. Creare un applicazione in PHP per gestire gli utenti virtuali Vediamo ora come realizzare una piccola applicazione per gestire gli utenti virtuali in MySQL con PHP, che ci permetterĂ di inserire, modificare, visualizzare e cancellare gli utenti dal database. Iniziamo con il costruire la pagina index iniziale dell'applicazione, una semplice pagina in html che posizioneremo in /var/www/html. La pagina index.html ecco qui di seguito il codice della nostra pagina statica iniziale: <html> <head><title>Gestione utenti ftp </title> </head> <body bgcolor="#000000" text="#ffffff" link="yellow"> <center> <table cellpadding="20" border="2" bordercolor="white"> <tr><td align="center"> <h1>GESTIONE UTENTI FTP</h1> 42
Web Server <br> <img src="logo.png" height="350" width="300"> <hr color="yellow" width="700"> <center> <table cellpadding="15" border="0"> <tr> <td><a href="inserisci.php"><img src="InsU.png" height="80" width="140"></a></td> <td><a href="view.php"><img src="cermod.png" height="80" width="140"></a></td> <td><a href="stampalistautenti.php"><img src="stampa.png" height="80" width="140"></a></td> </tr> </table> </center> </td> </tr> </table> </center> </body> </html> Questo è il front end
43
Web Server e fin qui niente di particolare, scriviamo ora il file php per la connessione al database mysql. File connectdb.php <?php /* CONNECTDB.PHP Consente a PHP di connettersi al tuo database */ // Variabili del database (inserisci le informazioni del tuo server) $server = 'localhost'; $user = 'root'; $pass = '123456'; $dbase = 'vsftpd'; // Connessione al Database $connection = mysql_connect($server, $user, $pass) or die ("Could not connect to server ... \n" . mysql_error ()); mysql_select_db($dbase) or die ("Could not connect to database ... \n" . mysql_error ()); ?> Dopo aver creato il file che gestisce la connessione possiamo ora creare il form in html per l'inserimento degli utenti nel database. Form inserisci.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Caricamento dati nel db </title> </head> <body bgcolor="black" text="white"> <center> <h1>INSERIRE UTENTE E PASSWORD FTP</h1> <br> <a href="index.html"><img src="home.png" height="80" width="140"></a> <br> <form method="post" action="input.php"> <table cellpadding="15" border="1"> <tr><td> <br> Username:<br> <input type="varchar" name="username" size="25">
44
Web Server <br> Password:<br> <input type="varchar" name="password" size="25"></td></tr> <br> </td> <tr> <td> <input type="submit" value="Inserisci"> | <input type="reset" value="Cancella"> </td> </tr> </form> </table> <br> <img src="logo.png" height="150" width="100"> </center> </body> </html> Ecco il front end dell'inserimento utente
Creiamo ora il file vero e proprio che gestisce l'inserimento dei dati, il file chiamato input.php Input.php 45
Web Server <html> <head> <title>Caricamento dati nel db</title> </head> <body bgcolor=”#000000” text=”#ffffff”> <h1>Caricamento utente server ftp</h1> <br> <h3>Risultato del caricamento</h3> <? $username=$_POST['username']; $password=$_POST['password']; trim ($s_username); if (!$username || !$password) { echo "Errore: non hai inserito i dati richiesti!"; exit; } $username = addslashes ($username); $password = addslashes ($password); @ $db = mysql_pconnect ("localhost" , "root" , "123456"); if (!$db) { echo "Errore: connessione al database non riuscita<br>\n"; exit; } mysql_select_db ("vsftpd") or die ("Errore: ".mysql_error()); $query = "INSERT INTO accounts VALUES (' ','$username' , MD5('$password'))"; $risultato = mysql_query($query) or die ("Inserimento non riuscito, errore: ".mysql_error()); if ($risultato) { echo mysql_affected_rows () ." nuovo utente inserito nell ftp.<br>\n"; } ?> </body> </html> Perfetto ora l'inserimento degli utenti all'interno del db è funzionante, creiamo ora la parte più copiosa ovvero la visualizzazione e modifica dei record, iniziamo con il creare il file di visualizzazione, ovvero quel file che ci permette di estrarre e visualizzare gli utenti all'interno del db, anche questo ci fornirà un output su un file php.
46
Web Server File view.php <!DOCTYPE HTML PUBLIC "-//W3C//DTD "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Visualizza Record</title> </head> <body bgcolor="#000000" text="#ffffff" vlink="orange"> <center> <h1>VISUALIZZA UTENTI FTP</h1> <br> <img src="logo.png" height="140" width="100"> </center> <br> <center> <?php /* VIEW.PHP Visualizza tutti i dati della tabella 'accounts' */
HTML
4.01//EN"
// connessione al database include('connectdb.php'); // ottiene i risultati dal database $result = mysql_query("SELECT * FROM accounts") or die(mysql_error()); // visualizza i dati in tabella echo "<p><b>Visualizza impaginato</a></p>";
Tutto</b>
|
<a
href='view-paginated.php?page=1'>Visualizza
echo "<table border='1' cellpadding='10' bordercolor='#ffffff'>"; echo "<tr> <th>id</th> <th>username</th> <th>password</th> <th></th> <th></th></tr>"; // loop tra i risultati della query del database, visualizzandoli in tabella while($row = mysql_fetch_array( $result )) { // emissione del contenuto di ogni riga in una tabella echo "<tr>"; echo '<td>' . $row['id'] . '</td>'; echo '<td>' . $row['username'] . '</td>'; echo '<td>' . $row['password'] . '</td>'; echo '<td><a href="modifica.php?id=' . $row['id'] . '"><font color="yellow">Edit</font></a></td>'; echo '<td><a href="cancella.php?id=' . $row['id'] . '"><font color="red">Delete</font></a></td>'; 47
Web Server echo "</tr>"; } // chiude la tabella> echo "</table>"; ?> </center> <br> <center> <table cellpadding="15" border="0"> <tr> <td><a href="index.html"><img src="home.png" width="120" height="80"></a></td> <td><a href="inserisci.php"><img src="InsU.png" width="120" height="80"></a></td> </tr> </table> </center> </body> </html> Ecco il front end del file
48
Web Server
da notare a fianco le voci edit in giallo che indicano la possibilitĂ di modificare l'utente e la password criptata in MD5 oppure delete in rosso che permette di eliminare il record. Creiamo ora il file Visualizza impaginato, questo file ci permette di visualizzare l'estrazione su piĂš file invece che su un unico file in modo da facilitare la ricerca. File view-paginated.php <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Visualizza Record Impaginati</title> </head> <body bgcolor="#000000" text="#ffffff" vlink="orange"> <center> <h1>VISUALIZZA RECORD IMPAGINATI</h1> <br> <img src="logoGallo.png" height="140" width="120" vlink="orange"> </center> <br>
49
4.01//EN"
Web Server <center> <?php /* VIEW-PAGINATED.PHP Visualizza tutti i dati della tabella 'accounts' Questa è una versione modificata del file view.php che include l'impaginazione */ // connessione al database include('connectdb.php'); // numero di risultati da visualizzare per pagina $per_page = 3; // calcola le pagine totali $result = mysql_query("SELECT * FROM accounts"); $total_results = mysql_num_rows($result); $total_pages = ceil($total_results / $per_page); // controlla se la variabile 'page' è impostata nell'URL (es: view-paginated.php?page=1) if (isset($_GET['page']) && is_numeric($_GET['page'])) { $show_page = $_GET['page']; // mi assicuro che il valore di $show_page sia valido if ($show_page > 0 && $show_page <= $total_pages) { $start = ($show_page -1) * $per_page; $end = $start + $per_page; } else { // errore - mostra il primo set di risultati $start = 0; $end = $per_page; } } else { // se la pagina non è impostata, mostra il primo set di risultati $start = 0; $end = $per_page; } } else { // se la pagina non è impostata, mostra il primo set di risultati $start = 0; 50
Web Server $end = $per_page; } // visualizza impaginazione echo "<p><a href='view.php'>Visualizza Tutto</a> | <b>Visualizza impaginato:</b> "; for ($i = 1; $i <= $total_pages; $i++) { echo "<a href='view-paginated.php?page=$i'>$i</a> "; } echo "</p>"; // visualizza i dati in tabella echo "<table border='1' cellpadding='10'>"; echo "<tr> <th>ID</th> <th>Username</th> <th>Password</th> <th></th> <th></th></tr>"; // loop tra i risultati della query del database, visualizzandoli in tabella for ($i = $start; $i < $end; $i++) { // mi assicuro che PHP non cerchi di mostrare risultati che non esistono if ($i == $total_results) { break; } // emissione del contenuto di ogni riga in una tabella echo "<tr>"; echo '<td>' . mysql_result($result, $i, 'id') . '</td>'; echo '<td>' . mysql_result($result, $i, 'username') . '</td>'; echo '<td>' . mysql_result($result, $i, 'password') . '</td>'; echo '<td><a href="modifica.php?id=' . mysql_result($result, $i, 'id') . '"><font color="yellow">Edit</font></a></td>'; echo '<td><a href="cancella.php?id=' . mysql_result($result, $i, 'id') . '"><font color="red">Delete</font></a></td>'; echo "</tr>"; } // chiude la tabella> echo "</table>"; // impaginazione ?> </center> <br> <center> <a href="index.html"><img src="home.png" width="120" height="80"></a> href="inserisci.php"><img src="InsU.png" width="120" height="80"></a> </center> </body> </html> 51
|
<a
Web Server L'output e simile a view.php. Creiamo ora il file più impegnativo, il file modifica.php. File modifica.php <?php /* EDIT.PHP Consente all'utente di modificare una voce specifica nel database */ // crea il form di modifica record // dal momento che questo modulo è utilizzato più volte in questo file, ho fatto una funzione facilmente riutilizzabile function renderForm($id, $username, $password, $error) { ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Modifica Record</title> </head> <body bgcolor="#000000" text="#ffffff"> <center> <h1>MODIFICA PASSWORD</h1> <br> <img src="logo.png" width="100" height="140"> </center> <br> <?php // se ci sono errori, vengono visualizzati if ($error != '') { echo '<div style="padding:4px; border:1px solid red; color:red;">'.$error.'</div>'; } ?> <center> <table cellpadding="15" border="1" bordercolor="#ffffff"> <tr> <td> <form action="" method="post"> <input type="hidden" name="id" value="<?php echo $id; ?>"/> <div> <p><strong>ID:</strong> <?php echo $id; ?></p> <br> <strong>Username: *</strong> <input type="text" name="username" value="<?php echo 52
Web Server $username; ?>"/><br/> <br> <strong>Password: *</strong> <input type="text" name="password" value="<?php echo $password; ?>"/><br/> <p>* Richiesto</p> <input type="submit" name="submit" value="Invia"> </div> </form> </td></tr> </table> <br> <a href="index.html"><img src="home.png" width="100" hight="140"></a> </center> </body> </html> <?php } // connessione al database include('connectdb.php'); // verifica se il modulo è stato inviato. Se lo è, inizia a elaborare il modulo e lo salva nel database if (isset($_POST['submit'])) { // verificare che il valore di 'id' sia un intero valido prima di ottenere i dati del modulo if (is_numeric($_POST['id'])) { // ottenere i dati del modulo e verifica che siano validi $id = $_POST['id']; $username = mysql_real_escape_string(htmlspecialchars($_POST['username'])); $password = mysql_real_escape_string(htmlspecialchars($_POST['password'])); // controlla che i campi username/password siano entrambi compilati if ($username == '' || $password == '') { // genera messaggio di errore $error = 'ERROR: Please fill in all required fields!'; // errore, visualizzo il modulo renderForm($id, $username, $password, $error); } else { // salva i dati nel database mysql_query("UPDATE accounts SET username='$username', password=MD5('$password') WHERE id='$id'") or die(mysql_error()); // una volta salvato, si viene reindirizzati alla pagina di visualizzazione header("Location: view.php"); 53
Web Server } } else { // Se l' 'id' non è valido, viene visualizzato un errore echo 'Error!'; } } else // se il modulo non è stato inviato, ottengo i dati dal db e visualizzare il modulo { // ottiene il valore 'id' dall'URL (se esiste), assicurandosi che sia valido (controlla che sia numerico/maggiore di 0) if (isset($_GET['id']) && is_numeric($_GET['id']) && $_GET['id'] > 0) { // query db $id = $_GET['id']; $result = mysql_query("SELECT * FROM accounts WHERE id=$id") or die(mysql_error()); $row = mysql_fetch_array($result); // verifica che l' 'id' corrisponda a una riga nel database if($row) { // ottiene i dati dal db $username = $row['username']; $password = $row['password']; // visualizza il modulo renderForm($id, $username, $password, ''); } else // se non corrisponde visualizza il risultato { echo "Nessun risultato!"; } } else // se l' 'id' nell'URL non è valido, o se non vi è alcun valore di 'id', visualizza un errore { echo 'Errore!'; } } ?> Ecco qui di seguito il front end del file:
54
Web Server
Notiamo come la password si presenti criptata in MD5, l'inserimento comunque avviene in carattere ascii. Creaiamo ora l'ultimo file quello che permette l'eliminazione del record, il file cancella.php. File cancella.php <?php /* DELETE.PHP Cancella una voce specifica della tabella 'players' */ // connessione al database 55
Web Server include('connectdb.php'); // controlla se la variabile 'id' è impostata nell'URL, e controlla che sia valida if (isset($_GET['id']) && is_numeric($_GET['id'])) { // ottiene il valore id $id = $_GET['id']; // elimina la voce $result = mysql_query("DELETE FROM accounts WHERE id=$id") or die(mysql_error()); // reindirizza alla pagina di visualizzazione header("Location: view.php"); } else // se l'id non è impostato o non è valido reindirizza alla pagina di visualizzazione { header("Location: view.php"); } ?> Bene abbiamo quasi finito, creiamo ora l'ultimo file quello che ci stampa a video tutti gli utenti del db <html> <head><title>Stampa a video utenti</title> </head> <body bgcolor="#000000" text="#ffffff"> <center> <h1>STAMPA UTENTI FTP A VIDEO</h1> <br> <img src="logo.png" height="120" width="100"> <br> <a href="index.html"><img src="home.png" height="60" width="120"></a> <br> <br> <? $user="root"; $pass="123456"; $dbase="vsftpd"; mysql_connect(localhost,$user,$pass); @mysql_select_db($dbase) or die("Impossibile selezionare il database"); $query="SELECT * FROM accounts"; $risultati=mysql_query($query);
56
Web Server
$num=mysql_numrows($risultati); mysql_close(); ?> <table border="1" cellspacing="2" cellpadding="2" bordercolor="white"> <tr> <th><font face="Arial, Helvetica, sans-serif">username</font></th> <th><font face="Arial, Helvetica, sans-serif">password</font></th> </tr> <? $i=0; while ($i < $num) { $username=mysql_result($risultati,$i,"username"); $password=mysql_result($risultati,$i,"password"); ?> <tr> <td><font face="Arial, Helvetica, sans-serif"><?php echo $username;?></font></td> <td><font face="Arial, Helvetica, sans-serif"><?php echo $password;?></font></td> </tr> <? $i++; } ?> </center> </body> </html>
57
Web Server Ed ecco l'output del file:
Installare Clamav antivirus e chrootkit e Rkhunter per controllare integritĂ di file e server Visto che il server FTP viene posto all'esterno e gli utenti che hanno accesso in scrittura possono eroneamente inserire qualche file contententi virus o rootkit che possono infettare il pc, vediamo come installare e controllare il nostro server.
Installiamo Clamav antivirus Prima di installare l'antivirus, dobbiamo installare i repo EPEL, installiamolo cosi. # yum install epel-release Ora possiamo installare l'antivirus. # yum install clamav clamd 58
Web Server Una volta che l'antivirus viene installato dobbiamo avviare servizio e il demone. # /etc/init.d/clamd on # chkconfig clamd on # /etc/init.d/clamd start Eseguiamo l'update del signature dell'antivirus # /usr/bin/freshclam Una volta installato ed effettuato l'update configuriamo una scansione giornaliera del disco dove verranno posti i dati, nel nostro caso usiamo la partizione /dati # nano /etc/cron.daily/manual_clamscan Scendiamo in fondo al file e aggiungiamo le seguenti righe. # ! /bin/bash SCAN_DIR=”/dati” LOG_FILE=”/var/log/clamav/manual_clamscan.log” /usr/bin/clamscan -i -r $SCAN_DIR >> $LOG_FILE Salviamo e usciamo da l'editor nano, rendiamo ora eseguibile lo script # chmod +x /etc/cron.daily/manual_clamscan Creiamo ora uno script che ci permetta di eseguire automaticamente la scansione e di inviare subito dopo un report alla nostra mail. Iniziamo con l'editare il file che chiameremo clamav-scan in cron.daily. # cd /etc/cron.daily # nano clamav-scan Nello script inseriamo ora queste righe: #!/bin/sh # Generatore data/ora stile: HH:mm dd/mm/YYYY data=$(date "+%H:%M %d/%m/%Y") # Indirizzo e-mail destinatario report email="indirizzomail@mail.it"
59
Web Server # Esegui WPScan ed invia report per e-mail clamscan -i -r /dati | /usr/sbin/ssmtp -s $email Salviamo e impostiamo i permessi corretti per renderlo eseguibile # chmod 755 clamav-scan Bene, l'antivirus è installato e pronto per eseguire una scansione giornaliera di tutti i dati inseriti nel server FTP. Vediamo di seguito l'installazione di Rkhunter e chrootkit.
Installare e configurare Rkhunter Rkhunter è un tool opensource per la scansione di rootkit, backdoors e exploit locali, iniziamo con lo scaricare il tool: # yum install rkhunter Anche qui facciamo in modo di avviare automaticamente il demone del tool: # chkconfig on Eseguiamo anche qui l'update del tool # rkhunter –update # rkhunter --propupd Eseguiamo ora una scansione manuale # rkhunter --check Ora dopo aver effettuato uno scan manuale del server, creiamo un script per eseguire una scansione automatica alla settimana con invio dei file di log tramite mail. # cd /etc/cron.weekly # nano rkhunter-scan.sh Aggiungiamo ora le seguenti righe allo script. #!/bin/sh email=indirizzomail@mail.it ( /usr/bin/rkhunter --versioncheck /usr/bin/rkhunter --update 60
Web Server /usr/bin/rkhunter --cronjob --report-warnings-only ) | /usr/sbin/ssmtp -s "$email" Salvare e dare i permessi corretti al file: # chmod 755 rkhunter-scan.sh Un altro software per la scansione di rootkit è Chrootkit, vediamo come installarlo e configurarlo per uno scan automatizzato settimanale.
Chrootkit Anche qui per installare il tools chrootkit dobbiamo disporre come abbiamo visto per gli altri, del repository epel, se questo è già stato installato, passiamo ad installare il tools. Per installare Chrootkit, il comando da dare è il seguente: # yum install chkrootkit Se volessimo eseguire una scansione manuale, non ci resta che dare il comando # chrootkit /directory o partizione Anche qui possiamo schedulare una scansione con report da ricevere tramite mail del tools, quindi la scansione anche in questo caso possiamo eseguirla settimanalmente pertando possiamo posizionarci in /etc/cron.weekly e creare il file chrootkit-scan.sh che conterrà giustamente lo script.
# cd /etc/cron.weekly # nano chrootkit-scan-sh Inseriamo ora queste righe
#!/bin/sh # Generatore data/ora stile: HH:mm dd/mm/YYYY data=$(date "+%H:%M %d/%m/%Y") # Indirizzo e-mail destinatario report email="tuaemail@mail.it" # Esegui WPScan ed invia report per e-mail
61
Web Server chkrootkit | /usr/sbin/ssmtp -s $email Bene ora abbiamo configurato tutti e tre i tools e entrambi possono scansionare e inviare una mail di verifica automaticamente. Vediamo ora però come installare un leggero server smtp in grado di fare questo lavoro, per l'occasione ho usato ssmtp. Scaricare SSMTP Per scaricare ssmtp dobbiamo disporre di wget, che abbiamo precedentemente installato, nel caso in cui non lo abbiate fatto ecco come farlo: # yum install wget Una volta installato, posizioniamoci nella cartella /tmp scarichiamo ssmtp # cd /tmp #wget https://dl.fedoraproject.org/pub/epel/6/x86_64/ssmtp-2.6121.el6.x86_64.rpm Terminato il download “che sarà molto veloce” installiamo il tool # rpm -Uvh ssmtp-2.61-21.el6x86_64.rpm Il file eseguibile verrà posizionato in /usr/sbin. Una volta installato configuriamolo con i parametri di posta desiderati, il file di configurazione lo troviamo in: # nano /etc/ssmtp/ssmtp.conf Mettiamo il simbolo # su tutte le voci e poi in fondo iniziamo ad inserire le seguenti voci di configurazione: root=vostroindirizzo@mail.it mailhub=server smtp:porta (se diversa dalla 25) AuthUser=utente autorizzato ad inviare mail AuthPass=password dell'utente RewriteDomain=dominio.doc Hostname=ftpsrv FromLineOvverride=YES UseSTARTTLS=YES UseTLS=YES (questo solo con gmail) AuthMethod=LOGIN (questo solo con gmail) TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt (questo solo con gmail)
62
Web Server Testiamo ora che tutto funzioni correttamente # ssmtp vostramail impostata sul file di conf to: vostramail impostata sul file di conf from: mail destinatario del messaggio Subject: test mail mail prova Per inviare la mail e chiudere usare la combinazione di tasti CTRL+D, se tutto funziona dovreste il destinatario riceverà una mail dal server. Ora abbiamo finito il nostro server FTP oltre ad essere configurabile in vari modi, è protetto e ci avvisa con l'invio delle mail.
63