— текстовый файл, содержащий информацию по входу в систему, тогда как
/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 всякий раз, когда файл изменяется, что уменьшает вероятность нарушения защиты).
7
Признак установки 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
свидетельствует о том, что можно создавать и исключать файлы из каталога, поскольку это требует изменения, а значит, записи в файл каталога.
На самом деле нельзя просто писать в каталог, даже суперпользователю
root
это запрещено:
$ who > .
Попытка затереть '.'
.: cannot create
Нельзя
$
Существуют системные обращения, которые создают и удаляют файлы, и только с их помощью можно изменить содержимое каталога. Но принцип прав доступа применим и для них: поле
w
показывает, кто может использовать системные функции для изменения каталога.
Право на удаление файла не зависит от самого файла. Если у вас есть право записи в каталог, вы можете удалять файлы из него, причем даже те, которые защищены от записи. Команда
rm
все-таки запрашивает подтверждение, прежде чем удалить защищенный файл, чтобы убедиться, что вы действительно хотите это сделать, — редкий для команд системы UNIX случай двойной проверки намерений пользователя. (Флаг
– f
команды rm обеспечивает удаление файлов без запроса.)
Поле
x
в случае каталога означает не выполнение, а поиск. Право на выполнение определяет возможность поиска файла в каталоге. Поэтому возможно создать каталог с правом доступа "
x
" для других пользователей, предполагая, что пользователи будут иметь доступ к любому известному им файлу в каталоге, но не смогут выполнять команду
ls
или читать каталог, чтобы узнать, какие файлы в нем находятся. Аналогично каталог с правом доступа
r--
можно читать (с помощью
ls
), но нельзя работать с его файлами. В некоторых системах используют это свойство, чтобы закрыть каталог
/usr/games
в рабочее время.
Команда
chmod
("change mode" — изменить режим) меняет права доступа к файлам:
$ chmod права_доступа имена файлов...
Синтаксис конструкции "права_доступа", к сожалению, громоздкий. Она может определяться двумя способами: с помощью восьмеричных чисел и последовательностью символов. Проще использовать восьмеричные числа, хотя иногда более удобными оказываются символьные обозначения, так как с их помощью можно показать, какие изменения произошли в правах доступа. Лучше, конечно, было бы задать
$ chmod rw-rw-rw- junk
Так нельзя!
чем вводить
$ chmod 666 junk
но так не получается. Восьмеричное значение режима складывается из значений прав доступа: 4 — для чтения, 2 — для записи и 1 — для выполнения. Три цифры, как и в выводе команды
ls
, показывают права доступа для владельца, группы и всех остальных. Символьные обозначения объяснить труднее; их точное описание приводится в справочном руководстве
chmod(1)
. Для наших же целей достаточно указать, что "
+
" устанавливает право доступа, а "
–
" лишает его. Например,
$ chmod +x command
позволяет всем выполнять команду, а
$ chmod -w file
лишает всех права записи в файл, включая и владельца файла. Если не принимать во внимание существование суперпользователя, то только владелец файла может изменить права доступа к файлу, независимо от текущих прав доступа. В том случае, когда кто-то еще предоставил вам право записи в файл, система не позволит изменить код прав доступа к файлу: