Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d60da689e7 |
171
s4a.tex
171
s4a.tex
@@ -2644,7 +2644,7 @@ Linux уже очень давно, но при этом практически
|
||||
\item Изолирование служб от сети
|
||||
\item Предоставление службам независимых каталогов +/tmp+
|
||||
\item Ограничение доступа служб к отдельным каталогам
|
||||
\item Принудительное отключение capabilities для служб
|
||||
\item Принудительное отключение полномочий (capabilities) для служб
|
||||
\item Запрет форка, ограничение на создание файлов
|
||||
\item Контроль доступа служб к файлам устройств
|
||||
\end{itemize}
|
||||
@@ -2752,6 +2752,175 @@ PrivateTmp=yes
|
||||
При включении данной опции, для службы создается новое пространство имен,
|
||||
отличающееся от иерархии каталогов основной системы только каталогом +/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}
|
||||
|
||||
vim:ft=tex:tw=80:spell:spelllang=ru
|
||||
|
||||
Reference in New Issue
Block a user