Ho trovato questo esempio, intitolato:ACL e MASK in Linux. In questo articolo vengono dimostrati i seguenti esempi che penso aiutino a capire come ACL e umask
interagiscono tra loro.
Sfondo
Quando un file viene creato su un sistema Linux, i permessi predefiniti 0666
vengono applicati mentre quando viene creata una directory i permessi predefiniti 0777
vengono applicati.
esempio 1 - file
Supponiamo di impostare il nostro umask su 077 e di toccare un file. Possiamo usare strace
per vedere cosa sta realmente accadendo quando lo facciamo:
$ umask 077; strace -eopen touch testfile 2>&1 | tail -1; ls -l testfile
open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
-rw-------. 1 root root 0 Sep 4 15:25 testfile
In questo esempio possiamo vedere che la chiamata di sistema open()
è fatto con i permessi 0666, tuttavia quando il umask 077
viene quindi applicato dal kernel, vengono rimosse le seguenti autorizzazioni (---rwxrwx
) e rimaniamo con rw-------
ovvero 0600.
esempio - 2 directory
Lo stesso concetto può essere applicato alle directory, tranne per il fatto che invece di essere le autorizzazioni predefinite 0666, sono 0777.
$ umask 022; strace -emkdir mkdir testdir; ls -ld testdir
mkdir("testdir", 0777) = 0
drwxr-xr-x 2 saml saml 4096 Jul 9 10:55 testdir
Questa volta stiamo usando mkdir
comando. Il mkdir
comando quindi chiamato la chiamata di sistema mkdir()
. Nell'esempio precedente possiamo vedere che mkdir
comando chiamato mkdir()
chiamata di sistema con i permessi predefiniti 0777
(rwxrwxrwx
). Questa volta con un umask di 022
le seguenti autorizzazioni vengono rimosse (----w--w-
), quindi ci resta 0755 (rwxr-xr-x
) quando sono state create le directory.
esempio 3 (applicazione dell'ACL predefinito)
Ora creiamo una directory e dimostriamo cosa succede quando ad essa viene applicato l'ACL predefinito insieme a un file al suo interno.
$ mkdir acldir
$ sudo strace -s 128 -fvTttto luv setfacl -m d:u:nginx:rwx,u:nginx:rwx acldir
$ getfacl --all-effective acldir
# file: acldir
# owner: saml
# group: saml
user::rwx
user:nginx:rwx #effective:rwx
group::r-x #effective:r-x
mask::rwx
other::r-x
default:user::rwx
default:user:nginx:rwx #effective:rwx
default:group::r-x #effective:r-x
default:mask::rwx
default:other::r-x
Ora creiamo il file, aclfile
:
$ strace -s 128 -fvTttto luvly touch acldir/aclfile
# view the results of this command in the log file "luvly"
$ less luvly
Ora ottieni i permessi del file appena creato:
$ getfacl --all-effective acldir/aclfile
# file: acldir/aclfile
# owner: saml
# group: saml
user::rw-
user:nginx:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
Nota la maschera, mask::rw-
. Perché non è mask::rwx
proprio come quando è stata creata la directory?
Controlla il luvly
log per vedere quali autorizzazioni predefinite sono state utilizzate per la creazione del file:
$ less luvly |grep open |tail -1
10006 1373382808.176797 open("acldir/aclfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 <0.000060>
Questo è dove diventa un po 'confuso. Con la maschera impostata su rwx
quando la directory è stata creata, ti aspetteresti lo stesso comportamento per la creazione del file, ma non funziona in questo modo. È perché il kernel sta chiamando il open()
funzione con i permessi predefiniti di 0666
.
Per riassumere
- I file non riceveranno il permesso di esecuzione (mascheramento o effetto). Non importa quale metodo usiamo:ACL, umask o mask &ACL.
- Le directory possono ottenere i permessi di esecuzione, ma dipende da come è impostato il campo di mascheramento.
- L'unico modo per impostare i permessi di esecuzione per un file che è sotto i permessi ACL è impostarli manualmente usando
chmod
.
Riferimenti
- pagina man acl
per motivi di sicurezza, il sistema operativo Linux non consente la creazione automatica di un file con un bit di esecuzione. Questo per impedire agli aggressori informatici di scrivere programmi in tali file e di eseguirli se ottengono l'accesso al tuo server. È solo una precauzione di sicurezza. Dovrai per sempre impostare manualmente il bit di esecuzione sui file dopo averli creati con l'utility chmod