url image

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

Поговорив о пользователях и группах, самое время вспомнить про права доступа, которые для них настраиваются. Общая схема прав одинакова и для файлов, и для папок. Вы уже видели, как система отображает права доступа, в выводе команды ls -l, которая показывает содержимое директории:

Первые 10 символов содержат информацию о правах к файлу или каталогу. 

-

тип файла

rw-

права пользователя-владельца

r--

права пользователей группы-владельца

r--

права всех остальных пользователей

Далее идёт имя пользователя-владельца и группы -владельца.

root

файл принадлежит пользователю root

root

файл принадлежит группе root

Исходя из этого, иерархия доступа на уровне пользователей разбивается следующим образом: права пользователя-владельца, права участников группы-владельца и права всех остальных. 

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

Каждый из этих уровней доступа можно выразить в восьмеричной системе с помощью числового значения: 4 (r), 2 (w), 1 (x). Вот так мы и получаем общую схему прав:

a — любые пользователи
u — права пользователя g — права группы o — права всех остальных
r w x r w x r w x
4 2 1 4 2 1 4 2 1

 

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

rwxrwxrwx = (4+2+1), (4+2+1), (4+2+1) = 777

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

Смена владельца файла или директории

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

chown [новый пользователь]:[новая группа] [файл или папка]

Если не указывать группу, изменится только пользователь-владелец. Если не указывать пользователя (:[новая группа]), изменится только группа-владелец. 

При изменении прав на директории можно использовать параметр -R. Он рекурсивно изменит владельца всех вложенных директорий и файлов. Представим, что нам нужно предоставить права на папку new-user для одноимённого пользователя и его группы. Команда для этого будет выглядеть так:

chown -R new-user:new-group /home/users/new-user

Второй инструмент — chgrp. В отличие от первого, меняет только группу-владельца:

chgrp [группа] [файл или папка]

Как и chown, может работать рекурсивно с помощью ключа -R.

Смена владельца файла или директории

Для работы непосредственно с правами используется команда chmod:

chmod [настройки прав] [файл или папка]

При работе с директориями опция -R позволит изменить права на все вложенные файлы и папки.

Настройки прав в chmod можно определять двумя способами:

  1. Указав категорию (u — пользователь-владелец, g — группа-владелец, o — другие пользователи, a — все пользователи), модификатор (+, - , =) и, соответственно, нужные права (r, w, x). 

    Например, представим, что у нас есть файл example.txt с максимальным уровнем прав для всех категорий пользователей: 

    Допустим, мы не хотим, чтобы кто-то в принципе мог запускать этот файл на выполнение. В таком случае нам нужно убрать параметр «x» из прав всех категорий пользователей сразу. Это можно сделать так: 

    chmod a-x example.txt

    Представим, что потом мы решили вернуть владельцу права на запуск файла. То есть нам нужно добавить параметр «x» в категорию пользователя-владельца:

    chmod u+x example.txt

    Если вдруг мы захотим изменить весь набор параметров для отдельной категории разом, это будет выглядеть следующим образом:

    chmod u=rwx example.txt
  2. Указав права в виде числового значения. Возможно, это не так прозрачно, но зато быстрее. В качестве параметра нам нужно передать это самое цифровое выражение уровня прав:

    chmod 777 example.txt 

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

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

    chmod 666 example.txt

    А потом вернём, но только пользователю-владельцу:

    chmod 766 example.txt

Бывает, что нам нужно изменить права только на все папки или только на все файлы в определённой директории. Часто с этим можно столкнуться при настройке прав на файлы сайтов. Вот вам пара однострочников на этот случай: 

  • Смена прав на 755 для всех папок внутри /var/www/sites/example.com:

    find /var/www/sites/example.com/ -type d -exec chmod 755 {} \;
  • Смена прав на 644 для всех файлов внутри /var/www/sites/example.com:

    find /var/www/sites/example.com/ -type f -exec chmod 644 {} \;

Изменение атрибутов файлов

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

Посмотреть атрибуты файлов в текущей директории можно с помощью команды lsattr. Если запустить её без аргументов, она выведет атрибуты всех файлов в текущей директории. Если указать путь к файлу или папке, она перечислит свойства указанного файла или списка файлов в указанной папке соответственно:

lsattr example.txt

Первые 20 символов в строке предназначены для отображения атрибутов файла.

Список атрибутов может отличаться в зависимости от файловой системы. Вот список основных:

i

«godmode» — файл становится неуязвим для любых изменений. Его нельзя удалить, переименовать, изменить содержимое, создать символьную ссылку на него.

a

в файл с таким атрибутом можно только добавлять новые данные. Старое содержимое изменить или удалить не получится. Это пригодится для защиты от вредоносных вставок или замен в файлах, куда постоянно записываются данные — например, в логах. Доступ к изменению старого содержимого по умолчанию есть только у суперпользователя root.

s

активирует безвозвратное удаление файла. В том смысле, что после удаления файл нельзя будет восстановить с носителя — при удалении все использовавшиеся для хранения файла блоки на диске перезаписываются нулями.

u

активирует «обратимое» удаление файлов. Это значит, что при удалении файла с этим атрибутом его содержимое можно восстановить.

с

сжатый файл. Все данные, записываемые в файл, автоматически сжимаются, а данные, извлекаемые из файла — возвращаются в исходное состояние.

d

настраивает для файла исключение при использовании утилиты dump. То есть файл не будет включен в архив при создании резервной копии этим способом.

e

показывает, что файл в качестве указателей использует экстенты.

j

в журналируемых файловых системах (ext3, ext4) указывает на то, что при сохранении файла он сначала будет записан в журнал ФС, и только потом — на диск.

A

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

D

атрибут для директорий. Указывает, что все изменения в папке синхронно записываются на диск, минуя кэш.

S

указывает, что все изменения в файле с этим атрибутом записываются синхронно на диск, минуя кэш.

 

Изменить атрибуты файла позволяет команда chattr:

chattr [модификатор][изменяемые атрибуты] [целевой файл или папка]

То есть, если нам нужно защитить какой-то важный файл от посягательств, можно использовать такую команду:

chattr +i example.txt

Проверяем — посягательства не работают.

Если же нам нужно вернуть файл в нормальное состояние, нужно выполнить обратную операцию: 

chattr -i example.txt

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

man chattr

Этот материал был полезен?

Скидка 25% новым клиентам!
Закажи сервер сегодня и получи скидку на первый месяц аренды!