File/Directories sicuri usando ACL (Access Control Lists) in Linux

Come amministratore di sistema, la nostra prima priorità sarà proteggere e garantire la sicurezza dei dati da accessi non autorizzati. Siamo tutti consapevoli delle autorizzazioni che impostiamo utilizzando alcuni utili comandi Linux come chmod, chown, chgrp… ecc. Tuttavia, questi set di autorizzazioni predefinite hanno alcune limitazioni e a volte potrebbero non funzionare come richiesto. Ad esempio, non possiamo impostare set di autorizzazioni diversi per utenti diversi sulla stessa directory o file. Perciò, sono stati implementati Liste di Controllo degli Accessi (ACL).

Linux Access Control Lists

Supponiamo di avere tre utenti, ‘tecmint1’, ‘tecmint2’ e ‘tecmint3’. Ognuno con un gruppo comune chiamato ‘acl’. L’utente ‘tecmint1’ desidera che solo l’utente ‘tecmint2’ possa leggere ed accedere ai file di proprietà di ‘tecmint1’ e nessun altro debba avere alcun accesso su di essi.

Le ACL (Liste di Controllo degli Accessi) ci permettono di fare lo stesso trucco. Queste ACL ci permettono di concedere autorizzazioni per un utente, gruppo e qualsiasi gruppo di utenti che non sono nella lista dei gruppi di un utente.

Nota: Secondo la Documentazione dei Prodotti Redhat, fornisce il supporto ACL per il file system ext3 e i file system NFS esportati.

Come verificare il supporto ACL nei sistemi Linux

Prima di procedere, è necessario verificare il supporto per le ACL sul Kernel corrente e sui file system montati.

1. Verifica del Supporto ACL nel Kernel.

Esegui il seguente comando per verificare il supporto ACL per il sistema di file e l’opzione POSIX_ACL=Y (se invece c’è N anziché Y, significa che il kernel non supporta l’ACL e deve essere ricompilato).

[root@linux ~]# grep -i acl /boot/config*

CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_GENERIC_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_CIFS_ACL=y
CONFIG_9P_FS_POSIX_ACL=y

2. Verifica dei pacchetti richiesti

Prima di iniziare a lavorare con le ACL, assicurati di avere installati i pacchetti richiesti. Di seguito sono elencati i pacchetti necessari da installare tramite yum o apt-get.

[root@linux ~]# yum install nfs4-acl-tools acl libacl		[on RedHat based systems]
[tecmint@linux ~]$ sudo apt-get install nfs4-acl-tools acl	[on Debian based systems]

3. Verifica del supporto per le ACL nel file system montato

Ora, controlla il file system montato per verificare se è montato con l’opzione di ACL o meno. Possiamo utilizzare il comando ‘mount’ per verificare la stessa cosa come indicato di seguito.

[root@linux ~]# mount  | grep -i root

/dev/mapper/fedora-root on / type ext4 (rw,relatime,data=ordered)

Ma nel nostro caso non sta mostrando acl per impostazione predefinita. Quindi, successivamente abbiamo l’opzione di rimonatere nuovamente la partizione montata utilizzando l’opzione acl. Ma, prima di procedere, abbiamo un’altra opzione per assicurarci che la partizione sia montata con l’opzione acl o meno, poiché per i sistemi recenti potrebbe essere integrata con l’opzione di montaggio predefinita.

[root@linux ~]# tune2fs -l /dev/mapper/fedora-root | grep acl

Default mount options:    user_xattr acl

Nella precedente visualizzazione, puoi vedere che l’opzione di montaggio predefinita ha già il supporto per acl. Un’altra opzione è rimontare la partizione come indicato di seguito.

[root@linux ~]# mount -o remount,acl /

Successivamente, aggiungi l’ingresso seguente al file ‘/etc/fstab’ per renderlo permanente.

/dev/mapper/fedora-root /	ext4    defaults,acl 1 1

Rimonta nuovamente la partizione.

[root@linux ~]# mount -o remount  /

4. Per il server NFS

Per il server NFS, se il file system esportato dal server NFS supporta ACL e le ACL possono essere lette dai client NFS, allora le ACL sono utilizzate dal sistema client.

Per disabilitare gli ACL sulla condivisione NFS, è necessario aggiungere l’opzione “no_acl” nel file ‘/etc/exportfs‘ sul server NFS. Per disabilitarli nuovamente sul lato del client NFS, utilizzare l’opzione “no_acl” durante il montaggio.

Come Implementare il Supporto agli ACL nei Sistemi Linux

Ci sono due tipi di ACL:

  1. ACL di Accesso: Gli ACL di Accesso vengono utilizzati per concedere autorizzazioni su qualsiasi file o directory.
  2. ACL Predefiniti: Gli ACL predefiniti vengono utilizzati per concedere/impostare una lista di controllo degli accessi su una specifica directory soltanto.

Differenza tra ACL di Accesso e ACL Predefiniti:

  1. Gli ACL predefiniti possono essere utilizzati solo a livello di directory.
  2. Qualsiasi sotto-directory o file creato all’interno di quella directory erediterà gli ACL dal suo directory principale. D’altra parte, un file eredita gli ACL predefiniti come i suoi ACL di accesso.
  3. Facciamo uso della flag “–d” per impostare gli ACL predefiniti e gli ACL predefiniti sono opzionali.
Prima di Impostare gli ACL Predefiniti

Per determinare gli ACL predefiniti per un file o directory specifica, utilizzare il comando ‘getfacl‘. Nell’esempio sottostante, il comando getfacl viene utilizzato per ottenere gli ACL predefiniti per una cartella ‘Music‘.

[root@linux ~]# getfacl Music/

# file: Music/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:other::rw-
Dopo Aver Impostato gli ACL Predefiniti

Per impostare gli ACL predefiniti per un file o directory specifica, utilizzare il comando ‘setfacl‘. Nell’esempio sottostante, il comando setfacl imposterà nuovi ACL (lettura ed esecuzione) su una cartella ‘Music’.

[root@linux ~]# setfacl -m d:o:rx Music/
[root@linux ~]# getfacl Music/
# file: Music/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:other::r-x

Come impostare nuovi ACL

Usare il comando ‘setfacl’ per impostare o modificare su qualsiasi file o directory. Per esempio, per dare i permessi di lettura e scrittura all’utente ‘tecmint1‘.

# setfacl -m u:tecmint1:rw /tecmint1/example

Come visualizzare gli ACL

Usare il comando ‘getfacl’ per visualizzare gli ACL su qualsiasi file o directory. Per esempio, per visualizzare gli ACL su ‘/tecmint1/esempio‘ usare il comando seguente.

# getfacl /tecmint1/example

# file: tecmint1/example/
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

Come rimuovere gli ACL

Per rimuovere gli ACL da qualsiasi file/directory, usiamo le opzioni x e b come mostrato di seguito.

# setfacl -x ACL file/directory  	# remove only specified ACL from file/directory.

# setfacl -b  file/directory   		#removing all ACL from file/direcoty

Implementiamo gli ACL nello scenario seguente.

Due utenti (tecmint1 e tecmint2), entrambi con un gruppo secondario comune chiamato ‘acl‘. Creeremo una directory di proprietà di ‘tecmint1‘ e forniremo i permessi di lettura e esecuzione su quella directory all’utente ‘tecmint2‘.

Passo 1: Creare due utenti e rimuovere la password da entrambi

[root@linux ~]# for user in tecmint1 tecmint2

> do
> useradd $user
> passwd -d $user
> done
Removing password for user tecmint1.
passwd: Success
Removing password for user tecmint2.
passwd: Success

Passo 2: Creare un gruppo e utenti per il gruppo secondario.

[root@linux ~]# groupadd acl
[root@linux ~]# usermod -G acl tecmint1
[root@linux ~]# usermod -G acl tecmint2

Passo 3: Creare una directory /tecmint e cambiare la proprietà a tecmint1.

[root@linux ~]# mkdir /tecmint1
[root@linux ~]# chown tecmint1 /tecmint1/
[root@linux ~]# ls -ld /tecmint1/

drwxr-xr-x 2 tecmint1 root 4096 Apr 17 14:46 /tecmint1/
[root@linux ~]# getfacl /tecmint1

getfacl: Removing leading '/' from absolute path names
# file: tecmint1
# owner: tecmint1
# group: root
user::rwx
group::r-x
other::r-x

Passo 4: Accedere con tecmint1 e creare una directory nella cartella /tecmint.

[tecmint@linux ~]$ su - tecmint1

Last login: Thu Apr 17 14:49:16 IST 2014 on pts/4
[tecmint1@linux ~]$ cd /tecmint1/
[tecmint1@linux tecmint1]$ mkdir example
[tecmint1@linux tecmint1]$ ll

total 4
drwxrwxr-x 2 tecmint1 tecmint1 4096 Apr 17 14:50 example
[tecmint1@linux tecmint1]$ whoami 
tecmint1

Passo 5: Ora imposta ACL utilizzando ‘setfacl’, in modo che ‘tecmint1’ abbia tutti i permessi rwx, ‘tecmint2’ abbia solo il permesso di lettura sulla cartella ‘esempio’ e gli altri non abbiano permessi.

$ setfacl -m u:tecmint1:rwx example/
$ setfacl -m u:tecmint2:r-- example/
$ setfacl -m  other:--- example/
$ getfacl example/

# file: example
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::r-x
mask::rwx
other::---

Passo 6: Ora accedi con l’altro utente cioè ‘tecmint2’ su un’altra console e cambia cartella in ‘/tecmint1’. Prova a visualizzare i contenuti usando il comando ‘ls’ e poi prova a cambiare cartella e vedere la differenza come segue.

[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:03:31 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ ls -lR example/
example/:
total 0
[tecmint2@linux tecmint1]$ cd example/

-bash: cd: example/: Permission denied
[tecmint2@linux tecmint1]$ getfacl example/

# file: example
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

Passo 7: Ora dai il permesso ‘esegui’ a ‘tecmint2’ sulla cartella ‘esempio’ e poi usa il comando ‘cd’ per vedere l’effetto. Ora ‘tecmint2’ ha i permessi per visualizzare e cambiare cartella, ma non ha permessi per scrivere nulla.

[tecmint1@linux tecmint1]$ setfacl -m u:tecmint2:r-x example/
[tecmint1@linux tecmint1]$ getfacl example/

# file: example
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r-x
group::rwx
mask::rwx
other::---
[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:09:49 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ cd example/
[tecmint2@linux example]$ getfacl .
[tecmint2@linux example]$ mkdir test

mkdir: cannot create directory ‘test’: Permission denied
[tecmint2@linux example]$ touch test

touch: cannot touch ‘test’: Permission denied

Nota: Dopo aver implementato ACL, vedrai un segno ‘+’ extra nell’output di ‘ls -l’ come segue.

[root@linux tecmint1]# ll

total 4
drwxrwx---+ 2 tecmint1 tecmint1 4096 Apr 17 17:01 example

Link di riferimento

Documentazione su ACL

Source:
https://www.tecmint.com/secure-files-using-acls-in-linux/