/etc/passwd
:$ grep you /etc/passwd
you:gkmbCTrJ04C0M:604:1:Y.0.А.People:/usr/you:
$
Поля в файле паролей разделяются двоеточием и расположены следующим образом (как видим из
passwd(5)
):login-id:зашифрованный_пароль:uid:group-id:разное:начальный_каталог:shell
Файл паролей представляет собой обычный текстовый файл, но назначение и разделитель полей определяются по соглашению между программами, работающими с информацией этого файла. Поле shell обычно пустое; значит, по умолчанию используется стандартный интерпретатор
/bin/sh
. Поле "разное" может содержать что угодно (как правило, ваше имя, адрес или телефон).Заметьте, что ваш пароль присутствует здесь во втором поле, но в зашифрованном виде. Файл паролей могут прочесть все (вы только что это сделали), и если ваш пароль бы там, то любой, кто пожелает, может выдать себя за вас. Когда вы вводите свой пароль при входе в систему, он шифруется, и результат сравнивается с зашифрованным паролем из
/etc/passwd
. Если они совпадают, то вам разрешают войти. Этот механизм работоспособен, потому что алгоритм шифрации таков, что позволяет легко перейти от раскрытой формы к зашифрованной, тогда как обратный переход очень труден. Например, если ваш пароль ka-boom
, он может быть зашифрован как gkmbCTrJ04COM
, но, получив последний, вам будет нелегко вернуться к оригиналу.Ядро решает, что вам можно позволить читать файл
/etc/passwd
исходя из прав доступа, связанных с файлом. Для каждого файла предусмотрены три вида прав доступа: чтение (т.е. исследование его содержимого), запись (т. е. изменение его содержимого) и выполнение (т. е. запуск его как программы). Далее, разным пользователям могут быть предоставлены различные права доступа. Как владелец файла вы имеете один набор прав на чтение, запись и выполнение. У "вашей" группы — другой набор прав доступа, у всех остальных — третий набор.Команда
ls
с флагом -l
сообщает среди прочего права доступа:$ ls -l /etc/passwd
-rw-r--r-- 1 root 5115 Aug 30 10:40 /etc/passwd
$ 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