FTP (ii) - ProFTP
ProFTPd és un servidor de transferència de fitxers (FTP) altament configurable amb llicència GPL que té el seu projecte a Projecte de ProFTPd.
ProFTPd utilitza un únic fitxer de configuració /etc/proftpd.conf
. Aquest fitxer de configuració és molt semblant al que té Apache
Un sol fitxer?
Bé, com gairebé tots els serveis, darrerament en distribucions Linux trobem la configuració en diversos fitxers. Alguns d'ells els posarem dins el directori conf.d tot i que el principal (i que els inclou) és el fitxer proftpd.conf.
ProFTPD ens permet, entre altres, crear usuaris virtuals, directoris virtuals, protegir l'accés a través d'adreces IP, i crear regles avançades, característiques que altres servidors FTP no ens donen.
Instal·lació
Per a instal·lar el servidor, en una màquina Ubuntu usarem les següents comandes havent iniciat sessió com a root (o havent fet sudo -s
o escrivint sudo
davant de les comandes)
apt-get update
apt install -y proftpd
I el client FTP?
És molt possible que ens falti instal·lar el client FTP per a fer proves localment. Per a poder instal·lar el client FTP i executar la comanda ftp
des de la shell caldrà executar la comanda
apt install ftp
Tenim fitxers de log?
Sí, al directori /var/log/proftpd
trobarem els fitxers controls.log
i proftpd.log
. Podem consultar aquest segon fitxer per a veure els intents de connexió.
ls -l /var/log/proftpd/
tail /var/log/proftpd/proftpd.log
Per a provar-ne el funcionament cal iniciar el servei i provar de connectar-nos des del client:
service proftpd start
ftp localhost
No inicia el servei proftpd?
Si el sistema detectés que el directori de configuració /etc/proftpd
i el dels logs /var/log/proftpd
tenen permís d'escriptura per a tothom no iniciaria el servei. En treballar en una màquina servidora real, no tenim aquest problema.
Els directoris són de root que és l'únic que els pot manipular.
ls -ld /etc/proftpd /var/log/proftpd
Podem veue que tenim el servei funcionant amb la comanda
systemctl status proftpd
Comprovem el funcionament
Podem veure els ports oberts amb la comanda ss
. El problema és que algunes màquines virtuals i contenidors poden no tenir l'aplicació instal·lada. Per a poder executar la comanda ss -n
pot ser que ens calgui instal·lar el paquet iproute2; podem fer-ho amb la comanda apt install iproute2
.
ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 *:21 *:*
Configuració bàsica
Configurarem el més bàsic per a poder treballar amb el servidor FTP.
Mirarem el fitxer proftpd.conf
, que podem trobar al directori del servidor /etc/proftpd
, i buscarem paràmetres interessants...
#
# /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file.
# To really apply changes, reload proftpd after modifications, if
# it runs in daemon mode. It is not required in inetd/xinetd mode.
#
# Includes DSO modules
Include /etc/proftpd/modules.conf
# Set off to disable IPv6 support which is annoying on IPv4 only boxes.
UseIPv6 on
# If set on you can experience a longer connection delay in many cases.
IdentLookups off
ServerName "Debian"
# Set to inetd only if you would proftpd by inetd/xinetd.
# Read README.Debian for more information on proper configuration.
ServerType standalone
DeferWelcome off
MultilineRFC2228 on
DefaultServer on
ShowSymlinks on
TimeoutNoTransfer 600
TimeoutStalled 600
TimeoutIdle 1200
DisplayLogin welcome.msg
DisplayChdir .message true
ListOptions "-l"
DenyFilter \*.*/
# Use this to jail all users in their homes
# DefaultRoot ~
# Users require a valid shell listed in /etc/shells to login.
# Use this directive to release that constrain.
# RequireValidShell off
# Port 21 is the standard FTP port.
Port 21
# In some cases you have to specify passive ports range to by-pass
# firewall limitations. Ephemeral ports can be used for that, but
# feel free to use a more narrow range.
# PassivePorts 49152 65534
# If your host was NATted, this option is useful in order to
# allow passive tranfers to work. You have to use your public
# address and opening the passive ports used on your firewall as well.
# MasqueradeAddress 1.2.3.4
# This is useful for masquerading address with dynamic IPs:
# refresh any configured MasqueradeAddress directives every 8 hours
<IfModule mod_dynmasq.c>
# DynMasqRefresh 28800
</IfModule>
# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd)
MaxInstances 30
# Set the user and group that the server normally runs at.
User proftpd
Group nogroup
# Umask 022 is a good standard umask to prevent new files and dirs
# (second parm) from being group and world writable.
Umask 022 022
# Normally, we want files to be overwriteable.
AllowOverwrite on
# Uncomment this if you are using NIS or LDAP via NSS to retrieve passwords:
# PersistentPasswd off
# This is required to use both PAM-based authentication and local passwords
# AuthOrder mod_auth_pam.c* mod_auth_unix.c
# Be warned: use of this directive impacts CPU average load!
# Uncomment this if you like to see progress and transfer rate with ftpwho
# in downloads. That is not needed for uploads rates.
#
# UseSendFile off
TransferLog /var/log/proftpd/xferlog
SystemLog /var/log/proftpd/proftpd.log
# Logging onto /var/log/lastlog is enabled but set to off by default
#UseLastlog on
# In order to keep log file dates consistent after chroot, use timezone info
# from /etc/localtime. If this is not set, and proftpd is configured to
# chroot (e.g. DefaultRoot or <Anonymous>), it will use the non-daylight
# savings timezone regardless of whether DST is in effect.
#SetEnv TZ :/etc/localtime
<IfModule mod_quotatab.c>
QuotaEngine off
</IfModule>
<IfModule mod_ratio.c>
Ratios off
</IfModule>
# Delay engine reduces impact of the so-called Timing Attack described in
# http://www.securityfocus.com/bid/11430/discuss
# It is on by default.
<IfModule mod_delay.c>
DelayEngine on
</IfModule>
<IfModule mod_ctrls.c>
ControlsEngine off
ControlsMaxClients 2
ControlsLog /var/log/proftpd/controls.log
ControlsInterval 5
ControlsSocket /var/run/proftpd/proftpd.sock
</IfModule>
<IfModule mod_ctrls_admin.c>
AdminControlsEngine off
</IfModule>
#
# Alternative authentication frameworks
#
#Include /etc/proftpd/ldap.conf
#Include /etc/proftpd/sql.conf
#
# This is used for FTPS connections
#
#Include /etc/proftpd/tls.conf
#
# Useful to keep VirtualHost/VirtualRoot directives separated
#
#Include /etc/proftpd/virtuals.conf
# A basic anonymous configuration, no upload directories.
# <Anonymous ~ftp>
# User ftp
# Group nogroup
# # We want clients to be able to login with "anonymous" as well as "ftp"
# UserAlias anonymous ftp
# # Cosmetic changes, all files belongs to ftp user
# DirFakeUser on ftp
# DirFakeGroup on ftp
#
# RequireValidShell off
#
# # Limit the maximum number of anonymous logins
# MaxClients 10
#
# # We want 'welcome.msg' displayed at login, and '.message' displayed
# # in each newly chdired directory.
# DisplayLogin welcome.msg
# DisplayChdir .message
#
# # Limit WRITE everywhere in the anonymous chroot
# <Directory *>
# <Limit WRITE>
# DenyAll
# </Limit>
# </Directory>
#
# # Uncomment this if you're brave.
# # <Directory incoming>
# # # Umask 022 is a good standard umask to prevent new files and dirs
# # # (second parm) from being group and world writable.
# # Umask 022 022
# # <Limit READ WRITE>
# # DenyAll
# # </Limit>
# # <Limit STOR>
# # AllowAll
# # </Limit>
# # </Directory>
#
# </Anonymous>
# Include other custom configuration files
# !! Please note, that this statement will read /all/ file from this subdir,
# i.e. backup files created by your editor, too !!!
# Eventually create file patterns like this: /etc/proftpd/conf.d/*.conf
#
Include /etc/proftpd/conf.d/
DefaultRoot
DefaultRoot [directori] [Grup d'usuaris als que se'ls aplicarà aquest directori per defecte]
Tip
De la mateixa manera que posem usuaris o grups, podem afegir al seu davant el signe d'exclamació (!) que el que farà serà negar l'usuari o grup.
Aquest paràmetre ens permet decidir quin directori veuran per defecte els usuaris tenint en compte que no podran accedir mai al directori pare del qual posem. Així doncs, quedaran engabiats (jail) dins d'aquest directori. Aquest paràmetre pot aparèixer més d'una vegada, ja que depenent d'uns o altres usuaris els podem deixar o no moure's per uns o altres directoris.
Exemples:
DefaultRoot ~
: tots els usuaris quedaran engabiats al seu directori HOME (~).DefaultRoot /home/ftp g1
: Els usuaris del grup g1 quedaran engabiats dins el directori /home/ftp i podran navegar dins d'ell sense sortir-se'n.DefaultRoot / g2
: Els usuaris del grup g2 podran moure's per tot l'arbre de directoris del sistema.
Fixeu-vos que el segon paràmetre, opcional, és el nom del grup, no pas de l'usuari
Creació d'usuaris
Per a crear un usuari en Linux utilitzarem la comanda useradd
de la següent forma.
useradd -m -s /bin/bash usuari001
Després cal posar-li password per tal que pugui entrar.
passwd usuari001
o bé
echo usuari001:usuari001 | chpasswd
Per a crear grups i usuaris podem executar el següent:
# Creacio de grups
groupadd grupftp1
groupadd grupftp2
# Creacio d'usauris en els grups anteriorment creats usuari001 i usuari002 (grupftp1) i usuaria001 i usuaria002 (grupftp2)
useradd -m -s /bin/bash -G grupftp1 usuari001 && echo usuari001:usuari001 | chpasswd
useradd -m -s /bin/bash -G grupftp1 usuari002 && echo usuari002:usuari002 | chpasswd
useradd -m -s /bin/bash -g grupftp2 usuaria001 && echo usuaria001:usuaria001 | chpasswd
useradd -m -s /bin/bash -g grupftp2 usuaria002 && echo usuaria002:usuaria002 | chpasswd
Per veure els usauris creats, comprovarem el fitxer /etc/passwd
:
tail /etc/passwd
ServerName
Ens permet donar un nom al servidor que serà el que apareixerà al missatge de connexió dels usuaris.
ServerName NomDelServidor
Accés d'usuaris locals
Per defecte tenim habilitat l'accés dels usuaris locals al servidor FTP, per tant, només ens cal crear alguns usuaris per a provar-ho.
# Creacio de grups
groupadd grupftp1
groupadd grupftp2
# Creacio d'usauris en els grups anteriorment creats usuari001 i usuari002 (grupftp1) i usuaria001 i usuaria002 (grupftp2)
useradd -m -s /bin/bash -G grupftp1 usuari001 && echo usuari001:usuari001 | chpasswd
useradd -m -s /bin/bash -G grupftp1 usuari002 && echo usuari002:usuari002 | chpasswd
useradd -m -s /bin/bash -g grupftp2 usuaria001 && echo usuaria001:usuaria001 | chpasswd
useradd -m -s /bin/bash -g grupftp2 usuaria002 && echo usuaria002:usuaria002 | chpasswd
Ara que tenim els usuaris usuari001 i usuari002 creats entrarem amb FTP. Veurem que el directori on estem és el /home/<nomUsuari>
amb la qual cosa podrem moure'ns per tot el sistema. Vegem-ho:
isard@ubuntu:~$ ftp localhost
Connected to localhost.
220 ProFTPD Server (Debian) [::ffff:127.0.0.1]
Name (localhost:isard): usuari001
331 Password required for usuari001
Password:
230 User usuari001 logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
Remote directory: /home/usuari001
ftp> cd /etc
250 CWD command successful
ftp> pwd
Remote directory: /etc
ftp> ls passwd
229 Entering Extended Passive Mode (|||3045|)
150 Opening ASCII mode data connection for file list
-rw-r--r-- 1 root root 2126 Jul 22 07:18 passwd
226 Transfer complete
ftp> bye
221 Goodbye.
Amb el consegüent problema del fet que algú que entri ja pot saber el nom de tots els usuaris del sistema.
Modificant el paràmetre DefaultRoot i afegint la línia DefaultRoot ~ usuari001
i reiniciant el servei, això ja quedaria resolt.
isard@ubuntu:~$ ftp localhost
Connected to localhost.
220 ProFTPD Server (Debian) [::ffff:127.0.0.1]
Name (localhost:isard): usuari001
331 Password required for usuari001
Password:
230 User usuari001 logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
Remote directory: /
ftp> cd /etc
550 /etc: No such file or directory
ftp> bye
221 Goodbye.
Limitem els usuaris locals
Per a definir quins usuaris poden i quins no poden iniciar sessió al nostre sistema o bé fer certes accions en directoris utilitzarem l'apartat, que is non hi és a nivell general, podem afegir-lo.
<Limit LOGIN>
</Limit>
AllowUser <usuari>
: Permet especificar un usuari concret a qui donem accés.DenyUser <usuari>
: Permet especificar un usuari concret a qui deneguem l'accés.AllowGroup <grup>
: Permet especificar un grup concret a qui donem accés.DenyAll
: Bloquegem l'accés a tots els usuaris excepte aquells que estiguin aAllowUser
.AllowAll
: Permet que els usuaris com anonymous es connectin a l'FTP.
No cal especificar tots els paràmetres. Anem a veure exemples:
- Permetem l'accés només a l'usuari usuari002
<Limit LOGIN>
AllowUser usuari002
DenyAll
</Limit>
<Limit LOGIN>
AllowAll
</Limit>
En directoris
Com hem comentat, podem limitar les accions a realitzar en un determinat directori utilitzant la directiva Limit
dins la directiva Directory
.
Com a exemple, suposem que volem deixar entrar en un directori determinat, /var/www
, només els usuaris del grup www
. A part de definir el grup web
i usuaris del grup web
podriem afegir el següent:
<Directory /var/www>
<Limit ALL>
Allow group www
DenyAll
</Limit>
</Directory>
Entrant com usuari001
no podem veure ni tant sols el nom del directori dins el llistat dels fitxers de /var
isard@ubuntu:/etc/proftpd/conf.d$ ftp localhost
Connected to localhost.
220 ProFTPD Server (Debian) [::ffff:127.0.0.1]
Name (localhost:isard): usuari001
331 Password required for usuari001
Password:
230 User usuari001 logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
Remote directory: /home/usuari001
ftp> ls /var
229 Entering Extended Passive Mode (|||34911|)
150 Opening ASCII mode data connection for file list
drwxr-xr-x 2 root root 4096 Jul 22 06:57 backups
drwxr-xr-x 16 root root 4096 Jul 17 10:12 cache
drwxrwxrwt 2 root root 4096 Feb 17 17:23 crash
drwxr-xr-x 42 root root 4096 Jul 18 11:19 lib
drwxrwsr-x 2 root staff 4096 Apr 18 2022 local
lrwxrwxrwx 1 root root 9 Feb 17 17:19 lock -> /run/lock
drwxrwxr-x 11 root syslog 4096 Jul 22 06:57 log
drwxrwsr-x 2 root mail 4096 Feb 17 17:19 mail
drwxr-xr-x 2 root root 4096 Feb 17 17:19 opt
lrwxrwxrwx 1 root root 4 Feb 17 17:19 run -> /run
drwxr-xr-x 5 root root 4096 Feb 17 17:25 snap
drwxr-xr-x 4 root root 4096 Feb 17 17:24 spool
drwxrwxrwt 7 root root 4096 Jul 22 07:39 tmp
226 Transfer complete
ftp> cd /var/www
550 /var/www: No such file or directory
ftp> bye
221 Goodbye.
Podem afegir-hi, a més, altres directives que defineixin l'usuari i el grup propietari del que posem/creem i els permisos per defecte dels fitxers i directoris. Aquests fitxers de configuració personal hem de posar-los al directori /etc/proftpd/conf.d/
. Al final el fitxer quedaria més o menys així:
<Directory /var/www>
Umask 0006 0007
DirFakeUser on unUsuari
DirFakeGroup on unGrup
UserOwner on www-data
GroupOwner on www-data
<Limit ALL>
AllowGroup www
DenyAll
</Limit>
</Directory>
UserOwner
i GroupOwner
poden no funcionar en contenidors
Si us dona error del tipus handling possibly truncated configuration data at line
, feu que el fitxer finalitzi amb una línia en blanc
Així, si tenim un usuari anomenat www
que pertany al grup www
podrem entrar al directori /var/www
isard@ubuntu:~$ ftp localhost
Connected to localhost.
220 ProFTPD Server (Debian) [::ffff:127.0.0.1]
Name (localhost:isard): www
331 Password required for www
Password:
230 User www logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
Remote directory: /home/www
ftp> cd /var/www
250 CWD command successful
ftp> ls
229 Entering Extended Passive Mode (|||21629|)
150 Opening ASCII mode data connection for file list
drwxr-xr-x 2 unUsuari unGrup 4096 Jul 18 17:28 daw1.cat
drwxr-xr-x 3 unUsuari unGrup 4096 Jul 19 11:46 html
drwxr-xr-x 2 unUsuari unGrup 4096 Jul 19 11:13 projecte1
drwxr-xr-x 2 unUsuari unGrup 4096 Jul 19 11:48 prova2
drwxr-xr-x 2 unUsuari unGrup 4096 Jul 19 12:00 prova3
226 Transfer complete
ftp> bye
221 Goodbye.
També podem fer que no es mogui del directori /var/www
si l'engabiem en aquest directori...
afegint al fitxer la línia
DefaultRoot /var/www www
isard@ubuntu:~$ ftp localhost
Connected to localhost.
220 ProFTPD Server (Debian) [::ffff:127.0.0.1]
Name (localhost:isard): www
331 Password required for www
Password:
230 User www logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
Remote directory: /
ftp> ls
229 Entering Extended Passive Mode (|||50639|)
150 Opening ASCII mode data connection for file list
drwxr-xr-x 2 unUsuari unGrup 4096 Jul 18 17:28 daw1.cat
drwxr-xr-x 3 unUsuari unGrup 4096 Jul 19 11:46 html
drwxr-xr-x 2 unUsuari unGrup 4096 Jul 19 11:13 projecte1
drwxr-xr-x 2 unUsuari unGrup 4096 Jul 19 11:48 prova2
drwxr-xr-x 2 unUsuari unGrup 4096 Jul 19 12:00 prova3
226 Transfer complete
ftp> bye
221 Goodbye.
Usuari anònim
Per a permetre les connexions anònimes cal configurar l'apartat de <Anonymous ~ftp>
sense limitar qui pot iniciar sessió de la següent forma:
<Anonymous ~ftp>
UserAlias anonymous ftp
RequireValidShell off
<Limit LOGIN>
AllowAll
</Limit>
</Anonymous>
En l'exemple anterior estem indicant que:
-
el directory pels usuaris anònims és el HOME de l'usuari
ftp
<Anonymous ~ftp>
-
també podem entrar amb un usuari anomenat
anonymous
, que és el mateix que entrar amb l'usuari real del sistemaftp
UserAlias anonymous ftp
-
com que l'usuari del sistema,
ftp
, està creat senese cap shell vàlida per entrar,isard@ubuntu:~$ grep ^ftp /etc/passwd ftp:x:115:65534::/srv/ftp:/usr/sbin/nologin
necessitem que es permeti inciar sessió a l'usuari que n tingui una shell vàlida
RequireValidShell off
Si mirem l'exemple que conté el fitxer de configuració proftpd.conf
podrem veure com limitar algunes accins a fer per aquest, o altres, usuaris.
El més normal és que els usuaris anònims no puguin pujar fitxers. Només permetem la descàrrega.