Настройка списков

Настройка списка системных пользователей

Пользователи, UID которых менее 1000, считаются системными и к ним не применяется изоляция. Однако, бывают случаи, когда системный пользователь, под которым работает какой-то системный сервис или база данных, имеет UID больше 1000. Для таких случаев предусмотрена возможность отключения LimitedFS для системных пользователей, указав имя такого пользователя в конфигурационном файле.

Для этих целей существует директория /etc/limitedfs/exclude-users.d, которая может содержать произвольное число конфигурационных файлов. Эти файлы содержат список имён системных пользователей, которые используются системными службами и не должны быть изолированы от основной системы. В каждой строке указывается одно имя пользователя. Файл /etc/limitedfs/exclude-users.d/system-users.conf содержит следующий список системных пользователей по умолчанию:

nobody
nfsnobody
exim
mysql
postgres
systemd-bus-proxy
systemd-network
systemd-coredump
systemd-oom
roundcube_sysuser
avahi-autoipd
clamav
colord
varnish
nagios
saslauth
apache
lsadm
nginx
unbound
polkitd
firebird
libstoragemgmt
dovecot
dovenull
saslauthd
chrony
sssd
setroubleshoot
pipewire
openvpn
nm-openvpn
nm-openconnect
dnsmasq

Администратор может изменить список системных пользователей, добавив новые имена пользователей или удалив существующие. Для этого нужно создать новый файл в директории /etc/limitedfs/exclude-users.d. Редактировать существующий файл /etc/limitedfs/exclude-users.d/system-users.conf, который содержит список системных пользователей по умолчанию и может изменяться при обновлении rpm-пакета limited-fs, не нужно.

Например, чтобы добавить нового системного пользователя sysuser в список, необходимо создать файл /etc/limitedfs/exclude-users.d/users2.conf со следующим содержимым:

sysuser

Если строка файла начинается со знака минус (-), то имя пользователя игнорируется, даже если присутствует в другом файле конфигурации. Поэтому, чтобы удалить системного пользователя postgres из списка по умолчанию, нужно создать файл /etc/limitedfs/exclude-users.d/users2.conf со следующим содержимым:

-postgres

Чёрный список директорий

Директории, доступные в LimitedFS, перечислены в конфигурации монтирований внутри директории /etc/limitedfs/mounts.d, а также в конфигурационных файлах в директориях /etc/limitedfs/files.d и /etc/limitedfs/symlinks.d. Эти конфигурационные файлы вместе формируют «белый список» директорий и файлов, которые доступны пользователям внутри LimitedFS.

Также есть «чёрный список» директорий (empty dirs), который позволяет скрыть содержимое любой директории (или поддиректории) внутри директорий из «белого списка». «Чёрный список» директорий хранится в конфигурационных файлах по пути /etc/limitedfs/empty-dirs.d.

Директория /etc/limitedfs/empty-dirs.d может содержать любое число конфигурационных файлов, которые содержат пути к директориям, которые надо скрыть из LimitedFS. При указании путей в этих конфигурационных файлах можно использовать маски (wildcards). Для скрытия содержимого директории, поверх неё автоматически монтируется пустая директория с помощью mount --bind.

Существует файл с чёрным списком директорий по умолчанию — /etc/limitedfs/empty-dirs.d/empty-dirs.conf. Этот файл сейчас пустой, в будущем в него, возможно, будут добавлены пути, которые нужно скрыть по умолчанию. Этот файл конфигурации перезаписывается при каждом обновлении rpm-пакета limited-fs, поэтому редактировать его нельзя. Для изменения конфигурации нужно создать новый файл, например /etc/limitedfs/empty-dirs.d/empty-dirs-new.conf.

Например, чтобы скрыть в LimitedFS директорию /opt/rh, нужно создать конфигурационный файл со следующим содержимым:

/opt/rh

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

-/opt/rh

После изменения настроек «белого» или «чёрного» списка нужно выполнить следующую команду для применения изменений:

$ sudo lfsctl  --mount-lfs

Далее приведён пример использования масок (wildcards). Чтобы запретить пользователям доступ внутри LimitedFS к некоторым директориям внутри /usr/lib, нужно выполнить команды:

$ sudo bash -c "echo '/usr/lib/sys*' > /etc/limitedfs/empty-dirs.d/new.conf"
$ sudo lfsctl --mount-lfs

После выполнения этих команд доступ к следующим директориям внутри LimitedFS будет запрещён:

/usr/lib/sysctl.d
/usr/lib/sysimage
/usr/lib/systemd
/usr/lib/sysusers.d

Предупреждение

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

Чёрный список файлов

Директория /etc/limitedfs/empty-files.d может содержать произвольное число конфигурационных файлов, которые содержат пути к файлам, доступ к которым должен быть запрещён внутри LimitedFS. Каждая строка файла должна иметь следующий вид:

path,mode
  • path – это абсолютный путь к файлу, доступ к которому нужно запретить;

  • mode – это строка, которая задаёт режим ограничения доступа: custom, perm или false.

Например:

/usr/sbin/fdisk,false
/usr/sbin/swapon,perm
/usr/sbin/useradd,custom

В режиме perm поверх пути path монтируется пустой файл с правами 0 (все операции запрещены) и владельцем и группой root:root. В результате, при попытке доступа к файлу, пользователь получает ошибку прав доступа Permission denied.

В режиме false поверх пути path монтируется бинарный исполняемый файл /usr/bin/false. В результате, когда пользователь запускает файл (команду) path, на самом деле будет запущена утилита /usr/bin/false, поэтому никаких существенных действий выполнено не будет и процесс вернёт ошибочный код завершения.

В режиме custom поверх пути path монтируется файл, заданный в параметре BlackFilePath конфигурационного файла /etc/limitedfs/limitedfs.json. В результате, когда пользователь запускает файл (команду) path, на самом деле будет запущена утилита, указанная в параметре BlackFilePath. Таким способом можно смонтировать, например, скрипт для логирования попыток доступа к файлам из чёрного списка:

$ sudo cat /etc/limitedfs/limitedfs.json
{ "BlackFilePath": "/root/black-file-logger.sh" }
$ sudo cat /root/black-file-logger.sh
#!/bin/bash
/usr/bin/logger "${0} file executed"
exit 1

Режим false следует использовать для ограничения доступа к исполняемым файлам, а режим perm подходит для ограничения доступа к любым файлам (и исполняемым, и файлам данных).

После изменения файлов конфигурации в директории /etc/limitedfs/empty-files.d для применения изменений, следует выполнить следующую команду:

$ sudo lfsctl  --mount-lfs

При указании путей в конфигурационных файлах черного списка файлов, можно использовать маски (wildcards). Например, чтобы внутри LimitedFS запретить пользователям запускать /usr/sbin/fdformat и /usr/sbin/fdisk, можно выполнить команды:

$ sudo bash -c "echo '/usr/sbin/fd*,false' > /etc/limitedfs/empty-files.d/new.conf"
$ sudo lfsctl --mount-lfs

Предупреждение

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

Белый список файлов и директорий

Директория /etc/limitedfs/files.d может содержать произвольное число конфигурационных файлов. Эти файлы содержат пути к файлам и директориям, которые должны быть видны в LimitedFS. При указании путей в этих конфигурационных файлах можно использовать маски (wildcards). Если путь, указанный в конфигурационном файле внутри директории /etc/limitedfs/files.d, является файлом или символической ссылкой, то такой путь копируется внутрь LimitedFS. Если же путь является директорией, то такой путь монтируется внутрь LimitedFS с параметром ro (только для чтения). Использование монтирования вместо копирования позволяет оптимизировать процесс формирования LimitedFS, а также автоматически поддерживает актуальность содержимого смонтированных директорий внутри LimitedFS (нет рассинхронизации с содержимым директории в реальной файловой системе). А файлы, которые скопированы внутрь LimitedFS, обновляются (синхронизируются с реальной файловой системой) командой lfsctl --update, которая выполняется раз в сутки по заданию крон. Также эта команда обновляет персональные файлы /etc/passwd, /etc/group, /etc/shadow, /etc/gshadow для всех пользователей.

Директория /etc/limitedfs/files.d содержит файлы конфигурации, которые содержат пути к файлам и директориям, доступными по умолчанию в LimitedFS. Эти конфигурационные файлы перезаписываются при обновлении rpm-пакета limited-fs. Поэтому для изменнения настроек по умолчанию, нужно не редактировать эти файлы, а создать новые файлы конфигурвции в директории /etc/limitedfs/files.d.

Администратор может изменить белый список файлов и директорий, которые будут видны внутри LimitedFS. Для этого нужно создать новый файл в директории /etc/limitedfs/files.d.

Например, чтобы добавить файл /etc/zshrc в LimitedFS, необходимо создать файл /etc/limitedfs/files.d/custom.conf со следующим содержимым:

/etc/zshrc

Если строка файла начинается со знака минус (-), то путь из этой строки игнорируется, даже если присутствует в другом файле конфигурации (строки сравниваются посимвольно, исключение пути из конфигурации сработает только при полном совпадении). Поэтому, чтобы удалить файл /etc/vimrc из LimitedFS, нужно создать файл /etc/limitedfs/files.d/custom.conf со следующим содержимым:

-/etc/vimrc

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

$ sudo lfsctl  --update

Маски файлов можно использовать следующим образом:

$ sudo bash -c "echo '/etc/vi*' > /etc/limitedfs/files.d/new.conf"
$ sudo lfsctl --update

После выполнения этих команд доступ к следующим файлам внутри LimitedFS будет разрешён:

/etc/vimrc
/etc/virc

Чтобы добавить эту маску в исключения, требуется посимвольное совпадение маски:

$ sudo bash -c "echo '-/etc/vi*' > /etc/limitedfs/files.d/new2.conf"
$ sudo lfsctl --update

А вот так исключение не сработает (нет посимвольного совпадения):

$ sudo bash -c "echo '-/etc/vi*c' > /etc/limitedfs/files.d/new2.conf"
$ sudo lfsctl --update

Предупреждение

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

Изоляция директории /etc для пользователей

По умолчанию в LimitedFS директория /etc изолирована таким образом, что каждый пользователь имеет свои собственные файлы /etc/passwd, /etc/group, /etc/shadow, /etc/gshadow, отличные от этих файлов в реальной корневой файловой системе. В этих файлах присутствуют системные пользователи и группы, которые указаны в конфигурационных файлах в директориях /etc/limitedfs/etc-users.d (список системных пользователей) и /etc/limitedfs/etc-groups.d (список системных групп). В персональном файле /etc/passwd пользователя присутствует сам пользователь (или несколько пользователей с таким же UID, в случае, когда такие есть). Других пользователей в /etc/passwd нет. В персональном файле /etc/group для пользователя кроме системных групп есть группы, в которые входит этот пользователь (или какие-либо пользователи с таким же UID, если такие есть). В списках членов групп перечислены только такие пользователи, даже если в файле /etc/group в реальной системе в группу входит много других пользователей. Файлы /etc/shadow и /etc/gshadow в LimitedFS заменены на файлы-заглушки, поскольку пользователь не имеет прав на их чтение, следовательно содержимое файлов внутри LimitedFS пользователя не имеет значение.

Директория /etc внутри LimitedFS содержит только ограниченное подмножество файлов из директории /etc реальной файловой системы. Список файлов и директорий, которые должны быть в директории /etc внутри LimitedFS, приводится в конфигурационных файлах в директории /etc/limitedfs/files.d. Каждый путь должен быть абсолютным (начинаться с /).

Если путь, указанный в конфигурационном файле внутри директории /etc/limitedfs/files.d, является файлом или символической ссылкой, то такой путь копируется внутрь LimitedFS. Если же путь является директорией, то такой путь монтируется внутрь LimitedFS с опцией ro (только для чтения). Использование монтирования вместо копирования позволяет оптимизировать процесс формирования LimitedFS, а также автоматически поддерживает актуальность содержимого смонтированных директорий внутри LimitedFS (нет рассинхронизации с содержимым директории в реальной файловой системе). А файлы, которые скопированы внутрь LimitedFS, обновляются (синхронизируются с реальной файловой системой) командой lfsctl --update, которая выполняется раз в сутки по заданию крон. Также, эта команда обновляет персональные файлы /etc/passwd, /etc/group, /etc/shadow, /etc/gshadow для всех пользователей.

По умолчанию директория /etc не указана в конфигурационных файлах монтирований внутри директории /etc/limitedfs/mounts.d. В этом случае изоляция директории /etc включена и выполняется формирование содержимого директории /etc внутри LimitedFS, как описано выше. Если же директория /etc указана в конфигурационных файлах монтирований внутри директории /etc/limitedfs/mounts.d, то изоляция (формирование персональных директорий) /etc для пользователей внутри LimitedFS отключается. При этом внутрь LimitedFS монтируется директория /etc из реальной файловой системы целиком, что менее правильно с точки зрения безопасности.

Для того, чтобы выключить изоляцию /etc, нужно создать файл внутри директории /etc/limitedfs/mounts.d, например /etc/limitedfs/mounts.d/mounts2.conf, добавить в него строку !/etc и затем выполнить команду lfsctl  --mount-lfs. Включить изоляцию /etc обратно можно, удалив этот файл и выполнив команду lfsctl  --mount-lfs.