По той же причине ls -l
читает / etc / passwd, именно данные связывают UID с именами. Когда ls
вызывает stat (2)
для файла, он получает числовой UID для владельца файла. Чтобы отобразить это как удобочитаемое имя, ему необходимо найти его в единственном месте, где есть эти ассоциации, / etc / passwd
. Например, типичная первая строка в / etc / passwd
- это
root:x:0:0:root:/root:/bin/bash
Когда ls -l / etc / hosts
необходимо произвести вывод
-rw-r--r-- 1 root root 222 Jan 14 2013 /etc/hosts
, он должен преобразовать UID 0 в "root", так как он вызывает библиотечную процедуру, например getpwuid , которая читает / etc / passwd
для обеспечения перевода. Это большая часть причины, по которой существует / etc / passwd
: для предоставления таких переводов для совершенно обычных целей.
Поиск имен пользователей представляет собой не большую проблему безопасности, чем вызов localtime , чтобы ls
мог сообщить вам «14 января 2013 года» в качестве времени модификации файла. Как заметил slm , нет причин держать файл открытым, поэтому он закрывается, как только его содержимое будет прочитано.
Файл / etc / passwd
изначально содержал хешированные пароли в более простое время. Хэши паролей были перемещены в / etc / shadow
, который обычные пользователи не могут прочитать, потому что это была дыра в безопасности. Имя / etc / passwd
осталось прежним, но теперь содержит x
в поле хэша бывшего пароля, которое не является допустимым хешем для любого пароля.
chmod недостаточно, так как пользователь может просто изменить режим.
Сначала запретите пользователю редактировать файл:
Теперь пользователь все еще может удалить файл, так что давайте остановим это. (файл удаляется, если он удален из содержащего его каталога. Мы должны остановить это.)
Теперь сделайте так, чтобы пользователь мог писать в содержащую -директорию
Вы ничего не можете сделать, чтобы остановить казнь. Вы не можете установить бит выполнения, но если пользователь может прочитать файл, он может его скопировать. Если они могут скопировать его, то они могут сделать его исполняемым.
Единственный известный мне способ сделать то, о чем вы просите, это использовать chattr (1 ), имя которого предполагает изменение атрибутов файлов.
В разделе атрибутов вы можете прочитать:
"Файл с атрибутом 'i' не может быть изменен :его нельзя удалить или переименовать, нельзя создать ссылку на этот файл, большую часть метаданных файла нельзя изменить, и файл нельзя открыт в режиме записи. Только суперпользователь или процесс, обладающий возможностью CAP _LINUX _IMMUTABLE, может устанавливать или очищать этот атрибут».
--практический случай:
: lsattr example.file
------------------- example.file
: ls -lh example.file
-rw------- 1 tntx tntx 15 Dec 23 20:43 example.file
: su -
Password:
root@foo: chattr +i example.file
root@foo: exit
logout
: lsattr example.file
----i-------------- example.file
: cat example.file
testing chattr
: echo "adding text" >> example.file
ksh93: example.file: cannot create [Operation not permitted]
Same with vi:
Read-only file, not written; use ! to override.
:w!
Error: example.file: Operation not permitted.
And then trying to mv:
: mv example.file example.file2
mv: cannot move 'example.file' to 'example.file2': Operation not permitted
What about cp:
: ls -lh example.file*
-rw------- 1 tntx tntx 15 Dec 23 20:43 example.file
-rw------- 1 tntx tntx 15 Dec 23 21:02 example.file2
: /usr/bin/lsattr example.file*
----i-------------- example.file
------------------- example.file2
Таким образом, это не удается, потому что вы можете заблокировать файл, чтобы он был доступен только для чтения пользователем, но вы можете свободно копировать (1 )и редактировать в новом файле.