Capitolo 3. File e file system
3.4. La sicurezza dei file
3.4.2. Gli strumenti
Una normale conseguenza dell'applicazione di rigidi permessi dei file (e qualche volta anche una
seccatura) è che i diritti d'accesso si dovranno cambiare per ogni genere di motivo. Per fare ciò
usiamo il comando chmod ed alla fine to chmod diventa un verbo inglese quasi accettabile,
significando il cambio delle modalità d'accesso ad un file. Il comando chmod può essere utilizzato
con opzioni alfanumeriche o numeriche come meglio ritenete.
L'esempio seguente usa le opzioni alfanumeriche per risolvere un problema che di solito si presenta
con i nuovi utenti:
asim:~> ./hello
bash: ./hello: bad interpreter: Permission denied
asim:~> cat hello #!/bin/bash
echo “Hello, World”
asim:~> ls -l hello
-rw-rw-r-- 1 asim asim 32 Jan 15 16:29 hello
asim:~> chmod u+x hello
asim:~> ./hello Hello, World
asim:~> ls -l hello
-rwxrw-r-- 1 asim asim 32 Jan 15 16:29 hello*
Gli operatori + e sono usati per concedere o negare un certo diritto ad un certo gruppo: sono
permesse combinazioni separate. Le pagine Info e man contengono degli utili esempi. Eccone qui
un altro che trasforma il file del precedente esempio in un file personale dell'utente asim:
asim:~> chmod u+rwx,go-rwx hello
asim:~> ls-l hello
-rwx--- 1 asim asim 32 Jan 15 16:29 hello*
Il tipo di problema manifestantesi in un messaggio di errore che dice che il permesso è negato da
qualche parte, normalmente dipende in molti casi da un problema con i privilegi d'accesso. Anche
commenti come “Ieri funzionava” o “Funziona quando lo avvio come root” derivano il più delle
volte da errati permessi dei file.
Usando chmod con argomenti numerici, i valori di ogni diritto d'accesso consentito devono essere
conteggiati insieme per gruppo. Così otteniamo un numero di tre cifre che è il valore simbolico
delle impostazioni create con chmod. La tabella seguente elenca le combinazioni più comuni:
Tabella 39. Protezione dei file con chmod
Comando Significato
chmod 400 file Per proteggere un file contro sovrascritture accidentali.
chmod 500 directory Per proteggervi da cancellazioni, ridenominazioni o spostamenti
accidentali di file da questa directory.
chmod 600 file Un file privato che può essere modificato solo dall'utente che ha
dato questo comando.
chmod 644 file Un file leggibile pubblicamente che può essere modificato solo
dall'utente che l'ha messo a disposizione.
chmod 660 file Gli utenti appartenenti al vostro gruppo possono modificare questo
file mentre gli altri non possono assolutamente accedervi.
chmod 700 file Protegge un file contro ogni accesso da parte degli altri utenti,
mentre l'utente proprietario ha ancora il pieno accesso.
chmod 755 directory Per file che dovrebbero essere leggibili ed eseguibili dagli altri, ma
modificabili solo dall'utente proprietario.
chmod 775 file Modalità standard per la condivisione di un file in un gruppo.
chmod 777 file Chiunque può fare di tutto su questo file.
Se inserite un numero con meno di tre cifre come argomento di chmod, i caratteri omessi vengono
rimpiazzati con degli zero a cominciare da sinistra. Effettivamente c'è una quarta cifra nei sistemi
Linux, che precede le prime tre ed imposta speciali modalità di accesso. Qualsiasi informazione su
ciò (e molto altro ancora) si trova nelle pagine Info.
3.4.2.2. Accesso ad un altro gruppo
appartenere, preceduti dai vostri nome utente e ID e dal nome del gruppo e ID con cui siete
correntemente connessi. Comunque in molti sistemi Linux potete essere attivamente collegati solo
con un gruppo alla volta. Di base questo gruppo attivo o primario è quello assegnatovi nel file
/etc/passwd. Il quarto campo di questo file contiene l'ID del gruppo primario degli utenti, che
si può ricercare nel file /etc/group. Un esempio:
asim:~> id
uid=501(asim) gid=501(asim) groups=100(users),501(asim),3400(web)
asim:~> grep asim /etc/passwd
asim:x:501:501:Asim El Baraka:/home/asim:/bin/bash
asim:~> grep 501 /etc/group asim:x:501:
Il quarto campo nella linea da /etc/passwd contiene il valore “501” che rappresenta il gruppo
asim nell'esempio precedente. Da /etc/group possiamo ottenere il nome corrispondente a
questo ID del gruppo. Quando si connette al sistema, questo è il gruppo a cui appartiene asim.
Schema del gruppo privato dell'utente
Per consentire una maggiore flessibilità, molti sistemi Linux seguono il cosiddetto user
private group scheme (o schema del gruppo privato dell'utente) che assegna ciascun
utente in primo luogo al proprio gruppo. Tale gruppo è un gruppo che contiene solo
questo particolare utente, da qui il nome “gruppo privato”. Normalmente questo gruppo
ha lo stesso nome del nome di login dell'utente, cosa che può creare una leggera
confusione.
A parte il proprio gruppo privato, l'utente asim può anche stare nei gruppi users e web. Poiché
questi sono gruppi secondari per tale utente, costui dovrà usare newgrp per registrarsi in uno di
questi gruppi (utilizzate gpasswd per impostare prima la password del gruppo). Nell'esempio, asim
deve creare file di proprietà del gruppo web.
asim:/var/www/html> newgrp web
asim:/var/www/html> id
uid=501(asim) gid=3400(web) groups=100(users),501(asim),3400(web)
Ora, quando asim creerà nuovi file, essi saranno di proprietà del gruppo web al posto del gruppo
asim:
asim:/var/www/html> touch test
asim:/var/www/html> ls -l test
-rw-rw-r-- 1 asim web 0 Jun 10 15:38 test
Registrarsi in un nuovo gruppo vi permette di evitare l'uso di chown (v. Sezione 3.4.2.4) o di
contattare il vostro amministratore di sistema per cambiare le proprietà per voi.
3.4.2.3. La “maschera” dei file
Quando si salva un file da qualche parte, questo per prima cosa viene sottoposto alla procedura
standard di sicurezza. I file senza permessi non esistono in Linux. I permessi dei file standard sono
stabiliti dalla mask (maschera) per la creazione di nuovi file. Il valore di questa maschera può essere
visualizzato mediante l'uso del comando umask:
bert:~> umask 0002Invece di aggiungere i valori simbolici a ciascuno, come con chmod, per calcolare i permessi su un
nuovo file questi devono essere sottratti dai diritti d'accesso totali possibili. Nell'esempio
precedente, comunque, vediamo 4 valori pur essendoci solo 3 categorie di permessi: user, group e
other. Il primo zero fa parte delle impostazioni speciali degli attributi dei file che tratteremo nelle
Sezioni 3.4.2.4 e 4.1.6. Potrebbe succedere che nel vostro sistema non venga neppure mostrato il
primo zero quando battete il comando umask e che vediate solo i tre numeri che rappresentano la
maschera di base per la creazione dei file.
Ogni sistema derivato da UNIX ha una funzione di sistema per la creazione di nuovi file, funzione
che viene chiamata ogni qualvolta un utente utilizza un programma che crea nuovi file, per
esempio, quando si scarica un file da internet, quando si salva un nuovo documento di testo e così
via. Questa funzione crea sia file che directory nuovi. Il permesso totale di leggere, scrivere ed
eseguire è concesso a tutti quando si crea una nuova directory. Quando invece si crea un nuovo file,
tale funzione concederà i permessi di lettura e scrittura a tutti ma non darà i permessi di esecuzione
a nessuno per tutte le categorie di utenti. Perciò, prima dell'applicazione della maschera, una
directory ha i permessi 777 o rwxrwxrwx e un semplice testo 666 o rwrwrw.
Il valore di umask viene sottratto da questi permessi base dopo che la funzione ha creato il nuovo
file o directory. Di conseguenza, se il valore della maschera è (0)002, una directory avrà di base i
permessi 775 e un file 664. Ciò viene mostrato nell'esempio seguente.
bert:~> mkdir newdir
bert:~> ls -ld newdir
drwxrwxr-x 2 bert bert 4096 Feb 28 13:45 newdir/
bert:~> touch newfile
bert:~> ls -l newfile
-rw-rw-r-- 1 bert bert 0 Feb 28 13:52 newfile
File contro directory
Normalmente una directory ha maggiori permessi: ha sempre il permesso di esecuzione
(execute). Se non l'avesse, essa sarebbe inaccessibile. Sperimentate ciò eseguendo
chmod 644 con una directory!
Se vi registrate in un altro gruppo utilizzando il comando newgrp, la maschera rimane invariata.
Così, se quest'ultima è impostata a 002, i file e le directory che creerete stando nel nuovo gruppo
saranno pure accessibili a tutti gli altri membri di esso: non avrete quindi bisogno di usare chmod.
L'utente root di base ha dei permessi di creazione dei file più ristretti:
[root@estoban root]# umask 022
Questi valori di base sono impostati per tutto il sistema nei file di configurazione delle risorse di
shell, per esempio /etc/bashrc oppure /etc/profile. Potete modificarli nel vostro file di
configurazione della shell (v. il capitolo 7 dedicato alla personalizzazione del vostro ambiente di
shell).
3.4.2.4. Cambiare le proprietà di utente e gruppo
Quando un file è posseduto da un utente o da un gruppo sbagliato, l'errore può essere corretto con i
comandi chown (change owner) e chgrp (change group). Cambiare la proprietà di un file è un
compito frequente di amministrazione del sistema in ambienti dove i file hanno la necessità di
essere condivisi all'interno di un gruppo. Entrambi i comandi sono molto flessibili, come potete
verificare ricorrendo all'opzione --help.
Il comando chown può essere impiegato per modificare le proprietà dell'utente e del gruppo,
mentre chgrp cambia solo la proprietà del gruppo. Naturalmente il sistema verificherà se l'utente
che fornisce uno di questi comandi ha sufficienti permessi sui file che intende modificare.
Per modificare l'appartenenza di un file ad un utente, usate questa sintassi:
chown newuser file
Se usate due punti (:) dopo il nome di utente (v. pagine Info), anche l'appartenenza al gruppo verrà
cambiata al gruppo primario dell'utente che fornisce il comando. In un sistema Linux ciascun
utente ha il proprio gruppo cosicché questo sistema può essere usato per rendere privati i file.
jacky:~> id
uid=1304(jacky) gid=(1304) groups=1304(jacky),2034(pproject)
jacky:~> ls -l my_report
-rw-rw-r-- 1 jacky project 29387 Jan 15 09:34 my_report
jacky:~> chown jacky: my_report
jacky:~> chmod o-r my_report
jacky:~> ls -l my_report
-rw-rw---- 1 jacky jacky 29387 Jan 15 09:34 my_report
Se jacky volesse condividere questo file, senza dare a nessuno il permesso di scriverlo, potrebbe
usare il comando chgrp:
jacky:~> ls -l report-20020115.xls
-rw-rw---- 1 jacky jacky 45635 Jan 15 09:35 report-20020115.xls
jacky:~> chgrp project report-20020115.xls
jacky:~> ls -l report-20020115.xls
-rw-rw---- 1 jacky project 45635 Jan 15 09:35 report-20020115.xls
In questo modo gli utenti del gruppo project potranno lavorare su questo file. Gli utenti estranei al
gruppo non avranno nulla a che fare con questo.
Sia chown che chgrp possono essere usati per cambiare le proprietà ricorsivamente usando
l'opzione R. In tal caso tutti file sottostanti e le sottodirectory di una data directory apparterranno a
quel dato utente e/o gruppo.
Restrizioni
In molti sistemi l'utilizzo dei comandi chown e chgrp è vietato agli utenti non
privilegiati. Se non siete gli amministratori di sistemi, non avrete la possibilità di
modificare utente e gruppo per ragioni di sicurezza. Se l'uso di questi comandi non
fosse limitato, utenti maliziosi potrebbero assegnare la proprietà, modificandola, dei file
ad altri utenti e/o gruppi e modificare il comportamento di quegli ambienti utenti e pure
causare danni ad altro file degli utenti.
3.4.2.5. Modi speciali
Per evitare che l'amministratore di sistema sia infastidito dal risolvere problemi di permessi per
tutto il tempo, possono essere concessi speciali diritti d'accesso a tutte le directory o a programmi
separati. Qui di seguito ci sono tre modi speciali:
●modo sticky bit: dopo l'esecuzione di un compito, il comando viene mantenuto nella
memoria di sistema. In origine questo era una funzione usata spesso per risparmiare
memoria: grandi job venivano caricati in memoria una sola volta. Ma oggigiorno la
memoria è economica e ci sono migliori tecniche per gestirla cosicché il modo non
viene più utilizzato per le sue capacità di ottimizzazione su singoli file. Se applicato
comunque ad un'intera directory, lo sticky bit assume un diverso significato. In tal
caso un utente può modificare file esistenti in questa directory quando è proprietario
del file oppure quando il file ha i permessi corretti. Questa funzione viene utilizzata
con directory come /var/tmp, che deve essere accessibile da chiunque, ma dove
non è appropriato per gli utenti modificare o cancellare i dati altrui. Lo sticky bit è
indicato con una t alla fine dell'elenco dei permessi sul file:
mark:~> ls -ld /var/tmp
drwxrwxrwt 19 root root 8192 Jan 16 10:37 /var/tmp/
Lo sticky bit si imposta utilizzando il comando chmod o+t directory. L'origine
storica della “t” si ritrova nella funzione UNIX save Text access.
●
SUID (set user ID) e SGID (set group ID): rappresentato dalla lettera s nel campo dei
permessi dell'utente o del gruppo. Quando un file eseguibile ha tale modalità
impostata, esso girerà con i permessi dell'utente e del gruppo invece che con quelli
dell'utente che batte il comando, dando così acceso alle risorse di sistema. Più avanti
discuteremo i ciò nel Capitolo 4.
●SGID (set group ID) su una directory: in questo caso speciale ogni file creato nella
directory avrà come gruppo proprietario lo stesso della directory (mentre il normale
comportamento sarebbe che i nuovi file fossero di proprietà dell'utente che li crea).
In questa maniera gli utenti non devono preoccuparsi delle proprietà di file quando
condividono directory
mimi:~> ls -ld /opt/docs
drwxrws--- 4 root users 4096 Jul 25 2001 docs/
mimi:~> ls -l /opt/docs
-rw-rw---- 1 mimi users 345672 Aug 30 2001-Council.doc
Questo è il modo normale di condividere file in UNIX.
I file esistenti non vengono modificati!
I file spostati in una directory SGID, ma creati altrove, mantengono i loro utenti e
gruppi proprietari. Ciò può confondere.
3.5. Sommario
Con UNIX, come con Linux, tutte le cose sono rappresentate in un modo o in un altro come file con
le loro corrette proprietà. L'uso di percorsi (predefiniti) consente agli utenti ed all'amministratore di
sistema di trovare, leggere e modificare i file.
Abbiamo compiuto i primi passi per diventare degli esperti: abbiamo trattato della struttura reale e
fittizia del file system ed ora sappiamo del modello Linux di sicurezza dei file come pure di diverse
altre precauzioni per la sicurezza che vanno adottate normalmente con ogni sistema.
La shell è il più importante strumento per interagire con il sistema. In questo capitolo abbiamo
appreso diversi comandi di shell, riportati nella tabella seguente.
Tabella 310. Nuovi comandi nel capitolo 3: i file ed il file system
Comando Significato
bash Programma GNU di shell.cat file(s) Invia il contenuto dei file allo standard output
cd directory Entra nella directory. cd è un comando integrato in bash.
chgrp newgroup file(s) Cambia il gruppo proprietario di file a newgroup
chown mode file Modifica i permessi di accesso nel file . chmod newowner[:[newgroup]] file(s) Modifica le proprietà di utente e gruppo del file cp sourcefile targetfile copia sourcefile con il nome targetfile df file Rapporto sullo spazio usato del disco nella partizione
contenente file. echo stringa Mostra una linea di testo
export Parte di sistema.bash che mostra le variabili ed i loro valori al file nomefile Determina il tipo di file di nomefile.
Comando Significato
find percorso espressione Trova file nella gerarchia del file system
grep PATTERN file Mostra le linee in file che contengono il modello (pattern) di ricerca
head file Invia la prima parte di file allo standard output id Stampa il nome e i gruppi dell'utente reale ed attuale info comando Mostra la documentazione relativa a comando less file Mostra file con un potente visualizzatore ln targetfile linkname Crea un collegamento di nome linkname a
targetfile.
locate stringadiricerca Mostra tutti i file accessibili che corrispondono al modello di ricerca.
ls file Stampa il contenuto della directory.
man comando Formatta e mostra le pagine del manuale (di sistema) in linea relative a comando.
mkdir nuovadir Crea una nuova directory vuota. mv vecchiofile nuovofile Rinomina o sposta vecchiofile. newgroup nomegruppo Registra in un nuovo gruppo
pwd Mostra la directory di lavoro attuale o corrente. quota Mostra l'utilizzo del disco e i limiti.
rm file Rimuove file e directory.
rmdir file Rimuove directory.
tail file Stampa l'ultima parte di file.
umask[valore] Mostra o cambia la modalità di creazione dei nuovi file. wc file Conta linee, parole e caratteri di file.
which comando Mostra l'intero percorso del comando.