Руководство FreeBSD
Пред. | Глава 3. Основы UNIX | След.

# 3.3. Права доступа

FreeBSD является прямым потомком BSD UNIX╝ и основывается на некоторых ключевых концепциях UNIX. В первую очередь это, конечно, тот факт, что FreeBSD - многопользовательская операционная система. Это означает, что несколько пользователей могут работать одновременно, решая различные задачи и совершенно не мешая друг другу. На системе лежит ответственность за правильное разделение и управление такими ресурсами как память, процессорное время, периферийные устройства и прочее.

Многопользовательская среда предполагает наличие механизма регулирования прав доступа к любому ресурсу в системе. Существует три типа прав доступа: на чтение, запись и исполнение. Права сгруппированы три по три, соответственно чтение/запись/выполнение для владельца/группы/всех остальных. Численное представление:

Значение | Права доступа | Список файлов каталога
--- | --- | ---
0 | Ничего не разрешено | `---`
1 | Нельзя читать и писать, разрешено исполнять | `--x`
2 | Нельзя читать и исполнять, разрешено писать | `-w-`
3 | Нельзя читать, разрешено писать и исполнять | `-wx`
4 | Разрешено читать, нельзя писать и исполнять | `r--`
5 | Разрешено читать и исполнять, нельзя писать | `r-x`
6 | Разрешено читать и писать, нельзя исполнять | `rw-`
7 | Разрешено все | `rwx`

Вы можете использовать опцию `-l` команды ls(1) для получения подробного листинга каталога, включающего колонку с информацией о правах на файл для владельца, группы и всех остальных. Например, команда `ls -l` в произвольном каталоге может вывести следующее:

    % ls -l
    total 530
    -rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile
    -rw-r--r--  1 root  wheel     512 Sep  5 12:31 otherfile
    -rw-r--r--  1 root  wheel    7680 Sep  5 12:31 email.txt
    ...

Вот как выглядит первая колонка вывода `ls -l`:

    -rw-r--r--

Первый (считая слева) символ говорит обычный ли это файл, каталог, символьное устройство, сокет или любое другое псевдо-файловое устройство. В нашем случае `-` указывает на обычный файл. Следующие три символа (в данном случае это `rw-`) задают права доступа владельца файла. Затем идут права группы, которой принадлежит файл (`r--`). Последняя тройка (`r--`) определяет права для всех остальных. Минус означает отсутствие каких-либо прав (т.е. нельзя ни читать, ни писать, ни выполнять). В данном случае права установлены таким образом, что владелец может читать и писать в файл, а группа и другие могут только читать. Таким образом, численное представление прав `644`, где каждая цифра представляет три части прав на файл.

Права на устройства контролируются аналогичным образом. В FreeBSD все устройства представлены в виде файлов, которые можно открывать, читать и писать в них. Эти специальные файлы содержатся в каталоге `/dev`.

Каталоги также являются файлами. К ним применимы те же права на чтение, запись и выполнение. Правда, в данном случае ''выполнение'' имеет несколько другой смысл. Когда каталог помечен как ''исполнимый'', это означает, что можно ''зайти'' в него (с помощью команды `cd`, change directory). Это также означает, что в данном каталоге можно получить доступ к файлам, имена которых известны (конечно, если собственные права на файл разрешают такой доступ).

Если же требуется получить список файлов в некотором каталоге, права доступа на него должные включать доступ на чтение. Для того, чтобы удалить из каталога какой-либо файл, имя которого известно, на этот каталог должны быть даны права на запись и на исполнение.

Существуют и другие права доступа, но они как правило используются в особых случаях, например, setuid-бит на выполняемые файлы и sticky-бит на каталоги. За дополнительными сведениями по этому вопросу обращайтесь к chmod(1).

## 3.3.1. Символические обозначения прав

Предоставил Tom Rhodes.

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

Опция | Буква | Значение
--- | --- | ---
(кто) | u | Пользователь (User)
(кто) | g | Группа (Group)
(кто) | o | Другие (Other)
(кто) | a | Все (All, ''world'')
(действие) | + | Добавление прав
(действие) | - | Удаление прав
(действие) | = | Явная установка прав
(права) | r | Чтение (Read)
(права) | w | Запись (Write)
(права) | x | Выполнение (Execute)
(права) | t | Sticky бит
(права) | s | SUID или SGID

Эти значения используются командой chmod(1) так же как и раньше, но с буквами. Например, вы можете использовать следующую команду для запрета доступа других пользователей к `FILE`:

    % chmod go= FILE

Для изменения более чем одного набора прав можно применить список, разделенный запятыми. Например, следующая команда удалит права группы и ''всех остальных'' на запись в `FILE`, а затем добавит права на выполнение для всех:

    % chmod go-w,a+x FILE

## 3.3.2. Флаги файлов в FreeBSD

Текст предоставил Tom Rhodes.

Кроме уже описанных прав доступа к файлам, FreeBSD поддерживает использование ''флагов файлов''. Эти флаги обеспечивают дополнительный уровень защиты и контроля над файлами, но не могут применяться к каталогам.

Эти флаги добавляют дополнительные возможности контроля над файлами, обеспечивая (при определенных условиях) невозможность их удаления или изменения даже пользователю `root`.

Файловые флаги изменяются при помощи утилиты chflags(1) посредством простого интерфейса. К примеру, чтобы установить системный признак неудаляемости на файл `file1`, выполните следующую команду:

    # chflags sunlink file1

Чтобы отключить флаг неудаляемости, просто выполните предыдущую команду с ключом ''no'' перед параметром `sunlink`. Вот так:

    # chflags nosunlink file1

Чтобы просмотреть флаги этого файла, воспользуйтесь командой ls(1) с параметрами `-lo`:

    # ls -lo file1

Результат выполнения команды должен выглядеть примерно так:

    -rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1

Некоторые флаги могут быть установлены или сняты с файлов только пользователем `root`. В остальных случаях эти флаги может установить владелец файла. Для получения дополнительной информации мы рекомендуем изучить содержимое справки по командам chflags(1) и chflags(2).

## 3.3.3. setuid, setgid и sticky-биты в правах доступа

Текст предоставил Tom Rhodes.

В дополнение к рассмотренным выше правам доступа и флагам файлов необходимо также упомянуть еще три бита прав доступа, о которых должны знать все системные администраторы. Это такие биты, как `setuid`, `setgid` и `sticky`.

Эти биты играют важную роль в определённых моментах работы UNIX, так как они предоставляют функциональность, расширяющую права обычного пользователя. Чтобы понять как они работают, необходимо определить различие между реальным идентификатором пользователя (UID) и действующим идентификатором пользователя (effective UID, EUID).

Реальный UID -- это идентификатор пользователя, запустившего процесс на выполнение. Действующий UID (EUID) -- это идентификатор пользователя, с которым на самом деле выполняется процесс. Например, утилита passwd(1) во время смены пароля пользователем запускается с реальным ID пользователя; однако, чтобы внести изменения в базу данных пользователей, ей необходимо работать с действующим ID пользователя `root`. Это тот механизм, который позволяет обычным пользователям изменять свои пароли и при этом не наблюдать ошибку `Permission Denied`.

> Замечание: Опция `nosuid`, указанная при монтировании файловой системы, отменяет действие битов `setuid` и `setgid`. То есть, утилиты, использующие эти биты прав, откажутся выполняться, даже не выдав пользователю никакого предостережения. К тому же, (с точки зрения обеспечения безопасности) эта опция монтирования не является абсолютно надежной, так как, согласно странице справочника mount(8), накладываемые ею ограничения могут быть обойдены при помощи ''обертки'' `nosuid` (`nosuid` wrapper).

Бит setuid устанавливается добавлением цифры четыре (4) перед численным представлением прав доступа, например:

    # chmod 4755 suidexample.sh

Теперь права доступа на файл ``suidexample.sh`` выглядят подобно следующему:

    -rwsr-xr-x   1 trhodes  trhodes    63 Aug 29 06:36 suidexample.sh

В вышеприведенной строке приметно то, что в перечне прав доступа для владельца файла присутствует символ `s`, который заменил собой бит выполнения.

Чтобы посмотреть `setuid` в действии, откройте два терминала. На одном из них запустите команду `passwd` с правами обычного пользователя. Пока утилита ждет ввода нового пароля, просмотрите таблицу процессов и найдите в ней запись о процессе `passwd`.

В терминале А:

    Changing local password for trhodes
    Old Password:

В терминале Б:

    # ps aux | grep passwd

    trhodes  5232  0.0  0.2  3420  1608   0  R+    2:10AM   0:00.00 grep passwd
    root     5211  0.0  0.2  3620  1724   2  I+    2:09AM   0:00.01 passwd

Как уже было сказано, утилита `passwd` запущена с правами обычного пользователя, но ее действующий UID -- `root`.

Действие бита `setgid` подобно действию `setuid`; отличие заключается в том, что изменяются настройки прав для группы. Когда выполняется приложение (или утилита) с установленным битом `setgid`, то ему (ей) будут обеспечены права в соответствии с группой владельца файла, а не с группой пользователя, запустившего процесс.

Чтобы установить на файл бит `setgid`, выполните команду `chmod`, добавив цифру два (2) перед численным представлением прав доступа, например:

    # chmod 2755 sgidexample.sh

Новый бит отображается подобно предыдущему случаю: обратите внимание на наличие `s` в перечне прав доступа для группы:

    -rwxr-sr-x   1 trhodes  trhodes    44 Aug 31 01:49 sgidexample.sh

> Замечание: В этих примерах, несмотря на то, что сценарий оболочки является исполняемым файлом, он не будет выполняться с другим действующим идентификатором пользователя (EUID). Так происходит потому, что сценариям командного интерпретатора недоступен системный вызов setuid(2).

Позволяя расширять права пользователя, оба бита прав доступа (`setuid` и `setgid`) могут привести к снижению безопасности системы. Третий обсуждаемый здесь бит -- `sticky` -- способствует повышению безопасности системы.

Бит `sticky`, будучи установленным на каталог, позволяет производить удаление файла только владельцу файла. Этот бит применяется для предотвращения удаления файлов в публичных каталогах, таких как `/tmp`, пользователями, не владеющими файлом. Чтобы задействовать этот бит, добавьте единицу (1) перед численным представлением прав доступа. Например:

    # chmod 1777 /tmp

Проверить результат можно при помощи команды `ls`:

    # ls -al / | grep tmp

    drwxrwxrwt  10 root  wheel         512 Aug 31 01:49 tmp

Отличительной особенностью бита `sticky` является наличие символа `t` в самом конце перечня прав.

Пред. | Начало | След.
Виртуальные консоли и терминалы | Уровень выше | Структура каталогов

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.