martedì 21 gennaio 2014

Un posto lontano e tranquillo

Servizi e Cotillon

Oggi un sacco di gente gira con sti cosi rettangolari, che chiamano Tablet o anche Smartphones . Gente affamata di servizi online nuovissimi e di incredibile utilità, come la mail e lo spazio di storage.

Ricordo che la prima volta che mi presentarono Dropbox rimasi un quarto d'ora a cercare di capirne l'utilità. Cosa aveva questo servizio in più, di un server remoto dove mettere i miei files ? Soprattutto cosa aveva in meno ?

So che sono domande che uno non dovrebbe porsi, perché non sono più di moda e infatti dopo un po`di tempo, ecco apparire Google Drive, che ha fugato ogni dubbio.

Devo dire che ognuno dei due servizi ha proprie caratteristiche : entrambi offrono la sincronizzazione con un proprio protocollo proprietario, ma Google Drive, ha la tendenza a privilegiare, senza sorpresa, il lavoro puramente online.

Entrambi offrono uno spazio gratuito limitato, entrambi si impadroniscono del vostro tablet e telefono e se non ci state attenti, incominciano a copiare le vostre foto e i vostri documenti in remoto (assumendo che è quello che ovviamente volete).

Poi nel caso di Google Drive queste foto sono analizzate e indicizzate, in modo che se fate la scansione di una ricevuta, potete anche cercarla direttamente, perché è sicuramente questo quello che volete.

Con questo non voglio scoraggiarvi anzi vi invito, prima di cliccare su "Accetto", di leggervi anche le policy sulla privacy, così vi fate un quadro completo.

Se volete divertirvi c'è anche gente su Internet che consiglia di metterci le fotocopie dei documenti e della carta di credito, io vi consiglio anche di usare G+ e una password tipo 12345 che pare vada per la maggiore di questi tempi.

E se voglio farlo da me ?

Se volete farlo da voi, con Linux ci sono 3 cose di cui avete bisogno e senza le quali è difficile combinare qualcosa :

  • L'accesso al router ADSL per abilitare i virtual server.
  • Un serverino locale sempre acceso.
  • L'iscrizione a un servizio Dynamic DNS, se avete l'IP dinamico, se avete l'IP statico il Dynamic DNS non serve, basta l'indirizzo.

Oggi, la maggior parte di quelli che si collegano ad Internet, hanno a casa un routerino, che di solito permette anche l'accesso alle impostazioni di base.

L'iscrizione al Dynamic DNS è generalmente gratuita. Io consiglio questo che è : comodissimo, leggero, non richiede un programma apposta ed e fatto proprio per girare sul server Linux, dove c'è il vostro serizio di storage.

Pochi hanno a casa un computer sempre acceso, però ci sono oggettini come il Raspberry PI , che si possono sempre mettere da qualche parte con il loro bel IP fisso, la loro schedina interna da 8 Giga con su Debian (di solito più di quanto c'è sul telefono), con una o due chiavettine USB esterne da 32 giga per esempio.

Io ne ho messa una sola perché all'altra ho attaccato una stampante, facendola diventare una stampante di rete.

Ovviamente il mio Raspberry è pieno di altri servizi, compreso un Server Web con cui controllo una serie di Intranet of things, ma questo non è oggetto della corrente discussione.

L'oggetto della corrente discussione, è il servizio o server che andrebbe attivato per garantire un sistema comodo e sicuro.

FTP, SFTP, FTPS o ...

Il servizio che è sempre stato usato per trasferire i files da un computer all'altro si chiama "servizio di trasferimento files" o FTP.

FTP è sempre stato un protocollo molto "disinvolto" : il client apre una socket sulla porta 21 si autentica, rigorosamente in chiaro,= e comincia a fare richieste di liste e files al server, che addirittura dovrebbe rispondergli aprendo lui (il server) una socket verso il client, senza per altro chiedersi cosa ne pensa il NAT di tutto questo.

Altri tempi, subito aggirati con l'introduzione del protocollo passivo, che almeno inverte questo meccanismo e poi da un sacco di altre piccole cose, come i comandi estesi.

Quando hanno visto che tutto ciò non era abbastanza, perché le password e i dati passavano ancora in chiaro, hanno pensato di usare l'autenticazione TLS ed eventualmente di incapsulare il tutto in un bel tunnel SSL .

Il risultato finale è stato FTPS che è un ottimo protocollo, anche se richiede parecchio lavoro dal punto di vista della configurazione, compresa l'autenticazione di chiavi (che possono anche essere "self signed").

Dall'altra parte della barricata, si sono accorti che anche il sistema di accesso dei sistemi POSIX aveva seri problemi di sicurezza, visto che anche lì passava tutto in chiaro, allora hanno pensato a fare il passaggio inverso, cioè creare una specie di tunnel universale SSL, con varie possibilità di autenticazione e di farci passare dentro vari protocolli, tra i quali la classica shell , che hanno chiamato SSH.

Insieme alla shell, arrivano almeno SCP e SFTP.  Il primo è un comodo sistema di trasferimento rapido dei files tra macchine diverse, cioè la versione sicura di RCP ; il secondo non è FTP e non ha molto a che vedere con FTP , però è un protocollo binario, indipendente, piuttosto semplice da usare ed estremamente versatile.

Per tornare al RaspberryPI , SSH è già attivo e serve per accedervi da remoto.

Allo scopo di evitare problemi di installazione dei vari server FTP con tanto di chiavi e finte CA, ho scelto di semplificare le cose usando proprio SFTP.

Configurazione

La configurazione del server SSH o meglio del daemon sshd di solito è già li pronta per collegarsi. Ci si aggancia alla porta 22 e si comincia a ballare, permettendoci ogni forma di nefandezza, compreso l'accesso di root. Tanto è sicuro ...

Noi vogliamo come al solito strafare e scegliamo una alternativa.

Prima di tutto vogliamo avere due daemon sshd : uno interno alla nostra rete con il quale compiere le solite nefandezze e uno accessibile dall'esterno, con un solo utente e privilegi limitati.

Per far questo creiamo un utente che chiamiamo per esempio aristide, e gli affidiamo una password complicata di una decina di caratteri almeno, con maiuscole, minuscole e numeri, il tutto ovviamente da root.

# adduser aristide

Dobbiamo anche impedire al nostro amico aristide di collegarsi in login e questo lo facciamo da passwd, cioè :

# vi /etc/passwd

....
aristide:x:1001:1002:,,,:/home/aristide:/bin/false

e con lo user è stato creato anche un gruppo aristide di default.
Fatto questo andiamo in /etc/ssh e copiamo sshd_config in sshd_config_alt .

# cd /etc/ssh
# cp sshd_config sshd_config_alt

mi raccomando di ricordarvi la d perché l'altra è la configurazione del client.

A questo punto possiamo sentirci liberi di editare il file sshd_config_alt :

# vi sshd_config_alt

Qui parto da quello del Raspberry PI  e evidenzio le modifiche :

# Package generated configuration file
# See the sshd_config(5) manpage for details

# What ports, IPs and protocols we listen for

#Port 22 
Port 9345
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes

# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 768

# Logging
SyslogFacility AUTH
LogLevel INFO

# Authentication:
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile    %h/.ssh/authorized_keys

# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes

# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes

# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

#X11Forwarding yes
#X11DisplayOffset 10
 
X11Forwarding no
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no

#MaxStartups 10:30:60
#Banner /etc/issue.net

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

#Subsystem sftp /usr/lib/openssh/sftp-server

Subsystem sftp internal-sftp
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes


AllowUsers aristide
AllowTcpForwarding no
ForceCommand internal-sftp
ChrootDirectory /storage


Quello che abbiamo fatto è :
  1. Cambiare la porta su una porta sconosciuta, per esempio la 9345.
  2. Limitare l'accesso al solo utente aristide, che non ha la possibilità di loggarsi ma solo di eseguire le operazioni di trasferimento files.
  3. Disabilitare ogni forma di forwarding conosciuto.
  4. Eseguire un chroot nella cartella /storage per impedire l'accesso al resto del disco.
Però non abbiamo finito, ora dobbiamo anche creare lo spazio di lavoro.

Andiamo in /storage e creiamo la cartella disk, poi mettiamo a posto i permessi in questo modo :

# mkdir /storage
# mkdir /storage/disk
# chown root:root /storage
# chown aristide:aristide /storage/disk

i permessi dovrebbero essere di entrambe le cartelle 755 cioè rwxr-xr-x, se non lo sono impostatele di conseguenza.

Il motivo per cui è stata creata la cartella /storage usabile solo da root, è un motivo di sicurezza, se non fate così sshd si arrabbia e vi impedisce di loggarvi.

D'altra parte in una cartella simile, aristide non può scrivere, quindi predisponiamo una cartella leggibile e scrivibile da aristide.

Ora si può creare uno script di partenza o modificare rc.local , per inserirci la chiamata al programma , una cosa del genere :

# /usr/sbin/sshd -f /etc/ssh/sshd_config_alt

e parte immediatamente un secondo daemon fatto su misura per noi.

Per collegarsi, si può provare da un altro computer con un semplice :

sftp -P 9345 aristide@<ip del computer>

inserire la password e ci si dovrebbe trovare nella root di storage, dove ovviamente non si può scrivere, ma entrando in disk potremo fare quello che vogliamo.

Una chiavetta per lo storage

Come ho detto, uso un RaspberryPI per fare tutto ciò e uso una chiavetta esterna come spazio di storage.

È molto interessante perché la chiavetta, a differenza del disco classico, non gira e non si usura, quando non ci scrivete e questo tipo di micro server, sono ideali per funzionare proprio con una chiavetta.

Il problema è come montarla. Qui avete due alternative :
  • o la formattate etx2 e predisponete un fsck.ext2 -p  prima di montarla.
  • o la mantenete formattata FAT e modificate le opzioni di mount opportunamente.
Se usate un ext2 potete fare un mount in questo modo :

mount /dev/sda1 -o noatime,nosuid,nodev,rw /storage/disk/

Se usate la classica chiavetta con FAT senza riformattarla dovete aggiungere i parametri per i permessi :

mount /dev/sda1 -o \
noatime,nosuid,nodev,rw,uid=1001,gid=1002,fmask=137,dmask=027 /storage/disk/

impedendo così l'esecuzione dei programmi e permettendo l'accesso e la visione solo a root, con un controllo completo da parte dell'utente.

Ovviamente i numerini sono gli stessi che avete visto prima in passwd e relativi all'utente aristide.

Accedere da remoto

Per permettere di entrare sul serverino da remoto, ipotizzando che la nostra rete abbia un classico 192.168.1.0/24 , e che l'IP fisso del server sia 192.168.1.50, possiamo andare nella configurazione di rete del nostro router e aprire quella che si chiama virtual server.

Io lo faccio sul mio router che è un cosettino di una certa marca, fornito dal provider.


E quindi impostare una porta così :


poi andare da uno delle decine di Dynamic DNS che ci sono in giro, iscrivervi, sceglievi un nome e fargli puntare al vostro IP.

E ora che si fa ?

In Linux con nautilus per esempio, potete fare Ctrl-l e inserire nella barra del File Manager :

sftp://aristide@<ip>:9345/disk

per esempio dalla vostra lan :



Da remoto dovete metterci l'indirizzo IP fisso o il vostro indirizzo Internet virtuale se usate un Dynamic DNS .

Da Windows potete usare svariati client, il più famoso è il WinSCP .

Su Android c'è AndFTP che è un po` grezzo, dal punto di vista della grafica (specie se avete un tablet da 10 pollici), ma vi permette di caricare ciò che vi interessa o scaricarlo in una cartella predisposta, in modo che poi sia accessibile da un qualsiasi file manager, lo impostate così :



Potete per esempio prendere le vostre foto del telefono, nella cartella DCIM , selezionarle e copiarle nella cartella remota, poi con il tablet potete scaricarle in shared e vederle, oppure col PC potete caricare un FILM , e metterlo nella cartella, per poi scaricarlo nuovamente.

Insomma potete fare ciò che volete, l'unica nota dolente è che se usate come me un RaspberryPI con una chiavetta, l'upload è molto lento, anche in locale, mentre il download è sensibilmetne più veloce.


1 commento: