echo "Linux: Come impostare correttamente i Permessi di acceso a files e cartelle"; echo ""; echo " Guide Software: come installare Apache, MySQL, PHP, phpmyAdmin su computer Windows | Fabrizio Viscardi
Fabrizio Viscardi Logo
Guide per installare Software

Le Guide Software

I Permessi in Linux

Impostazioni ed uso dgli opportuni comandi
Tutti i sistemi Unix/Linux hanno una gestione standard dei permessi sui file, che rispecchia la natura di sistema operativo multiutente.
I permessi possono essere di lettura, scrittura e esecuzione e vengono differenziati sulla base della natura dell'utente rispetto al file o directory:
- utente proprietario owner del file
- gruppo proprietario owner group del file
- gli altri utenti others, che sono l'owner e non appartegono all'owner group.
Il permesso di esecuzione è necessario per poter accedere a delle directory e, ovviamente, permette l'esecuzione di file (script shell, perl, php, cgi; programmi binari compilati).

Per visualizzare i permessi di un file basta usare il comando ls -l che per ogni file da un output simile a:
-rwxr-xr-- 1 mark admins 77266 Dec 13 17:18 /bin/command.sh
La prima colonna, composta da 10 caratteri, descrive i permessi sul file /bin/command.sh.
Il primo carattere (nell'esempio: -) identifica il tipo di file (directory, pipe, block o char device, symlink...);
I successivi 3 caratteri identificano i permessi in lettura/scrittura/esecuzione dell'owner di /bin/command.sh (in questo caso l'owner mark ha tutti i permessi sul file: rwx );
I successivi 3 identificano i permessi del gruppo owner di /bin/command.sh (in questo caso il gruppo admins ha permesso di lettura ed esecuzione sul file: r-x );
I successivi 3 identificano i permessi di tutti gli altri utenti del sistema (in questo caso hanno solo il permesso di lettura: r-- ).
Le successive colonne nell'output di ls -l indicano l'owner, il gruppo, la dimensione in byte, la data di ultima modifica e il nome del file.

Per modificare i permessi dei file si usa il comando chmod che usa una duplice sintassi per indicare i permessi:
read - lettura: Flag r in symbolic mode; Valore 4 in octal mode
write - scrittuta: Flag w in symbolic mode; Valore 2 in octal mode
execute - esecuzione: Flag x in symbolic mode; Valore 1 in octal mode

Troubleshooting di programmi e permessi sui file

Tutti i programmi su un sistema Unix/Linux hanno i permessi di lettura e scrittura sul file system corrispondenti a quelli dell'utente di sistema, così come indicato in /etc/passwd, con cui vengono eseguiti.
Può capitare, provando a installare e lanciare programmi diversi, che questi non riescano ad essere eseguiti o non funzionino correttamente.
Come sempre, in caso di problemi, un controllo dei log è la prima operazione da compiere.
Relativamente spesso la causa è proprio la mancanza di permessi per poter leggere o scrivere file (configurazione, log, dati, librerie condivise ecc.).
A volte il programma cerca determinati file in posizioni dove non si trovano (in questi casi un link può rapidamente, e in modo un po' "sporco" risolvere il problema), a volte non ha i permessi di lettura su file di configurazione o di dati, o sulle directory che li contengono, in altri casi può cercare di scrivere (tipicamente log e dati) su directory o file dove l'utente che ha lanciato il programma (può essere anche un utente di sistema, che lo esegue automaticamente al boot) non ha permessi di scrittura.
Un esempio ricorrente è la configurazione di Apache per gestire siti web, aggiornati via ftp da diverse persone.
In questo caso l'utente con cui gira Apache (di solito nobody o apache) deve poter avere permessi di lettura sui file che compongono il sito web (e di esecuzione sulle relative directory).
Contemporaneamente gli utenti che si collegano via ftp, devono poter scrivere sulle loro home directory, che sono anche le home dei relativi server web.
Spesso, su Linus e su altri Unix, le home directory degli utenti sono in /home e sono leggibili solo dai rispettivi owner:
ls -l /home/  | grep bacco
drwx------    2 bacco    bacco       18384 Aug 24 04:02 bacco
Se Apache fosse configurato per avere il dominio www.bacco.it con le proprie pagine in /home/bacco, non riuscirebbe a visualizzare il sito Web per mancanza di permessi.
Questi andrebbero allargati all'utente con cui viene eseguito da Apache:
chmod -R 750 /home/bacco
chgrp -R apache /home/bacco

Ottenendo un funzionale:
drwxr-x---    2 bacco    apache       18384 Aug 24 04:02 bacco
A volte, in preda a pigrizia o vittime dell'inconsapevolezza, si può avere la tentazione di allargare al massimo i permessi sui file che servono al programma che vogliamo far funzionare a tutti i costi:
chmod -R 777 /home/bacco
Ottiene un funzionale ma poco sicuro:
drwxrwxrwx    2 bacco    bacco       18384 Aug 24 04:02 bacco
In questo modo Apache potrebbe tranquillamente visualizzare il sito di bacco, ma avrebbe anche permessi di scrittura non necessari, condivisi anche con tutti gli altri utenti del sistema, che avrebbero l'indebita possibilità di modificare le pagine di sito in /home/bacco.

comando 'chmod'

Modifica gli attributi di accesso su uno o più file. Solo il proprietario del file, o l'utente root, può modificarne gli attributi. E' un comando comune in tutti gli Unix e Linux.
chmod [opzioni] modo file
-c (--changes) Visualizza informazioni sui file che vengono modificati
-R (--recursive) Applica le modifiche alla directory indicata e a tutte le sue sottodirectory
--reference=file_origine Applica al file specificato nella riga di comando gli stessi permessi che ha file_origine
-f (--silent) Non stampa messaggi di errore sui file che non possono essere modificati

Esistono due diversi modi per definire i permessi su un file:

SYMBOLIC MODE
I permessi vengono definiti nella forma: chi-opcode-permesso.
CHI può essere:
u USER - Utente proprietario del file
g GROUP - Gruppo proprietario del file
o OTHER - Altri utenti
a ALL - Tutti gli utenti del sistema (default)
OPCODE può essere:
+ Aggiunge un permesso
- Rimuove un permesso
= Assegna un permesso (e rimuove tutti quelli non specificati)
PERMESSO può essere:
r READ - Lettura sul file
w WRITE - Scrittura sul file
x EXECUTE - Esecuzione del file (o apertura della directory)
s SET USER ID - Il file (comando) viene eseguito con i permessi dell'owner sul file system, anche quando viene eseguito da altri utenti. Questo attributo è a volte necessario in alcuni comandi lanciati da utenti normali che hanno accesso sul sistema con i permessi di root (es: traceroute).
t STICKY BIT - Normalmente un utente può cancellare tutti i file contenuti in una directory su cui ha permesso di scrittua, anche se non ha permessi di scrittura sul file stesso. Con lo Sticky bit impostato, ciò non è possibile: l'utente può cancellare il relativo file solo se ha permessi di scrittura sul file stesso
u Lascia i permessi correnti dell'utente owner
g Lascia i permessi correnti del gruppo owner
o Lascia i permessi correnti per gli altri utenti

OCTAL MODE
E' un metodo alternativo che permette di definire i permessi con un numero ottale composta da tre cifre:
la prima indica i permessi per l'utente owner, la seconda per il gruppo, la terza per gli altri.
I permessi vengono calcolati sommando i seguenti valori ottali:
4 - Lettura
2 - Scrittura
1 - Esecuzione.
In questo modo il permesso di lettura+scrittura+esecuzione si indica con il numero 7 (4+2+1), il permesso di lettura, esecuzione con 5 (4+1) e così via.
E' inoltre possibile indicare una quarta cifra (da far precedere alle 3 usuali) per permettere l'assegnamento dei seguenti permessi spciali:
4 - Imposta lo UserId per l'esecuzione
2 - Imposta il GroupID
1 - Imposta lo sticky bit.

Esempi
Per impostare i permessi totali all'owner, e solo in lettura a tutti gli altri si hanno le seguenti possibilità:
chmod 744 /home/file
chmod u=rwx,go=r /home/file


Per impostare permessi di sola lettura per l'owner e il group e nessun permesso per gli altri:
chmod 440 /home/file
chmod ug=r,o-rwx /home/file


Per impostare totali permessi per tutti gli utenti su un file:
chmod 777 /home/file
chmod ugo=rwx /home/file


Per impostare lo sticky bit su un file e permessi totali solo per l'owner e di sola lettura per il group:
chmod 1740 /home/file
chmod u=srwx,g=r,o-rwx


comando 'chown'

Modifica il proprietario di uno più file. Può essere fatto solo da root o dal proprietario corrente del file.
E' un comando comune in tutti gli Unix e Linux.
chown [opzioni] nuovo_proprietario file
chown [opzioni] nuovo_proprietario:nuovo_gruppo file

-c (--changes) Visualizza informazioni sui file che vengono modificati
-R (--recursive) Applica le modifiche alla directory indicata e a tutte le sue sottodirectory
--reference=file_origine Applica al file specificato nella riga di comando lo stesso proprietario che ha file_origine
-f (--silent) Non stampa messaggi di errore sui file che non possono essere modificati
-v (--verbose) Visualizza dettagliate informazioni su ogni file che chown tenta di modificare.

Esempi
chown al /var/tmp/alien Imposta al come propietario del file /var/tmp/alien
chown beppe:beppe /home/file Imposta owner beppe e group owner beppe al file /home/file.

comando 'chgrp'

Cambia l'owner group di un file o directory. Comando comune in tutti gli Unix.chgrp [opzioni] nuovo_gruppo file
-c (--changes) Visualizza informazioni sui file che vengono modificati
-R (--recursive) Applica le modifiche alla directory indicata e a tutte le sue sottodirectory
--reference=file_origine Applica al file specificato nella riga di comando lo stesso gruppo proprietario che ha file_origine
-f (--silent) Non stampa messaggi di errore sui file che non possono essere modificati
-v (--verbose) Visualizza dettagliate informazioni su ogni file che chown tenta di modificare.

Esempi
chgrp users /tmp/data Imposta users come owner group del file /tmp/data
chgrp -R wheel /tmp/datadir Imposta wheel come wonder group della directory /tmp/datadir e di tutti i file e le sottodirectory che contiene.

comando 'lsattr'

Visualizza gli attributi di un file su file system ext2/ext3.lsattr [opzioni] [nomefile]
-R visualizza ricorsivamente gli attributi dei file all'interno delle directory;
-V visualizza la versione del programma;
-a visalizza tutti i tipi di file, anche quelli nascosti;
-d visualizza le directory allo stesso modo degli altri file anzichè visualizzarne il contenuto;
-v visualizza la versione del file;

Esempio:
[azitti@pluto zabbix]$ lsattr zabbix.tar
s-S-i-dAc--t- zabbix.tar

E' possibile notare gli attributi particolari che sono settabili con il comando chattr

comando 'chattr'

'chattr' imposta gli attributi di un file su un file system linux di tipo ext2/ext3.
Andando a lavorare su particolari  attributi peculiari di questi file system chattr non è un comando unix standard.
chattr  [-RV] [-v versione ] [+/-= attrib]  file ...
-R Ricorsivo
-V Stampa gli attributi modificati
-v versione Imposta la versione di un file.

Attributi
a il file può essere aperto solo in append mode.
c il file è compresso/decompresso dal kernel su disco  
d Non verrà eseguito il backup su di esso dall' utility dump.
i Il file non può essere modificato in alcun modo.
s Il file è cancellato e i suoi blocchi sono azzerati e scritti su disco.
S I cambiamenti sono scritti in modo sincrono su disco
u Il file è cancellato e il suo contenuto è salvato per un eventuale ripristino.

NB: gli attributi 'c' ed 'u' non sono attualmente implementati.
Grazie al comando chattr è possibile fare in modo che un file non sia modificabile nemmeno da root, senza prima disabilitare il flag -i che permette di apportarvi dei cambiamenti.
Esempio:
[azitti@pluto azitti]$ chattr -i [nomefile]
Settando questo attributo, creare un link al file, rinominarlo, sovrascriverlo cancellarlo o aggiornarlo non sarà più possibile
Questa opzione risulta utile per aumentare la sicurezza del proprio sistema, rendendo non accidentalmente modificabili, per esempio, alcuni file di configurazione.

comando 'grpck'

Verifica l'integrità del file contenente i gruppi di sistema. Viene verificato che ogni entry nel file /etc/group oppure in /etc/gshadow abbia il corretto formato e i dati contenuti siano validi in caso contrario viene visualizzato un prompt che richede la cancellazione dell'intera linea contente errori. L'utility è in grado di verificare:
- la correttezza del numero di campi;
- l'unicità dei nomi di gruppo;
- la validità dell'elenco utenti e amministratori;

La sintassi è la seguente:
grpck [opzioni] [target]
-r: modalità read only;

Esempio:
root@Joker:~# grpck /etc/group
invalid group file entry
delete line `pippo'? y
grpck: the files have been updated
In questo esempio è stata riscontrata una linea non valida


Qualora il check abbia dato esito positivo non viene visualizzato alcun messaggio.

come usare CHMOD per creare un eseguibile da shell

Spesso occorre ripetere da shell una serie di comandi più volte, comportando così un inutile quanto fastidioso spreco di tempo nel dover riscrivere ogni volta le stesse linee di comando. Un trucco per automatizzare questa procedura è il seguente: si costruisce un file eseguibile da shell che riscrive ed esegue delle linee di comando nella sequenza da noi impostata, semplicemente lanciandolo da riga di comando.
Per semplicità creeremo un file che esegue una sola istruzione, ma supponete di avere molti comandi da eseguire spesso e capirete il vantaggio che si ottiene con questo metodo.
Il file che creeremo si chiama prova.sh:
# vi prova.sh
Adesso siete nell’editor di testo vi. Scriviamo ora una riga di comando che permette di elencare i file presenti nella posizione dalla quale eseguiamo il file prova.sh:
ls
Quindi premete INVIO, ESC, :wq
Adesso digitate da shell:
# chmod a+x prova.sh
Questo comando abilita tutti (a=all) all’esecuzione (x=eXecute) del file prova.sh
Se non lo digitate, provando ad eseguire il file prova.sh avreste in risposta una frase di permesso negato.
Ora non resta che eseguire il comando:
# ./prova.sh
Vi comparirà un listato dei file e delle directory situate nella posizione da cui lo avete eseguito.
Come sempre per saperne di più sull'uso di una comando, potete consultare l'help (# chmod --help) o il manuale (# man chmod).