Jak mogę NIE modyfikować pliku?

35

Po zalogowaniu mogę wykonać następujące czynności:

mkdir foo
touch foo/bar
chmod 400 foo/bar 
chmod 500 foo

Następnie mogę otworzyć vima (nie jako root), edytować bar, wymusić zapis za pomocą w!, a plik zostanie zmodyfikowany.

Jak mogę sprawić, aby system operacyjny nie zezwolił na jakąkolwiek modyfikację pliku?

AKTUALIZACJA 02 marca 2017 r

  1. chmod 500 footo czerwony śledź: uprawnienie do zapisu w katalogu nie ma nic wspólnego z możliwością modyfikowania zawartości pliku - tylko z możliwością tworzenia i usuwania plików.

  2. chmod 400 foo/barw rzeczywistości zapobiega zmianie zawartości pliku. Ale , to jednak nie zapobiega uprawnienia pliku jest przed zmianą - właściciel pliku może zawsze zmienić uprawnienia jego akt jest (zakładając, że mogą one uzyskać dostępu do pliku czyli zezwolenie na wykonywanie wszystkich katalogów przodków). W rzeczywistości strace (1) ujawnia, że ​​właśnie to robi vim (7.4.576 Debian Jessie) - vim wywołuje chmod (2), aby tymczasowo dodać uprawnienia do zapisu dla właściciela pliku, modyfikuje plik, a następnie wywołuje chmod ( 2) ponownie, aby usunąć uprawnienie do zapisu. Dlatego przy użyciu chattr +idziała - tylko root może wywoływać chattr -i. Teoretycznie vim (lub jakikolwiek program) mógłby zrobić to samo z chattr jak z chmodem na niezmiennym pliku, jeśli działa jako root.

użytkownik2141130
źródło
3
Wierzę, że pod maską vimfaktycznie zmienia uprawnienia, a następnie odkłada je z powrotem.
Jordan
Ty nie działa tak root?
Alvin Wong,
Alvin, robię to jako użytkownik inny niż root. Zredagowałem post, aby wyjaśnić.
user2141130

Odpowiedzi:

49

Możesz ustawić atrybut „niezmienny” w większości systemów plików w Linuksie.

chattr +i foo/bar

Aby usunąć atrybut niezmienny, używasz -zamiast +:

chattr -i foo/bar

Aby zobaczyć bieżące atrybuty pliku, możesz użyć lsattr:

lsattr foo/bar

Strona podręcznika chattr (1) zawiera opis wszystkich dostępnych atrybutów. Oto opis i:

   A  file with the `i' attribute cannot be modified: it cannot be deleted
   or renamed, no link can be created to this file  and  no  data  can  be
   written  to  the  file.  Only the superuser or a process possessing the
   CAP_LINUX_IMMUTABLE capability can set or clear this attribute.
Jordan
źródło
3
W Linuksie ta niezmienna flaga jest dostępna w wielu systemach plików nie tylko ext2 / 3/4 (przynajmniej btrfs, hfsplus, jfs, nilfs2, xfs, ocfs2, ubifs, gfs2, reiserfs AFAICT po szybkim przejrzeniu kodu)
Stéphane Chazelas,
@StephaneChazelas Widziałem, że chattrpolecenie było częścią e2fsprogspakietu w moim systemie. Dlatego złożyłem to oświadczenie. Zaktualizowałem odpowiedź na podstawie Twojego komentarza.
Jordan
To nie działa w przypadku dowiązań symbolicznych :-(. To rozwiązanie byłoby świetne, ponieważ chcę uniknąć sytuacji, w której dowiązanie symboliczne może zostać przypadkowo zmodyfikowane przez dowolnego użytkownika, w tym użytkownika root.
natenho
Niezmienna jest poprawna flaga i-węzła, a nie xattr? flaga ioctl, a ściślej?
ytpillai
1

Możesz:

  1. Zmień właściciela pliku na rootlub nowo utworzonego użytkownika fikcyjnego
  2. Zachowaj prawidłową grupę.
  3. Użyj, chmod 440aby zezwolić na czytanie według grupy (czyli ciebie).

Jeśli właściwy użytkownik nie jest jedynym w tej grupie, powinieneś utworzyć nową grupę, dodać tylko do niej i użyć tej grupy. Jednak nie jesteś właścicielem pliku, dlatego vinie możesz zmienić właściciela pliku.

Siema'
źródło
3
Jeśli możesz pisać do katalogu nadrzędnego, vim może usunąć plik i utworzyć nowy (i robi to, kiedy to robisz :w!). vim nie idzie jednak tak daleko, jak tymczasowa zmiana uprawnień do katalogu. Dlatego zachowanie katalogu, w którym nie można zapisać, powinno być bezpieczne.
Stéphane Chazelas,
0

Aby całe drzewo katalogów było tylko do odczytu:

cd <directory>
find ./ -print0 | sudo xargs -I {} -0 chattr +i {}

Aby uczynić go ponownie czytelnym, zmień +ina -i.

Robin A. Meade
źródło