vsftpd

Esquema general ftp

  • decidir si volem permetre l'accés als comptes:
    • anònim
    • del sistema
    • virtuals
  • decidir si poden desplaçar-se fóra del seu directori privat
  • decidir si volem accés segur (xifrat) o no (sense certificat)

Generació de certificat

  • autosignat (per defecte: cert-ssl)
  • autosignat (openssl)
  • mkcert
  • certbot

comptes virtuals

L'ús de comptes virtuals se pot realitzar en base a:

  • fitxers (en local o remot)
  • base de dades relacional (local o remota)
  • servei d'autenticació (local o remot)

eines per gestionar les bases de dades locals en fitxers

  • db-util (debian) - Eines de Base de Dades de Berkeley
  • htpasswd - utilitat del paquet apache2-utils
  • ftpasswd - Utilitat del paquet proftpd

autenticació i autorització

A linux, la manera elegant de tractar l'autenticació per part de les aplicacions és fer servir el sistema PAM: l'aplicació incorpora la bibliteca PAM i després configura com gestiona l'accés amb un fitxer de configuració a /etc/pam.d

cas pràctic

Configuració del servidor vsftp per:

  • no permetre l'accéss al compte anònim
  • accés amb comptes virtuals
  • limitació de moviment al home dir (chroot)
  • accés amb certificat (autosignat per defecte: snakeoil)

creació de la base de dades

## creació bbdd (base de dades)
# el fitxer se genera a /tmp i s'elimina després de generar la base de dades

tee /tmp/virtuals.txt << EOF
demo01
passdemo01
demo02
passdemo02
EOF

sudo apt install -y db-util
sudo db_load -T -t hash -f /tmp/virtuals.txt /etc/vsftpd-virtual-user.db
sudo chmod 600 /etc/vsftpd-virtual-user.db 
rm /tmp/virtuals.txt 

creació del fitxer d'autenticació PAM

##
## generació de fitxers pam
##


sudo tee /etc/pam.d/vsftpd.virtual << EOF
#%PAM-1.0
auth       required     pam_userdb.so db=/etc/vsftpd-virtual-user
account    required     pam_userdb.so db=/etc/vsftpd-virtual-user
session    required     pam_loginuid.so
EOF

creació dels directoris

##
## Creació dels directoris
##

#> anònim
sudo mkdir -p /srv/ftp/pub
sudo tee /srv/ftp/pub/demo-anon.txt << EOF
hola k ase
EOF

sudo mkdir -p /etc/vsftp/virtual-users

#> comptes virtuals
for i in demo01 demo02; do
sudo mkdir -p /srv/ftp/virtuals/$i/data
sudo chown -R ftp:ftp /srv/ftp/virtuals/$i

sudo tee /etc/vsftp/virtual-users/$i << EOF
local_chroot=/srv/ftp/virtuals/$i/data
EOF
done

fitxer de configuració /etc/vsftpd.conf

### heredoc document sense substitució de variables: EOF entre cometes simples.
sudo tee /etc/vsftpd.conf << 'EOF'
## https://access.redhat.com/documentation/es-es/red_hat_enterprise_linux/4/html-single/reference_guide/index#ch-ftp
## https://manpages.debian.org/bookworm/vsftpd/vsftpd.conf.5.en.html
## http://slacksite.com/other/ftp.html
## https://www.zeppelinux.es/instalacion-y-configuracion-del-servidor-ftp-vsftpd-en-linux-debian/#an_n24

## https://tbellembois.github.io/VSFTPD.html
## https://puerto53.com/linux/configuracion-de-ftp-con-vsftp/


#### certificat: sí
#### accés: sols homedir (a.k.a. chroot)
#### comptes: anònim no + virtual users si + comptes sistema no
#### localitzacions:
#### - /srv/ftp/pub > anonim
#### - /srv/ftp/virtuals/comptexx > virtuals  
#### 

# funcionament: com engega el servei (obligatoris aquests dos i no se permet qualsevol combinació!!)
listen=NO
listen_ipv6=YES

# debug
# -- debian
#debug_ssl=YES

# anònim

# -- debian
anonymous_enable=NO
# -- rh
anon_mkdir_write_enable=NO
anon_root=/srv/ftp/pub
anon_upload_enable=NO
anon_world_readable_only=YES
ftp_username=ftp
no_anon_password=NO
# -- debian
allow_anon_ssl=NO
anon_other_write_enable=NO
no_anon_password=NO



# local_user

# -- rh
local_enable=YES
guest_enable=YES
guest_username=ftp
local_root=/srv/ftp/virtuals/$VIRTUALUSER/data
#local_umask
chmod_enable=NO
chroot_list_enable=NO
#chroot_list_file=
chroot_local_user=YES

user_config_dir=/etc/vsftpd/virtual-users
user_sub_token=$VIRTUALUSER

# Set the name of the PAM service vsftpd will use
pam_service_name=vsftpd.virtual
#pam_service_name=vsftpd.virtual-and-system

virtual_use_local_privs=YES
allow_writeable_chroot=YES



# cert - local
force_anon_data_ssl=NO
force_anon_logins_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES


ssl_enable=YES
ssl_request_cert=NO
ssl_tlsv1=YES


rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key


# -- ftps
# require_cert
# -- #


# transferències

download_enable=YES
chown_uploads=NO
chown_username=NO
write_enable=YES
# -- debian    
delete_failed_uploads=YES


# log

dual_log_enable=YES
log_ftp_protocol=YES
syslog_enable=NO
#vsftpd_log_file
xferlog_enable=YES
xferlog_file=/var/log/xferlog
#xferlog_std_format
EOF