DataLife Engine > Система > Управление правами доступа во FreeBSD

Управление правами доступа во FreeBSD


15-07-2010. Разместил: admin Права доступа играют важную роль в формировании концепции безопасности ОС. В FreeBSD права доступа являются довольно простыми, в отличии от операционной системы Windows, где есть восходящее, нисходящее наследование. Конечно, такая гибкость в установлении прав доступа к определённым ресурсам это положительный момент, но слишком сложная система выставления прав может привести к серьёзной ошибке, что в свою очередь может скомпрометировать систему в целом.
В операционной система FreeBSD существует всего три стандартных флага (так же имеются специальные флаги), которые определяют те или иные права доступа:
r – чтение
w – запись
x – выполнение

Данные флаги применяются к следующим трём категориям:
u - Пользователь (owner)
g - Группа (group)
o - Другие (other)

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

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

fdesktop1# ls -l /root/tests
-rwxr-x---  1 atrium  wheel  13 Jun  5 02: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  5 02:05 /root/tests

$ echo "test message" >> /root/tests
$ cat /root/tests
test message


Как видим запись в файл произошла успешно.

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 следующие права доступа:
Управление правами доступа во FreeBSD
Теперь переведём полученные цифры:

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  9 02:26 test.txt



Так же для облегчения запоминания составим таблицу соответствующую цифровому представлению прав доступа:


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

1.Для владельца - чтение, запись, выполнение
2.Для группы – чтение и запись
3.Для других – чтение

Владелец: 0400 + 0200 + 0100 = 0700
Группа: 0040 + 0020 = 0060
Другие: 0004 = 0004

В итоге мы получаем права доступа для файла – 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 18 00: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 18 00:51 file.txt


или можно по-другому

fdesktop1# ls -l
total 2
-rw-r--rw-  1 atrium  wheel  8 Jun 18 00: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 18 00:51 file.txt


Способов довольно много, как говорится, всё зависит от вашей фантазии, мне больше нравится в цифровом варианте.

Так же помимо стандартных прав доступа – чтение, запись, выполнение существуют специальные права доступа, их можно назначить как в символьном, так и в цифровом варианте:

Важно!
Права, на каталог по своему действию отличаются от прав, установленных на файл:

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 18 00:51 file.txt
fdesktop1# ls -l
total 31
drwx--x---  2 root    wheel      512 Jun 18 00: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 19 02: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 18 01: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 18 01:06 test.file


Сменим владельца или группу для файла или каталога:
$ ls -l
total 0
-rw-r-----  1 atrium  wheel  0 Jun 18 01:06 test.file
$ chgrp staff test.file
$ ls -l
total 0
-rw-r-----  1 atrium  staff  0 Jun 18 01:06 test.file


$ ls -l
total 0
-rw-r-----  1 atrium  staff  0 Jun 18 01:06 test.file
$ /usr/sbin/chown atrium:0 test.file
$ ls -l
total 0
-rw-r-----  1 atrium  wheel  0 Jun 18 01:06 test.file


fdesktop1# ls -l /home/atrium/rt
total 0
-rw-r-----  1 atrium  wheel  0 Jun 18 01: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 18 01:06 test.file


Посмотрим информацию о файле или каталоге:
$ stat test.file
91 16069 -rw-r----- 1 root wheel 0 0 "Jun 18 01:06:57 2009" "Jun 18 01:06:57 2009" 
 "Jun 18 01:12:16 2009" "Jun 18 01:06:57 2009" 4096 0 0 test.file
$ ls -l test.file
-rw-r-----  1 root  wheel  0 Jun 18 01:06 test.file


$ ls -l | grep '^d'
drwxr-xrw-  2 atrium  wheel  512 Jun 18 01:07 rt
$ stat rt
91 16065 drwxr-xrw- 2 atrium wheel 64017 512 "Jun 18 01:12:20 2009"  
"Jun 18 01:07:01 2009"  "Jun 18 01:07:01 2009" "Jun 18 01:04:31 2009" 4096 4 0 rt


Автор статьи.
Вернуться назад