FreeBSD является прямым потомком BSD UNIX(R) и основывается на некоторых ключевых концепциях UNIX(R). В первую очередь это, конечно, тот факт, что 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).
Символические обозначения, иногда называемые символическими выражениями, используют буквы вместо восьмеричных значений для назначения прав на файлы и каталоги. Символические выражения используют синтаксис (кто) (действие) (права), где существуют следующие значения:
Опция | Буква | Значение |
---|---|---|
(кто) | 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
Кроме уже описанных прав доступа к файлам, 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).
В дополнение к рассмотренным выше правам доступа и флагам файлов
необходимо также упомянуть еще три бита прав доступа, о которых должны
знать все системные администраторы. Это такие биты, как
setuid
, setgid
и
sticky
.
Эти биты играют важную роль в определённых моментах работы UNIX(R), так как они предоставляют функциональность, расширяющую права обычного пользователя. Чтобы понять как они работают, необходимо определить различие между реальным идентификатором пользователя (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
в самом конце перечня
прав.
Этот, и другие документы, могут быть скачаны с https://download.freebsd.org/ftp/doc/.
По вопросам, связанным с FreeBSD, прочитайте
документацию прежде чем писать в
<questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите в рассылку
<doc@FreeBSD.org>.