Может ли суперпользователь писать в файлы только для чтения?

Я наткнулся на удивительное (для меня) поведение разрешений на FreeBSD. Предположим, что я работаю как пользователь без полномочий root . Я создаю файл, устанавливаю его разрешение только для чтения, а затем пытаюсь записать в него:

$ touch f $ chmod 400 f $ ls -lf -r-------- 1 user wheel f $ echo a >> t t: Permission denied. 

Все идет нормально. Теперь я делаю то же самое, что и root, и записывает в файл:

 # ls -l f2 -r-------- 1 root wheel f2 # echo a >> f2 # echo $? 0 

Это ошибка или предполагаемое поведение? Можно ли смело предположить, что это будет работать на любом Unix и Linux?

Это нормально для root чтобы иметь возможность переопределять разрешения таким образом.

Другим примером является то, что root может читать файл без доступа к чтению:

 $ echo hello > tst $ chmod 0 tst $ ls -l tst ---------- 1 sweh sweh 6 Aug 16 15:46 tst $ cat tst cat: tst: Permission denied $ sudo cat tst hello 

Некоторые системы имеют концепцию неизменяемых файлов. например, на FreeBSD:

 # ls -l tst -rw-r--r-- 1 sweh sweh 6 Aug 16 15:50 tst # chflags simmutable tst # echo there >> tst tst: Operation not permitted. 

Теперь даже root не может писать в файл. Но, конечно, root может удалить флаг:

 # chflags nosimmutable tst # echo there >> tst # cat tst hello there 

С FreeBSD вы можете пойти дальше и установить флаг ядра, чтобы предотвратить удаление root из root :

 # chflags simmutable tst # sysctl kern.securelevel=1 kern.securelevel: -1 -> 1 # chflags nosimmutable tst chflags: tst: Operation not permitted 

Теперь никто, даже root может изменить этот файл.

(Системе необходимо перезагрузить, чтобы уменьшить безопасный уровень).

Да, это очень нормально. root не имеет ограничений на чтение / запись (с очень небольшим исключением), потому что он является корнем.