Zezwól właścicielowi na tworzenie i odczytywanie plików, ale nie modyfikuj ani nie usuwaj

17

Chciałbym dać użytkownikowi uprawnienia do tworzenia i odczytu plików w określonym katalogu, ale nie do modyfikowania ani usuwania plików. Jeśli użytkownik może dołączyć do plików, jest w porządku, ale wolałbym nie. To jest na Ubuntu Linux.

Myślę, że jest to niemożliwe przy standardowych uprawnieniach do plików Uniksa, ale może jest to możliwe przy użyciu list ACL? Użytkownik zawsze będzie łączyć się przy użyciu SFTP, więc jeśli istniałby jakiś sposób na kontrolowanie tego w SFTP (w przeciwieństwie do uprawnień systemu operacyjnego), byłoby dobrze.

Aby być absolutnie jasnym, chcę:

  • echo hello> test # udany, ponieważ test nie istnieje, a tworzenie jest dozwolone
  • echo hello >> test # może się powieść lub nie, w zależności od tego, czy dozwolone jest dołączanie
  • echo hello2> test # kończy się niepowodzeniem, ponieważ test już istnieje, a modyfikacja nie jest dozwolona
  • test kota # udany, ponieważ dozwolone są odczyty
  • test rm # kończy się niepowodzeniem, ponieważ usuwanie nie jest dozwolone

Jeśli zastanawiasz się, dlaczego chcę to zrobić, ma to uczynić system kopii zapasowej Duplicati odpornym na Ransomware.

paj28
źródło
1
Pliki są zawsze tworzone jako puste. Kiedy to zrobisz echo > test, powłoka wykonuje plik, open("test", O_WRONLY|O_CREAT|O_TRUNC)który tworzy plik, a następnie wywołuje, echoktóry zapisuje zawartość, więc ją modyfikuje. Teraz możesz pozwolić, aby tylko pierwszy otwarty (WR) odniósł sukces.
Stéphane Chazelas,
@ StéphaneChazelas - edytowany w celu wyjaśnienia, że ​​dołączanie jest dozwolone
paj28

Odpowiedzi:

16

Możesz użyć bindfs:

$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/

Ten katalog jest własnością stephane, z grupą stephane (stephane jest jego jedynym członkiem). Zwróć też uwagę, tże uniemożliwia użytkownikom zmianę nazwy lub usuwanie wpisów, których nie są właścicielami.

$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir

bindfs dirNad sobą mamy stałą własność i uprawnienia do plików i katalogów. Wygląda na to, rootże wszystkie pliki są własnością (choć w prawdziwym katalogu są nadal własnością Stephane).

Katalogi otrzymują drwxrwxr-x root stephaneuprawnienia, a inne typy plików -rw-r--r-- root stephane.

$ ls -ld dir
drwxrwxr-t   2 root     stephane   4096 Aug 12 12:28 dir

Teraz tworzenie pliku działa, ponieważ katalog można zapisać:

$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file

Jednak nie można wykonać drugiego zapisu open() na tym pliku, ponieważ nie mamy na to pozwolenia:

$ echo test > dir/file
zsh: permission denied: dir/file

(zwróć uwagę, że dołączanie nie jest tam dozwolone (jako część początkowych wymagań)).

Ograniczenie: chociaż nie możesz usunąć lub zmienić nazwy wpisów z dirpowodu tego tbitu, nowe katalogi, które tam utworzysz, nie będą miały tego tbitu, więc będziesz mógł zmienić nazwę lub usunąć wpisy.

Stéphane Chazelas
źródło
To jest genialne! Dziękujemy za poświęcenie czasu na wypracowanie tak eleganckiego rozwiązania. Słyszałem o bindfs wcześniej, ale po raz pierwszy faktycznie go użyłem.
paj28,
4

chattr +aOpcja umożliwi dołączanie tylko. Pliki można zmieniać w ten sposób, ale tylko poprzez dodanie do nich (tj. Dopisanie linii). Nie możesz usuwać istniejących plików, ale tworzyć nowe. Może to pasować do twoich potrzeb:

sudo chattr -R +a /dir/to/apply/to

od man chattr

Plik z ustawionym atrybutem `a 'może być otwarty tylko w trybie dołączania do zapisu. Tylko superużytkownik lub proces posiadający zdolność CAP_LINUX_IMMUTABLE może ustawić lub usunąć ten atrybut.

(zauważ, że dotyczy to również katalogów)

Twoja lista wyglądałaby następująco:

echo hello > test # succeeds, because test doesn't exist, and creation is allowed
echo hello2 > test # fails, because test already exists, and overwriting is not allowed
echo hello3 >> test # succeeds, because appending is allowed
cat test # succeeds, because reads are allowed
rm test # fails, because delete is not allowed
Fiximan
źródło
Ok, to brzmi obiecująco. Prawidłowo zapobiega usuwaniu, a jeśli plik ma atrybut, zapobiega zastępowaniu. Jednak po utworzeniu nowych plików nie otrzymują automatycznie atrybutu. Czy jest jakiś sposób, aby stało się to automatycznie?
paj28,
Jeśli katalog ma atrybut, pliki będą się odpowiednio zachowywać, mimo że atrybut nie zostanie jawnie ustawiony. Problemem są pliki w nowych podkatalogach. Np. Dir1 to chattr +awtedy mogę utworzyć plik, nie mogę go usunąć, mogę dołączyć. Jeśli utworzę katalog 1 / katalog 2, mogę zrobić to, co chcę IN
katalog 2
1
Niestety nie: dpaste.com/042XQ7X
paj28,
Ach, przepraszam - wcześniej zrobiłem zły test
Fiximan
@ paj28 twój link jest zepsuty :-(
mjaggard