$ ls -lq /etc/passwd
-rw--r--r-- 1 adm 5115 Aug 30 10:40 /etc/passwd
Информацию, содержащуюся в двух строках вывода команды
ls
, можно интерпретировать так: владельцем файла
/etc/passwd
является пользователь с login-id, равным
root
; его группа называется
adm
; размер файла 5115 байт; последний раз изменен был 30 августа в 10:40; файл имеет единственную связь, т.е. одно имя в файловой системе (вопрос о связях мы обсудим в следующем разделе). Некоторые варианты команды
ls
выдают имена владельца и группы сразу при однократном вызове.
Строка
-rw-r--r--
показывает, как представляет права доступа к файлу команда
ls
. Первый дефис (
-
) означает, что это обычный файл. В случае каталога на его месте стояла бы буква
d
. Следующие три символа обозначают права владельца файла на чтение, запись и выполнение (исходя из uid). Строка
rw-
свидетельствует о том, что владелец (
root
) может читать, писать, но не выполнять файл. В случае выполняемого файла дефис был бы заменен символом
x
.
Три символа (
r--
) обозначают права доступа группы, в данном случае пользователей из группы
adm
— по-видимому, системных администраторов, которые могут читать файл, но не писать и не выполнять его. Следующие три символа (также
r--
) определяют права доступа для всех остальных пользователей системы. Таким образом, на данной машине только
root
может изменить информацию по входу в систему для пользователя, но прочесть файл и узнать эту информацию может любой. Разумным был бы вариант, при котором группа
adm
также имела бы право на запись в файл
/etc/passwd
.
Файл
/etc/group
хранит в зашифрованном виде имена групп и их group-id и определяет, какие пользователи входят в какие группы. В файле
/etc/passwd
определяется только ваша группа при входе в систему; команда
newgrp
изменяет ее права доступа на права другой группы.
Кто угодно может задать:
$ ed /etc/passwd
и редактировать файл паролей, но только
root
может записать измененный файл. Поэтому вполне правомочен вопрос: как изменить свой пароль, если это требует редактирования файла паролей. Программа, изменяющая пароли, называется
passwd
, вероятно, вы найдете ее в
/bin
:
$ ls -l /bin/passwd
-rwsr-xr-x 1 root 8454 Jan 4 1983 /bin/passwd
$
(Обратите внимание на то, что
/etc/passwd
— текстовый файл, содержащий информацию по входу в систему, тогда как
/bin/passwd
находится в другом каталоге, содержит программу, готовую к выполнению, и позволяет изменить данные, связанные с паролем). Права доступа к этому файлу показывают, что выполнить команду может кто угодно, но изменить команду
passwd
— только
root
. Буква
s
вместо
x
в поле прав на выполнение для владельца файла означает, что при выполнении команды ей предоставляются права, соответствующие праву владельца файла, в данном случае
root
. Поскольку файл
/bin/passwd
имеет такой признак установки uid и при выполнении получает права
root
, любой пользователь, выполняя команду
passwd
, может редактировать файл
/etc/passwd
.
Введение признака установки uid — простое элегантное решение целого ряда проблем безопасности.[7] Например, автор игровой программы может установить свой uid для программы, поэтому она сможет изменять файл с результатами игр, который защищен от доступа со стороны других пользователей. Но идея введения признака установки uid потенциально опасна. Программа
/bin/passwd
должна быть правильной, иначе она может уничтожить системную информацию под прикрытием суперпользователя root. При наличии прав доступа
-rwsrwxrwx
ее мог бы переписать любой пользователь, и, таким образом, заменить файл на неработоспособную программу. Это особенно опасно для программ, обладающих признаком установки uid, поскольку
root
имеет доступ к каждому файлу, системы. (В некоторых системах UNIX происходит отключение признака установки uid всякий раз, когда файл изменяется, что уменьшает вероятность нарушения защиты).
Признак установки uid — мощное средство, но оно используется в основном для нескольких системных программ, таких, как
passwd
. Рассмотрим более типичный файл:
$ ls -l /bin/who
-rwxrwxr-x 1 root 6348 Mar 29 1983 /bin/who
$
Этот файл доступен для выполнения всем, а писать в него могут только
root
и пользователь той же группы. Слова "доступен для выполнения" означают, что при вводе
$ who
интерпретатор
shell
просматривает ряд каталогов, в том числе
/bin
, отыскивая файл с именем
who
. Если такой файл найден и он имеет право доступа на выполнение, то
shell
обращается к ядру для его запуска. Ядро проверяет права доступа, и, если они действительны, запускает программу. Отметим, что программа — это просто файл с правом доступа на выполнение. В следующей главе вы познакомитесь с программами, являющимися обычными текстовыми файлами, но они могут выполняться как команды, поскольку имеют право доступа на выполнение.
Права доступа к каталогам действуют несколько иначе, но основной принцип остается тем же:
$ ls -ld .
drwxrwxr-x 3 you 80 Sep 27 06:11 .
$
Команда
ls
с флагом
-d
сообщает скорее о самом каталоге, чем о его содержимом, и первая буква
d
в выводе означает, что
'.'
в действительности является каталогом. Поле
r
показывает, что можно читать каталог, поэтому с помощью команды
ls
(или
od
для данного случая) можно выяснить, какие файлы хранятся в нем. Буква
w
свидетельствует о том, что можно создавать и исключать файлы из каталога, поскольку это требует изменения, а значит, записи в файл каталога.