Dopo aver visionato come gestire i file, vediamo come gestire i permessi di file e directory. Qui va fatta un po’ di nozione su come Linux gestisce i files.
Abbiamo visto negli articoli precedenti che se diamo il comando “ll” o “ls -l” vedremo la lista del contenuto della directory interessata posta per colonne, la prima in particolare mostra solitamente una sequenza di tre lettere. Ad esempio:
-rwxrwxrwx 1 walter walter 11138982 feb 5 2016 BX200_UPDATE_MU02_BOOTABLE.zip*
-rw------- 1 walter walter 60 lug 11 15:56 .directory
-rw-rw-r-- 1 walter walter 81075 lug 11 14:57 feat-oruxmaps.png
drwxrwxr-x 9 walter walter 4096 mar 18 16:39 ISO/
-rw-rw-r-- 1 walter walter 657856 mag 31 15:29 libbit4xpki-amd64.deb
-rwxrwxrwx 1 walter root 3076 giu 25 2015 loremipsum.txt*
-rw-rw-r-- 1 walter walter 493950 lug 24 23:32 MalgaDauda.gpx
Come si nota si tratta della ripetizione di rwx che sta per r=read (lettura), w=write (scrittura), x=execution (esecuzione). Nel caso di una directory la sequenza è preceduta da una “d”. Questa sequenza viene ripetuta tre volte poiché tre sono i gruppi a cui possono essere associati tali permessi. Si tratta del gruppo User, Group e World/Other. I primi due sono espliciti, e li vediamo indicati poco dopo sulla medesima riga come “walter” per il gruppo User, mentre il secondo nell’esempio sopra varia, ed è il Group. Ad esempio il file loremipsum.txt ha come utente proprietario Walter mentre il gruppo appartiene a root. Il terzo gruppo come si vede non è elencato poiché significa “tutti gli altri“, ovvero si determina la tipologia di accesso a tutti gli utenti e gruppi non indicati specificatamente.
Ritornando su User/Group, ovviamente l’utente deve esistere nel sistema come il gruppo. Ma il gruppo, come fa intendere la parola, può contenere diversi utenti, vedremo fra poco come fare.
Prendendo in esame il file MalgaDauda.gpx ha nel caso di utente e gruppo i diritti di leggere e scrivere, mentre chiunque altro può solo leggere, ma ad esempio non può modificare o scrivere nel file. Nel caso invece di loremipsum.txt il file è, come si dice in gergo, “completamente aperto” poiché chiunque dei tre gruppi può leggere, scrivere e mandarlo in esecuzione qual’ora ci fossero delle istruzioni al suo interno. Questo passaggio deve essere ben compreso, poiché il gruppo Other (ovvero chiunque si possa collegare al computer, anche da remoto) avendo la facoltà di scrivere, potrebbe modificare tale file scrivendo delle istruzioni e mandarlo in esecuzione. Come si può intuire è una situazione pericolosa, in particolare se si tratta di un server pubblico e se tali files sono presenti nella cartella del vostro webserver!
Come si modificano i permessi?
La modifica avviene attraverso il comando “chmod” seguito dall’opzione di aggiunta o rimozione con i simboli + per aggiungere e – per togliere, associati al gruppo le cui lettere sono UGO (user, group, other), seguito dal file o directory interessata alla modifica. Facciamo un esempio pratico:
chmod +u rw -go rwx loreimpsum.txt
in questo caso abbiamo dato i permessi di lettura e scrittura al gruppo user, mentre abbiamo levato tutto a group e other. Occorre fare attenzione che questo comando è di tipo sottrattivo/aggiuntivo e non sostitutivo. Nell’esempio sopra se il file avesse avuto già in precedenza il permesso di esecuzione sul gruppo User, questo sarebbe rimasto e non sovrascritto.
Per levarlo avremmo dovuto scrivere:
chmod +u rw -u x -go rwx loreimpsum.txt
Per attuare una sovrascrittura totale si può utilizzare il sistema assoluto, che francamente trovo poco mnemonico. Seguendo questa tabella
0 ---
1 --x
2 -w-
3 -wx
4 r--
5 r-x
6 rw-
7 rwx
dove ad ogni numerazione segue una specifica azione, potremo dare agevolmente il comando:
chmod 600 loreimpsum.txt
Possiamo ovviamente dare tale comando ad un file in una posizione (path) diversa, oppure a gruppi di file, ad esempio selezionandoli per estensione. Oppure attraverso le espressioni regolari “catturare” i file che abbiano una ricorrenza ad esempio nel nome tipo:
chmod 600 lore*
Ovvero si applicherà a tutti i file che iniziano per “lore”.
Nel caso di una Directory possiamo oltre che cambiare i permessi alla cartella, cambiare contestualmente anche i permessi nei file in essa contenuti:
chmod -R 600 /path/mia/directory
in questo caso con l’opzione -R si da recursività ai sotto contenuti.
Può capitare che non possiamo cambiare i permessi di un file/cartella poiché questa appartiene all’utente root, in questo caso dobbiamo elevarci con il comando sudo, o nel caso di un utente specifico attraverso il comando su nomeutente. Ricordo che per vedere l’utente corrente con cui stiamo operando è utile il comando “who“.
Di seguito altre opzioni del comando chmod:
Uso: chmod [OPZIONE]... MODO[,MODO]... FILE...
o: chmod [OPZIONE]... MODO-OTTALE FILE...
o: chmod [OPZIONE]... --reference=RFILE FILE...
Change the mode of each FILE to MODE.
With --reference, change the mode of each FILE to that of RFILE.
-c, --changes like verbose but report only when a change is made
-f, --silent, --quiet suppress most error messages
-v, --verbose output a diagnostic for every file processed
--no-preserve-root do not treat '/' specially (the default)
--preserve-root fail to operate recursively on '/'
--reference=RFILE use RFILE's mode instead of MODE values
-R, --recursive change files and directories recursively
--help mostra questo aiuto ed esce
--version stampa le informazioni sulla versione ed esce
Each MODE is of the form '[ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+'.
Come si cambiano i permessi proprietario?
Abbiamo visto come cambiare i permessi relativi a scrittura/lettura/esecuzione, ma nel caso di User/Group è necessario il comando “chown“.
Il comando è piuttosto semplice nel suo utilizzo:
chown walter:root loremipsum.txt
Si può anche solo specificare l’utente e non il gruppo, mentre nel caso del gruppo l’utente deve essere sempre dichiarato. Se dichiariamo un utente o un gruppo non valido il comando viene abortito e segnalato quale utente o gruppo non risulta esistente nel sistema.
Parimenti a chmod, anche per questo comando è possibile indicare una directory o una path, così come l’utilizzo delle espressioni regolari. Anche in questo caso con l’opzione -R si ottiene la recursività dell’azione.
Di seguito altre opzioni per il comando chown:
Uso: chown [OPZIONE]... [PROPRIETARIO][:[GRUPPO]] FILE...
o: chown [OPZIONE]... --reference=RFILE FILE...
Change the owner and/or group of each FILE to OWNER and/or GROUP.
With --reference, change the owner and group of each FILE to those of RFILE.
-c, --changes like verbose but report only when a change is made
-f, --silent, --quiet suppress most error messages
-v, --verbose output a diagnostic for every file processed
--dereference affect the referent of each symbolic link (this is
the default), rather than the symbolic link itself
-h, --no-dereference affect symbolic links instead of any referenced file
(useful only on systems that can change the
ownership of a symlink)
--from=ATTUALE_PROPRIETARIO:ATTUALE_GRUPPO
cambia il proprietario o il gruppo di ogni file
solo se il suo attuale proprietario o gruppo
corrisponde a quello specificato qui. Ciascuno può
essere omesso, e in questo caso non è richiesto
che l'attributo mancante corrisponda
--no-preserve-root do not treat '/' specially (the default)
--preserve-root fail to operate recursively on '/'
--reference=RFILE use RFILE's owner and group rather than
specifying OWNER:GROUP values
-R, --recursive operate on files and directories recursively
The following options modify how a hierarchy is traversed when the -R
option is also specified. If more than one is specified, only the final
one takes effect.
-H if a command line argument is a symbolic link
to a directory, traverse it
-L traverse every symbolic link to a directory
encountered
-P do not traverse any symbolic links (default)
--help mostra questo aiuto ed esce
--version stampa le informazioni sulla versione ed esce
Owner is unchanged if missing. Group is unchanged if missing, but changed
to login group if implied by a ':' following a symbolic OWNER.
OWNER and GROUP may be numeric as well as symbolic.
Esempi:
chown root /u Cambia il proprietario di /u in "root".
chown root:staff /u Analogo, ma cambia anche il gruppo in "staff".
chown -hR root /u Cambia il proprietario di /u e dei file contenuti in "root".
Visionare i gruppi e/o aggiungere utenti ai gruppi.
All’inizio abbiamo visto come un file o una directory appartenga ad un specifico gruppo. Per visionare l’elenco dei gruppi e degli user si può effettuare un cat di due distinti file di sistema.
Per visionare gli utenti esistenti:
cat /etc/passwd
Per visionare i gruppi esistenti:
cat /etc/group
Nel caso dei gruppi vedremo appunto il gruppo, un id univoco e l’elenco, se presente, degli utenti appartenenti a quel gruppo.
Per aggiungere un utente ad un gruppo ci andremo ad avvalere del comando usermod.
usermod -a -G NomeGruppo Utente
E’ molto importante non dimenticare l’opzione -a (append) poiché questa aggiunge il gruppo all’utente, senza invece sostituisce eventuali gruppi presenti, tra cui quello primario, con l’effetto che l’utente di fatto perderà i permessi che aveva in precedenza. Ad esempio tale comando dato all’utente root può rivelarsi davvero pericoloso.
Altre opzioni di usermod:
Usage: usermod [options] LOGIN
Options:
-c, --comment COMMENT new value of the GECOS field
-d, --home HOME_DIR new home directory for the user account
-e, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE
-f, --inactive INACTIVE set password inactive after expiration
to INACTIVE
-g, --gid GROUP force use GROUP as new primary group
-G, --groups GROUPS new list of supplementary GROUPS
-a, --append append the user to the supplemental GROUPS
mentioned by the -G option without removing
him/her from other groups
-h, --help display this help message and exit
-l, --login NEW_LOGIN new value of the login name
-L, --lock lock the user account
-m, --move-home move contents of the home directory to the
new location (use only with -d)
-o, --non-unique allow using duplicate (non-unique) UID
-p, --password PASSWORD use encrypted password for the new password
-R, --root CHROOT_DIR directory to chroot into
-s, --shell SHELL new login shell for the user account
-u, --uid UID new UID for the user account
-U, --unlock unlock the user account
-v, --add-subuids FIRST-LAST add range of subordinate uids
-V, --del-subuids FIRST-LAST remove range of subordinate uids
-w, --add-subgids FIRST-LAST add range of subordinate gids
-W, --del-subgids FIRST-LAST remove range of subordinate gids
-Z, --selinux-user SEUSER new SELinux user mapping for the user account
Come abbiamo visto è possibile gestire nel dettaglio e in modo puntuale tutta la catena di permessi di un file o una directory. Inizialmente rispetto ad un sistema Windows può apparire complicato o difficile da ricordare, ma in seguito quando prenderete mano al sistema vi renderete conto che rispetto alle controparti Microsoft, la visione a colpo d’occhio e la gestione risulta essere molto più sicura.