Права на файлы в 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-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 -rw-r–r– 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-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 Оригинал: http://polishlinux.org/console/file-permissions-in-linux/