Настройки монтирований

Настройка монтирований LimitedFS

Для управления системой изоляции используются конфигурационные файлы, расположенные внутри директории /etc/limitedfs. Список монтирований задаёт множество директорий, которые монтируются из реальной системы в LimitedFS и будут доступны пользователю внутри LimitedFS. Помимо директорий, указанных в конфигурационных файлах монтирований, пользователю внутри LimitedFS доступны его домашняя директория и директория /var/www/php-bin/$USERNAME (если она существует).

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

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

!/bin
/dev
!/etc
!/lib
!/lib64
/opt
/run
!/sbin
!/usr
/var
@/tmp,700
@/var/tmp,700
@/var/run/screen,777
@/var/php/apm/db,777
@/var/cache/php-eaccelerator,777

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

По умолчанию внутри LimitedFS разрешено выполнение suid программ (например, exim). Однако, это можно изменить, запретив выполнение всех suid программ внутри LimitedFS при помощи опции монтирования nosuid. Для этого используется опция MountOptions в конфигурационном файле /etc/limitedfs/limitedfs.json. В значении этого параметра через запятую перечисляются опции монтирования, которые должны использоваться внутри LimitedFS. Например, для отключения возможности выполнения suid программ внутри LimitedFS для опции MountOptions нужно указать значение nosuid, а затем выполнить команду lfsctl --mount-lfs для применения изменений. При этом монтирования выполняются с опцией nosuid, чтобы исключить повышение прав пользователя и повысить безопасность. Повышение прав с помощью бита setuid на исполняемых файлах, а также с помощью привилегий Linux (Linux capabilities) внутри LimitedFS в этом случае будет отключено.

По умолчанию директории монтируются с доступом для чтения и записи (read-write). Если же строка файла монтирований начинается с восклицательного знака (!), то директория, указанная в строке, монтируется в LimitedFS только для чтения (read-only), что дополнительно повышает безопасность, исключая модификацию файлов пользователем даже в случае некорректных прав на файлы и директории. Строки, которые начинаются с символа (#), считаются комментариями (игнорируются). Если путь к директории начинается со знака минус (-), то такая директория не монтируется в LimitedFS, даже если указана в каком-либо другом конфигурационном файле в директории /etc/limitedfs/mounts.d. Таким образом, чтобы убрать, например, путь /sbin (который есть в списке монтирований по умолчанию) из списка монтирований, достаточно создать файл /etc/limitedfs/mounts.d/mounts2.conf со следующим содержимым:

-/sbin

Допустим, нужно переопределить параметры монтирования для пути /opt, чтобы этот путь монтировался не для чтения и записи как в конфигурации по умолчанию (read-write), а только для чтения (read-only). Для этого достаточно добавить в созданный файл /etc/limitedfs/mounts.d/mounts2.conf следующую строку:

!/opt

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

$ sudo lfsctl  --mount-lfs

Персональные монтирования пользователя

В LimitedFS каждый пользователь может иметь свои персональные монтирования, доступные только ему и недоступные для других пользователей. Например, домашняя директория пользователя является персональным монтированием этого пользователя и она не видна для других пользователей. Домашняя директория пользователя монтируется в LimitedFS всегда, это поведение нельзя изменить.

В LimitedFS можно создавать дополнительные персональные монтирования для пользователей при помощи конфигурационного файла монтирований, который был описан ранее. Строка персонального монтирования в конфигурационном файле начинается с символа @, после которого указывается путь к директории (монтированию), а затем через запятую указываются права этой директории в восьмеричной форме. Для таких монтирований владельцем и группой владельца является сам пользователь и первичная группа этого пользователя соответственно.

Например, строка @/tmp,700 создаёт в LimitedFS персональную изолированную директорию /tmp для каждого пользователя, которая будет доступна только самому пользователю.

$ ls -ld /tmp
drwx------. 2 user2111 user2111 6 июл 18 09:26 /tmp

По умолчанию в LimitedFS пользователи имеют следующие персональные, изолированные директории (помимо домашней директории):

@/tmp,700
@/var/tmp,700
@/var/run/screen,777
@/var/php/apm/db,777
@/var/cache/php-eaccelerator,777

Если какого-либо пути, указанном в файле монтирований, не существует в реальной файловой системе, то такое монтирование игнорируется (не создаётся). Например, если в реальной файловой системе нет директории /var/cache/php-eaccelerator, то и внутри LimitedFS этой директории не будет (монтирование /var/cache/php-eaccelerator не будет создано).

Персональные монтирования пользователя физически располагаются в домашней директории пользователя по пути ~/.limitedfs/$MNT_PATH, где MNT_PATH — это путь к персональному монтированию пользователя, указанный в файле конфигурации монтирований. Поэтому на использование дискового пространства внутри персональных монтирований пользователя действует ограничение дисковой квоты, если такое ограничение настроено для домашней директории пользователя.

Также есть возможность создавать изолированные директории пользователей /tmp не в домашних директориях пользователей, а в директории /tmp реальной файловой системы. В случае, когда эта системная директория /tmp расположена на tmpfs, то есть в оперативной памяти, доступ к изолированным директориям /tmp пользователей будет более быстрый. Чтобы включить эту возможность, нужно создать конфигурационный файл с произвольным именем, например /etc/limitedfs/mounts.d/mounts2.conf со следующим содержимым:

-/tmp

И выполнить команду:

$ sudo lfsctl  --mount-lfs

После этого, будет создана директория /tmp/.limitedfs, внутри которой будут созданы изолированные директории /tmp для каждого пользователя, для которого включена LimitedFS. Эти директории монтируются по пути /tmp внутри LimitedFS пользователей. Если в реальной файловой системе существует директория /tmp/USERNAME, где USERNAME — имя пользователя, и владелец и группа этой директории равны UID и GID пользователя USERNAME, то эта директория монтируется по пути /tmp/USERNAME внутри LimitedFS пользователя USERNAME.

Очистка временных файлов в /tmp-директориях пользователей

Временные файлы могут накапливаться в системе и занимать дисковое пространство. Для удаления временных файлов в LimitedFS предусмотрен механизм tmpwatch. Следующая команда выполняет очистку временных файлов для всех пользователей внутри LimitedFS.

$ sudo lfsctl  --tmpwatch

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

$ sudo cat /etc/cron.d/limitedfs-cron
0 4 * * * root /usr/bin/flock -n /var/run/limitedfs.cron.lock /usr/share/limitedfs/bin/cron.daily &> /dev/null

$ sudo cat /usr/share/limitedfs/bin/cron.daily
#!/usr/bin/bash
/usr/bin/ionice -c 3 /usr/sbin/lfsctl --update
/usr/bin/ionice -c 3 /usr/sbin/lfsctl --tmpwatch
/usr/bin/ionice -c 3 /usr/sbin/lfsctl --clean-up
exit 0