RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Права доступа играют важную роль в
формировании концепции безопасности ОС. В FreeBSD права доступа
являются довольно простыми, в отличии от операционной системы Windows,
где есть восходящее, нисходящее наследование. Конечно, такая гибкость в
установлении прав доступа к определённым ресурсам это положительный
момент, но слишком сложная система выставления прав может привести к
серьёзной ошибке, что в свою очередь может скомпрометировать систему в
целом.
В операционной система FreeBSD существует всего три стандартных флага (так же имеются специальные флаги [см. Таблица 1.5]), которые определяют те или иные права доступа:
r – чтение
w – запись
x – выполнение
Данные флаги применяются к следующим трём категориям:
u - Пользователь (owner)
g - Группа (group)
o - Другие (other)
Владельца определяет непосредственно пользователь, который
владеет тем или иным ресурсом (файлом, устройством, каталогом), он
может как снимать, так и устанавливать различные флаги доступа.
Группу определят список пользователей, которые имеет совместный доступ к ресурсу.
Другие – это все те пользователи, которые не входят в группу и
соответственно ниодин из них не является владельцем ресурса. Другие
являются нежелательными пользователями и чаще всего они имеют
минимальный набор прав или не имеют их вообще.
Для просмотра установленных прав доступа, соответствующего владельца и группы на какой-либо ресурс используется команда ls(1) с опцией -l:
fdesktop1# ls -l /root/tests -rwxr-x--- 1 atrium wheel 13 Jun 502:05 /root/tests
Как видно из примера, каталог имеет для владельца (atrium) права на
чтение, запись и выполнение, для группы (wheel) права на чтение и
выполнение, для всех остальных пользователей права доступа отсутствуют.
Для того чтобы понимать все тонкости прав доступа важно уяснить порядок их проверки:
1.Первоначально проверяется не является ли пользователь владельцем
файла и если он таковым является, определяются его права и дальше
проверка прав доступа не идёт, т.е если даже пользователь состоит в
группе у которой права намного ниже чем у владельца, права группы даже
не будут проверяться. Если пользователь является владельцем ресурса и
для него не определены какие-либо права, то доступ запрещается.
Пример:
Пользователь atrium является владельцем определённого файла и состоит в
группе wheel. Права доступа на файл определены как rwx-r-x----, т.е
владелец файла может записывать, исполнять, читать файл, а группа
только читать и исполнять. Далее попробуем произвести запись в файл:
fdesktop1# id atrium uid=1001(atrium) 0(wheel) fdesktop1# ls -l /root/tests -rwxr-x--- 1 atrium wheel 13 Jun 502:05 /root/tests
2.Если пользователь не является владельцем файла, то проверятся, не
состоит ли он в группе, которая имеет права доступа к ресурсу, если это
так, то система определяет права доступа пользователю соответствующие
правам группы. Если пользователь состоит в группе и для группы
отсутствуют права, то доступ запрещается.
3.Далее, если пользователь не является владельцем файла и не состоит в
группе, которая имеет доступ к файлу, то ему назначаются права
определённые для других.
4.Особо проверяются права доступа для пользователя root. Если система видит, что пользователь имеет UID = 0, что соответствует root, независимо от login_name, то система вообще не проверяет права доступа к ресурсу, так как пользователь root имеет неограниченный доступ к системе.
Виды представления прав доступа:
Права доступа можно представить как в цифровом виде, так и в символьном.
1. Цифровой вариант
Так как права доступа назначаются трём категориям, и имеется
три вида прав доступа, в результате всего назначается девять флагов:
(111 – 111 -111) – соответствует правам доступа 777.
Представление прав доступа основано на двоичной системе. Т.е
каждой категории можно назначит три флага – чтение (r), запись (w),
выполнение (x), что соответствует (111). 1 означает присутствие того
или иного флага, 0 – соответственно отсутствие того или иного флага.
Для перевода двоичной системы в десятичную используется следующая таблица соответствия, читается она справа налево:
128 64 32 16 8 4 2 1
Как же нам перевести наши права доступа в десятичную систему? Давайте потренируемся.
Назначим файлу с именем test.txt следующие права доступа:
u (user)
g(group)
o(other)
test.txt
111
101
100
rwx
r - x
r- -
Теперь переведём полученные цифры:
u(user) – 111 – смотрим нашу таблицу
соответствия справа налево, данной последовательности соответствуют
цифры – 124, далее полученные цифры суммируем и получаем – 1+2+4 = 7
g(group) – 101 – проделываем то же самое – 1+4 = 5
o(other) – 100 – проделываем то же самое – 4 = 4
В результате наши права доступа на файл выглядят следующим образом – 754 и их можно назначить с помощью команды chmod(1).
Для обратного перевода, цифрового значения в двоичное,
необходимо разделить на 2, остаток при делении соответствует единице,
если деление без остатка – 0, записывается справа налево.
Пример:
fdesktop1# touch test.txt fdesktop1# chmod 754 test.txt fdesktop1# ls -l test.txt -rwxr-xr-- 1 root wheel 0 Jun 902:26 test.txt
Так же для облегчения запоминания составим таблицу соответствующую цифровому представлению прав доступа:
Таблица 1.4
Цифровое
Двоичная система
Символьное
Значение
0400
100 – 000 – 000
r— -— ---
Чтение для владельца
0200
010 – 000 – 000
-w- -— ---
Запись для владельца
0100
001 – 000 – 000
--x -— ---
Выполнение для файлов а для каталогов разрешает поиск
0040
000 – 100 – 000
-— -r- ---
Чтение для группы
0020
000 – 010 – 000
-— -w- ---
Запись для группы
0010
000 – 001 – 000
-— --x ---
Выполнение для файлы а для каталога возможность поиска в нём.
0004
000 – 000 – 100
-— -— r--
Чтение для других пользователей
0002
000 – 000 – 010
-— -— -w-
Запись для других пользователей
0001
000 – 000 – 001
-— -— --x
Выполнение для файлов и поиск в каталоге для других пользователей
Как видно из составленной таблицы для того чтобы назначить права
доступа на ресурс для той или иной категории, всего лишь необходимо
сложить права доступа данной категории между собой. Т.е нам, к примеру,
необходимо назначить следующие права доступа на файл:
1.Для владельца - чтение, запись, выполнение
2.Для группы – чтение и запись
3.Для других – чтение
В итоге мы получаем права доступа для файла – 764, данные права можно назначить с помощью команды chmod(1).
2. Символьный вариант
Символьный вариант назначения прав доступа запомнить довольно
легко. При данном способе назначения прав доступа учитываются четыре
категории:
a - Все (all) (ugo)
u - Владелец (owner)
g - Группа (group)
o - Другие (other)
Для этих трёх категорий назначаются права доступа:
r – право на чтение [см. Таблица 1.4]
s – для u (owner) – setuid бит, для g (group) – setgid бит [см. Таблица 1.5]
t – stick бит [см. Таблица 1.5]
w – право на запись [см. Таблица 1.4]
x – право на выполнение [см. Таблица 1.4]
Над правами, описание которых представлено выше возможно выполнение следующих операций:
+ - добавляет указанные права доступа для той или иной категории
- - удаляет указанные права доступа для той или иной категории
= - назначает указанные права доступа, при этом отменяя предыдущие для той или иной категории
При назначении прав доступа с помощью символьного варианта, категории разделяются символом запятая (,). Для примера, файл имеет права доступа (rw- r— rw--), назначим ему следующие права доступа (rwx --x –w-):
fdesktop1# ls -l total 2 -rw-r--rw- 1 atrium wheel 8 Jun 1800:51 file.txt fdesktop1# chmod u+x,g=x,o-r file.txt fdesktop1# ls -l total 2 -rwx--x-w- 1 atrium wheel 8 Jun 1800:51 file.txt
или можно по-другому
fdesktop1# ls -l total 2 -rw-r--rw- 1 atrium wheel 8 Jun 1800:51 file.txt fdesktop1# chmod u+x,g-r+x,o-r file.txt fdesktop1# ls -l total 2 -rwx--x-w- 1 atrium wheel 8 Jun 1800:51 file.txt
Способов довольно много, как говорится, всё зависит от вашей фантазии, мне больше нравится в цифровом варианте.
Так же помимо стандартных прав доступа – чтение, запись,
выполнение существуют специальные права доступа, их можно назначить как
в символьном, так и в цифровом варианте:
Таблица 1.5
Цифровое
Символьное
Значение
4000
--s -— ---
Setuid бит. При выполнение файла с данным битом эффективный uid
устанавливается в uid владельца. Иными словами процесс выполняется от
имени владельца файла. (К примеру программа passwd(1)).
Для каталога данный бит определяет что при создании файла процессом
владельцем файла будет не пользователь от которого создавался файл а
владелец каталога это действительно если файловая система в котрой
находится каталог поддерживает: suiddir опцию см. mount(8).
2000
-— --s ---
Setgid бит. При выполнении файла с данным битом эффективный gid устанавливается в gid группы.
1000
-— -— --t
Stick бит. Данный бит эффективно применяется для каталогов. Если он
установлен на каталог то конкретный файл в нём может удалять только
владелец файла в независимости от прав на каталог. Очень эффективен при
групповом доступе.
Важно!
Права, на каталог по своему действию отличаются от прав, установленных на файл:
1.Право записи установленное на каталог для группы, владельца или
других позволяет удалить в нём любой файл в независимости от владельца
и установленных на него прав доступа, поэтому с правом записи на
каталог будьте весьма осторожны. Для решения данной проблемы можно
использовать специальный флаг – Stick бит (1000), приведённый в таблице
1.5.
2.Право выполнения установленное на каталог позволяет применение для него команды ls(1) с ключом ‘–l', команды cd(1) так как происходит обращение к метаданным файлов.
3.Право чтения для каталога позволяет получить список файлов без подробной информации о них.
4.Права чтения и выполнения для каталога действуют независимо друг от
друга, т.е наличие обоих прав доступа необязательно. Комбинацией данных
прав доступа можно получить довольно интересные результаты:
При установленном праве выполнения на каталог, без права чтения позволяет создать так называемый “тёмный”
каталог. Что это такое? В данном каталоге отсутствует возможность
получить листинг находящихся в нём файлов, но имеется возможность
обращаться к файлам, если их имена заранее известны. К примеру,
создадим тёмный каталог и попытаемся получить листинг файлов в нём и
прочитать один из файлов с заранее известным именем:
fdesktop1# ls -l ./test total 2 -rw-r--rw- 1 atrium wheel 8 Jun 1800:51 file.txt fdesktop1# ls -l total 31 drwx--x--- 2 root wheel 512 Jun 1800:51 test
$ cat /root/test/file.txt My file $ ls /root/test ls: test: Permission denied
Установленные права доступа на тот или иной ресурс может изменить только владелец или суперпользователь с UID = 0.
Предопределение прав доступа
Существует весьма полезная команда umask(2),
она задаёт маску на вновь создаваемые файлы в системе. Данную команду
Вы можете встретить не только в ОС FreeBSD, но так же и в различном ПО
(Samba….). В ПО она может применяться и для каталогов, но существует
различие в способе высчитывания прав доступа для каталогов и файлов,
которые определяет данная команда. Формат команды весьма прост,
задаются три цифры, которые затем поочерёдно вычитаются из 7, если
команда определяет права для каталогов и из 6, если команда определяет
права для файлов. Для примера в ОС FreeBSD вы задаёте маску 240, это позволит задать права доступа на вновь создаваемые файлы 426, т.е в символьном представлении r---w-rw-:
$ umask 240 $ touch file.test $ ls -l total 0 -r---w-rw- 1 atrium wheel 0 Jun 1902:18 file.test
Для работы с правами доступа и изменения владельцев, групп будут полезны следующие команды:
chmod(1) – изменения прав доступа к тому или иному ресурсу. chown(8) – изменение группы и владельца ресурса. chgrp(1) – изменение группы ресурса. ls(1) – чтение каталога и получение различной подробной информации. stat(1) – получение статистической информации о файле, весьма полезная команда. umask(2) – задаёт маску на создаваемые файлы для пользователя.
Практика:
(Для более подробной информации о командах обязательно читайте манны)
Создадим файл и установим ему для владельца права на чтение и запись, для группы чтение, а для других никаких прав:
В цифровом варианте:
$ touch file $ chmod 640 ./file $ ls -l total 0 -rw-r----- 1 atrium wheel 0 Jun 1801:04 file
В символьном варианте:
$ touch test.file $ chmod u=rw,g=r,o-rwx test.file $ ls -l total 0 -rw-r----- 1 atrium wheel 0 Jun 1801:06 test.file
Сменим владельца или группу для файла или каталога:
$ ls -l total 0 -rw-r----- 1 atrium wheel 0 Jun 1801:06 test.file $ chgrp staff test.file $ ls -l total 0 -rw-r----- 1 atrium staff 0 Jun 1801:06 test.file
$ ls -l total 0 -rw-r----- 1 atrium staff 0 Jun 1801:06 test.file $ /usr/sbin/chown atrium:0 test.file $ ls -l total 0 -rw-r----- 1 atrium wheel 0 Jun 1801:06 test.file
fdesktop1# ls -l /home/atrium/rt total 0 -rw-r----- 1 atrium wheel 0 Jun 1801:06 test.file fdesktop1# chown root:0 /home/atrium/rt/test.file fdesktop1# ls -l /home/atrium/rt total 0 -rw-r----- 1 root wheel 0 Jun 1801:06 test.file