Version v9.1 (2012-01-23 00:13) [AUTO]
This commit is contained in:
171
s4a.tex
171
s4a.tex
@@ -2644,7 +2644,7 @@ Linux уже очень давно, но при этом практически
|
|||||||
\item Изолирование служб от сети
|
\item Изолирование служб от сети
|
||||||
\item Предоставление службам независимых каталогов +/tmp+
|
\item Предоставление службам независимых каталогов +/tmp+
|
||||||
\item Ограничение доступа служб к отдельным каталогам
|
\item Ограничение доступа служб к отдельным каталогам
|
||||||
\item Принудительное отключение capabilities для служб
|
\item Принудительное отключение полномочий (capabilities) для служб
|
||||||
\item Запрет форка, ограничение на создание файлов
|
\item Запрет форка, ограничение на создание файлов
|
||||||
\item Контроль доступа служб к файлам устройств
|
\item Контроль доступа служб к файлам устройств
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
@@ -2752,6 +2752,175 @@ PrivateTmp=yes
|
|||||||
При включении данной опции, для службы создается новое пространство имен,
|
При включении данной опции, для службы создается новое пространство имен,
|
||||||
отличающееся от иерархии каталогов основной системы только каталогом +/tmp+.
|
отличающееся от иерархии каталогов основной системы только каталогом +/tmp+.
|
||||||
|
|
||||||
|
\subsection{Ограничение доступа служб к отдельным каталогам}
|
||||||
|
|
||||||
|
Используя опции +ReadOnlyDirectories=+ и +InaccessibleDirectories=+, вы можете
|
||||||
|
ограничить доступ службы к указанным каталогам только чтением, либо вообще
|
||||||
|
запретить его:
|
||||||
|
\begin{Verbatim}
|
||||||
|
...
|
||||||
|
[Service]
|
||||||
|
ExecStart=...
|
||||||
|
InaccessibleDirectories=/home
|
||||||
|
ReadOnlyDirectories=/var
|
||||||
|
...
|
||||||
|
\end{Verbatim}
|
||||||
|
Добавление этих двух строчек в файл конфигурации, приводит к тому, что служба
|
||||||
|
полностью утрачивает доступ к содержимому каталога +/home+ (она видит лишь
|
||||||
|
пустой каталог с правами доступа 000), а также не~может писать внутрь каталога
|
||||||
|
+/var+.
|
||||||
|
|
||||||
|
\begin{caveat}
|
||||||
|
К сожалений, в настоящее время опция +ReadOnlyDirectories=+ не~применяется
|
||||||
|
рекурсивно к точкам монтирования, расположенным в поддереве указанного каталога
|
||||||
|
(т.е. смонтированные внутри +/var+ и его подкаталогов файловые системы
|
||||||
|
по-прежнему останутся доступными на запись, если, конечно, не~перечислить их
|
||||||
|
всех поименно). Мы собираемся исправить это в ближайшее время.
|
||||||
|
\end{caveat}
|
||||||
|
|
||||||
|
Механизм работы этой опции тоже реализован с использованием пространств имен
|
||||||
|
файловых систем.
|
||||||
|
|
||||||
|
\subsection{Принудительное отключение полномочий (capabilities) для служб}
|
||||||
|
|
||||||
|
Еще одна чрезвычайно эффективная опция~--- +CapabilityBoundingSet=+, позволяющая
|
||||||
|
контролировать список capabilities, которые смогут получить процессы службы:
|
||||||
|
\begin{Verbatim}
|
||||||
|
...
|
||||||
|
[Service]
|
||||||
|
ExecStart=...
|
||||||
|
CapabilityBoundingSet=CAP_CHOWN CAP_KILL
|
||||||
|
...
|
||||||
|
\end{Verbatim}
|
||||||
|
В нашем примере, служба может иметь лишь полномочия +CAP_CHOWN+ и +CAP_KILL+.
|
||||||
|
Попытки какого-либо из процессов службы получить любые другие полномочия, даже с
|
||||||
|
использованием suid-бинарников, будут пресекаться. Список возможных полномочий
|
||||||
|
приведен на странице документации
|
||||||
|
\href{http://linux.die.net/man/7/capabilities}{capabilities(7)}. К сожалению,
|
||||||
|
некоторые из этих полномочий являются слишком общими (разрешают очень многое),
|
||||||
|
например, +CAP_SYS_ADMIN+, однако они все же остаются неплохой альтернативой
|
||||||
|
запуску службы с полными административными (рутовыми) привилегиями.
|
||||||
|
|
||||||
|
Как правило, определение списка полномочий, необходимых для работы конкретной
|
||||||
|
службы, является довольно трудоемким процессом, требующим ряда проверок. Чтобы
|
||||||
|
немного упростить эту задачу, мы добавили возможность создания <<черного
|
||||||
|
списка>> привилегий, как альтернативы описанному выше механизму <<белого
|
||||||
|
списка>>. Вместо того, чтобы указывать, какие привилегии нужно оставить, вы
|
||||||
|
можете перечислить, какие из них оставлять точно нельзя. Например: привилегия
|
||||||
|
+CAP_SYS_PTRACE+, предназначенная для отладчиков, дает очень широкие полномочия
|
||||||
|
в отношении всех процессов системы. Очевидно, что такие службы, как Apache,
|
||||||
|
не~занимаются отладкой чужих процессов, и поэтому мы можем спокойно отнять у них
|
||||||
|
данную привилегию:
|
||||||
|
\begin{Verbatim}
|
||||||
|
...
|
||||||
|
[Service]
|
||||||
|
ExecStart=...
|
||||||
|
CapabilityBoundingSet=~CAP_SYS_PTRACE
|
||||||
|
...
|
||||||
|
\end{Verbatim}
|
||||||
|
Наличие символа +~+ после знака равенства инвертирует принцип работы опции:
|
||||||
|
следующий за ним перечень привилегий рассматривается уже не~как белый, а как
|
||||||
|
черный список.
|
||||||
|
|
||||||
|
\begin{caveat}
|
||||||
|
Некоторые службы, при отсутствии определенных привилегий, могут вести себя
|
||||||
|
некорректно. Как уже говорилось выше, формирование списка необходимых полномочий
|
||||||
|
для каждой конкретной службы может оказаться довольно трудной задачей, и лучше
|
||||||
|
всего будет обратиться с соответствующим вопросом к разработчикам службы.
|
||||||
|
\end{caveat}
|
||||||
|
|
||||||
|
\begin{caveat}[~2]
|
||||||
|
\href{https://forums.grsecurity.net/viewtopic.php?f=7&t=2522}{Привилегии~--- это
|
||||||
|
не~лекарство от всех бед.} Чтобы они работали действительно эффективно,
|
||||||
|
возможно, придется дополнить их другими методиками защиты.
|
||||||
|
\end{caveat}
|
||||||
|
|
||||||
|
Чтобы проверить, какие именно привилегии имеют сейчас ваши процессы, вы можете
|
||||||
|
воспользоваться программой +pscap+ из комплекта +libcap-ng-utils+.
|
||||||
|
|
||||||
|
Применение опции +CapabilityBoundingSet=+ является простой, прозрачной и удобной
|
||||||
|
альтернативой введению аналогично механизма путем модификации исходного кода
|
||||||
|
всех системных служб.
|
||||||
|
|
||||||
|
\subsection{Запрет форка, ограничение на создание файлов}
|
||||||
|
|
||||||
|
Некоторые ограничения безопасности можно применить, используя механизм
|
||||||
|
ограничения ресурсов. Прежде всего, как ясно из его названия, этот механизм
|
||||||
|
предназначен для контроля использования ресурса, а не~для контроля доступа.
|
||||||
|
Однако, две его настройки могут быть использованы для запрета определенных
|
||||||
|
действий: +RLIMIT_NPROC+ может запретить службе форкаться (запускать
|
||||||
|
дополнительные процессы), а +RLIMIT_FSIZE+ позволяет блокировать запись в файлы
|
||||||
|
ненулевого размера:
|
||||||
|
\begin{Verbatim}
|
||||||
|
...
|
||||||
|
[Service]
|
||||||
|
ExecStart=...
|
||||||
|
LimitNPROC=1
|
||||||
|
LimitFSIZE=0
|
||||||
|
...
|
||||||
|
\end{Verbatim}
|
||||||
|
Обратите внимание, что эти ограничения будут эффективно работать только в том
|
||||||
|
случае, если служба будет работать от имени простого пользователя (не~root) и
|
||||||
|
не~будет иметь привилегии +CAP_SYS_RESOURCE+ (блокирование этой привилегии можно
|
||||||
|
обеспечить, например, описанной выше опцией +CapabilityBoundingSet=+). В
|
||||||
|
противном случае, ничто не~мешает процессу поменять соответствующие ограничения.
|
||||||
|
|
||||||
|
\begin{caveat}
|
||||||
|
+LimitFSIZE=+ действует очень жестко. Если процесс пытается записать файл
|
||||||
|
ненулевого размера, он немедленно получает сигнал +SIGXFSZ+, который, как
|
||||||
|
правило, прекращает работу процесса (в случае, если не~назначен обработчик
|
||||||
|
сигнала). Кроме того, стоит отметить, что эта опция не~запрещает создание файлов
|
||||||
|
нулевого размера.
|
||||||
|
\end{caveat}
|
||||||
|
|
||||||
|
Подробности об этих и других опциях ограничения ресурсов можно уточнить на
|
||||||
|
странице документации \href{http://linux.die.net/man/2/setrlimit}{setrlimit(2)}.
|
||||||
|
|
||||||
|
\subsection{Контроль доступа служб к файлам устройств}
|
||||||
|
|
||||||
|
Файлы устройств предоставляют приложениям возможность доступа к ядру и
|
||||||
|
драйверам. Причем драйверы, как правило менее тщательно тестируются и не~так
|
||||||
|
аккуратно проверяются на предмет наличия уязвимостей, по сравнению с основными
|
||||||
|
компонентами ядра. Именно поэтому драйверы часто становятся объектами атаки
|
||||||
|
злоумышленников. systemd позволяет контролировать доступ к устройствам
|
||||||
|
индивидуально для каждой службы:
|
||||||
|
\begin{Verbatim}
|
||||||
|
...
|
||||||
|
[Service]
|
||||||
|
ExecStart=...
|
||||||
|
DeviceAllow=/dev/null rw
|
||||||
|
...
|
||||||
|
\end{Verbatim}
|
||||||
|
Приведенная конфигурация разрешит службе доступ только к файлу +/dev/null+,
|
||||||
|
полностью запретив доступ к остальным файлам устройств.
|
||||||
|
|
||||||
|
Реализация данной опции построена на использование cgroups-контроллера
|
||||||
|
+devices+.
|
||||||
|
|
||||||
|
\subsection{Прочие настройки}
|
||||||
|
|
||||||
|
Помимо приведенных выше, простых и удобных в использовании опций, существует и
|
||||||
|
ряд других других настроек, позволяющих повысить уровень безопасности. Но
|
||||||
|
использование этих настроек, как правило, уже требует определенных изменений в
|
||||||
|
исходном коде службы, и поэтому такие настройки представляют интерес прежде
|
||||||
|
всего для апстримных разработчиков. В частности, сюда относится опция
|
||||||
|
+RootDirectory=+ (позволяющая запустить службу +chroot()+-окружении), а также
|
||||||
|
параметры +User=+ и +Group=+, определяющие пользователя и группу, от имени
|
||||||
|
которых работает служба. Использование этих опций значительно упрощает написание
|
||||||
|
демонов, так как работа по понижению привилегий ложится на плечи systemd.
|
||||||
|
|
||||||
|
Возможно, у вас возникнет вопрос, почему эти опции не~включены по умолчанию.
|
||||||
|
Отвечаем: чтобы не~нарушать совместимость. Многие из них несколько отступают от
|
||||||
|
традиций, принятых в Unix. Например, исторически сложилось, так что +/tmp+
|
||||||
|
является общим для всех процессов и пользователей. Существуют программы,
|
||||||
|
использующие этот каталог для IPC, и включение по умолчанию режима изоляции
|
||||||
|
для +/tmp+ нарушит работу таких программ.
|
||||||
|
|
||||||
|
И несколько слов в заключение. Если вы занимаетесь сопровождением unit-файлов
|
||||||
|
в апстримном проекте или в дистрибутиве, пожалуйста, подумайте о том, чтобы
|
||||||
|
воспользоваться приведенными выше настройками. Если сопровождаемая вами служба
|
||||||
|
станет более безопасной <<из коробки>>, от этого выиграют не~только ваши
|
||||||
|
пользователи, но и все мы, потому что Интернет станет чуть более безопасным.
|
||||||
\end{document}
|
\end{document}
|
||||||
|
|
||||||
vim:ft=tex:tw=80:spell:spelllang=ru
|
vim:ft=tex:tw=80:spell:spelllang=ru
|
||||||
|
|||||||
Reference in New Issue
Block a user