I permessi e i diritti del filesystem GNU/Linux sono alla base della sicurezza del sistema e uno dei suoi principi è la netta separazione dei diritti su file e cartelle. In un ambiente fortemente multiutente, come il server di una scuola, i diritti sui file impediscono a un utente per impostazione predefinita di eliminare o sovrascrivere accidentalmente i documenti di un altro. Tuttavia, ci sono casi d'uso in cui più utenti devono accedere (leggere, scrivere e persino eliminare) i file di altri utenti, ad esempio nel server della scuola sopra menzionato, dove gli studenti lavorano allo stesso progetto. In questa sezione della preparazione all'esame RHCSA impareremo come creare un ambiente per tale collaborazione, usando la tecnica setgid (set groupID). Tieni presente che mentre eseguiamo questi passaggi su un sistema operativo recente, il setgid non è una novità e lo troverai in tutte le distribuzioni.
In questo tutorial imparerai:
- Come aggiungere utenti a un gruppo supplementare
- Come usare set-GID su una directory
- Come verificare la corretta proprietà all'interno della directory set-GID
- Come utilizzare la directory speciale come membro del gruppo

Requisiti e convenzioni software utilizzati
Categoria | Requisiti, convenzioni o versione del software utilizzata |
---|---|
Sistema | Red Hat Enterprise Linux 8 |
Software | GNU Coreutils 8.30 |
Altro | Accesso privilegiato al tuo sistema Linux come root o tramite sudo comando. |
Convenzioni | # – richiede che i comandi linux dati vengano eseguiti con i privilegi di root direttamente come utente root o usando sudo comando$ – richiede che i comandi linux dati vengano eseguiti come un normale utente non privilegiato |
Il caso d'uso
Per dimostrare l'uso di setgid, abbiamo un server virtuale e su di esso dobbiamo creare un gruppo di utenti, aggiungere membri e impostare una directory a cui entrambi hanno accesso. Finora questa è solo una
questione di impostazioni dei permessi. Il trucco sarà aggiungere il setgid alla directory, quindi i file creati all'interno della directory avranno il gruppo proprietario della directory padre. Poiché il gruppo avrà i permessi di lettura e scrittura all'interno della directory, tutti i membri del gruppo possono leggere e scrivere i file, senza la necessità dell'appartenenza al gruppo di impostazioni dell'utente originale in modo esplicito.
Configurazione di base
Per prima cosa creiamo gli oggetti necessari. Creiamo la directory del progetto:
# mkdir -p /student_projects/rocket_science
E i nostri due utenti, sarah
e john
, utilizzando il comando useradd:
# useradd john # useradd sarah
Abbiamo anche bisogno di creare un gruppo di utenti che consenta la collaborazione tra i suoi membri:
# groupadd rocketengineers
Quindi impostiamo questo gruppo come proprietario della directory del progetto, in modo ricorsivo:
# chown -R :rocketengineers /student_projects/rocket_science
Successivamente, aggiungiamo i nostri utenti a rocketengineers
gruppo:
# usermod -a -G rocketengineers john # usermod -a -G rocketengineers sarah
Abbiamo aggiunto il gruppo come gruppo secondario. Per i dettagli sui gruppi, consulta il tutorial sull'appartenenza al gruppo.
Per completare la configurazione di base, dobbiamo aggiungere l'autorizzazione completa al gruppo nella directory:
# chmod 770 /student_projects/rocket_science
E con questo, la nostra configurazione di base è completa. Entrambi gli utenti possono scrivere nella directory e i file creati saranno di proprietà dell'utente e il gruppo proprietario sarà il gruppo principale dell'utente. Possiamo controllare le
autorizzazioni che abbiamo impostato con stat
:
# stat /student_projects/rocket_science File: /student_projects/rocket_science Size: 6 Blocks: 0 IO Block: 4096 directory Device: fd00h/64768d Inode: 17789698 Links: 2 Access: (0770/drwxrwx---) Uid: ( 0/ root) Gid: ( 1003/rocketengineers) Context: unconfined_u:object_r:default_t:s0 Access: 2020-10-04 18:29:57.500453785 +0200 Modify: 2020-10-04 18:29:47.650278956 +0200 Change: 2020-10-04 18:30:34.809115974 +0200 Birth: -
Gli identificatori molto probabilmente differiranno. Possiamo vedere che il proprietario della directory è root
, mentre la proprietà del gruppo appartiene ai rocketengineers
gruppo. Ciò consente a entrambi i membri
del gruppo di leggere e scrivere da e nella directory.
Collaborazione senza setgid
Diciamo che i due utenti vorrebbero condividere alcune note con questa configurazione. sarah
ha ottenuto un file di testo con dati importanti nella sua home directory:
$ id uid=1002(sarah) gid=1002(sarah) groups=1002(sarah),1003(rocketengineers) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 $ cat general_project.notes text
Per condividerlo con john
, copia il file nella directory condivisa (quindi c'è ancora un backup nella sua home directory, per ogni evenienza):
$ cp general_project.notes /student_projects/rocket_science/
Controllando le proprietà, possiamo vedere che il proprietario è effettivamente sarah
, e anche il gruppo che possiede il file è sarah
, il gruppo principale dell'utente:
$ stat /student_projects/rocket_science/general_project.notes File: /student_projects/rocket_science/general_project.notes Size: 5 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 18019570 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1002/ sarah) Gid: ( 1002/ sarah) Context: unconfined_u:object_r:default_t:s0 Access: 2020-10-04 18:31:30.229099624 +0200 Modify: 2020-10-04 18:31:30.229099624 +0200 Change: 2020-10-04 18:31:30.229099624 +0200 Birth: -
Passiamo a john
. Ha anche alcune scoperte sul progetto e vorrebbe condividerle.
$ id uid=1001(john) gid=1001(john) groups=1001(john),1003(rocketengineers) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 $ echo "mytext" > rocket.txt $ cp rocket.txt /student_projects/rocket_science/
Si applicano le stesse autorizzazioni, il file appena copiato sarà di proprietà di john
:
$ stat /student_projects/rocket_science/rocket.txt File: /student_projects/rocket_science/rocket.txt Size: 7 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 18356857 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1001/ john) Gid: ( 1001/ john) Context: unconfined_u:object_r:default_t:s0 Access: 2020-10-04 18:32:24.433075710 +0200 Modify: 2020-10-04 18:32:24.433075710 +0200 Change: 2020-10-04 18:32:24.433075710 +0200 Birth: -
Poiché entrambi sono membri dei rocketengineers
gruppo, possono leggere il contenuto della directory e, poiché entrambe le loro note sono leggibili da tutto il mondo, possono leggere i rispettivi
file.
$ cat /student_projects/rocket_science/general_project.notes text
Il problema sorge quando john
vorrei aggiungere alcune note su sarah
file di dati importanti:
$ echo "some comments" >> /student_projects/rocket_science/general_project.notes -bash: /student_projects/rocket_science/general_project.notes: Permission denied
In effetti, non possono lavorare sui file dell'altro, solo leggerli. Ora sarah
potrebbe impostare la proprietà di gruppo del suo file sul loro gruppo comune, risolvendo così il problema. Ma perché ne avrebbe bisogno
con ogni file, se avessimo il setgid per aiutarci?
Impostazione del flag setgid
Per impostare il flag setgid, utilizziamo chmod
:
# chmod g+s /student_projects/rocket_science
Nota il flag "s" nelle autorizzazioni grop (impostato in grassetto per motivi di chiarezza):
# stat /student_projects/rocket_science File: /student_projects/rocket_science Size: 53 Blocks: 0 IO Block: 4096 directory Device: fd00h/64768d Inode: 17789698 Links: 2 Access: (2770/drwxrws---) Uid: ( 0/ root) Gid: ( 1003/rocketengineers) Context: unconfined_u:object_r:default_t:s0 Access: 2020-10-04 18:32:29.389167450 +0200 Modify: 2020-10-04 18:32:24.433075710 +0200 Change: 2020-10-04 18:34:04.449927062 +0200 Birth: -
Test e verifica dei risultati
Ora sarah
può condividere i suoi nuovi appunti di ricerca:
$ cat findings.txt rocket needs wings $ cp findings.txt /student_projects/rocket_science/ $ stat /student_projects/rocket_science/findings.txt File: /student_projects/rocket_science/findings.txt Size: 19 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 18999000 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1002/ sarah) Gid: ( 1003/rocketengineers) Context: unconfined_u:object_r:default_t:s0 Access: 2020-10-04 18:35:15.195236593 +0200 Modify: 2020-10-04 18:35:15.195236593 +0200 Change: 2020-10-04 18:35:15.195236593 +0200 Birth: -
La proprietà del gruppo è impostata sul gruppo della directory principale a causa del setgid
a posto. Ciò causerà john
per poter commentare le nuove note di ricerca:
$ echo "verified!" >> /student_projects/rocket_science/findings.txt $ cat /student_projects/rocket_science/findings.txt rocket needs wings verified!
E con ciò abbiamo completato il nostro obiettivo di creare una directory di collaborazione per un gruppo di utenti. Potremmo farlo per altri gruppi con il metodo sopra, separando i dati di diversi progetti in base a
autorizzazioni, in modo che un membro di un gruppo non possa eliminare accidentalmente i dati di un altro progetto.
# Titolo video:lavorare in una directory setgid
# Descrizione video:modificare i file di altri utenti in una directory setgid
# Nome file video:rhcsa_setgid.webm
Conclusione
Sotto GNU/Linux rigorosi permessi e diritti di proprietà, setgid
è un modo semplice per consentire agli utenti del sistema di interagire tra loro i file in modo sicuro, consentendo il lavoro di gruppo
senza l'uso di una soluzione esterna pesante o rovinando i gruppi e le autorizzazioni iniziali dell'utente. Nell'esempio precedente, non era necessario toccare le home directory degli utenti o le loro autorizzazioni a livello di sistema
, abbiamo semplicemente creato un luogo speciale in cui possono condividere ciò di cui hanno bisogno.
Esercizi
- Crea più directory di progetto con gruppi diversi. Verifica se i membri di un progetto possono leggere i file di un altro progetto.
- Crea una directory multiprogetto, a cui ogni membro del progetto ha accesso.
- Crea un progetto incrociato sola lettura directory, dove solo un membro del progetto (gestione del progetto) può scrivere, ma possono leggere i membri di tutti i progetti.