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.


domenica 12 gennaio 2014

Gnome Shell e le Cartelle Colorate





Dalle mie parti, si narra una antica leggenda per cui un mio lontano prozio, dopo vent'anni di lavoro in un disordinato ufficio, fu il primo e unico vero inventore delle cartellette colorate.

Non penso che questa leggenda sia vera, e non ho mai apprezzato il monumento che il sindaco volle dedicare al mio prozio, ma qualche volta, quando gironzolo per il disco del mio portatile, mi intristisco di fronte alla visione di tante cartellette tutte uguali e tutte dello stesso colore.

Una volta succedeva anche coi files, ma adesso i sistemi sono praticamente tutti dotati di un comodo sistema, per ottenere delle stupende thunbnails.

Per le cartelle però questo non succede, c'è stato qualche timido tentativo, specialmente con KDE, ma il grosso della questione è ancora irrisolto.

È facile capire il perché:  tranne alcuni casi, come le foto o la musica, il sistema non sà cosa c'è in una cartella e se cerca di prendere qualche preview per rappresentarla, magari l'immagine non è significativa e rischia solo di creare confusione.

Ok, quindi il sistema non lo sa, ma noi si.

Per esempio nel mio caso, quando sono lanciato in un lavoro, riempio le scrivanie, sia quella reale che quella virtuale, di documenti vari, poi : la prima la ordino butto un po`di cose nel cestino e metto il rimanente in un armadio e per la seconda faccio esattamente la stessa cosa, mettendo le cose in un armadio chiamato Folders della mia HOME utente.

Così come leggenda narra, che il mio prozio, steso sulla comoda poltrona dell'ufficio e guardando il grigiore di quell'armadio, pensò alle cartellette colorate, realtà vuole che guardando quel maledetto Folders pieno di cartellette tutte uguali, il sottoscritto abbia voluto per forza fare qualcosa.

Una iconcina a testa

La prima cosa è cercare delle immagini piccole che rappresentino le singole attività.

Fare questo è facile facile, basta andare su Google Images, scegliere l'apposita voce di ricerca Clip art , inserire il nome della cartella (o qualcosa di simile), per esempio Android e si trova sempre un modo per descriverla, per esempio questo coso :



Possiamo scegliere jpg o png, altri formati sono accettati ma è meglio stare sul classico.

Se avete scelto la ricerca Clip Art, l'iconcina sarà di pochi pixel e se è troppo grande potete ridimensionarla con cura per farla diventare qualcosa attorno ai 256 pixel, ma le dimensioni esatte non sono molto importanti.

A questo punto salvatela nel folder Folders/Android, col nome .icon .

In sintesi le vostre icone saranno files nascosti all'interno del folder stesso con nome .icon e senza estensione, perché come dovreste ben sapere, Linux non si basa sulle estensioni ma sui magic numbers, per riconoscere il formato.

E chi glielo spiega a Gnome Shell ?

Ora che in ogni subfolder del folder "Folders", c'è una icon nascosta di nome ".icon" chi glielo spiega a Gnome Shell ?

Può spiegarglielo l'interfaccia grafica, tasto destro, proprietà, si clicca sull'iconcina e si sceglie.

Però è noioso e come al solito noi cerchiamo qualcosa di più semplice da farsi, con l'immancabile script di poche righe.

Le iconcine sono associate agli attributi del Virtual File System di Gnome, quindi cosa ci può essere di più comodo del comando : gvfs-set-attribute ?

Si può scrivere :

gvfs-set-attribute -t string "<path assoluto del folder>" metadata::custom-icon "file:<path assoluto dell'immagine>"

dove il significato di path assoluto del folder e path assoluto dell'immagine lo lascio intuire a voi.


Il solito script

Si và nella propria cartella Folders o in qualsiasi altra grigissima cartella della vostra HOME, dalla Documents alla Workspace alla Development eccetera e si lancia il solito script che abbiamo chiamato seticons, il quale sta nella classica /usr/local/bin, salvato come root ed accessibile in lettura ed esecuzione  da tutti (chmod 755) e il gioco è fatto !

Cosa manca ? Lo Script . Quindi eccolo qui :

#!/bin/bash
p=`pwd`
for i in *
do
  if [ -d "$i" ]
  then
    if [ -r "$i/.icon" ]
    then
      gvfs-set-attribute -t string "$p/$i" metadata::custom-icon "file://$p/$i/.icon"
    fi
  fi
done


Questo mette in p il path da cui lo lanciamo, quindi nel mio caso immaginiamo : /home/duraminga/Folders, ricerca tutti gli elementi che ci sono nella cartella, e quando trova un subfolder ( -d "$i" ) , si avventura cercando l'eventuale presenza di un file nascosto .icon ( -r "$i/.icon" ) e se lo trova allora esegue il set che nel caso del subfolder Android è :

gvfs-set-attribute -t string "/home/duraminga/Folders/Android" metadata:custom-icon "file:///home/duraminga/Folders/Android/.icon"

combinazione, proprio quello che ci serve per impostare le iconcine, quindi apriamo Folders, et voilà :



Se lo ingrandiamo un pochino possiamo anche vedere il dettaglio del numero di elementi nelle cartelle, con grande soddisfazione del mio prozio.