KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программное обеспечение » Брайан Керниган - UNIX — универсальная среда программирования

Брайан Керниган - UNIX — универсальная среда программирования

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Брайан Керниган, "UNIX — универсальная среда программирования" бесплатно, без регистрации.
Перейти на страницу:

Введение признака установки 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 свидетельствует о том, что можно создавать и исключать файлы из каталога, поскольку это требует изменения, а значит, записи в файл каталога.

На самом деле нельзя просто писать в каталог, даже суперпользователю 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

лишает всех права записи в файл, включая и владельца файла. Если не принимать во внимание существование суперпользователя, то только владелец файла может изменить права доступа к файлу, независимо от текущих прав доступа. В том случае, когда кто-то еще предоставил вам право записи в файл, система не позволит изменить код прав доступа к файлу:

$ ls -ld /usr/mary

drwxrwxrwx 5 mary 704 Sep 25 10:18 /usr/mary

$ chmod 444 /usr/mary

chmod: can't change /usr/mary

$

Но, если каталог не защищен от записи, пользователи могут удалять файлы, несмотря на отсутствие права доступа к файлу. Если вы хотите быть уверенным в том, что ни вы, ни ваши друзья никогда не удалят файлы из каталога, отмените право на запись для каталога:

$ cd

$ date > temp

$ chmod -w .         Закрыть каталог по записи

$ ls -ld .

dr-xr-xr-x 3 you 80 Sep 27 11:48 .

$ rm temp

rm: temp not removed Нельзя удалить файл

$ chmod 775 .        Восстановление прав доступа

$ ls -ld .

drwxrwxr-x 3 you 80 Sep 27 11:48 .

$ rm temp            Теперь можно

$

Файл temp теперь удален. Обратите внимание на то, что изменение прав доступа к каталогу не меняет дату последней модификации файла. Дата модификации отражает изменение содержимого файла, а не прав доступа к нему. Права доступа и даты хранятся не в самом файле, а в системной структуре данных, называемой индексным дескриптором (речь о нем пойдет в следующем разделе).

Упражнение 2.5

Поэкспериментируйте с командой chmod. Попробуйте разные простые варианты типа 0 или 1. Будьте осторожны, чтобы не испортить свой начальный каталог.

2.5 Индексные дескрипторы

Файл имеет несколько атрибутов: имя, содержимое и служебную информацию (права доступа и даты модификации). Служебная информация размещается в индексном дескрипторе вместе с важной системной информацией, такой, как размер файла, место хранения его на диске и т.д.[8] В индексном дескрипторе хранятся три даты: время последнего изменения файла (записи в него), время последнего использования файла (чтение или выполнение), время последнего изменения самого индексного дескриптора, например изменения прав доступа.

$ date

Tue Sep 27 12:07:24 EDT 1983 $ date > junk

$ ls -l junk

-rw-rw-rw 1 you 29 Sep 27 12:07 junk

$ ls -lu junk

-rw-rw-rw 1 you 29 Sep 27 06:11 junk

$ ls -lc junk

-rw-rw-rw 1 you 29 Sep 27 12:07 junk

$

Как видно из результата действия команды ls -lu, изменение содержимого файла не влияет на дату последнего использования, а с изменением прав доступа связана только дата изменения индексного дескриптора, о чем выдается сообщение командой ls -lc:

$ chmod 444 junk

$ ls -lu junk

-r--r--r-- 1 you 29 Sep 27 06:11 junk

$ ls -lc junk

-r--r--r-- 1 you 29 Sep 27 12:11 junk

$ chmod 666 junk $

Можно использовать флаг -t команды ls, который применяется для сортировки файлов по времени (по умолчанию принимается время последней модификации), совместно с флагами -с или -r, чтобы узнать порядок, в котором изменились индексные дескрипторы или читались файлы:

$ ls recipes

apple

pie

$ ls -lut total 2

drwxrwxrwx 4 you 64 Sep 27 12:11 recipes

-rw-rw-rw- 1 you 29 Sep 27 06:11 junk

У каталога recipes, как вы видите, более позднее время использования, поскольку мы только что просмотрели его содержимое.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*