Version v9.1 (2012-01-23 00:13) [AUTO]

This commit is contained in:
nnz1024
2012-01-23 00:13:00 +04:00
parent adb49af977
commit d60da689e7

171
s4a.tex
View File

@@ -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