Убунтология

Популярное содержимое

Права доступа

 

Автор статьи: SergeA

 

Что такое права доступа

В линуксе существует мощная система разграничения прав доступа к файлам и каталогам, которая позволяет сохранить ваши приватные данные от посторонних глаз, предотвратить запуск нежелательной программы или скрипта, а также защитить важные системные файлы от неосторожного изменения или удаления. Речь пойдет о правах доступа.

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

serg@serg:~$ mkdir work
serg@serg:~$ cd work
serg@serg:~/work$ touch file1 
serg@serg:~/work$ ls -l
-rw-r--r-- 1 serg serg 0 2009-05-09 16:03 file1
serg@serg:~/echo "sometext">file1

Запустив известную нам команду ls -l мы увидим права доступа на файл - рассмотрим их подробно.
- rw- r-- r--
мы видим 3 группы значений по три символа — это и есть права доступа на файл (дефис пред началом говорит о том, что объект является файлом)

r (read) - право на чтение файла
w (write) - право на редактирование (изменение) файла
x(execute) - право на выполнение (запуск) файла
- - права не определены (отсутствуют)
сразу хочу оговориться — прав на исполнение в созданном файле нет - это определяет маска пользователя, прописываемая в файле fstab.

Почему мы видим три группы прав — это права для:

1. владельца файла - u (user)
2. группы - g (group)
3. остальных пользователей - o (other)

4. всех пользователей - a (all) — особой группы для «этого пользователя» нет - это все 3 группы.

итого получаем три группы прав: я (владелец) - могу читать и редактировать файл (rw-), члены группы — могут только читать файл (r--), все остальные могут только читать файл (r--)
Теперь разберемся кто есть кто.

Владелец — это тот, кто создал файл (или получил право владения им).

Группа — один из обязательных атрибутов принадлежности файла. Для удобства работы лиц, занятых одним проектом объединяют в одну группу и все файлы создаваемые внутри этого проекта принадлежат этой группе. Например идет создание сайта и за работой заняты несколько человек. Администратор (рут) создает группу, например, proj и включает в нее всех занятых в проекте. Все создаваемые этой группой файлы будут иметь каждый своих владельцев, но относиться к ОДНОЙ группе - proj. Права установленные во второй тройке символов (для группы) будут распространяться для всех членов группы proj.

В нашем примере было бы так:

-rw-r--r-- 1 serg proj 0 2009-05-09 16:03 file1


Владелец я, следовательно на меня действует первая тройка прав rw-

А если владелец файла не я, а другой член проекта, например alex:

-rw-r--r-- 1 alex proj 0 2009-05-09 16:03 file1

тогда на меня, как на члена группы proj, распространяются только права группы т.е. r--

Все остальные - это те, кто не является владельцем файла и не относится к группе.

Если вас все устраивает — то работайте с файлом на здоровье, а если нет — то права доступа надо поменять.

Символьный метод изменения прав доступа

Для этого существует команда chmod

Её синтаксис:

chmod [ugoa] [+-=] [rwx] <file>

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

Знак «+» добавляет права, знак «-» отнимает права, знак «=» устанавливает указываемые права, для выбранной категории пользователей, убирая все остальные.

Например, я хочу запустить скрипт file1 — для этого его надо сделать исполняемым:

serg@serg:~/work$ chmod u+x file1
serg@serg:~/work$ ls -l
-rwxr--r-- 1 serg serg 0 2009-05-09 16:03 file1

мы видим, что в группе владельца появился бит исполнения x — теперь я могу запустить мой скрипт, но никто кроме меня и рута этого сделать не сможет.

(Только сперва создадим простейший сценарий).

serg@serg:~/work$ echo "echo hello world">file1
serg@serg:~/work$./file1
hello world

Работает!

Я хочу дать право на редактирование файла всем пользователям:

serg@serg:~/work$ chmod a=w file1
serg@serg:~/work$ ls -l
--w--w--w- 1 serg serg 0 2009-05-09 16:03 file1

Этой командой мы установили право редактирования для всех пользователей, а остальные права исчезли — исправим это безобразие:

serg@serg:~/work$ chmod u+x file1
serg@serg:~/work$ chmod ug+r file1
serg@serg:~/work$ chmod o-w file1
serg@serg:~/work$ chmod o+r file1
serg@serg:~/work$ ls -l
-rwxrw-r-- 1 serg serg 0 2009-05-09 16:03 file1

Вот так гораздо лучше — мы вернули себе права на выполнение (u+x), вернули себе и группе права на чтение (ug+r), а также отняли у всех остальных право редактирования файла (o-w) и вернули право чтения (o+r), хотя последнее действие можно было осуществить одной командой: chmod o=r file1 — результат будет тот же самый.
С правами для файлов все ясно - мы либо можем, либо не можем читать редактировать и исполнять файлы, а как обстоит дело с каталогами.

(примечание: изменения прав для нескольких категорий пользователей можно записывать в одну строку через запятую chmod u+x,ug+r,o+r file1)

Права доступа к каталогам

Итак, бит r для каталога означает возможность прочитать его содержимое командой ls (или открыть его в вашем любимом файловом менеджере).

Бит w означает возможность удалять, переименовывать и добавлять файлы, при этом следует помнить, что права записи и удаления распространяются только на сам каталог, но не на файлы в каталоге - они могут иметь ЛЮБЫЕ права доступа, но вы (или не вы) сможете их беспрепятственно удалить. Будьте аккуратны с доступом к вашим каталогам.

Бит х — это возможность сделать каталог текущим, искать и исполнять файлы в каталоге.

При этом возникают любопытные нюансы.

Сделаем наш каталог открытым всем ветрам, т.е. дадим права rwx для всех:

serg@serg:~$ chmod a=rwx work
serg@serg:~$ ls -l
drwxrwxrwx 3 serg serg 4096 2009-05-09 21:49 work

Отнимем право чтения:

serg@serg:~$ chmod u-r work
serg@serg:~$ ls -l
d-wxrwxrwx 3 serg serg 4096 2009-05-09 21:49 work
serg@serg:~$ ls work
ls: невозможно открыть каталог work: Permission denied

Прочитать его содержимое нельзя, НО, если вы знаете имя файла, то перейдя в каталог и набрав его имя, вы можете прочитать или изменить файл:

serg@serg:~$ cd work
serg@serg:~/work$ ls
ls: невозможно открыть каталог .: Permission denied
serg@serg:~/work$ cat file1
echo hello world

Вы также можете перейти на уровень ниже, через каталог, на который у вас нет прав чтения, использую команду cd.

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

С каталогами все.

Численный метод изменения прав доступа

Мы рассмотрели символьный способ изменения прав доступа, который является наглядными, но избыточным, т.к. для изменения прав различных групп требуется две и более команды.
Рассмотрим численный метод.
В численном методе правам доступа присваиваются цифры из восьмеричной системы счисления:

- — 0
х — 1
w — 2
r — 4

Возьмем права нашего первозданного файла:

-rw-r--r-- 1 serg serg 0 2009-05-09 16:03 file1

заменим буквы в правах цифрами:

(4 2 0) (0 4 0) (0 4 0), сложив цифры в группах получим 644 — это и есть численное выражение прав доступа.

Рассмотрим всю мощь этого способа на примере.

Сделаем file1 общедоступным:

serg@serg:~/work$ chmod a=rwx file1
serg@serg:~/work$ ls -l
-rwxrwxrwx 1 serg serg    9 2009-05-09 22:38 file1

А теперь нам требуется :

1.отнять права изменения и исполнения у всех прочих пользователей
2.отнять права изменения и чтения у группы
3.отнять у себя право запуска

Символьный метод потребует целых три команды:

serg@serg:~/work$ chmod o-wx file1
serg@serg:~/work$ chmod g-rw file1
serg@serg:~/work$ chmod u-x file1
serg@serg:~/work$ ls -l
-rw---xr-- 1 serg serg    9 2009-05-09 22:38 file1

Для удобства эти три команды можно выписать в одну строчку, перечислив изменения прав через запятую:

serg@serg:~/work$ chmod u-x,g-rw,o-wx file1
serg@serg:~/work$ ls -l
-rw---xr-- 1 serg serg    9 2009-05-09 22:38 file1

а теперь посчитаем: (4+2+0) (0+0+1) (4+0+0) = 614

все вышеперечисленное можно сделать ОДНОЙ командой (только для этого вернем все как было):

serg@serg:~/work$ chmod a=rwx file1
serg@serg:~/work$ chmod 614 file1
serg@serg:~/work$ ls -l
-rw---xr-- 1 serg serg    9 2009-05-09 22:38 file1

результат точно такой же — удобно, однако.

Смена владельца и группы файла

Помните, вначале статьи мы говорили, что владельцем файла является тот, кто создал файл или тот, кто получил право владения им. Как поменять владельца файла - для этого существует замечательная команда:

chown <user>[:group] <file>

Эта команда позволяет поменять владельца файла и группу, но запускать ее необходимо с правами рута, т.е. через sudo:

serg@serg:~/work$ sudo chown root:root file1
[sudo] password for serg:
serg@serg:~/work$ ls -l
-rwx------ 1 root root   17 2009-05-12 21:09 file1

И владелец и группа поменялись - теперь это чужой файл и я не имею к нему доступа.

Поменяем только владельца файла file2:

serg@serg:~/work$ sudo chown root file2
serg@serg:~/work$ ls -l
-rwx------ 1 root root   17 2009-05-12 21:09 file1
-rwx------ 1 root serg    0 2009-05-09 21:47 file2

Мы видим, что владелец поменялся, а группа осталась прежней.
Исключительно для смены группы существует команда chgrp:

chgrp <group> <file>

serg@serg:~/work$ sudo chgrp root file3
serg@serg:~/work$ ls -l
-rwx------ 1 root root   17 2009-05-12 21:09 file1
-rwx------ 1 root serg    0 2009-05-09 21:47 file2
-rwx------ 1 serg root    0 2009-05-09 21:47 file3

Группа у file3 изменилась, хотя это можно сделать и с помощью chown, указав прежнего владельца и новую группу.

Мы рассмотели базовые права, но существуют еще и другие.

Бит SUID

Что за зверь такой? Это бит, установка которого делает возможным запуск файла любым пользователем с ПРАВАМИ ЕГО ВЛАДЕЛЬЦА. Если ничего не поняли, смотрим сюда.

Известно, что любой пользователь может сам сменить себе пароль, для этого он должен запустить команду passwd, а теперь задумайтесь - кто владелец этой бесценной утилиты - конечно же рут, тогда как, я, простой пользователь могу свободно ее запускать? Ответ прост - у этой утилиты стоит бит s (SUID). Чтобы убедиться в этом найдем утилиту passwd и посмотрим на ее права доступа:

serg@serg:~$ whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man1/passwd.1ssl.gz /usr/share/man/man5/passwd.5.gz

Ага, вот она: /usr/bin/passwd, идем туда и смотрим на права доступа, только учтите, что файлов в этом каталоге масса, поэтому воспользуемся утилитой grep, включенной в конвеер:

serg@serg:~$ cd /usr/bin/
serg@serg:/usr/bin$
serg@serg:/usr/bin$ ls -l|grep "passwd"
-rwsr-xr-x 1 root   root      45468 2008-12-08 12:17 gpasswd
-rwsr-xr-x 1 root   lpadmin   13752 2009-04-15 20:34 lppasswd
-rwxr-xr-x 1 root   root      13756 2008-09-01 11:24 mkpasswd
-rwsr-xr-x 1 root   root      32988 2008-12-08 12:17 passwd

Что мы видим - у файла passwd владелец и группа root, и для всех (в третьей группе прав доступа) стоит бит запуска. А теперь подумаем, что делает это команда - она производит АДМИНИСТРАТИВНЫЕ действия над пользователем так, как если бы это был рут. Теперь обратим внимание на права доступа для владельца rws, бит s и означает, что любой запустивший программу passwd, делает это так же как и рут.
Для установки этого бита надо использовать команду :

chmod u[+-]s <file>

Сделаем так: вернемся в наш любимый рабочий каталог и поставим бит s на file3:

serg@serg:~$ cd ~/work
serg@serg:~/work$ chmod u+s file3
serg@serg:~/work$ ls -l
-rws------ 1 serg root    0 2009-05-09 21:47 file3

Теперь любой пользователь, запускающий file3, запускает его с правами владельца (serg).

Бит SGID

Этот бит утснавливается для каталогов, и его действие полностью аналогично SUID, только он дает право на зпапуск любого файла в каталоге с правами группы. Устанавливается бит s для каталогов командой:

chmod g[+-]s <directory>

Пример приводить не буду - все абсолютно аналогично.

Sticky bit

Последнее право относится к так называемым распределенным каталогам - это каталоги где хранятся файлы разных пользователей (например каталог /tmp)

Что значит распределенный каталог - это каталог, куда вы можете записывать свои файлы, читать чужие (если можно), а стирать и переименовывать ТОЛЬКО СВОИ.

Просмотрим права доступа к каталогу /tmp

serg@serg:~/work$ cd /
serg@serg:/$ ls -lad /tmp
drwxrwxrwt  10 root root  4096 2009-05-12 21:23 /tmp

Мы видим, что в конце стоит бит t - это и есть sticky bit, чтобы его установить используется команда:

chmod +t <direcrory>

после установки этого бита переименовывать или удалять файлы в каталоге сможет только их владелец или владелец самого каталога.

Ну и напоследок хотелось бы сказать про численые методы изменения битов SUID, SGID и sticky bit.
При установке этих значений перед тремя цифрами ставится четвертая, например chmod 1777, а теперь поподробнее про первую цифру:

0 - обнуляет SUID, SGID и sticky bit
1 - устанавливает sticky bit
2 - устанавливает SGID
4 - устанавливает SUID


Сложение этих цифр будет означать одновременную установку соответствующих битов, например:
chmod 5777 - означает установку sticky bit и SUID (1+4=5)

Все остальное посчитайте в уме.

Массовое изменение прав доступа

До сих пор мы изменяли только права отдельных файлов и каталогов, а как быть, если потребуется изменить права доступа 1000 файлов в одном каталоге?

Для этого существует рекурсия, команды chmod, chown и chgrp запускаются с ключом -R.

Отнимем все права для группы и остальных юзеров, а себе вернем все привилегии, но для этого понадобятся еще файлы.

serg@serg:~/work$ touch file2 file3
serg@serg:~/work$ ls -l
-r-x--xr-- 1 serg serg    9 2009-05-09 22:38 file1
-rwxrwxrwx 1 serg serg    0 2009-05-09 21:47 file2
-rwxrwxrwx 1 serg serg    0 2009-05-09 21:47 file3

Теперь изменим права доступа сразу для всех файлов:

serg@serg:~/work$ cd ..
serg@serg:~$ chmod -R 700 work/
serg@serg:~$ cd work
serg@serg:~/work$ ls -l
-rwx------ 1 serg serg    9 2009-05-09 22:38 file1
-rwx------ 1 serg serg    0 2009-05-09 21:47 file2
-rwx------ 1 serg serg    0 2009-05-09 21:47 file3

Что и требовалось доказать. Примеры для chown и chgrp приводить не буду - полная аналогия.

Графический способ изменения прав доступа

Если вы являетесь владельцем файла, то можете изменить права доступа графическим способом, для этого щелкните правой кнопкой мыши по файлу: Свойства-Права

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

gconftool-2 --type bool --set /apps/nautilus/preferences/show_advanced_permissions true

Или поставьте галочку в конфигураторе: Приложения-Системные утилиты-Редактор конфигурации, если его там нет, наберите команду:

gconf-editor

Далее перейдите по адресу apps-nautilus-preferences-show_advanced_permissions и поставьте галочку:

После этой операции закладка с правами доступа будет выглядеть так:

Вот, собственно и все, ставите галочку - даете права, снимаете галочку - отнимаете права, все наглядно и понятно.

Делать подобные вещи можно и с файлами, которые вам не принадлежат, если вы знаете пароль рута (ваш, ваш пароль) - выполните команду:

gksu nautilus

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

Будьте особенно внимательны при выполнении групповых операций и операций с правами рута, команда sudo chmod -R 777 /* может вам дорого обойтись!