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

Ответить
Khvosticov Sergey
Сообщения: 203
Зарегистрирован: 31.12.2009
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-r–r– 1 adam adam 400 2007-08-22 18:49 prog_09.py
Третья и четвертая колонка означают, что пользователь и группа владеют файлом.

2.1. chgrp
Эта команда позволяет изменить группу-владельца файла. Если эту команду использует простой пользователь, то он, во-первых, должен быть владельцем файла, а во-вторых, он должен быть членом группы, которой он хочет дать права. Интересный факт, пользователь не должен быть членом группы, которая владеет файлом. Синтаксис следующий: chgrp new-group files,можно использовать как и имя группы, так и GID группы.
$ ls -l
-rw-r–r– 1 adam root 0 2007-09-03 15:33 file.txt
$ chgrp users file.txt
$ ls -l
Команду кстати можно использовать с ключом -R, что приведет к рекурсивному обходу всех файлов в каталоге и его подкаталогах.

2.2. chown
Эта команда используется для изменения как владельца так и группы. В большинстве систем, только root имеет право пользоваться этой командой. У команды следующий синтаксис: chown new user:new group files. Как и в команде chgrp, вы можете использовать как имена пользователей и групп, так и их GID и UID. Кстати команда не проверяет на существование пользователей и группы, так что можно задать несуществующие.
$ ls -l
-rw-r–r– 1 adam users 0 2007-09-03 15:33 file.txt
root@laptop:# chown root:root file.txt
adam@laptop:~$ ls -l
-rw-r–r– 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-r–r– 2 adam adam 96 2007-09-05 18:04 blob
drwxr-xr-x 2 adam adam 176 2007-09-04 15:57 tapety
-rw-r–r– 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-r–r– 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-r–r– 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

Аватара пользователя
Distructor
Администратор
Сообщения: 1607
Зарегистрирован: 28.12.2009
дооформить и указать ссылку на источник

-- добавлено 17 мар 2010, 17:48 --

В Linux файл имеет ``права доступа'' и ``владельца'', который относится к ``группе''. Посмотрите пример:

Код: Выделить всё

   $ ls -l /bin/ls
   -rwxr-xr-x  1  root  bin  27281 Aug 15 1995 /bin/ls*
Первое поле содержит права доступа к файлу /bin/ls, который принадлежит пользователю root, группы bin. Опуская другую информацию, запомните, что означает -rwxr-xr-x, слева направо:
- это тип файла (- = обычный файл, d = каталог, l = ссылка, и т.д.);
rwx являются правами доступа для владельца файла (чтение, запись, выполнение);
r-x являются правами доступа для группы, к которой относится владелец файла (чтение, выполнение);
r-x являются правами доступа для всех остальных пользователей (чтение, выполнение).

Каталог /bin тоже имеет права доступа. Вот поэтому вы не можете удалить файл /bin/ls до тех пор, пока не станете пользователем root: вы просто не имеете прав сделать это. Для изменения прав доступа к файлу используется команда:
$ chmod <ugoXperm> <file>
где ugo -- это u (пользователь, который является владельцем), g (группа), o (остальные), X -- это либо +, либо -, perm -- это r (чтение), w (запись), или x (выполнение). Вот общие примеры использования команды chmod:
$ chmod +x file
устанавливает право на выполнения данного файла.
$ chmod go-rw file
удаляет право на чтение и запись для всех, кроме владельца файла.
$ chmod ugo+rwx file
дает всем права на чтение, запись и выполнение.
# chmod +s file
делает так называемый ``setuid'' или ``suid'' файл -- файл, который любой может выполнять с привилегиями владельца. Обычно, это применяется к файлам, владельцем которых является root; часто это важные системный файлы, такие как X-сервер.

Более коротким способом для ссылки на права доступа является использование цифрового обозначения: rwxr-xr-x может быть выражен как 755 (каждый символ соответствует биту: --- равен 0, --x равен 1, -w- равен 2, -wx равен 3...). Это выглядит трудным, но, немного попрактиковавшись, вы поймете концепцию. root, будучи администратором, может изменять права доступа на файлы любого пользователя.

http://www.opennet.ru/docs/RUS/linux_base/node11.html

Ответить