Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d60da689e7 | ||
|
|
adb49af977 |
316
s4a.tex
316
s4a.tex
@@ -6,17 +6,21 @@
|
|||||||
\usepackage[T1,T2A]{fontenc}
|
\usepackage[T1,T2A]{fontenc}
|
||||||
\usepackage{indentfirst} % Отступ в первом абзаце главы
|
\usepackage{indentfirst} % Отступ в первом абзаце главы
|
||||||
\usepackage{fancyvrb} % Продвинутые листинги и in-line commands
|
\usepackage{fancyvrb} % Продвинутые листинги и in-line commands
|
||||||
% listings для данной ситуации, имхо, избыточен
|
% listings в данной ситуации, IMHO, избыточен
|
||||||
\usepackage{pdflscape} % Внимание! При выводе в DVI выборочный
|
\usepackage{pdflscape} % Внимание! При выводе в DVI выборочный
|
||||||
% поворот страниц работать не будет, хотя текст будет повернут.
|
% поворот страниц работать не будет, хотя текст будет повернут.
|
||||||
\usepackage[colorlinks,unicode,urlcolor=blue]{hyperref}
|
\usepackage[colorlinks,unicode,urlcolor=blue]{hyperref}
|
||||||
% Заполняем поля PDF уже со включенной опцией unicode
|
% Заполняем поля PDF уже со включенной опцией unicode
|
||||||
\hypersetup{pdftitle={systemd для администраторов},%
|
\hypersetup{pdftitle={systemd для администраторов},%
|
||||||
pdfauthor={Lennart Poettering, Sergey Ptashnick}}
|
pdfauthor={Lennart Poettering, Sergey Ptashnick}}
|
||||||
|
% Не засоряем оглавление подразделами
|
||||||
|
\setcounter{tocdepth}{1}
|
||||||
% Несколько сокращений
|
% Несколько сокращений
|
||||||
\newcommand{\sectiona}[1]{\section*{#1}\addcontentsline{toc}{section}{#1}}
|
\newcommand{\sectiona}[1]{\section*{#1}\addcontentsline{toc}{section}{#1}}
|
||||||
\newcommand{\hreftt}[2]{\href{#1}{\texttt{#2}}}
|
\newcommand{\hreftt}[2]{\href{#1}{\texttt{#2}}}
|
||||||
\newcommand{\tbs}{\textbackslash}
|
\newcommand{\tbs}{\textbackslash}
|
||||||
|
\newenvironment{caveat}[1][]{\smallskip\par\textbf{Предупреждение#1: }}%
|
||||||
|
{\smallskip\par}
|
||||||
% Примерный аналог символа \testSFii (присутствует в листингах),
|
% Примерный аналог символа \testSFii (присутствует в листингах),
|
||||||
% но без использования пакета pmboxdraw, средствами graphicx
|
% но без использования пакета pmboxdraw, средствами graphicx
|
||||||
\newcommand{\mytextSFii}{\raisebox{0pt}[0pt][\depth]{%
|
\newcommand{\mytextSFii}{\raisebox{0pt}[0pt][\depth]{%
|
||||||
@@ -2607,6 +2611,316 @@ Linux подсистема ipset гораздо лучше подходит дл
|
|||||||
systemd. Но, конечно, будет лучше, если этим займутся разработчики из апстрима
|
systemd. Но, конечно, будет лучше, если этим займутся разработчики из апстрима
|
||||||
приложения, или сопровождающие вашего дистрибутива.
|
приложения, или сопровождающие вашего дистрибутива.
|
||||||
|
|
||||||
|
\section{К вопросу о безопасности}
|
||||||
|
|
||||||
|
Одно из важнейших достоинств Unix-систем~--- концепция разделения привилегий
|
||||||
|
между различными компонентами ОС. Многие системные службы работают от имени
|
||||||
|
специальных системных пользователей, имеющих ограниченные полномочия, что
|
||||||
|
позволяет уменьшить ущерб для системы в случае взлома этих служб.
|
||||||
|
|
||||||
|
Однако, такой подход предоставляет лишь самую минимальную защиту, так как
|
||||||
|
системные службы, хотя уже и не~имеют полномочий администратора (root), все
|
||||||
|
равно имеют практически те же права, что и обычные пользователи. Чтобы
|
||||||
|
обеспечить более эффективную защиту, нужно поставить более жесткие ограничения,
|
||||||
|
отняв у служб ряд возможностей, разрешенных для обычного пользователя.
|
||||||
|
|
||||||
|
В частности, такая возможность предоставляется системами мандатного контроля
|
||||||
|
доступа (далее MAC, от Mandatory Access Control), например, SELinux. Если вам
|
||||||
|
нужно обеспечить высокий уровень безопасности на своем сервере~--- SELinux будет
|
||||||
|
вам неплохим подспорьем. Что касается systemd, то он предоставляет разработчикам
|
||||||
|
и администраторам целый арсенал возможностей по ограничению локальных служб, и
|
||||||
|
эти механизмы работают независимо от систем MAC. Таким образом, вне
|
||||||
|
зависимости от того, смогли ли вы разобраться с SELinux~--- у вас появляется ряд
|
||||||
|
дополнительных возможностей по усилению мер безопасности.
|
||||||
|
|
||||||
|
В этой главе мы рассмотрим несколько таких опций, предоставляемых systemd, и
|
||||||
|
обсудим вопросы их практического применения. Реализация этих опций основана на
|
||||||
|
использовании ряда уникальных технологий безопасности, реализованных в ядре
|
||||||
|
Linux уже очень давно, но при этом практически неизвестных для большинства
|
||||||
|
разработчиков. Мы постарались сделать соответствующие опции systemd максимально
|
||||||
|
простыми в использовании, чтобы заинтересовать администраторов и апстримных
|
||||||
|
разработчиков:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Изолирование служб от сети
|
||||||
|
\item Предоставление службам независимых каталогов +/tmp+
|
||||||
|
\item Ограничение доступа служб к отдельным каталогам
|
||||||
|
\item Принудительное отключение полномочий (capabilities) для служб
|
||||||
|
\item Запрет форка, ограничение на создание файлов
|
||||||
|
\item Контроль доступа служб к файлам устройств
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Все эти опции описаны в man-страницах systemd, главным образом, в
|
||||||
|
\href{http://0pointer.de/public/systemd-man/systemd.exec.html}{systemd.exec(5)}.
|
||||||
|
Если вам потребуются какие-либо уточнения, пожалуйста, обратитесь к этим
|
||||||
|
страницам.
|
||||||
|
|
||||||
|
Все эти опции доступны на системах с systemd, вне зависимости от использования
|
||||||
|
SELinux или любой другой реализации MAC.
|
||||||
|
|
||||||
|
Все эти опции не~так уж и обременительны, и поэтому их разумнее будет
|
||||||
|
использовать даже в тех случаях, когда явная необходимость в них, казалось бы,
|
||||||
|
отсутствует. Например: даже если вы полагаете, что ваша служба не~пишет в
|
||||||
|
каталог +/tmp+, и поэтому использование +PrivateTmp=yes+ (см. ниже) вроде бы и
|
||||||
|
не~обязательно~--- лучше включить эту опцию, просто потому, что вы не~можете
|
||||||
|
знать наверняка, как будут вести себя используемые вами сторонние библиотеки (и
|
||||||
|
плагины для них). В частности, вы никогда не~узнаете, какие модули NSS могут
|
||||||
|
быть включены в каждой конкретной системе, и пользуются ли они каталогом +/tmp+.
|
||||||
|
|
||||||
|
Мы надеемся, что эти опции окажутся полезными как для администраторов,
|
||||||
|
защищающих свои системы, так и для апстримных разработчиков, желающих сделать
|
||||||
|
свои службы безопасными <<из коробки>>. Мы настоятельно рекомендуем
|
||||||
|
разработчикам использовать такие опции по умолчанию в апстримных
|
||||||
|
service-файлах~--- это сравнительно несложно, но дает значительные преимущества
|
||||||
|
в плане безопасности.
|
||||||
|
|
||||||
|
\subsection{Изолирование служб от сети}
|
||||||
|
|
||||||
|
Простая, но мощная опция, которой вы можете воспользоваться при настройке
|
||||||
|
службы~--- +PrivateNetwork=+:
|
||||||
|
\begin{Verbatim}
|
||||||
|
...
|
||||||
|
[Service]
|
||||||
|
ExecStart=...
|
||||||
|
PrivateNetwork=yes
|
||||||
|
...
|
||||||
|
\end{Verbatim}
|
||||||
|
Добавление этой строчки обеспечивает полную изоляцию от сети всех процессов
|
||||||
|
данной службы. Они будут видеть лишь интерфейс обратной петли (+lo+), причем
|
||||||
|
полностью изолированный от обратной петли, используемой в основной системе.
|
||||||
|
Чрезвычайно эффективная защита против сетевых атак.
|
||||||
|
|
||||||
|
\begin{caveat}
|
||||||
|
Некоторым службам сеть необходима для нормальной
|
||||||
|
работы. Разумеется, никто и не~говорит о том, чтобы применять
|
||||||
|
+PrivateNetwork=yes+ к сетевым службам, таким, как Apache. Однако даже те
|
||||||
|
службы, которые не~ориентированы на сетевое взаимодействие, могут нуждаться в
|
||||||
|
сети для нормальной работы (порой эта потребность не~вполне очевидна). Например,
|
||||||
|
если ваша система хранит пользовательские учетные записи в базе LDAP, для
|
||||||
|
выполнения системных вызовов наподобие +getpwnam()+ может потребоваться
|
||||||
|
обращение к сети. Впрочем, даже в такой ситуации, как правило, можно
|
||||||
|
использовать +PrivateNetwork=yes+, за исключением случаев, когда службе может
|
||||||
|
потребоваться информация о пользователях с ID~$\geq1000$.
|
||||||
|
\end{caveat}
|
||||||
|
|
||||||
|
Если вас интересуют технические подробности: эта возможность реализована с
|
||||||
|
использованием технологии сетевых пространств имен (network namespaces). При
|
||||||
|
задействовании данной опции, для службы создается новое пространство имен, в
|
||||||
|
котором настраивается только интерфейс обратной петли.
|
||||||
|
|
||||||
|
\subsection{Предоставление службам независимых каталогов \texttt{/tmp}}
|
||||||
|
|
||||||
|
Еще одна простая, но мощная опция настройки служб~--- +PrivateTmp=+:
|
||||||
|
\begin{Verbatim}
|
||||||
|
...
|
||||||
|
[Service]
|
||||||
|
ExecStart=...
|
||||||
|
PrivateTmp=yes
|
||||||
|
...
|
||||||
|
\end{Verbatim}
|
||||||
|
При задействовании этой опции, служба получит свой собственный каталог +/tmp+,
|
||||||
|
полностью изолированный от общесистемного +/tmp+. По давно сложившейся традиции,
|
||||||
|
в Unix-системах каталог +/tmp+ является общедоступным для всех локальных служб и
|
||||||
|
пользователей. За все эти годы, он стал источником огромного количества проблем
|
||||||
|
безопасности. Чаще всего встречаются атаки с использованием символьных ссылок
|
||||||
|
(symlink attacks) и атаки на отказ в обслуживании (DoS attacks). Изолирование
|
||||||
|
этого каталога для каждой службы делает подобные уязвимости практически
|
||||||
|
бесполезными.
|
||||||
|
|
||||||
|
Для релиза Fedora~17
|
||||||
|
\href{https://fedoraproject.org/wiki/Features/ServicesPrivateTmp}{утверждена}
|
||||||
|
инициатива, направленная на включение этой опции по умолчанию для большинства
|
||||||
|
системных служб.
|
||||||
|
|
||||||
|
\begin{caveat}
|
||||||
|
Некоторые службы используют +/tmp+ не~по назначению,
|
||||||
|
помещая туда сокеты IPC и другие подобные элементы, что само по себе уже
|
||||||
|
является уязвимостью (хотя бы потому, что используемые при передаче информации
|
||||||
|
файлы и каталоги должны иметь предсказуемые имена, что делает ваш код уязвимым к
|
||||||
|
атакам через символьные ссылки и атакам на отказ в обслуживании. Такие объекты
|
||||||
|
лучше помещать в каталог +/run+, так как в нем присутствует строгое разделение
|
||||||
|
доступа. В качестве примера такого некорректного использования +/tmp+ можно
|
||||||
|
привести X11, размещающий там свои коммуникационные сокеты (впрочем, в данном
|
||||||
|
конкретном случае некоторые меры безопасности все же присутствуют: сокеты
|
||||||
|
размещаются в защищенном подкаталоге, который создается на ранних стадиях
|
||||||
|
загрузки). Разумеется, для служб, использующих +/tmp+ в целях коммуникации,
|
||||||
|
включение опции +PrivateTmp=yes+ недопустимо. К счастью, таких служб
|
||||||
|
сейчас уже не~так уж и много.
|
||||||
|
\end{caveat}
|
||||||
|
|
||||||
|
С технической точки зрения, эта опция построена на использовании технологии
|
||||||
|
пространств имен файловых систем (filesystem namespaces), реализованной в Linux.
|
||||||
|
При включении данной опции, для службы создается новое пространство имен,
|
||||||
|
отличающееся от иерархии каталогов основной системы только каталогом +/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