Come dare le autorizzazioni per leggere scrivere ma non cancellare il file


12

Voglio dare agli utenti la possibilità di creare file di scrittura e lettura in un'altra directory utente, ma non avere l'opzione di eliminare il file dopo averlo creato (il bit sticky non funzionerà qui ...) ad esempio:

Ho un utente manager con la directory repository
Ho un utente worker1che deve scrivere i file /manager/repositoryma non posso eliminare i file
Ho un utente worker2che deve scrivere i file /manager/repository ma non posso eliminare i file
Ho un utente worker3che deve scrivere i file /manager/repository ma non posso elimina i file

ma worker 1-2-3non può eliminare solo i file dopo la creazione managere rootpuò eliminare i file worker 1-2-3creati.

Ho provato pochi chowne chmodtrucchi con l'applicazione lo sticky bit senza successo.


1
Gli worker*utenti scrivono nella directory in un certo modo? In un commento hai menzionato che i file di registro vanno qui, quindi significa che viene avviato un determinato eseguibile per creare file qui? In tal caso, è possibile autorizzare il workergruppo sudoa eseguire l'eseguibile come manager. Quindi l'eseguibile creerebbe i registri come l' managerutente che potrebbe essere leggibile dai lavoratori.
Centimane,

Se l'utente può modificare il file, può anche cancellarne il contenuto, "eliminandolo" in modo efficace. Sembra che tu abbia bisogno di una sorta di interfaccia di "invio", non di filesystem. Le email sarebbero le più semplici.
ybungalobill

Risposte:


8

A differenza di Windows, non esiste un'autorizzazione di eliminazione distinta in Unix / Linux. Il diritto di eliminare (o creare o rinominare) un file è associato alla directory contenente. Rimuovere l'autorizzazione di scrittura per i lavoratori /manager/repository/attivi al fine di negare ai lavoratori di creare, eliminare e rinominare i file.

Si noti che non è possibile consentire la creazione di file ma negarne la cancellazione.


come rimuovere l'autorizzazione di scrittura poiché il file verrà scritto per tutto il tempo in cui è il file di registro
user63898

Sebbene ciò fosse vero, molti sistemi moderni supportano ACL estesi (ACL NFSv4 come supportati da FreeBSD, Solaris o Linux (patch Richacl) che offrono funzionalità simili agli ACL di Windows NT. È probabile che la tua distribuzione Linux di serie non ce l'abbia.
Stéphane Chazelas il

@ user63898 si rimuovono le autorizzazioni di scrittura dalla directory in cui si trova il file, non dal file stesso.
GnP,

6

Prima di tutto assicurati che ACL sia abilitato nel tuo sistema, quindi esegui questo comando

setfacl -d -R -m user::rwx,user:worker1:---,user:worker2:---,user:worker3:--- \
/manager/repository

Come funziona

  • Questo comando darà autorizzazioni di lettura, scrittura ed esecuzione per il proprietario nella directory /manager/repository. Sarà revoca tutte le autorizzazioni per worker1, worker2e worker3.

  • Questo darà agli altri utenti l'accesso in lettura e scrittura ma negherà l'accesso all'eliminazione.


Da man setfacl:

-d, --default
       All  operations  apply to the Default ACL.

-R, --recursive
       Apply operations to all files and directories recursively.

-m, --modify
       Options to modify the ACL of a file or directory.

grazie, ma il problema è che gli utenti vengono creati continuamente. e alcuni vengono eliminati dall'amministratore. quindi ciò significa che devo aggiornare ogni volta la directory con setfacl? c'è qualche soluzione più generica?
user63898

sì, quando provo a creare un file da worker1 tocca /manager/repository/x.txt im get: tocco: impossibile toccare `/manager/repository/x.txt ': autorizzazione negata
user63898

ancora ottenere l'autorizzazione negata quando faccio ls -ld repository im getting: drwxrwxr-t 2 manager utenti 4096 set 7 11:30 repository /
user63898

quando si fa setfacl -d -R -m utente :: rwx, utente: worker1: --- repository / e quindi si tenta di creare un file da worker1 toccare /manager/repository/x.txt im get: touch: impossibile toccare `/ manager /repository/x.txt ': autorizzazione negata
user63898

5
ciò non consentirebbe comunque a qualcuno di scrivere un file vuoto qui? Mi echo " " > $filepiacerebbe bloccare il contenuto del file con "", che è tecnicamente una scrittura, ma cancella efficacemente il contenuto. Sembra che un vero repository come svn sarebbe la scommessa migliore qui.
Centimane,

3

Per fare ciò con le autorizzazioni, avresti bisogno di un sistema con supporto per ACL simili agli ACL NFSv4. Ad esempio, su FreeBSD, se il filesystem è montato con il nfsv4aclsflag, puoi fare:

mkdir testdir
chown manager:worker-group testdir
chmod 775 testdir
setfacl -m group@:D::deny testdir

Negare esplicitamente l' delete_childautorizzazione ai membri del worker-groupgruppo.

Tuttavia si noti che poiché i lavoratori sarebbero proprietari dei file che creano, sarebbero comunque in grado di modificare gli ACL su di essi, e concedendosi l' deleteautorizzazione, ciò avrebbe la precedenza sul delete_childpermesso della directory padre e non lo sono certo c'è un modo per aggirare questo (almeno sui filesystem UFS su FreeBSD). Ad esempio potrebbero fare:

$ touch file
$ rm -f file
rm: file: Operation not permitted
$ setfacl -m owner@:d::allow file
$ rm -f file
$

0

Per prendere le autorizzazioni di scrittura dalla /manager/repositorycartella. Quindi, tutti gli utenti che non sono root saranno in grado di scrivere o eliminare dai file all'interno /manager/repository, ma non di eliminare alcun file da questa directory.

chmod 755 /manager/repository

0

possiamo modificare file e cartelle ma non possiamo eliminarli.

Per rimuovere gli attributi, eseguire i seguenti comandi:

Per i file:

$ sudo chattr -R -a file.txt

Per le directory:

$ sudo chattr -R -a dir1/

(1) Secondo la documentazione, l' aattributo significa solo append. Gli utenti possono modificare questi file? (2) Qual è l'effetto dell'impostazione adell'attributo su una directory?
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.