Як зробити файл НЕ модифікованим?


35

Під час входу в систему я можу зробити наступне:

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

Тоді я можу відкрити vim (не як root), редагувати bar, змусити записати w!, і файл буде змінено.

Як я можу змусити операційну систему заборонити будь-які зміни файлів?

ОНОВЛЕННЯ 02 березня 2017 року

  1. chmod 500 foo- це червона оселедець: дозвіл на запис у каталог не має нічого спільного з можливістю змінювати вміст файлу - лише можливість створювати та видаляти файли.

  2. chmod 400 foo/barнасправді запобігає зміні вмісту файлу. Але це не заважає змінювати дозволи файлу - власник файлу завжди може змінити дозволи його файлу (якщо припустити, що він може отримати доступ до файлу, тобто виконати дозвіл у всіх каталогах предків). Насправді, strace (1) виявляє, що саме це робить vim (7.4.576 Debian Jessie) - vim викликає chmod (2), щоб тимчасово додати дозвіл на запис власника файлу, модифікує файл, а потім викликає chmod ( 2) знову для видалення дозволу на запис. Ось чому, використовуючи chattr +iтвори, може зателефонувати лише root chattr -i. Теоретично, vim (або будь-яка програма) може робити те саме, що і з chattr, як і з chmod у незмінному файлі, якщо він працює як root.


3
Я вважаю, що під кришкою vimфактично змінюються дозволи, а потім повертаються назад.
Йорданм

Ви не біжите як root?
Альвін Вонг

Елвін, я роблю це як некористувач. Я відредагував пост, щоб уточнити.
користувач2141130

Відповіді:


49

Можна встановити атрибут "незмінний" для більшості файлових систем у Linux.

chattr +i foo/bar

Щоб видалити незмінний атрибут, ви використовуєте -замість +:

chattr -i foo/bar

Щоб побачити поточні атрибути для файлу, ви можете використовувати lsattr:

lsattr foo/bar

Сторінка chattr (1) містить опис усіх доступних атрибутів. Ось опис для 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.

3
В Linux цей незмінний прапор доступний у багатьох файлових системах, а не просто ext2 / 3/4 (принаймні, btrfs, hfsplus, jfs, nilfs2, xfs, ocfs2, ubifs, gfs2, reiserfs AFAICT з швидкого перегляду коду)
Stéphane Chazelas

@StephaneChazelas Я бачив, що chattrкоманда була частиною e2fsprogsпакету в моїй системі. Саме тому я зробив таку заяву. Я оновив відповідь на основі вашого коментаря.
Йорданм

Це не працює для символьних посилань :-(. Це рішення було б чудово, тому що я хочу уникнути того, що символьне посилання може бути випадково модифіковано будь-яким користувачем, включаючи root.
natenho

Змінюється чи правильний прапор inode, а не xattr? прапор ioctl бути точним?
ytpillai

1

Ти можеш:

  1. Змініть власника файлу на rootновоствореного користувача
  2. Дотримуйтесь правильної групи.
  3. Використовуйте, chmod 440щоб дозволити читання за групою (яка ви).

Якщо правильний користувач не єдиний у цій групі, вам слід створити нову групу і додати в неї лише його, а також використовувати для цього групу. Однак ви не є власником файлу, тому ви viне можете змінити власника файлу.


3
Якщо ви можете написати в батьківський каталог, то vim може видалити файл і створити новий (і це робиться, коли ви це робите :w!). vim не йде так далеко, як тимчасово змінюючи дозволи довідок. Таким чином, зберігання каталогу, який не можна записати, має бути безпечним.
Стефан Шазелас

0

Щоб зробити ціле дерево каталогів лише для читання:

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

Щоб зробити його читабельним знову, змініть +iна -i.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.