19 марта 2010 г.

Владелец файла и права доступа (Команды chmod и chown)

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

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

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

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

Для изменения прав доступа используется команда chmod. Для смены владельца файла используется команда chown, для смены группы пользователей файла - команда chgrp.

Далее шпаргалка по данным командам, а так же по обозначениям прав доступа"

Посмотреть владельца, группу файла и права доступа на него можно с помощью команды:

ls -l file

Понятно, что в данном примере file нужно заменить на имя конкретного файла (если команда запускается прямо из папки с ним), либо на путь к нему.

В результате должны увидеть подробную информацию о файле подобного вида (начало строки):

-rwxr-xr-x 1 root root ...

Во-первых, отсюда видно, что владелец файла root, группа в данном случае тоже root.

Во-вторых, в самом начале сочетание символов даёт полное представление о правах доступа на файл.
Первый символ обозначает тип файла:

-  обычный файл
d  каталог
b  файл блочного устройства
c  файл символьного устройства
s  доменное гнездо (socket)
p  именованный канал (pipe)
l  символическая ссылка (link)

Затем идут девять символов. Они делятся на три группы, по три символа.
Значения групп слева направо:

владелец
группа
все остальные пользователи системы

Значения символов в группах (символы тоже идут в определённом порядке):

r  чтение (reed)
w  запись (write)
x  выполнение (execute)
-  отсутствие права (на месте которого находится символ)

Таким образом в данном примере владелец может просматривать (читать), изменять (записывать) и исполнять файл, а остальные пользователи могут только просматривать и исполнять. Для директорий значения прав доступа примерно такие же, только выполнение значит возможность заходить в каталог (таким образом, если пользователь имеет право на выполнение каталога, но не имеет право на чтение, он сможет зайти туда, но не увидит содержащийся в нём файлов).

Права доступа можно изменять командой chmod. При этом сами права можно задать двумя способами (буквами или цифрами).

Сначала способ, показавшийся мне более простым и понятным:

chmod wXp file

Здесь вместо каждой из букв wXp, нужно подставить соответсвующие значения.

Вместо wнужно подставить один из следующих символов, либо их сочетание:

u  пользователь, являющийся владельцем файла (user)
g  группа (group)
o  все остальные пользователи (other)
a  все пользователи вообще (all), то есть a=ugo

Вместо X нужно подставить один из символов:

+  даёт право
-  лишает права
=  устанавливает указанные права вместо имеющихся

Вместо p могут подставляться следующие символы или их сочетания:

r  чтение, просмотр (reed)
w  запись, изменение (write)
x  выполнение (execute)

То есть обозначения прав доступа те же, что и по команде просмотра подробной информации о файле.

На примерах это будет выглядеть следующим образом:
chmod a+x file  предоставляет всем пользователям системы право на выполнение file (варианты равнозначной записи: chmod ugo+x file, chmod +x file)
chmod go-rw file удаляет права на чтение и запись для всех, кроме владельца file
chmod u=rwx  предоставляет владельцу полные права на file (права других пользователей остаются прежними)
chmod u+w,go+x file  добавляет владельцу право изменять, а всем остальным право выполнять file

Второй способ записи - цифровой. Он возможно даже ещё проще, только надо запоминть числовые значения:

r = 4  чтение
w = 2  запись
x = 1  выполнение

Если предоставляется набор прав, то цифры складываются. Таким образом кроме имеющихся трёх цифр возможны ещё варианты:

3 = wx  запись и выполнение
5 = rx  чтение и выполнение
6 = rw  чтение и запись
7 = rwx  чтение, запись и выполнение (полные права)

В команде сначала пишется право для владельца, затем для группы и потом для всех остальных пользователей. Таким образом получается трёхзначное число, а в остальном употребление команды точно такое же. Например:
chmod 777 file  предоставляет полные права на file абсолютно всем пользователям системы
chmod 760 file  даёт полные права владельцу, права на просмотр и изменение группе и никаких прав остальным пользователям

Для смены владельца и группы файла существуют команды chown и chgrp. Использование:

chown newowner file1 file2 ...
chgrp newgroup file1 file2 ...

Где newowner и newgroup новый владелец файла и новая группа файла соответственно. Сменить владельца может либо сам владелец (текущий), либо суперпользователь. Чтобы сменить группу владелец должен также входить в группу, которой принадлежит файл изначально.

К теме о команде chmod, есть ещё несколько признаков файла, задаваемых вместе с правами доступа.
1) бит сохранения задачи (бит прилипчивости - sticky bit) указывает системе, что после выполнения задачи, надо сохранить её в оперативной памяти. Удобно для часто вызываемых на выполнение задач для ускорения работы, но на достаточно мощных компьютерах не особо актуально.
2) бит смены идентификатора пользователя указывает, что программа должна получить те же права доступа, что имеет владелец программы (обычно, то есть когда этот бит не установлен, программа получает права те же, что имеет пользователь, её запустивший). Это бывает нужно в некоторых случаях, например, при смене пароля (иначе пользователь не мог бы поменять свой пароль).
3) бит смены идентификатора группы работает подобным образом.

В цифровом виде имеют значения:

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

При цифровом задании прав, данные атрибуты так же могут суммироваться и должны идти первыми:
chmod 4775 file  даёт полные права владельцу и группе, всем остальным даёт права только на чтение и выполнение и устанавливает бит смены идентификатора пользователя

Установка бита смены идентификатора пользователя:
chmod +s file

При установленных всех трёх битов результат вывода команды ls -l может принять подобную форму:

-rwSrwsrwT

В данном случае S указывает на установленный бит смены идентификатора пользователя, но владелец тут не имеет права на исполнение файла (файл может быть вообще не исполняемый), s указывает на установленный бит смены идентификатора группы, причём группа имеет право на выполнение файла, а также установлен бит сохранения задачи, но все остальные пользователи не могут выполнять файл - на это указывает T (аналогично как и с S и s, маленькая t указывала бы на то, что остальные пользователи имеют право на выполнение файла).

Информация отсюда (кое-что там написано лучше и полнее, например, про команду смены пароля, зачем ей бит смены идентификатора пользователя, плюс там есть немного про учёт блокировки доступа):
http://rus-linux.net/MyLDP/consol/hdrguide/rusman/chmod.htm
http://www.linuxcenter.ru/lib/books/kostromin/gl_04_05.phtml

2 комментария:

  1. Источники использованы неудачные :( Вот здесь вроде бы получше описано:
    http://pascal.tsu.ru/unix/files/files4.html
    Что мне не понравилось:
    - ни о каком "учёте блокировки доступа" я никогда не слышал, проведённые раскопки показали, что и вообще нигде об этом не упоминается. А эксперименты показывают следующее (Debian Squeeze):

    root@h3 ~ # touch a
    root@h3 ~ # ls -l a
    -rw-r--r-- 1 root root 0 Jan 23 16:49 a
    root@h3 ~ # chmod +l a
    chmod: invalid mode: `+l'
    Try `chmod --help' for more information.

    Видимо, это что-то совсем устаревшее или специфичное для какого-то конкретного юникса =)

    - sticky bit в современных *никсах нужен вовсе не для того, для чего был нужен когда-то =) А нужен он в основном для того, чтобы в общедоступных директориях типа /tmp не могли безобразничать (т.е. удалять или переименовывать файлы, созданные не ими) обычные пользователи. Например, чтобы файл сокета какого-нибудь демона типа mysql не удалили. Или там переименовали, подсунули вместо него свой и прослушивали проходящие запросы-ответы ;) См. у Паскаля, там не так сумбурно написано.

    Ну и фишка, на которую я не так давно наступил с размаху...
    Современные *nix-системы, и Linux kernel в том числе, _игнорируют_ suid/sgid-бит на всех исполняемых файлах, начинающихся с кранчбэнга (#!). Проще говоря - никакие скрипты не могут быть suid/sgid.
    Длинное объяснение, почему так и почему никак нельзя иначе - здесь:
    http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html
    А если кратко - for security reasons =)

    ОтветитьУдалить