Salta el contingut

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>
Afegint dins el que permetem i el que no a partir de les següents opcions:

  • 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 a AllowUser.
  • 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>
- Permetem l'accés a tothom incloses les connexions anònimes

<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í:

/etc/proftpd/conf.d/var_www.conf
<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>

UserOwneri GroupOwnerpoden 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

Exemple de connexió
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/wwwsi l'engabiem en aquest directori...

afegint al fitxer la línia

DefaultRoot /var/www www
Exemple de connexió
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 sistema ftp

    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.