Как стать автором
Обновить

Еще раз о полномочиях в GNU/Linux

Думаю, что практически все пользователи Linux знают как выглядит и что означает строчка полномочий для объектов файловой системы:

myuser@mycomp:~$ ls -l
-rw-r--r-- 1 myuser myuser 167 2010-02-03 13:56 examples.desktop
drwxr-xr-x 2 myuser myuser 4096 2010-02-03 13:57 Видео
...........

и думаю, у большинства возникали ситуации — «а почему мне это не позволено». По этому я для себя решил сформулировать основные моменты и разбавить их примерами. Если надеетесь узнать что-то новое — читаем дальше...

Итак, основы


Первые символы в строке (например drwxr-xr-x) обозначают те права, которые вы имеете по отношению к этому объекту файловой системы, а так же что это есть за объект (его тип).
Тип объекта обозначается первым символом. Существующие объекты можно выразить следующей табличкой:
Код Тип объекта
— Обычный файл
d Каталог
l Символическая ссылка
c Специальное символическое устройство
b Специальное блочное устройство
p Буфер FIFO
s Сокет


Три подгруппы по три символа в каждом из оставшихся символов (rwxr-xr-x) обозначают права (слева на право) пользователя, владеющего файлом, права группы и права остальных пользователей. Причем установленный символ означает присутствие какого-либо полномочия на данный объект, а отсутствие (прочерк) — его отсутствие (как ни странно ).
Суть же буковок rwx попытаюсь донести другой табличкой:

файл vs. каталог
r
Файл можно копировать/читать (просматривать содержимое)
Каталог можно просматривать/узнать его содержимое (т.е. заходить внутрь)
w
Файл можно переименовывать/изменять/удалять
В каталог(е) можно: записать объект/создать объект/удалить объект (если есть соответствующее право на этот объект в каталоге)
x
Файл можно исполнять как программу/скрипт
В каталог можно зайти (сделать его текущим)/просматривать содержащие каталог объекты в соответствии с их правами.

Примеры:
1.Ситуация искуственная, если кто придумает зачем нужно — напишите

myuser@mycomp:~$ ls -l
-rw-r--r-- 1 myuser myuser 167 2010-02-03 13:56 examples.desktop
--w------- 1 myuser myuser 0 2010-06-14 12:41 test.txt
myuser@mycomp:~$ less test.txt
test.txt: Отказано в доступе
myuser@mycomp:~$ rm test.txt
myuser@mycomp:~$ ls -l
-rw-r--r-- 1 myuser myuser 167 2010-02-03 13:56 examples.desktop


т.е. читать файл мы не можем (- вместо r), а вот удалить — запросто (w).
2.
myuser@mycomp:~$ ls -l
-rw-r--r-- 1 myuser myuser 167 2010-02-03 13:56 examples.desktop
drwxr-xr-x 2 myuser myuser 4096 2010-06-14 13:16 test.dir
myuser@mycomp:~$ ls -l test.dir/
-rw-r--r-- 1 myuser myuser 0 2010-06-14 13:17 test.txt
myuser@mycomp:~$ chmod -x test.dir/
myuser@mycomp:~$ ls -l test.dir/
ls: невозможно получить доступ к test.dir/test.txt: Отказано в доступе
-????????? ? ? ? ? ? test.txt
myuser@mycomp:~$ mkdir test.dir/test.dir2
mkdir: невозможно создать каталог «test.dir/test.dir2»: Отказано в доступе
myuser@mycomp:~$ touch test.dir/test2.txt
touch: невозможно выполнить touch для «test.dir/test2.txt»: Отказано в доступе
myuser@mycomp:~$ ls -l test.dir/
ls: невозможно получить доступ к test.dir/test.txt: Отказано в доступе
-????????? ? ? ? ? ? test.txt
myuser@mycomp:~$ rm test.dir/test.txt
rm: невозможно удалить «test.dir/test.txt»: Отказано в доступе


А вот с каталогами права на запись (w) без прав на смену каталога (x) не дают возможности создавать и удалять файлы/каталоги в нем, хотя названия файлов и их тип (первый «-» в правах это простой файл; каталог обозначался бы буковкой d) мы посмотреть смогли (r у нас есть). По сути права на запись в каталог без прав на смену каталога особого смысла не имеют.
3.А вот права на смену каталога без прав на чтение и запись могут иметь практический интерес:

myuser@mycomp:~$ ls -l ~
d--x--x--x 3 myuser myuser 4096 2010-06-14 14:02 test.dir
myuser@mycomp:~$ ls -l test.dir/
ls: невозможно открыть каталог test.dir/: Отказано в доступе
myuser@mycomp:~$ cat test.dir/test.txt
Ух ты! Прочитался!!!


suid, sgid и sticky


Суть привилегий, обозначающихся suid и sgid, достаточно проста: они имеют смысл только для исполняемых файлов (с установленным битом x). Если установлены биты suid и/или sgid, то запускаемая программа «думает», что ее запустил либо владелец (suid), либо пользователь группы (sgid) файла:

myuser@mycomp:~$ cp /usr/bin/whoami ~
myuser@mycomp:~$ chmod +s /home/myuser/whoami
myuser@mycomp:~$ ls -l
-rwsr-sr-x 1 myuser myuser 30220 2010-06-14 15:24 whoami
myuser@mycomp:~$ su -c /home/myuser/whoami myuser2
Пароль:
myuser
myuser@mycomp:~$ su -c /home/myuser/whoami root
Пароль:
myuser
myuser@mycomp:~$ su -c /usr/bin/whoami root
Пароль:
root
myuser@mycomp:~$


… и только впоследний раз команда whoami «поняла», что я не myuser, а сам ROOT …
А вот бит sticky имеет смысл как раз только для каталогов и говорит о возможности удаления объектов только его владельцем либо root-ом (этот бит для файлов, на сколько я знаю никак не обрабатывается).
Пример такого каталога: /tmp
myuser@mycomp:~$ ls -ld /tmp
drwxrwxrwt 15 root root 4096 2010-06-14 10:34 /tmp

И да, есть один неявно видный нюанс: если удаление из каталога с установленным sticky-бит будет производить владелец каталога, то ему плевать на каком ухе у вас кепка кто владелец файла — все равно удалит.

… только для чтения


Что касается прав доступа к файлам, то некоторые файловые системы как-то ext2/3, позволяют ставить еще некоторые атрибуты, перекрывающие права пользования объектами. Их не очень много, но хочу рассказать всего о двух. Смотрятся эти атрибуты командой lsattr, а меняются chattr и только root-ом.
Сразу пример на первую опцию a, атрибут «только добавление записей»:
В каталоге «tmp2» был создан файл «test1» с одной строкой «line 1», а дальше смотрим, что мне удастся с ним сделать

myuser@mycomp:~$ ls -l tmp2/test1
-rw-rw-rw- 1 myuser myuser 21 2010-06-14 18:02 tmp2/test1
myuser@mycomp:~$ lsattr tmp2/test1
------------------- tmp2/test1
myuser@mycomp:~$ chattr +a tmp2/test1
chattr: Операция не позволяется while setting flags on tmp2/test1
myuser@mycomp:~$ su -c "chattr +a tmp2/test1" root
Пароль:
myuser@mycomp:~$ lsattr tmp2/test1
-----a------------- tmp2/test1
myuser@mycomp:~$ rm tmp2/test1
rm: невозможно удалить «tmp2/test1»: Операция не позволяется
myuser@mycomp:~$ vi tmp2/test1
myuser@mycomp:~$ echo "line 2" >> tmp2/test1
myuser@mycomp:~$ echo "line 3" >> tmp2/test1
myuser@mycomp:~$ cat tmp2/test1
line 1
line 2
line 3
myuser@mycomp:~$ echo "line 4" > tmp2/test1
-bash: tmp2/test1: Операция не позволяется

Для таких как я поясняю:
1)Изначально этот файл доступен всем на чтение и запись (что с ним можно сделать при этом мы знаем).
2)Получаем список доп атрибутов — он пуст (все прочерки).
3) Пытаемся установить атрибут «только добавление записей» от пользователя myuser – ошибка!
4) Делаем тоже от root и смотрим — получилось, появился атрибут ”a”
5) Пытаемся удалить файл — упс! Уже не можем. Доп. атрибуты, устанавливаемые от root не дают нам это сделать!
6) пытаемся редактировать — тоже не можем (поверте на слово)
7) Добавляем строки в файл — все получается, атрибут так и называется «только добавление записей»
8) проверяем
9) А вот последняя операция опять не удалась: мы не имеем права изменить то, что уже записано (в данном случае удалить), а только добавлять.
И вторая обещанная опция: i

myuser@mycomp:~$ su -c "chattr +i tmp2/test1" root
Пароль:
myuser@mycomp:~$ lsattr tmp2/test1
----ia------------- tmp2/test1
myuser@mycomp:~$ echo "line 4" >> tmp2/test1
-bash: tmp2/test1: Отказано в доступе


Вот теперь даже добавить не можем в файл…
Остальные опции — просю смотреть странички помощи к соответствующим командам.
Собственно все вышеописанное по большей части было сделано ради как раз дополнительных атрибутов, о которых узнал совсем недавно. Надеюсь, теперь знающих будет больше.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.