Контроль доступа к файлам

Общие сведения о правах доступа

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

Права доступа к файлам и каталогам в ОС разделяются на три категории:

  • Владелец (user): права доступа для пользователя, которому принадлежит файл.
  • Группа (group): права доступа для группы пользователей, связанной с файлом.
  • Остальные (others): права для всех остальных пользователей Системы.

Права доступа включают в себя:

  • r (read) – чтение: пользователь может просматривать содержимое файла или список файлов в каталоге.
  • w (write) – запись: пользователь может изменять содержимое файла или создавать, удалять и переименовывать файлы в каталоге.
  • x (execute) – выполнение: пользователь может запускать файл на выполнение (если это исполняемый файл или скрипт) или переходить в каталог.

Права доступа также можно задать с помощью чисел. Каждому праву доступа соответствует определенное число:

  • r = 4;
  • w = 2;
  • x = 1.

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

  • 7 (rwx) = 4 (чтение) + 2 (запись) + 1 (выполнение);
  • 5 (r-x) = 4 (чтение) + 1 (выполнение).

Общая схема настройки прав для пользователей и групп пользователей одинакова и для файлов, и для папок.

Система отображает права доступа в выводе команды ls -l, которая показывает содержимое директории (рисунок 47):

Рисунок 47 - Вывод команды ls -l

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

Пример вывода команды ls -l:

-rw-r--r--

Где параметры:

  • rw- – владелец может читать и изменять файл;
  • r-- – группа может только читать файл;
  • r-- – остальные пользователи также могут только читать файл.

Назначение владельца и группы отображается при выполнении команды ls -l:

-rw-r----- 1 root adm 1024 May 10 12:00 syslog

где:

  • root — владелец,
  • adm — группа.

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

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

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

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

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

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

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

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

Список распространённых параметров команды chgrp:

  • -h – работа непосредственно с самими символьными ссылками;
  • --dereference – работа с файлами, а не самими символьными ссылками (используется по умолчанию);
  • -R – рекурсивная обработка каталога со всем его содержимым;
  • -H – переход по символической ссылке и изменение атрибутов файла/каталога; используется вместе с параметром -R;
  • -L – переход по символической ссылке и продолжение рекурсивной обработки; используется вместе с параметром -R;
  • -P – обработка только символической ссылки при наличии; используется вместе с параметром -R; является значением по умолчанию;
  • --reference=имя_образца – использование группы образца; используется вместо группы;
  • -c – вывод при обработке только изменений;
  • -v – вывод информации о каждом обработанном объекте.

Изменение прав доступа

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

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

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

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

  1. указать категорию (u – пользователь-владелец, g – группа-владелец, o – другие пользователи, a – все пользователи), модификатор ("+", " ", "=") и, соответственно, нужные права (r, w, x). Например, если есть файл example.txt с максимальным уровнем прав для всех категорий пользователей rwx rwx rwx. Если не нужно, чтобы кто-то мог запускать этот файл на выполнение, нужно убрать параметр x из прав всех категорий пользователей сразу. Это можно сделать так:
    chmod a-x example.txt
    
    Права доступа к файлу поменяются на:
    rw-rw-rw-
    
    Теперь, если необходимо вернуть владельцу права на запуск файла, следует добавить параметр x в категорию пользователя-владельца:
    chmod u+x example.txt
    
    После чего права доступа на файл станут следующими:
    rwxrw-rw-
    
    Для изменения всего набора параметров для отдельной категории сразу нужно использовать команду:
    chmod u=rwx example.txt
    
    Права доступа к файлу снова изменятся на:
    rwxrwxrwx
    

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

```bash Terminal
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. Команда без аргументов выведет атрибуты всех файлов в текущей директории. Если указать путь к файлу или папке, будут перечислены свойства указанного файла или списка файлов в указанной папке соответственно (рисунок 48):

lsattr example.txt

Рисунок 48 – Использование команды lsattr

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

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

  • i – файл становится неуязвим для любых изменений ("godmode"). Его нельзя удалить, переименовать, изменить содержимое или создать на него символическую ссылку.
  • a – в файл можно только добавлять новые данные. Изменение или удаление существующего содержимого запрещено. Атрибут часто используется для защиты лог-файлов. Изменять такие файлы может только суперпользователь root.
  • s – при удалении файл безвозвратно стирается: все блоки на диске, которые он занимал, перезаписываются нулями.
  • u – активирует возможность восстановления содержимого файла после удаления ("обратимое" удаление).
  • c – файл хранится в сжатом виде: при записи данные автоматически сжимаются, при чтении – распаковываются.
  • d – исключает файл из резервного копирования при использовании утилиты dump.
  • e – показывает, что файл использует экстенты в качестве указателей.
  • j – для журналируемых файловых систем (ext3, ext4) указывает, что данные файла сначала записываются в журнал, а затем – на диск.
  • A – при работе с файлом не обновляется информация о времени последнего доступа.
  • D – применяется к каталогам. Изменения в таких каталогах записываются на диск синхронно, минуя кеш.
  • S – обеспечивает синхронную запись изменений в файл напрямую на диск, минуя кеш.

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

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

Таким образом, если необходимо защитить какой-то важный файл от изменений, можно использовать такую команду (рисунок 49):

chattr +i example.txt

Рисунок 49 – Проверка выполнения действий над файлом example.txt

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

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

chattr -i example.txt

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

man chattr

SUID (Set User ID)

SUID – это атрибут исполняемого файла, позволяющий запустить его с правами владельца. В ОС РОСА "ХРОМ" приложение запускается с правами пользователя, запустившего указанное приложение. Это обеспечивает дополнительную безопасность, т. к. процесс с правами пользователя не сможет получить доступ на запись к важным системным файлам, например /etc/passwd, который принадлежит суперпользователю root.

Если на исполняемый файл установлен атрибут suid, то при выполнении эта программа автоматически меняет "эффективный userID" на идентификатор того пользователя, который является владельцем этого файла. Таким образом, независимо от того, кто запускает эту программу, она при выполнении имеет права хозяина этого файла.

SGID (Set Group ID)

Атрибут SGID аналогичен SUID, но относится к группе. При этом, если для каталога установлен бит SGID, то создаваемые в нем объекты будут получать группу владельца каталога, а не пользователя.

UMASK

Любой процесс при создании нового файла определяет, какие права доступа нужно задать для данного файла. Зачастую запрашиваются права "0666" (чтение и запись всеми), что дает больше разрешений, чем необходимо в большинстве случаев. Но при этом каждый раз, когда создается новый файл, Система обращается к параметру, называемому umask. Система использует значение umask, чтобы понизить изначально задаваемые разрешения на более разумные и безопасные. Просмотреть текущие настройки umask можно, набрав в командной строке:

user@user:~$ umask
0002

Использование маски umask определяется политикой безопасности организации. В сертифицированной конфигурации рекомендуется установка umask не менее 0022 или 0077.

В ОС РОСА "ХРОМ" значением по умолчанию для umask является "0022", что позволяет другим пользователям читать новые файлы (если имеется соответствующий доступ), но не изменять их. Чтобы автоматически обеспечивать бо́льший уровень защищенности для создаваемых файлов, можно изменить настройки umask:

user@user:~$ umask 0077

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

В отличие от "обычного" назначения прав доступа к файлу, umask задает, какие права доступа должны быть отключены.

Изменение SUID и SGID

Установка SUID/SGID должна выполняться только для доверенных программ в соответствии с политикой безопасности.

Способ установки и удаления битов SUID и SGID:

  • чтобы задать бит SUID:
    chmod u+s <путь к файлу>
    
  • чтобы задать бит SGID:
    chmod g+s <путь к директории>
    
  • чтобы удалить бит SUID:
    chmod u-s <путь к файлу>
    
  • чтобы удалить бит SGID:
    chmod g-s <путь к директории>
    

Расширенные списки контроля доступа (ACL)

ACL (Access Control List, список контроля доступа) – это механизм в ОС, который позволяет более гибко управлять доступом к файлам и папкам, чем это позволяют права доступа по умолчанию. С ACL можно установить права доступа для конкретных пользователей и групп пользователей на конкретные файлы и папки.

ACL обычно состоит из двух типов прав: пользовательские права и групповые права. Пользовательские права позволяют устанавливать права доступа для конкретных пользователей, а групповые права – для групп пользователей.

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

Команды для работы с ACL в ОС включают getfacl и setfacl. Команда getfacl используется для просмотра текущих прав доступа ACL на файлы и папки, а команда setfacl – для изменения или добавления новых прав доступа ACL на файлы и папки.

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

В ОС списки ACL хранятся в расширенных атрибутах (extended attributes, xattr), которые являются дополнительными метаданными, хранящимися в файловой системе. Большинство файловых систем, в т.ч. ext4, BTRFS, XFS, поддерживают хранение ACL в xattr. Однако, не все файловые системы поддерживают ACL и хранение их в xattr. Например, файловая система FAT32 полностью не поддерживает ACL.

Пакет с утилитами для работы с ACL уже предустановлен в ОС. При необходимости его можно установить из репозитория командой:

sudo dnf install acl

Команды getfacl и setfacl

Команда getfacl отображает права доступа в ОС в виде ACL:

user$ touch файл1
user$ getfacl файл1
file: файл1
owner: kofler
group: kofler
user::rw-
group::r--
other::r--
user$ ls -l файл1
-rw-r--r-- 1 kofler... файл2

С помощью setfacl можно определить новые права доступа. Следующие команды предоставляют пользователю gabi и всем членам группы docuteam доступ к файлу с правом читать и изменять этот файл, однако закрывают пользователю kathrin какой-либо доступ к файлу:

user$ setfacl -m gabi:rw файл1
user$ setfacl -m g:docuteam:rw файл1
user$ setfacl -m kathrin:- файл1

Список прав команды getfacl немного длиннее. Теперь команда ls показывает на месте прав доступа для членов группы специальную ACL-маску. За буквами, означающими доступ, следует символ "+", указывающий на наличие правил ACL.

user$ getfacl файл1
file: файл1
owner: kofler
group: kofler
user::rw-
user:gabi:rw-
user:kathrin:---
group::r--
group:docuteam:rw-
mask::rw-
other::r--
user$ ls -l файл1
-rw-rw-r--+ 1 kofler... файл1

Как правило, списки контроля доступа применяются для того, чтобы предоставить определенному пользователю доступ к его файлам, не давая такого доступа всем остальным пользователям. В таком случае потребуется обратиться к администратору, чтобы он создал группу, к которой будет принадлежать сам пользователь и те пользователи, вместе с которыми предполагается обрабатывать файлы. При использовании ACL нужно выполнить команду:

setfacl -m пользователь:rw файл

Маски

Маска ограничивает права, предоставляемые правилами ACL. Если, например, для маски ACL устанавливается значение "r", то ни одно правило не может дать пользователю права изменять или выполнять файлы. Таким образом, ACL-маска имеет приоритет над правилами ACL. Но в любом случае она никак не влияет на обычные права доступа, которые предоставляются пользователю или группе пользователей традиционным способом.

При изменении правила ACL командой setfacl маска автоматически рассчитывается заново так, чтобы могли выполняться все прочие правила ACL. Данная маска отображается с помощью команды getfacl и также учитывается командой:

ls -l

Можно явным образом настроить маску с помощью команды:

setfacl -m:rwx файл

Таким образом, ограничиваются права ACL. Следует учитывать, что маска действует лишь до тех пор, пока не будет определено новое правило ACL. В таком случае маска ACL будет автоматически пересчитана (если только не запрещено с помощью параметра -n).

Наследование

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

Совместимость

Распространение списков контроля доступа сильно осложняется тем, что многие стандартные команды и практически все пользовательские программы просто игнорируют ACL. Если просто скопировать файл с правилами ACL с помощью команды cp, то в скопированном файле правила ACL не сохранятся. То же самое произойдет, если открыть файл на редактирование в любом текстовом или графическом редакторе и сохранить его под другим именем. При использовании команды cp будет полезен параметр -p, но у большинства других команд и программ подобные параметры отсутствуют, либо эти программы вообще не приспособлены к работе с ACL.

Проблемы возникают и при резервном копировании. Команды tar и rsync элиминируют правила ACL. Файловая система CD и DVD не рассчитана на работу с ACL, так что сохраняемая в них информация теряется.

Есть два выхода: во-первых, можно применять вместо tar версию star, совместимую с ACL, во-вторых, перед резервным копированием можно создавать отдельный текстовый файл, в который заносятся ACL-правила всех копируемых файлов. После резервного копирования правил ACL восстанавливаются на основании этого файла.

getfacl -R --skip-base. > acl-backup (Сохранение ACL-правил)
setfacl --restore=acl-backup (Восстановление ACL-правил)

Файл с ACL должен храниться защищённо, так как содержит информацию о правах доступа.

Расширенные атрибуты

Команды setfattr и getfattr

На следующих примерах показано, как сохранять атрибуты с помощью команды setfattr и считывать их с использованием getfattr:

user$ touch файл2
user$ setfattr -n user.language -v ru файл2
user$ setfattr --name=user.charset --value=utf8 файл2
user$ getfattr -d файл2
file: файл2
user.charset="utf8"
user.language="ru"

Команда getfattr обычно возвращает только те атрибуты, чье название начинается с user. Если требуется увидеть другие атрибуты, нужно указывать имя атрибута вместе с меткой -n, а образец атрибута с меткой -m.

Совместимость с расширенными атрибутами

К сожалению, пока практически не существует программ, которые сохраняли бы расширенные атрибуты при копировании, архивировании и т. д. Даже следующая команда игнорирует атрибуты:

cp -p

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

user$ getfattr -R. > ea-backup (Сохранение атрибутов)
user$ setfattr --restore=ea-backup (Восстановление атрибутов)

Примеры настройки ACL

Настройка ACL выполняется администратором в соответствии с политикой безопасности организации. В качестве примера рассматриваются типовые настройки списков доступа:

  1. Предоставление прав конкретному пользователю: Чтобы дать пользователю user1 права на чтение и выполнение файла нужно запустить следующую команду:
setfacl -m u: user1:rx файл
  1. Настройка прав для группы editors на запись в каталог:
setfacl -m g:editors:rwx каталог
  1. Удаление записей ACL для файла:
setfacl -b файл
  1. Установка прав по умолчанию для всех новых файлов в каталоге:
setfacl -m d:u:john:rwx каталог
  1. Настройка ACL для существующих файлов. В качестве примера используются следующие исходных данные:
    • каталог /media/buh (на поддерживающей ACL файловой системе: ext4, BTRFS, XFS и др.);
    • группа пользователей buh (бухгалтерия);
    • пользователи ivanova, petrova, sidorova, входящие в группу buh. Необходимо всех пользователей из группы buh – ivanova, petrova, sidorova – наделись следующими правами:
    • читать файлы в /media/buh;
    • создавать новые файлы и каталоги;
    • изменять существующие файлы. Для настройки ACL для существующих файлов нужно выполнить следующие действия:
  2. Выставить права на каталог /media/buh для группы buh, чтобы ее пользователи могли записывать и читать файлы в этом каталоге:
sudo setfacl -R -m g:buh:rwx /media/buh

Эта команда добавляет права для группы buh на папку /media/buh и все ее подкаталоги и файлы. Опция -R означает, что изменения должны применяться рекурсивно для всех подкаталогов и файлов. Опция -m означает, что изменяются существующие права. Параметр g:buh:rwx означает, что выставляются права для группы buh на чтение, запись и выполнение. 7. Проверить, что права настроены правильно, можно командой:

sudo getfacl /media/buh

В выводе на экран должно быть примерно следующее:

file: /media/buh/
owner: <owner>
group: buh
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:buh:rwx
default:other::r-x

В этом выводе для группы buh выставлены права на чтение, запись и выполнение, и группа buh имеет права на чтение и запись файлов в папке /media/buh, все ее подпапки и файлы в них. 8. Автоустановка ACL для создаваемых файлов и папок. Ключ -d в команде setfacl позволяет установить ACL по умолчанию на вновь создаваемые файлы и папки в указанной директории. Для того, чтобы установить права по умолчанию для группы buh на каталог /media/buh, нужно выполнить следующую команду:

sudo setfacl -R -d -m g:buh:rwx /media/buh

Здесь ключ -d указывает, что устанавливается ACL по умолчанию, а ключ -m указывает, что изменяются существующие права. Аргумент g:buh:rwx задает права для группы buh на чтение, запись и выполнение. Теперь при создании новых файлов и подкаталогов в каталоге /media/buh они будут автоматически получать ACL с правами, выставленными по умолчанию. Чтобы проверить, что ACL по умолчанию настроены правильно, нужно выполнить команду:

sudo getfacl /media/buh

В выводе должно быть примерно следующее:

file: /media/buh/
owner: <owner>
group: buh
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:buh:rwx
default:other::r-x

В этом выводе строка default:group:buh:rwx указывает, что группа buh имеет права на чтение, запись и выполнение для всех вновь создаваемых файлов и подкаталогов в каталоге /media/buh.