Права доступа
Last updated
Last updated
Поговорив о пользователях и группах, самое время вспомнить про права доступа, которые для них настраиваются. Общая схема прав одинакова и для файлов, и для папок. Вы уже видели, как система отображает права доступа, в выводе команды ls -l
, которая показывает содержимое директории:
Первые 10 символов содержат информацию о правах к файлу или каталогу.
Далее идёт имя пользователя-владельца и группы -владельца.
Исходя из этого, иерархия доступа на уровне пользователей разбивается следующим образом: права пользователя-владельца, права участников группы-владельца и права всех остальных.
Соответственно, для каждой категории указывается, какие операции с файлом ей доступны: чтение (r), запись (w) или выполнение (x) — для исполняемых файлов. Для директорий параметры те же, но обозначают немного другое: просмотр директории (r), создание папок / файлов (w) внутри директории, переход в директорию (x).
Каждый из этих уровней доступа можно выразить в восьмеричной системе с помощью числового значения: 4 (r), 2 (w), 1 (x). Вот так мы и получаем общую схему прав:
Для отображения уровня прав помимо формата rwxrwxrwx
используется упомянутый восьмеричный формат. Для этого достаточно сложить все уровни прав по категориям:
Теперь можно перейти к инструментам, которые позволяют управлять правами на файлы и директории.
7 = 4 + 2 + 1 (read/write/execute)
6 = 4 + 2 (read/write)
5 = 4 + 1 (read/execute)
4 = 4 (read)
3 = 2 + 1 (write/execute)
2 = 2 (write)
1 = 1 (execute)
Для смены владельца доступны два инструмента. Первый — chown
, позволяет изменить пользователя и группу файла или папки:
Если не указывать группу, изменится только пользователь-владелец. Если не указывать пользователя (:[новая группа]
), изменится только группа-владелец.
При изменении прав на директории можно использовать параметр -R
. Он рекурсивно изменит владельца всех вложенных директорий и файлов. Представим, что нам нужно предоставить права на папку new-user
для одноимённого пользователя и его группы. Команда для этого будет выглядеть так:
Второй инструмент — chgrp
. В отличие от первого, меняет только группу-владельца:
Список распространённых параметров команды chgrp
:
-h
– работать непосредственно с самими символьными ссылками;
--dereference
– работать с файлами, а не самими символьными ссылками. Используется по умолчанию;
-R
– рекурсивная обработка каталога со всем его содержимым;
-H
– перейти по символической ссылке и изменить атрибуты файла/каталога. Используется вместе с параметром -R
;
-L
- перейти по символической ссылке и продолжить рекурсивную обработку. Используется вместе с параметром -R
;
-P
– при встрече с символической ссылке и обрабатывать только её. Используется вместе с параметром -R, является значением по умолчанию;
--reference=имя_образца
– использовать группу образца. Используется вместо группа
;
-c
– при обработке выводить только изменения;
-v
– выводить информацию о каждом обработанном объекте.
Для работы непосредственно с правами используется команда chmod
:
При работе с директориями опция -R
позволит изменить права на все вложенные файлы и папки.
Настройки прав в chmod
можно определять двумя способами:
Указав категорию (u
— пользователь-владелец, g
— группа-владелец, o
— другие пользователи, a
— все пользователи), модификатор (+
, -
, =
) и, соответственно, нужные права (r
, w
, x
).
Например, представим, что у нас есть файл example.txt
с максимальным уровнем прав для всех категорий пользователей:
Допустим, мы не хотим, чтобы кто-то в принципе мог запускать этот файл на выполнение. В таком случае нам нужно убрать параметр «x»
из прав всех категорий пользователей сразу. Это можно сделать так:
Представим, что потом мы решили вернуть владельцу права на запуск файла. То есть нам нужно добавить параметр «x»
в категорию пользователя-владельца:
Если вдруг мы захотим изменить весь набор параметров для отдельной категории разом, это будет выглядеть следующим образом:
Указав права в виде числового значения. Возможно, это не так прозрачно, но зато быстрее. В качестве параметра нам нужно передать это самое цифровое выражение уровня прав:
В примере мы назначили максимальный уровень доступа всем категориям пользователей.
Соответственно, для изменения уровня прав отдельной категории пользователей нужно изменить только это числовое значение. Например, запретим исполнение файла для всех пользователей:
А потом вернём, но только пользователю-владельцу:
Бывает, что нам нужно изменить права только на все папки или только на все файлы в определённой директории. Часто с этим можно столкнуться при настройке прав на файлы сайтов. Вот вам пара однострочников на этот случай:
Смена прав на 755
для всех папок внутри /var/www/sites/example.com
:
Смена прав на 644
для всех файлов внутри /var/www/sites/example.com
:
Помимо прав доступа и владельца каждый файл может иметь ряд атрибутов, определяемых на уровне файловой системы. Атрибуты показывают, какие операции могут или не могут проводиться с файлом в принципе, независимо от того, кто им владеет.
Посмотреть атрибуты файлов в текущей директории можно с помощью команды lsattr
. Если запустить её без аргументов, она выведет атрибуты всех файлов в текущей директории. Если указать путь к файлу или папке, она перечислит свойства указанного файла или списка файлов в указанной папке соответственно:
Первые 20 символов в строке предназначены для отображения атрибутов файла.
Список атрибутов может отличаться в зависимости от файловой системы. Вот список основных:
Изменить атрибуты файла позволяет команда chattr
:
То есть, если нам нужно защитить какой-то важный файл от посягательств, можно использовать такую команду:
Проверяем — посягательства не работают.
Если же нам нужно вернуть файл в нормальное состояние, нужно выполнить обратную операцию:
Для просмотра более подробной информации о файловых атрибутах, их ограничениях и правилах применения используйте команду:
Атрибут исполняемого файла, позволяющий запустить его с правами владельца. В операционных системах Linux приложение запускается с правами пользователя, запустившего указанное приложение. Это обеспечивает дополнительную безопасность т.к. процесс с правами пользователя не сможет получить доступ на запись к важным системным файлам, например /etc/passwd, который принадлежит суперпользователю root. Если на исполняемый файл установлен бит suid, то при выполнении эта программа автоматически меняет «эффективный userID» на идентификатор того пользователя, который является владельцем этого файла. То есть, не зависимо от того - кто запускает эту программу, она при выполнении имеет права хозяина этого файла.
Аналогичен SUID, но относиться к группе. При этом, если для каталога установлен бит SGID, то создаваемые в нем объекты будут получать группу владельца каталога, а не пользователя.
Когда процесс создает новый файл, он указывает, какие права доступа нужно задать для данного файла. Зачастую запрашиваются права 0666 (чтение и запись всеми), что дает больше разрешений, чем необходимо в большинстве случаев. К счастью, каждый раз, когда в Linux создается новый файл, система обращается к параметру, называемому umask. Система использует значение umask чтобы понизить изначально задаваемые разрешения на что-то более разумное и безопасное. Вы можете просмотреть текущие настройки umask набрав umask в командной строке:
В Linux-системах значением по умолчанию для umask является 0022, что позволяет другим читать ваши новые файлы (если они могут до них добраться), но не изменять их. Чтобы автоматически обеспечивать больший уровень защищенности для создаваемых файлов, можно изменить настройки umask:
Такое значение umask
приведет к тому, что группа и прочие не будут иметь совершенно никаких прав доступа для всех, вновь созданных файлов.
В отличие от «обычного» назначения прав доступа к файлу, umask
задает какие права доступа должны быть отключены. Посмотрим на таблицу соответствия значений чисел и прав:
Воспользовавшись этой таблицей мы видим, что последние три знака в 0077 обозначают —rwxrwx. umask
показывает системе, какие права доступа отключить. Совместив первое и второе становится видно, что все права для группы и остальных пользователей будут отключены, в то время как права владельца останутся нетронутыми.
Способ установки и удаления битов suid и sgid чрезвычайно прост. Чтобы задать бит suid:
Чтобы задать бит sgid:
Он используется для задания битов sticky, suid и sgid совместно с правами доступа:
Ниже приведен пример того, как использовать четырехзначный режим для установки прав доступа на директорию.
Атрибут | Описание атрибута |
---|---|
i
«godmode» — файл становится неуязвим для любых изменений. Его нельзя удалить, переименовать, изменить содержимое, создать символьную ссылку на него.
a
в файл с таким атрибутом можно только добавлять новые данные. Старое содержимое изменить или удалить не получится. Это пригодится для защиты от вредоносных вставок или замен в файлах, куда постоянно записываются данные — например, в логах. Доступ к изменению старого содержимого по умолчанию есть только у суперпользователя root
.
s
активирует безвозвратное удаление файла. В том смысле, что после удаления файл нельзя будет восстановить с носителя — при удалении все использовавшиеся для хранения файла блоки на диске перезаписываются нулями.
u
активирует «обратимое» удаление файлов. Это значит, что при удалении файла с этим атрибутом его содержимое можно восстановить.
с
сжатый файл. Все данные, записываемые в файл, автоматически сжимаются, а данные, извлекаемые из файла — возвращаются в исходное состояние.
d
настраивает для файла исключение при использовании утилиты dump
. То есть файл не будет включен в архив при создании резервной копии этим способом.
e
показывает, что файл в качестве указателей использует экстенты.
j
в журналируемых файловых системах (ext3
, ext4
) указывает на то, что при сохранении файла он сначала будет записан в журнал ФС, и только потом — на диск.
A
указывает, что при работе с файлом система не будет обновлять информацию о времени доступа к нему.
D
атрибут для директорий. Указывает, что все изменения в папке синхронно записываются на диск, минуя кэш.
S
указывает, что все изменения в файле с этим атрибутом записываются синхронно на диск, минуя кэш.