Права на файлы в Linux

1. Основы

С самого своего появления, UNIX позиционировался как мультипользовательская операционная система. Что соответственно повлекло за собой создание механизмов для защиты и обеспечения авторизорованного доступа к данным. Таким образом появился стандарт DAC (Discretionary Access Control). В соответствии с DAC, пользователь сам решает какие права доступа соответствуют файлам. Но с точки зрения разработки операционных систем эта модель оказалась неудовлетворительной. Из-за чего появились новые модели для организации доступа к файлам, такие как MAC (Mandatory Access Control), ACL (Access Control List), и их реализации, например SELinux, TrustedBSD, Trusted Solaris.

2. Владелец файла

Обычно, владельцем файла является пользователь, создавший этот файл. В UNIX-подобных операционных системах, все файлы имеют два типа владельцев: user (пользователь) и group (группа). Владельцы не должны совпадать друг с другом, т.е. user не должен быть членом group. Но фактически почти всегда, пользователь принадлежит к той группе, которая владеет файлом. Если пользователь не является владельцем файла и не принадлежит к группе, владеющей файлом, то он считается левым (others, остальные). Каждому пользователю в системе присваивается UID-номер (user identification number, идентификатор пользователя), с помощью этого система однозначно определяет пользователя. Пользователь root имеет UID = 0, а максимально возможный номер принадлежит пользователю nobody (никто) (для Ubuntu это 65534, для NetBSD 32767). Следовательно права привязываются не в к имени пользователя, а к его UID. Аналогично каждой группе соответствует GID (group identification number). Для того что бы в консоле вывести владельцев файлов используйте команду ls с ключом -l:

$ ls -l
razem 1822
drwxr-xr-x 3 adam adam 120 2007-09-03 16:00 Desktop
-rw-rr 1 adam adam 400 2007-08-22 18:49 prog_09.py 

Третья и четвертая колонка означают, что пользователь и группа владеют файлом.

2.1. chgrp

Эта команда позволяет изменить группу-владельца файла. Если эту команду использует простой пользователь, то он, во-первых, должен быть владельцем файла, а во-вторых, он должен быть членом группы, которой он хочет дать права. Интересный факт, пользователь не должен быть членом группы, которая владеет файлом. Синтаксис следующий: chgrp new-group files,можно использовать как и имя группы, так и GID группы.

$ ls -l
-rw-rr 1 adam root 0 2007-09-03 15:33 file.txt
$ chgrp users file.txt
$ ls -l
-rw-rr 1 adam users 0 2007-09-03 15:33 file.txt 

Команду кстати можно использовать с ключом -R, что приведет к рекурсивному обходу всех файлов в каталоге и его подкаталогах.

2.2. chown

Эта команда используется для изменения как владельца так и группы. В большинстве систем, только root имеет право пользоваться этой командой. У команды следующий синтаксис: chown new user:new group files. Как и в команде chgrp, вы можете использовать как имена пользователей и групп, так и их GID и UID. Кстати команда не проверяет на существование пользователей и группы, так что можно задать несуществующие.

$ ls -l
-rw-rr 1 adam users 0 2007-09-03 15:33 file.txt
root@laptop:# chown root:root file.txt
adam@laptop:~$ ls -l
-rw-rr 1 root root 0 2007-09-03 15:33 file.txt

Смена группы и пользователя.

root@laptop:# chown zoidberg file.txt

Смена владельца на пользователя zoidberg, группа остается без изменений.

# chown :futurama file.txt

Смена группы на futurama, владелец без изменений.

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

В любой UNIX-подобной системе имеются 3 уровня доступа к файлу: чтение, read (r), запись, write (w) и выполнение, execute (x).Тип доступа Для файла Для каталога
r Чтение содержимого файла Отображение содержимого каталога (например командой ls)
w Запись в файл Изменение содержимого каталога
x Запуск файла на исполнение Возможность войти в каталог командой cd

Стоит заметить, что когда мы рассматриваем права на каталоги, нужно помнить, что каталог - это тоже файл, который содержит список файлов, т.е. их имена и расположение на диске. Для того что бы посмотреть содержимое каталога достаточно воспользоваться командой ls (без ключей), для этого необходимы только права на чтение, но для того что бы выполнить ls -l необходимы права на запись и выполнение. Обобщая вышесказанное, выполняя любую операцию над каталогом (кроме простого просмотра содержимого) вам необходимы права на выполнение, таким образом обладая этими правами вы получаете доступ к содержимому каталога использую имена файлов.

drw-rr 2 adam adam 96 2007-09-05 18:04 blob
drwxr-xr-x 2 adam adam 176 2007-09-04 15:57 tapety
-rw-rr 1 adam adam 125 2007-08-29 18:31 fme.py

Список прав доступен по команде ls с ключом -l. В первой колонке первый символ обозначает тип файла, а остальные 9 показывают права доступа. Первые 3 из 9 показывают права user, следующие 3 - это права group, и оставшиеся для левых.

В приведенном примере blob - это каталог, user имеет права на запись и чтение, но не на выполнение (rw-), у группы и у остальных есть права только на чтение. Tapety - тоже каталог, и у user есть права на все (rwx), а у группы и у остальных есть права на чтение и выполнение (r-x). Fme.py - это файл.

3.1. chmod

Рассмотрим команду для смены прав доступа:

chmod access rights files

Перед выполнением команды необходимо выбрать класс пользователей, для кого мы хотим изменить права (ugo, User, Group, Others). Есть так же дополнительная группа a (all, все). Затем выбираем оператор: + (дать права), - (убрать права) и = (присвоить права). И в конце выбрать сами права (rwx, r-x и т.д.).

$ chmod u+x skrypt.sh

Пользователю (u) добавляется (+) право на выполнение (x) файла skrypt.sh.

$ chmod go-r raport.odt

У группы и остальных (go) отбирается (-) право на чтение (r).

$ chmod a=w finanse.ods

Всем (a) присваивается (=) право на запись (w), а остальные права стираются (=).

$ chmod u+rwx,g+rwx,o+x trurl.py

Пользователю прибавляются права на все, группе тоже, а остальным прибавляется право на выполнение.

3.2. Числовое представление прав

Для упрощения записи команды chmod можно использовать числовое представление прав. У каждого типа доступа есть числовое представление, для этого используется двоичное представление. Единица означает - есть право, 0 - нет права. Таким образом запись правила rwx r-x r-x в бинарном виде будет выглядить следующим образом: 111 101 101. Но двоичное представление не очень удобно, поэтому используют десятичное представлени. 111 в двоичной системе - это 7 в десятичной, а 101 - это 5, таким образом 111 101 101 - это 755. Итак получаем:

x 1
-w- 2
-wx 3
r 4
r-x 5
rw- 6
rwx 7

Таким образом вы можете записать как

$ chmod u=rwx,g=rwx,o=x trurl.py

так и

 $ chmod 771 trurl.py

3.3. Специальные уровни доступа

Рассмотрим несколько специальных уровней доступа, расширяющие стандартные.

3.3.1. X

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

$ ls -l
-rwx 1 adam users 14 2007-09-10 21:48 skrypt.sh
drwx 1 adam users 14 2007-09-10 21:48 tapety
-rw- 1 root users 3665 2007-09-17 17:23 wynik.txt
$ chmod go+X *
$ ls -l
-rwxr-xr-x 1 adam users 14 2007-09-10 21:48 skrypt.sh
drwxr-xr-x 1 adam users 14 2007-09-10 21:48 tapety
-rw-rr 1 adam users 3665 2007-09-17 17:23 wynik.txt

3.3.2. Липкий бит

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

drwxrwxrwt 10 root root 464 2007-09-20 12:45 tmp

Эта возможность часто используется для каталога /tmp. Судя из названия, этот каталог используется как временный.

Назначить липкий бит можно командой chmod:

# chmod u+t test/
# ls -l
drwxrwxrwt 2 adam users 48 2007-09-20 15:28 test

или используя числовую запись

# chmod 1000 test/

3.3.3. setuid

Если установить этот режим на исполняемый файл, то все смогут запускать программу от имени владельца. Например у программы ping владельцем является root (т.к. только root имеет право создавать сокеты, что и делает эта программа), но так как на ней стоит этот режим, то и все остальные могут пользоваться этой программой.

$ ls -l /usr/bin/ | grep sudo
-rwsr-xr-x 1 root root 91508 2006-10-09 13:37 sudo
# chmod u+s program
# chmod 4000 program

3.3.4. setgid

Полностью аналогична setuid, только для групп.

# chmod g+s test/
# chmod 2000 test/
# ls -l
drwxrwsrwt 2 adam adam 48 2007-09-20 15:28 test

3.4. unmask

Команда unmask используется для установки прав файлов для новосозданных файлов по умолчанию. Глобально, у всех новых файлов права по умолчанию 666. С помощью этой команды мы передаем те опции которые НЕ будут присутствовать в новых файлах. Т.е. если мы передадим параметр 0022, то по умолчанию права будут 644.

$ umask
0022
$ touch file
$ ls -l
-rw-rr 2 adam adam 48 2007-09-20 15:28 file
umask 0111
$ ls -l
-rw-rw-rw- 1 adam adam 0 2007-09-20 17:31 file2

Оригинал: http://polishlinux.org/console/file-permissions-in-linux/
Взято с http://linuxpeople.ru/2007/12/04/prava-na-fajly-v-linux/