# Setuid e setgid

Nei sistemi operativi Unix e Unix-like, setuid (abbreviazione di set user id, assegna l'identificativo utente) e setgid (abbreviazione di set group id, assegna l'identificativo di gruppo) sono dei permessi speciali attribuibili a file e directory che modificano il comportamento del sistema nei loro confronti. Essi possono essere impostati o rimossi tramite il comando chmod.

## Comportamento sui file
### File eseguibili

Quando applicato a file eseguibili, il permesso setuid permette ad un utente che già possiede appropriati permessi di esecuzione sul file di eseguirlo con anche i privilegi dell'utente proprietario del file oltre che ai propri.
Tecnicamente la cosa è gestita dal kernel, che nel caso debba caricare in memoria un nuovo programma tramite una delle chiamate di sistema della famiglia exec si occupa di impostare l'effective user ID nel process control block del nuovo processo con lo user identifier del proprietario del file.
Il permesso setuid viene tipicamente usato per permettere ad utenti non privilegiati di eseguire particolari programmi con i privilegi dell'amministratore (root): un tipico esempio è l'assegnazione di tale permesso al comando mount per permettere anche agli utenti normali di montare dei file system residenti su memorie di massa rimovibili, quali chiavi USB o CD-ROM. Per contro, la gestione della sicurezza in questo caso è di fatto demandata al programma stesso, ed in caso di bug essa potrebbe essere violata (l'utente potrebbe ad esempio riuscire ad eseguire programmi arbitrari con privilegi elevati, tali da permettergli di violare il sistema, oppure i privilegi ottenuti potrebbero essere sufficienti per far infiltrare nel sistema dei trojan horse o altre minacce).
Il permesso setgid su file eseguibili si comporta in maniera analoga a setuid, con la differenza che il kernel attribuisce al nuovo processo un effective group ID pari a quello del gruppo assegnato al file, per cui il processo dispone anche dei privilegi di tale gruppo.
Per ragioni di sicurezza, il comportamento predefinito di alcune shell testuali, come ad esempio Bash, prevede di annullare l'effetto di tali permessi quando applicati a degli script: al loro avvio come interpreti esse infatti reimpostano automaticamente il valore dell'effective user ID al valore del real user ID, e quello dell'effective group ID al valore del real group ID. In caso di necessità, è possibile avvalersi di programmi esterni, quali ad esempio sudo, che opportunamente configurati permettono comunque di ottenere l'effetto desiderato.

### File non eseguibili

Il permesso setgid impostato su file non eseguibili permette invece ai processi di usare su di essi il mandatory locking, che è un meccanismo di lock non aggirabile dai processi offerto tipicamente dai sistemi operativi che derivano da UNIX System V ed anche da Linux.

## Comportamento sulle directory

Il permesso setuid non ha effetto sulle directory, ed è di fatto ignorato.
Il permesso setgid applicato ad una directory fa in modo che tutti i nuovi file e subdirectory creati al suo interno abbiano come gruppo assegnato quello del gruppo della directory che li contiene anziché quello principale dell'utente. Le nuove subdirectory inoltre avranno automaticamente impostato il permesso setgid, di fatto propagandolo verso il basso nella gerarchia. È quindi comodo per creare directory destinate a contenere risorse da condividere tra utenti che hanno diversi gruppi principali, ma che hanno un gruppo supplementare in comune: in tal caso è sufficiente creare la directory assegnandole il gruppo in comune agli utenti ed il permesso setgid, e poi assicurarsi che i permessi dei file contenuti consentano l'accesso al gruppo suddetto.