devdev / in the loop

Creare un server FTP usando Amazon S3

$ useradd -d /home/ec2-user/s3mount -s /sbin/nologin nomeutente
$ passwd nomeutente
Cambio password per l'utente nomeutente.

 

In questo post vedremo come tirare un server FTP utilizzando una istanza Amazon EC2 che sincronizza automaticamente  i dati verso un bucket Amazon S3. Questa soluzione dirty-cheap sfrutta la libreria s3fs che ci permette in sostanza di montare un bucket S3 come un volume locale, usando il celebre FUSE e di eseguire letture/scritture senza alcun problemi, proprio come se i file fossero in locale. Configureremo successivamente un server FTP basato sul collaudato vsftpd  per interagire dall’esterno con l’istanza EC2.

Perché S3?

Amazon S3 è una garanzia, un pilastro del cloud object storage ed offre una durabilità del 99,999999999% (ci basta?) e ci permette di non avere alcun limite di storage. Costruiremo, in effetti, un backup server FTP con storage illimitato.

Perché FTP?

FTP non è un protocollo sicuro, ma è stabile, perfettamente compatibile con App di qualsiasi genere. A fornire maggiore protezione ci penseremo noi sfruttando le potenzialità dei Security Group di Amazon EC2. Per il momento concentriamoci sulla costruzione del servizio, pensando in futuro all’implementazione di un FTP-sicuro (FTPS) oppure un SFTP via SSH.

Come funziona s3fs

Gli hard disk locali, SAN o iSCSI conservano le informazioni come blocchi. Questo significa che potenzialmente, ogni memoria di questo tipo potrebbe funzionare universalmente con un sistema operativo Unix. Amazon S3, invece, è costruita sul concetto di object storage, per questo non direttamente compatibile con un sistema operativo standard.

La libreria s3fs risolve questo problema: si occupa di emulare come un filesystem locale (sul quale possiamo creare, cancellare, rinominare i file, etc.) un object storage remoto.

Ci siamo, abbiamo capito come trasferire i file sulla nostra istanza EC2, tramite il protocollo FTP, e come poi spostare questi file su Amazon S3, tramite la libreria s3fs. Procediamo allora.

Installiamo e configuriamo s3fs

Come root, procediamo all’installazione dei pacchetti di supporto:

# sudo su
# yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel

Scarichiamo e compiliamo s3fs:

git clone https://github.com/s3fs-fuse/s3fs-fuse.git
cd s3fs-fuse
./autogen.sh
./configure
make
make install

A questo punto, aggiungiamo le nostre credenziali AWS al file auto-discovery:

# echo LA_NOSTRA_AWS_KEY:IL_NOSTRO_AWS_SECRET > ~/.passwd-s3fs
# chmod 640 ~/.passwd-s3fs

Creiamo una directory, che sarà quella automaticamente sincronizzata con un bucket S3:

# mkdir s3mount
# cd s3mount
# pwd
/home/ec2-user/s3mount

La nostra directory /home/ec2-user/s3mount , quindi, farà la magia.

Procediamo quindi a montare, come fosse un comune volume, il nostro bucket backupBucket (che abbiamo creato in precedenza) puntandolo proprio a questa directory:

/usr/local/bin/s3fs backupBucket /home/ec2-user/s3mount -o nonempty -o allow_other

Controlliamo che il volume sia montato correttamente:

# mount | grep s3fs
s3fs on /home/ec2-user/s3mount type fuse.s3fs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)

Perfetto. Facciamo una piccola prova. Creiamo un file vuoto e controlliamo dalla console AWS S3 che questo file ci sia:

# touch /home/ec2-user/s3mount/prova.txt

Installiamo vsftpd

Sempre come root, installiamo il pacchetto vsftpd :

# yum install vsftpd
Plugin abilitati:priorities, update-motd, upgrade-helper
amzn-main                                                                                           | 2.1 kB  00:00:00     
amzn-updates                                                                                        | 2.5 kB  00:00:00     
Risoluzione dipendenze
--> Esecuzione del controllo di transazione
---> Pacchetto vsftpd.x86_64 0:2.2.2-13.13.amzn1 settato per essere installato
--> Risoluzione delle dipendenze completata

Dipendenze risolte

===========================================================================================================================
 Package                  Arch                     Versione                              Repository                   Dim.
===========================================================================================================================
Installazione:
 vsftpd                   x86_64                   2.2.2-13.13.amzn1                     amzn-main                   161 k

Riepilogo della transazione
===========================================================================================================================
Install  1 Pacchetto

Dimensione totale del download: 161 k
Dimensione installata: 320 k
Is this ok [y/d/N]: y
Downloading packages:
vsftpd-2.2.2-13.13.amzn1.x86_64.rpm                                                                 | 161 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installazione     : vsftpd-2.2.2-13.13.amzn1.x86_64                                                                  1/1 
  Verifica in corso : vsftpd-2.2.2-13.13.amzn1.x86_64                                                                  1/1 

Installato:
  vsftpd.x86_64 0:2.2.2-13.13.amzn1                                                                                        

Completo!

Procediamo subito alla sua configurazione editando il file vsftpd.conf :

vi /etc/vsftpd/vsftpd.conf

Impostiamo il file come segue. Possiamo configurarlo a piacimento, ma ricordiamoci di impostare local_enable=YES : permetterà a tutti gli utenti locali di accedere all’FTP.

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
chroot_local_user=YES
pam_service_name=vsftpd
tcp_wrappers=YES
pasv_enable=YES
pasv_min_port=15393
pasv_max_port=15592
port_enable=YES

Salviamo il file e lanciamo vsftpd:

# /etc/init.d/vsftpd restart
Arresto di vsftpd:                                         [  OK  ]
Avvio di vsftpd per vsftpd:                                [  OK  ]

Lanciamo vsftp al boot

Per sopravvivere al reboot, configuriamo il lancio all’avvio:

sudo chkconfig --level 345 vsftpd on

Apriamo le porte necessarie

Ricordiamoci di aprire le porte 20-21 e il range 15393-15592 nel Security Group dell’istanza! Decidiamo se “aprire a tutto il mondo” o stringere l’accesso ad uno o più indirizzi IP.

Creiamo un utente FTP

A questo punto, non ci resta che creare l’utente FTP con il quale effettueremo il login sul server FTP:

# useradd -d /home/ec2-user/s3mount -s /sbin/nologin nomeutente
useradd: attenzione: la directory home esiste già.
Non verrà copiato nessun file dalla directory skel.
# passwd nomeutente
Cambio password per l'utente nomeutente.

Impostiamo quindi i permessi sulla sua directory per evitare problemi:

# sudo chmod 755 /home/ec2-user
# sudo chmod 755 /home/ec2-user/s3mount
# chown -R nomeutente:nomeutente /home/ec2-user/s3mount/

Fatto. A questo punto, proviamo a collegarci all’IP pubblico della nostra istanza EC2 e proviamo ad eseguire l’upload di un file, lo troveremo nel nostro bucket Amazon S3!

Questo articolo ti è stato utile?
Server – LETTURA 7 MINUTI Il comando du, esempi e flag
Il comando du è uno standard Linux/Unix (e Mac) che ci permette di ottenere informazioni su file e cartelle in…
Server – LETTURA 5 MINUTI rsync: come escludere file e cartelle
Rsync (Remote sync) è uno strumento molto potente per poter sincronizzare due cartelle, e per poter effettuare backup incrementali. In…
Server – LETTURA 4 MINUTI Come bloccare un IP con .htaccess
Bloccare l’accesso ad un sito può essere utile per vari motivi: bloccare script malevoli, proteggersi dagli stalker o da quegli…
Server – LETTURA 12 MINUTI Che cos’è la High Availability
In questi anni stiamo vedendo un incremento verticale delle strutture ad alta efficacia, sia in termini di performance che di…
Roba figa da
if (weekend) {
    relax();
}
la nostra newsletter, ogni tanto.