Site icon Tosolini.info

Guida ai comandi Linux: Permessi sui file

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.

Exit mobile version