{"id":1428,"date":"2018-04-13T15:05:13","date_gmt":"2018-04-13T13:05:13","guid":{"rendered":"http:\/\/clark.tipistrani.it\/?p=1428"},"modified":"2018-10-11T10:22:34","modified_gmt":"2018-10-11T08:22:34","slug":"server-ftp-riveduto-e-corretto","status":"publish","type":"post","link":"http:\/\/clark.tipistrani.it\/?p=1428","title":{"rendered":"Server FTP riveduto e corretto"},"content":{"rendered":"<p>Visto che il precedente server FTP ha deciso di colpo di non funzionare pi\u00f9 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 \u00e8 l&#8217;evoluzione di quanto scritto <a href=\"http:\/\/clark.tipistrani.it\/?p=28\">qui<\/a>.<br \/>\nVisto che ho imparato diverse cose su systemd e adesso mi sta ancora pi\u00f9 sullo stomaco la scelta del sistema operativo e&#8217; caduta su Devuan che con ogni probabilit\u00e0 diventer\u00e0 la mia distro di riferimento.<br \/>\nLa macchina \u00e8 sempre la solita dedicata a questo servizio, un Dell PowerEdge T100 con un HD SATA da 250 GB che ho partizionato in questo modo<\/p>\n<p>\/dev\/sda1 63 4209029 4208967 2G b W95 FAT32<br \/>\n\/dev\/sda2\u00a0 282,4M \/boot<br \/>\n\/dev\/sda3 1,9G 82 Linux swap<br \/>\n\u251c\u2500\/dev\/sda5 23,3G\u00a0 \/<br \/>\n\u251c\u2500\/dev\/sda6 18,6G\u00a0 \/var<br \/>\n\u251c\u2500\/dev\/sda7\u00a0 953M \/tmp<br \/>\n\u251c\u2500\/dev\/sda8\u00a0 1,4G \/home<br \/>\n\u2514\u2500\/dev\/sda9 184,5G \/jail<br \/>\nInstallazione il pi\u00f9 base possibile, vale a dire sistema base e server ssh, per avere un kernel un po pi\u00f9 recente ho installato il kernel da backport ma francamente non era necessario.<br \/>\nUna 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.<br \/>\nL&#8217;operazione molto semplice da compiere una volta installato debootstrap\u00a0 da root dare questo comando<br \/>\ngrecale:~# debootstrap jessie \/jail http:\/\/auto.mirror.devuan.org\/merged\/<br \/>\ne una volta finito di installare tutte le sue cose propone autonomamente un\u00a0 mkdir \/target\/lib\/modules che va modificato in mkdir \/jail\/lib\/modules.<br \/>\nModifichiamo adesso nella macchina padre il file \/etc\/fstab in modo che faccia l&#8217;automount del filesystem proc e il device devpts, aggiungiamo queste righe:<br \/>\nproc-chroot \/jail\/proc proc none 0 0<br \/>\ndevpts \/jail\/dev\/pts devpts defaults 0 0<br \/>\ne copiamo il file \/etc\/hosts in \/jail\/etc\/hosts per configurare la rete.<br \/>\nCol comando chroot \/jail ci spostiamo nell&#8217;ambiente chroot, e giusto come comodit\u00e0 aggiungiamo al .bashrc della root in jail questa riga:<br \/>\nPS1=&#8217;\\[\\e[1;31m\\][\\u@\\h \\W]\\$\\[\\e[0m\\] &#8216;<br \/>\nche colora di rosso il prompt in modo da capire al volo quando siamo in chroot e quando no.<br \/>\nInstalliamo 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&#8217;utente\u00a0 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.<br \/>\nL&#8217;utente archivio sar\u00e0 l&#8217;utente ftp vero e proprio, quello che viene dato ai clienti per prelevare o mettere materiale, l&#8217;utente manager \u00e8 quello che usano all&#8217;interno della ditta e che ha permessi di lettura e scrittura ovunque nella directory deputata all&#8217;FTP, per non dare accesso di root agli utenti interni.<br \/>\nL&#8217;idea \u00e8 quella di creare due directory all&#8217;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&#8217;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\u00e0 non \u00e8 il caso che chiunque possa vedere cosa viene mandato a noi.<br \/>\nIn sostanza avremo una situazione di questo tipo:<br \/>\n\/<br \/>\n|&#8212;home<br \/>\n|&#8212;archivio<br \/>\n|&#8212;download<br \/>\n|&#8212;upload<\/p>\n<p>Ma all&#8217;utente apparir\u00e0 una cosa di questo tipo<\/p>\n<p>\/<br \/>\n|&#8212;download<br \/>\n|&#8212;upload<br \/>\nperch\u00e9 imporremo nel file di configurazione di proftpd che la \/home di archivio sia la sua root directory, in altre parole un chroot all&#8217;interno di un chroot, paranoia? S\u00ec senza dubbio, si tratta solo di capire quanta essa sia, nel dubbio Si vis pacem para bellum.<br \/>\nCreiamo le directory con mkdir download upload quindi chown archivio.manager download e chown archivio.manager upload dopo di che rendiamo non leggibile all&#8217;utente archivio\u00a0 la directory upload con chmod -R u-r upload\/\u00a0 quindi rendiamo non scrivibile download all&#8217;autente archivio con un chmod -R u-w download\u00a0 e la rendiamo scrivibile al gruppo (manager) chmod -R g+w download\u00a0 se adesso diamo un:<br \/>\n[root@grecale archivio]# ls -al<\/p>\n<p>drwxr-xr-x 4 archivio archivio 4096 apr 12 11:57 .<br \/>\ndrwxr-xr-x 4 root root 4096 apr 9 07:59 ..<br \/>\ndr-xrwxr-x 2 archivio manager 4096 apr 13 14:21 download<br \/>\nd-wxrwxr-x 2 archivio manager 4096 apr 13 14:23 upload<br \/>\nE coi permessi siamo a posto, mettiamo a posto adesso il file di configurazione di proftpd che al solito si trova sotto \/etc\/proftpd<br \/>\nproftpd.conf<\/p>\n<p>&nbsp;<\/p>\n<p># Includes DSO modules<br \/>\nInclude \/etc\/proftpd\/modules.conf<\/p>\n<p># Set off to disable IPv6 support which is annoying on IPv4 only boxes.<br \/>\nUseIPv6 off<br \/>\n# If set on you can experience a longer connection delay in many cases.<br \/>\nIdentLookups off<\/p>\n<p>ServerName &#8220;grecale&#8221;<br \/>\nServerType standalone<br \/>\nServerAdmin edp@zincometal.com<br \/>\nDeferWelcome off<\/p>\n<p>MultilineRFC2228 on<br \/>\nDefaultServer on<br \/>\nShowSymlinks on<\/p>\n<p>TimeoutLogin 120<br \/>\nTimeoutNoTransfer 120<br \/>\nTimeoutStalled 240<br \/>\nTimeoutIdle 300<\/p>\n<p>DisplayLogin .benvenuto<br \/>\nDisplayChdir filetodisplay true<\/p>\n<p>ListOptions &#8220;-l&#8221;<\/p>\n<p>DenyFilter \\*.*\/<\/p>\n<p># Use this to jail all users in their homes<br \/>\nDefaultRoot ~<\/p>\n<p># Port 21 is the standard FTP port.<br \/>\nPort 21<\/p>\n<p># In some cases you have to specify passive ports range to by-pass<br \/>\n# firewall limitations. Ephemeral ports can be used for that, but<br \/>\n# feel free to use a more narrow range.<br \/>\n#PassivePorts 49152 65534<\/p>\n<p># If your host was NATted, this option is useful in order to<br \/>\n# allow passive tranfers to work. You have to use your public<br \/>\n# address and opening the passive ports used on your firewall as well.<br \/>\n# MasqueradeAddress xxx.xxx.xxx.xxx<\/p>\n<p># This is useful for masquerading address with dynamic IPs:<br \/>\n# refresh any configured MasqueradeAddress directives every 8 hours<br \/>\n&lt;IfModule mod_dynmasq.c&gt;<br \/>\n# DynMasqRefresh 28800<br \/>\n&lt;\/IfModule&gt;<\/p>\n<p>MaxInstances 30<\/p>\n<p># Set the user and group that the server normally runs at.<br \/>\nUser nobody<br \/>\nGroup nogroup<\/p>\n<p># Umask 022 is a good standard umask to prevent new files and dirs<br \/>\n# (second parm) from being group and world writable.<br \/>\nUmask 022 022<br \/>\n# Normally, we want files to be overwriteable.<br \/>\nAllowOverwrite on<\/p>\n<p>&nbsp;<\/p>\n<p>TransferLog \/var\/log\/proftpd\/xferlog<br \/>\nSystemLog \/var\/log\/proftpd\/proftpd.log<\/p>\n<p># Logging onto \/var\/log\/lastlog is enabled but set to off by default<br \/>\n.c&gt;<br \/>\nQuotaEngine off<br \/>\n&lt;\/IfModule&gt;<\/p>\n<p>&lt;IfModule mod_ratio.c&gt;<br \/>\nRatios off<br \/>\n&lt;\/IfModule&gt;<\/p>\n<p>&nbsp;<\/p>\n<p># Delay engine reduces impact of the so-called Timing Attack described in<br \/>\n# http:\/\/www.securityfocus.com\/bid\/11430\/discuss<br \/>\n# It is on by default.<br \/>\n&lt;IfModule mod_delay.c&gt;<br \/>\nDelayEngine on<br \/>\n&lt;\/IfModule&gt;<\/p>\n<p>&lt;IfModule mod_ctrls.c&gt;<br \/>\nControlsEngine off<br \/>\nControlsMaxClients 2<br \/>\nControlsLog \/var\/log\/proftpd\/controls.log<br \/>\nControlsInterval 5<br \/>\nControlsSocket \/var\/run\/proftpd\/proftpd.sock<br \/>\n&lt;\/IfModule&gt;<\/p>\n<p>&lt;IfModule mod_ctrls_admin.c&gt;<br \/>\nAdminControlsEngine off<\/p>\n<p>&lt;\/IfModule&gt;<\/p>\n<p>&nbsp;<\/p>\n<p># A basic anonymous configuration, no upload directories.<\/p>\n<p>&nbsp;<\/p>\n<p># Include other custom configuration files<br \/>\n&lt;Directory \/*&gt;<br \/>\nAllowOverwrite on<br \/>\n&lt;\/Directory&gt;<br \/>\n&lt;Anonymous ~archivio&gt;<br \/>\nAccessGrantMsg &#8220;Accesso consentito all&#8217;utente %u.&#8221;<br \/>\nAllowRetrieveRestart on<br \/>\nAllowStoreRestart off<br \/>\nExtendedLog \/var\/log\/proftpd\/grecale.log read,write,auth<br \/>\nAnonRequirePassword yes<br \/>\nMaxClients 10 &#8220;\u00c8 stato raggiunto il limite di utenti ammessi (%m).&#8221;<br \/>\nMaxClientsPerHost 1 &#8220;\u00c8 gi\u00e0 connesso 1 utente dal tuo dominio.&#8221;<br \/>\nRequireValidShell yes<\/p>\n<p>&lt;Directory *&gt;<br \/>\n&lt;Limit WRITE&gt;<br \/>\nDenyAll<br \/>\n&lt;\/Limit&gt;<\/p>\n<p>&lt;Limit READ&gt;<br \/>\nDenyAll<br \/>\n&lt;\/Limit&gt;<\/p>\n<p>&lt;Limit DIRS&gt;<br \/>\nAllowAll<br \/>\n&lt;\/Limit&gt;<br \/>\n&lt;\/Directory&gt;<\/p>\n<p>&lt;Directory \/home\/archivio\/download&gt;<br \/>\n&lt;Limit STOR&gt;<br \/>\n###<br \/>\norder deny,allow<br \/>\nAllow 192.168.2.0\/24<br \/>\nAllowUser manager<br \/>\nDeny from all<br \/>\n###<br \/>\nDenyAll<br \/>\n&lt;\/Limit&gt;<br \/>\n&lt;\/Directory&gt;<\/p>\n<p>&lt;Directory \/home\/archivio\/upload&gt;<br \/>\nUmask 222<br \/>\n&lt;Limit STOR&gt;<br \/>\nAllowAll<br \/>\n&lt;\/Limit&gt;<br \/>\n&lt;Limit READ&gt;<br \/>\nDenyAll<br \/>\n&lt;\/Limit&gt;<\/p>\n<p>&lt;\/Directory&gt;<br \/>\n&lt;\/Anonymous&gt;<\/p>\n<p>Include \/etc\/proftpd\/conf.d\/<\/p>\n<p>A questo punto si rilancia il demone proftpd e si fa un test con un browser ftp:\/\/xxx.xxx.xxx.xxx:21<\/p>\n<p>Chiede login e password a cui si da archivio e pwarchivio e&#8230;<br \/>\nresta li senza fare piu&#8217; un tubo&#8230;<br \/>\nSenza stare a spiegare tutta la storia nei log si trova questa scritta:<\/p>\n<p>Passive data transfer failed, possibly due to network issues<br \/>\ngrecale proftpd[4167] grecale.oceano.lan (sangiorgio.oceano.lan[192.168.2.237]): Check your PassivePorts and MasqueradeAddress settings,<br \/>\ngrecale proftpd[4167] grecale.oceano.lan (sangiorgio.oceano.lan[192.168.2.237]): and any router, NAT, and firewall rules in the network path.<br \/>\ngrecale proftpd[4167] grecale.oceano.lan (sangiorgio.oceano.lan[192.168.2.237]): FTP no transfer timeout, disconnected<br \/>\ngrecale proftpd[4167] grecale.oceano.lan (sangiorgio.oceano.lan[192.168.2.237]): FTP session closed.<br \/>\nA farla breve per qualche strano motivo di sicurezza adesso lavora solo in modo passivo quindi dobbiamo scommentare le righe:<br \/>\nPassivePorts 49152 65534<br \/>\ne dato che grecale e dietro NAT anche<\/p>\n<p>MasqueradeAddress xxx.xxx.xxx.xxx<br \/>\ndove xxx.xxx.xxx.xxx \u00e8 l&#8217;indirizzo IP pubblico a cui si chiama il server FTP.<br \/>\nSi tratta quindi anche di modificare lo script di firewall permettendo il NAT delel porte passive, quindi il blocco regole di IPTABLES per l&#8217;FTP diventa qualcosa di simile a questo<br \/>\n### FTP RULES<br \/>\n$IPT -A INPUT -p tcp &#8211;dport 21 -j ACCEPT<br \/>\n$IPT -A INPUT -p tcp &#8211;dport 49152:65534 -j ACCEPT<br \/>\n$IPT -A FORWARD -i $EXTIF -p tcp &#8211;dport 21 -j ACCEPT<br \/>\n$IPT -A FORWARD -p tcp &#8211;dport 49152:65534 -j ACCEPT<br \/>\n$IPT -A OUTPUT -p tcp &#8211;sport 20 -j ACCEPT<br \/>\n$IPT -t nat -A PREROUTING -s 0\/0 -i $EXTIF -p tcp -d $EXTIP &#8211;dport 21 -j DNAT \\<br \/>\n&#8211;to-destination $GRECALE:21<br \/>\n$IPT -t nat -A PREROUTING -s 0\/0 -i $EXTIF -p tcp -d $EXTIP &#8211;dport 49152:65534 -j DNAT \\<\/p>\n<p>&#8211;to-destination $GRECALE:49152-65534 #### NOTA MOLTO BENE per il &#8211;to-destination ci vuole il &#8211; (dash) e NON i : (colon) e ci ho messo 2 ore a capirlo&#8230;<br \/>\nResta 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 <a href=\"http:\/\/clark.tipistrani.it\/?p=42\">script<\/a><br \/>\ne nella macchina padre questo <a href=\"http:\/\/clark.tipistrani.it\/?p=40\">script<\/a><\/p>\n<p>ADDENDUM<\/p>\n<p>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:<br \/>\n2018-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.<br \/>\nrapida ricerca tramite google e la soluzione \u00e8 aggiungere queste tre voci:<\/p>\n<p>IdentLookups off<br \/>\nUseReverseDNS off<br \/>\nAllowForeignAddress on<br \/>\ne anche dalla LAN si arriva al server senza problemi.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Visto che il precedente server FTP ha deciso di colpo di non funzionare pi\u00f9 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 \u00e8 l&#8217;evoluzione di quanto scritto qui. Visto che ho imparato diverse cose su systemd e [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,7,6],"tags":[53,121,119,120,122],"class_list":["post-1428","post","type-post","status-publish","format-standard","hentry","category-linux","category-sistemi-operativi","category-work","tag-chroot","tag-debootstrap","tag-ftp","tag-jail","tag-proftpd"],"_links":{"self":[{"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/posts\/1428","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1428"}],"version-history":[{"count":9,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/posts\/1428\/revisions"}],"predecessor-version":[{"id":1493,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=\/wp\/v2\/posts\/1428\/revisions\/1493"}],"wp:attachment":[{"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1428"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/clark.tipistrani.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}