С самого своего появления, UNIX позиционировался как мультипользовательская операционная система. Что соответственно повлекло за собой создание механизмов для защиты и обеспечения авторизорованного доступа к данным. Таким образом появился стандарт DAC (Discretionary Access Control). В соответствии с DAC, пользователь сам решает какие права доступа соответствуют файлам. Но с точки зрения разработки операционных систем эта модель оказалась неудовлетворительной. Из-за чего появились новые модели для организации доступа к файлам, такие как MAC (Mandatory Access Control), ACL (Access Control List), и их реализации, например SELinux, TrustedBSD, Trusted Solaris.
Обычно, владельцем файла является пользователь, создавший этот файл. В 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
Третья и четвертая колонка означают, что пользователь и группа владеют файлом.
Эта команда позволяет изменить группу-владельца файла. Если эту команду использует простой пользователь, то он, во-первых, должен быть владельцем файла, а во-вторых, он должен быть членом группы, которой он хочет дать права. Интересный факт, пользователь не должен быть членом группы, которая владеет файлом. Синтаксис следующий: 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, что приведет к рекурсивному обходу всех файлов в каталоге и его подкаталогах.
Эта команда используется для изменения как владельца так и группы. В большинстве систем, только 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, владелец без изменений.
В любой 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 - это файл.
Рассмотрим команду для смены прав доступа:
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
Пользователю прибавляются права на все, группе тоже, а остальным прибавляется право на выполнение.
Для упрощения записи команды 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
Рассмотрим несколько специальных уровней доступа, расширяющие стандартные.
Данная опция добавляет выбранным классам права на выполнение тогда и только тогда, когда другие классы тоже имеют права на выполнение:
$ 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
Если такой типа установить на выполняемый файл, то результаты его работы будут храниться в оперативной памяти даже после завершения программы. Эта возможность редко используется в наши дни, но исторически это сделано было для уменьшения затрат при запуске программ, сегодня существуют более мощные средства кэширования и экономичного распределения памяти между процессами. Если поставить эту опцию на каталог, то всем будет разрешено создавать в ней содержимое, но удалять будет иметь права только владелец и 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/
Если установить этот режим на исполняемый файл, то все смогут запускать программу от имени владельца. Например у программы 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
Полностью аналогична setuid, только для групп.
# chmod g+s test/ # chmod 2000 test/ # ls -l drwxrwsrwt 2 adam adam 48 2007-09-20 15:28 test
Команда 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/