Server FTP riveduto e corretto —
Visto che il precedente server FTP ha deciso di colpo di non funzionare più senza un apparente motivo, e che comunque era vecchiotto come SO Debian 7 (2013) ho deciso che era ora di rifare la macchina pertanto questo articolo è l’evoluzione di quanto scritto qui.
Visto che ho imparato diverse cose su systemd e adesso mi sta ancora più sullo stomaco la scelta del sistema operativo e’ caduta su Devuan che con ogni probabilità diventerà la mia distro di riferimento.
La macchina è sempre la solita dedicata a questo servizio, un Dell PowerEdge T100 con un HD SATA da 250 GB che ho partizionato in questo modo
/dev/sda1 63 4209029 4208967 2G b W95 FAT32
/dev/sda2 282,4M /boot
/dev/sda3 1,9G 82 Linux swap
├─/dev/sda5 23,3G /
├─/dev/sda6 18,6G /var
├─/dev/sda7 953M /tmp
├─/dev/sda8 1,4G /home
└─/dev/sda9 184,5G /jail
Installazione il più base possibile, vale a dire sistema base e server ssh, per avere un kernel un po più recente ho installato il kernel da backport ma francamente non era necessario.
Una volta installati e configurati i miei soliti tools per lavorare come mi piace (vim,gpm, postfix,logcheck, e poco altro) sono passato ad installare debootstrap, tool che in sostanza permette di creare un ambiente di lavoro completo in un ambiente chroot, vale a dire separato da quello della chiamiamola macchina padre.
L’operazione molto semplice da compiere una volta installato debootstrap da root dare questo comando
grecale:~# debootstrap jessie /jail http://auto.mirror.devuan.org/merged/
e una volta finito di installare tutte le sue cose propone autonomamente un mkdir /target/lib/modules che va modificato in mkdir /jail/lib/modules.
Modifichiamo adesso nella macchina padre il file /etc/fstab in modo che faccia l’automount del filesystem proc e il device devpts, aggiungiamo queste righe:
proc-chroot /jail/proc proc none 0 0
devpts /jail/dev/pts devpts defaults 0 0
e copiamo il file /etc/hosts in /jail/etc/hosts per configurare la rete.
Col comando chroot /jail ci spostiamo nell’ambiente chroot, e giusto come comodità aggiungiamo al .bashrc della root in jail questa riga:
PS1=’\[\e[1;31m\][\u@\h \W]\$\[\e[0m\] ‘
che colora di rosso il prompt in modo da capire al volo quando siamo in chroot e quando no.
Installiamo e configuriamo locales in chroot per non avere messaggi strani quando si lavora, e quindi installiamo proftpd, dopo di che aggiungiamo al file /etc/shell un /bin/false e con adduser aggiungiamo l’utente archivio, sostituendo in /etc/passwd la shell con /bin/false, cloniamo in /etc/passwd e shadow archivio come manager, e aggiungiamo manager anche a group, aggiorniamo la password di manager con passwd, questo serve ad avere un altro utente con la stessa home di archivio.
L’utente archivio sarà l’utente ftp vero e proprio, quello che viene dato ai clienti per prelevare o mettere materiale, l’utente manager è quello che usano all’interno della ditta e che ha permessi di lettura e scrittura ovunque nella directory deputata all’FTP, per non dare accesso di root agli utenti interni.
L’idea è quella di creare due directory all’interno della /home di archivio, una di download da cui prendere dati e una di upload in cui mettere dati quando necessario e di dare i permessi giusti ad entrambe in modo tale che per l’utente archivio sia possibile leggere ma non scrivere nella directory download e scrivere ma non leggere nella directory upload, in quanto essendo un unico login per diverse realtà non è il caso che chiunque possa vedere cosa viene mandato a noi.
In sostanza avremo una situazione di questo tipo:
/
|—home
|—archivio
|—download
|—upload
Ma all’utente apparirà una cosa di questo tipo
/
|—download
|—upload
perché imporremo nel file di configurazione di proftpd che la /home di archivio sia la sua root directory, in altre parole un chroot all’interno di un chroot, paranoia? Sì senza dubbio, si tratta solo di capire quanta essa sia, nel dubbio Si vis pacem para bellum.
Creiamo le directory con mkdir download upload quindi chown archivio.manager download e chown archivio.manager upload dopo di che rendiamo non leggibile all’utente archivio la directory upload con chmod -R u-r upload/ quindi rendiamo non scrivibile download all’autente archivio con un chmod -R u-w download e la rendiamo scrivibile al gruppo (manager) chmod -R g+w download se adesso diamo un:
[root@grecale archivio]# ls -al
drwxr-xr-x 4 archivio archivio 4096 apr 12 11:57 .
drwxr-xr-x 4 root root 4096 apr 9 07:59 ..
dr-xrwxr-x 2 archivio manager 4096 apr 13 14:21 download
d-wxrwxr-x 2 archivio manager 4096 apr 13 14:23 upload
E coi permessi siamo a posto, mettiamo a posto adesso il file di configurazione di proftpd che al solito si trova sotto /etc/proftpd
proftpd.conf
# Includes DSO modules
Include /etc/proftpd/modules.conf
# Set off to disable IPv6 support which is annoying on IPv4 only boxes.
UseIPv6 off
# If set on you can experience a longer connection delay in many cases.
IdentLookups off
ServerName “grecale”
ServerType standalone
ServerAdmin edp@zincometal.com
DeferWelcome off
MultilineRFC2228 on
DefaultServer on
ShowSymlinks on
TimeoutLogin 120
TimeoutNoTransfer 120
TimeoutStalled 240
TimeoutIdle 300
DisplayLogin .benvenuto
DisplayChdir filetodisplay true
ListOptions “-l”
DenyFilter \*.*/
# Use this to jail all users in their homes
DefaultRoot ~
# 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 xxx.xxx.xxx.xxx
# This is useful for masquerading address with dynamic IPs:
# refresh any configured MasqueradeAddress directives every 8 hours
<IfModule mod_dynmasq.c>
# DynMasqRefresh 28800
</IfModule>
MaxInstances 30
# Set the user and group that the server normally runs at.
User nobody
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
TransferLog /var/log/proftpd/xferlog
SystemLog /var/log/proftpd/proftpd.log
# Logging onto /var/log/lastlog is enabled but set to off by default
.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>
# A basic anonymous configuration, no upload directories.
# Include other custom configuration files
<Directory /*>
AllowOverwrite on
</Directory>
<Anonymous ~archivio>
AccessGrantMsg “Accesso consentito all’utente %u.”
AllowRetrieveRestart on
AllowStoreRestart off
ExtendedLog /var/log/proftpd/grecale.log read,write,auth
AnonRequirePassword yes
MaxClients 10 “È stato raggiunto il limite di utenti ammessi (%m).”
MaxClientsPerHost 1 “È già connesso 1 utente dal tuo dominio.”
RequireValidShell yes
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
<Limit READ>
DenyAll
</Limit>
<Limit DIRS>
AllowAll
</Limit>
</Directory>
<Directory /home/archivio/download>
<Limit STOR>
###
order deny,allow
Allow 192.168.2.0/24
AllowUser manager
Deny from all
###
DenyAll
</Limit>
</Directory>
<Directory /home/archivio/upload>
Umask 222
<Limit STOR>
AllowAll
</Limit>
<Limit READ>
DenyAll
</Limit>
</Directory>
</Anonymous>
Include /etc/proftpd/conf.d/
A questo punto si rilancia il demone proftpd e si fa un test con un browser ftp://xxx.xxx.xxx.xxx:21
Chiede login e password a cui si da archivio e pwarchivio e…
resta li senza fare piu’ un tubo…
Senza stare a spiegare tutta la storia nei log si trova questa scritta:
Passive data transfer failed, possibly due to network issues
grecale proftpd[4167] grecale.oceano.lan (sangiorgio.oceano.lan[192.168.2.237]): Check your PassivePorts and MasqueradeAddress settings,
grecale proftpd[4167] grecale.oceano.lan (sangiorgio.oceano.lan[192.168.2.237]): and any router, NAT, and firewall rules in the network path.
grecale proftpd[4167] grecale.oceano.lan (sangiorgio.oceano.lan[192.168.2.237]): FTP no transfer timeout, disconnected
grecale proftpd[4167] grecale.oceano.lan (sangiorgio.oceano.lan[192.168.2.237]): FTP session closed.
A farla breve per qualche strano motivo di sicurezza adesso lavora solo in modo passivo quindi dobbiamo scommentare le righe:
PassivePorts 49152 65534
e dato che grecale e dietro NAT anche
MasqueradeAddress xxx.xxx.xxx.xxx
dove xxx.xxx.xxx.xxx è l’indirizzo IP pubblico a cui si chiama il server FTP.
Si tratta quindi anche di modificare lo script di firewall permettendo il NAT delel porte passive, quindi il blocco regole di IPTABLES per l’FTP diventa qualcosa di simile a questo
### FTP RULES
$IPT -A INPUT -p tcp –dport 21 -j ACCEPT
$IPT -A INPUT -p tcp –dport 49152:65534 -j ACCEPT
$IPT -A FORWARD -i $EXTIF -p tcp –dport 21 -j ACCEPT
$IPT -A FORWARD -p tcp –dport 49152:65534 -j ACCEPT
$IPT -A OUTPUT -p tcp –sport 20 -j ACCEPT
$IPT -t nat -A PREROUTING -s 0/0 -i $EXTIF -p tcp -d $EXTIP –dport 21 -j DNAT \
–to-destination $GRECALE:21
$IPT -t nat -A PREROUTING -s 0/0 -i $EXTIF -p tcp -d $EXTIP –dport 49152:65534 -j DNAT \
–to-destination $GRECALE:49152-65534 #### NOTA MOLTO BENE per il –to-destination ci vuole il – (dash) e NON i : (colon) e ci ho messo 2 ore a capirlo…
Resta solo da far partire il server FTP in automatico quando si riavvia la macchina padre e, visto che il vecchio sistema a script di init funziona non vedo un solo motivo al mondo per cambiarlo, quindi nella macchina in chroot nella directry init.d andiamo a mettere questo script
e nella macchina padre questo script
ADDENDUM
Dopo qualche tempo mi chiamano dei colleghi e mi dicono che non riescono a collegarsi internamente al server mentre invece se escono su internet si collegano senza problemi, il proftpd.log dice:
2018-10-11 08:04:59,748 grecale proftpd[7549] grecale.oceano.lan (pc0.oceano.lan[192.168.2.254]): SECURITY VIOLATION: Passive connection from 192.168.2.237 rejected.
rapida ricerca tramite google e la soluzione è aggiungere queste tre voci:
IdentLookups off
UseReverseDNS off
AllowForeignAddress on
e anche dalla LAN si arriva al server senza problemi.
Categorised as: Linux | Sistemi operativi | Work
Comments are disabled on this post