Найти в Дзене
turn on me

Права доступа к файлам в Linux

Linux - многопользовательская система, причем она изначально разрабатывалась многопользовательской. Во всем мире миллионы устройств работают на каком-либо дистрибутиве (в каком-то роде можно это назвать версией) Linux. В том числе подавляющее большинство серверов, и даже Android, установленный на миллионах смартфонах - это Linux (т.к. в его состав входит ядро Linux). Так как же изменить права доступа к определенным файлам? Для этого существует утилита chmod (change mode), которая позволяет изменить права для владельца, группы и других пользователей на какой-либо файл. Но давайте по порядку. Категории пользователей в Linux 1. В Linux главным пользователем, которых имеет полный доступ ко всем файлам, является суперпользователь (администратор) или root-пользователь. Не важно какие права доступа установлены на файл или директорию (а директория, как мы помним из предыдущей статьи "типы файлов" - это тоже файл), root-пользователь всегда имеет полные права на все файлы.
2. Владелец файла - и
Оглавление

Linux - многопользовательская система, причем она изначально разрабатывалась многопользовательской. Во всем мире миллионы устройств работают на каком-либо дистрибутиве (в каком-то роде можно это назвать версией) Linux. В том числе подавляющее большинство серверов, и даже Android, установленный на миллионах смартфонах - это Linux (т.к. в его состав входит ядро Linux). Так как же изменить права доступа к определенным файлам?

Для этого существует утилита chmod (change mode), которая позволяет изменить права для владельца, группы и других пользователей на какой-либо файл. Но давайте по порядку.

Категории пользователей в Linux

1. В Linux главным пользователем, которых имеет полный доступ ко всем файлам, является суперпользователь (администратор) или root-пользователь. Не важно какие права доступа установлены на файл или директорию (а директория, как мы помним из предыдущей статьи "типы файлов" - это тоже файл), root-пользователь всегда имеет полные права на все файлы.
2. Владелец файла - изначально это тот, кто создал файл. Но владельца файла можно позже поменять. Владелец файла может быть только один.
3. Группа файла - изначально это группа владельца файла, но ее можно легко поменять на любую другую группу.
4. Остальные пользователи - это те, кто не относится к предыдущим 3 категориям.

Какие есть права доступа

есть 3 основных права:
*
чтение - есть возможность увидеть содержимое файла
*
изменение - запись, изменение имени, удаление
*
выполнение - файл можно запустить (актуально для программ)

Но в какой-то момент стало понятно, что недостаточно этих прав, поэтому в 1979 г. были разработаны 3 дополнительных права доступа:
*
SUID (set user ID upon execution - установка ID владельца файла во время его выполнения) - разрешить какому-либо пользователю выполнение файла от имени суперпользователя (только выполнение)
*
SGID (set group ID upon execution - установка ID группы во время выполнения; имеется ввиду ID той группы, которой присвоен доступ к файлу) - разрешить какой-либо группе выполнение от имени суперпользователя. Если SGID установлен на папку, все файлы созданные в ней будут связаны с группой этой папки, а не с пользователем. Такое поведение используется для организации общих папок
*
sticky-bit - используется почти только для каталогов; благодаря нему каждый может читать, изменять, добавлять, выполнять и удалять свои файлы в каталог, но не может изменять и удалять файлы других пользователей. Например, папка /tmp как раз имеет такой флаг. Этот флаг также используется для организации общих папок

sticky-bit был разработан еще в 1974 году, другие 2 дополнительных права были разработаны Денисом Ритчи - одним из разработчиков Си, на котором позже и было написано Линусом Торвальдсом ядро Linux.
Вообще благодаря SUID и SGID, операционная система в некоторой степени Linux стала более уязвима

Как посмотреть права для определенного файла

Для этого можно воспользоваться утилитой ls
У этой команду можно вызывать с опциями:

  • -l вывести файлы в виде списка (с доп. информацией о файле: тип файла и права доступа, владелец файла, группа файла, размер, дата создания и название )
  • вывести все файлы, в т.ч. скрытые
  • -h показать размер файла в удобном виде (например не в виде 29902, а как 29 Кбайт)
  • -i показать иноду файла (индексный номер файла; почти каждому файлу присваивается уникальное число, чтобы его было проще найти)

Опции можно комбинировать. Таким образом, чтобы вывести все файлы в папке (скрытые тоже) вместе с информацией о файлах нужно выполнить:
ls -la

Интерпретация выведенной информации

в 1-ом столбце есть 10 позиций, первая отведена для типа файла
в 1-ом столбце есть 10 позиций, первая отведена для типа файла

остальные 9 позиций разделены поровну на 3 категории пользователей - владельца, группы и остальных.

Для владельца (2-4 позиция):
r (
read)
w (
write)
x (e
xecute) или s (SUID)

Для группы (5-7 позиция):
r (
read)
w (
write)
x (e
xecute) или s (SGID)

Для остальных (8-10 позиция):
r (
read)
w (
write)
x (e
xecute) или t (sticky-bit)

Примеры

В этих примерах мы не будем учитывать первую позицию, отведенную под тип файла (об этом можно прочитать тут).

Если видим такую последовательность:
r w - r w - r - -
это означает, что владелец может читать и изменять файл; группа может тоже читать и изменять; остальные пользователи тоже могут только читать (характерно для созданных обычных файлов)

Если такая последовательность:
r w x - - x - - x
значит владелец имеет все права, а группу и остальные могут только выполнять файл (обычно такие права ставят для программ, написанных каким-либо пользователем)

Если такая:
r w x r w x r w x
то у всех есть полные права (это характерно для символьных ссылок на файлы)

Если такая:
- - - - - - - - -
это значит, что ни у кого нет никаких прав на этот файл. Работать с такими файлами может только суперпользователь, как мы помним, у него есть все права на все файлы, не зависимо от установленных флагов доступа

Как поменять права доступа + примеры

Итак, чтобы дать файлу права нужно прописать

chmod <опции> <для кого изменяем права><+ или -><набор прав> <файл(ы)>

для кого изменяем права: u (user = владелец файла), g (group), o (other)
добавить/отнять:
+ (добавить права) или - (отнять права)
Набор прав:
r (read), w (write), x (execute), s (SUID или SGID), t (sticky-bit)

Можно одновременно писать несколько категорий для кого меняем права и несколько флагов прав

Опции для chmod
Рассмотрим только 2 наиболее часто требующиеся опции:
-R
применить рекурсивно
-v выводить максимум информации

Пример
создадим 9 файлов и применим к ним разные права

создали 5 пустых текстовых файлов и еще 4 папки
создали 5 пустых текстовых файлов и еще 4 папки

займемся изменением прав:

-3

file1.txt - владельцу дали право на выполнение
file2.txt - владельцу, группе и остальным убрали все права (чтение, изменение, выполнение)
file3.txt - группе и остальным убрали все права
file4.txt - остальным убрали все права (т.к. у остальных было право только на чтение, можно было бы сделать o-r)
file5.txt - сначала пользователю и группе дали право на выполнение, а затем у остальных убрали право на чтение

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

для папки file6 убрали для всех пользователей возможность читать ее (а точнее ее содержимое). При этом создавать файлы или изменять те, которые в ней есть (при условии что мы знаем их имена) или выполнять их можно
для папки file6 убрали для всех пользователей возможность читать ее (а точнее ее содержимое). При этом создавать файлы или изменять те, которые в ней есть (при условии что мы знаем их имена) или выполнять их можно
В папке file7 сначала создадим какой-нибудь файл (это понадобится для демонстрации). После чего уберем у всех право на выполнение для этой папки. Теперь при попытке вывода информации в файле, подробности не будут выведены; кроме того нельзя ни попасть в папку, ни создать файл в ней
В папке file7 сначала создадим какой-нибудь файл (это понадобится для демонстрации). После чего уберем у всех право на выполнение для этой папки. Теперь при попытке вывода информации в файле, подробности не будут выведены; кроме того нельзя ни попасть в папку, ни создать файл в ней
Добавим флаг SGID папке file8
Добавим флаг SGID папке file8
добавим флаг sticky-bit папке file9
добавим флаг sticky-bit папке file9
теперь уберем sticky-bit у папки file9 и добавим SUID
теперь уберем sticky-bit у папки file9 и добавим SUID
Кстати, забыл сказать, что с помощью знака "равно" можно назначить только заданные права.
Допустим у файла были права
r w x r w - r - -
если выполнить команду
chmod ugo=x <file>
то у файла будут следующие права
- - x - - x - - x

Итого касательно директорий

* если у директории убрать флаг r, то в нее можно будет попасть и создавать там файлы, но нельзя будет посмотреть ее содержимое
* если у директории убрать флаг
w, то нельзя будет создавать файлы в директории (и переносить их туда/оттуда), а также удалять оттуда файлы, хотя копировать оттуда можно, при этом имя папки менять можно (если стоит флаг x), но удалить директорию нельзя
* если у директории убрать флаг
x, то в папку невозможно будет зайти, но можно посмотреть что в ней лежит, хотя дополнительную информацию о файлах в ней (права доступа, когда создана и пр.) посмотреть нельзя будет, также нельзя будет перемещать или копировать файлы в нее/из нее или удалять файлы в ней (т.е. по сути работает как флаги x + w ) и саму папку тоже нельзя будет удалить, но можно поменять ее имя

на этом все!
P.S.: есть еще циферные коды для смена прав на файл, скажите, нужно ли об этом рассказать отдельно?