\documentclass[russian,notitlepage,a4paper]{article}
\usepackage[koi8-r]{inputenc}
\usepackage{babel}

\textwidth=18cm
\oddsidemargin=-1.04cm
%\headheight=0cm
%\textheight=28cm
%\headsep=0cm
%\topmargin=-1.54cm

\author{Dmitry~V.~Levin <ldv@altlinux.org>\\ALT Linux Team}
\title{ALT Secure Packaging Policy\\(revision 0.4)}

\begin{document}
\maketitle

\section{Массовые операции над файлами и каталогами.}
(секции: \%setup, \%build, \%install, \%pre*, \%post*, \%trigger*).

При массовой обработке файлов и каталогов ({\it glob expansion}, {\it find} и др.)
{\bf НЕОБХОДИМО} отделять команду с параметрами от списка аргументов
разделителем ``--'' везде, где это поддерживается.

Обоснование:
Массовые операции над файлами, имена которых начинаются на ``-'', могут
давать неверный результат в случае неиспользования ``--''.

При использовании утилиты {\it find} для изменения файлов и каталогов
{\bf НЕОБХОДИМО} использовать параметр {\it -print0}; соответствующие ему параметры других утилит:
\begin{description}
	\item[xargs:] -r0
	\item[grep:] -Z
	\item[sort:] -z
\end{description}

Обоснование:
Использование {\it find} при работе с каталогами, содержащими объекты с
нестандартными именами (пробелами и др.), без использования {\it -print0}
приводит неправильному результату.

Пример использования:
\begin{verbatim}
find -type f -print0 |
	xargs -r0 %__grep -FZl 'mawk gawk' -- |
	xargs -r0 %__subst 's/mawk gawk/gawk mawk/g' --
\end{verbatim}

\section{Использование subshells.}
Следует всеми силами избегать использовать subshells в скриптах сборки,
установки/удаления и триггеров, так как они скрывают возможные ошибки.
Если вы хотите временно сменить текущий каталог, лучше воспользуйтесь
командами pushd и popd.  Если же вам действительно необходимо использовать
subshell, то предполагается, что вы передаете статус выполняемой команды
процессу-предку самостоятельно.

\section{Операции с временными файлами.}
При необходимости создания временных файлов и/или каталогов в
shell-скриптах следует использовать утилиту {\it mktemp(1)} совместно
с командой {\it trap}, например:
\begin{verbatim}
TMPFILE="`mktemp -t progname.XXXXXXXXXX`" || exit 1
exit_handler()
{
	local rc=$?
	trap - EXIT
	rm -f -- "$TMPFILE"
	exit $rc
}
trap exit_handler EXIT HUP INT QUIT PIPE TERM
\end{verbatim}
Не следует пользоваться фиксированными либо предсказуемыми именами для
создания временных файлов в общедоступных каталогах, таких как {\it /tmp}.
Не следует оставлять временные файлы в случае успешного окончания текущей
стадии сборки пакета.

При использовании {\it mktemp -t} в shell-скриптах необходимо добавлять
{\it mktemp >= 1:1.3.1} в список зависимостей пакета.

\section{Чужие и системные каталоги и файлы.}
(секции: \%install, \%files).

Пакеты {\bf НЕ ДОЛЖНЫ} включать в свой состав чужие каталоги и файлы, в
частности, системные объекты файловой системы, а также файлы устройств
(последнее - прерогатива пакета {\it dev}).

Обоснование:
У каждого объекта файловой системы, имеющего отношение к дистрибутиву,
должен и может быть только один владелец (или группа родственных владельцев
в случае, когда несколько подпакетов одного пакета соместно испольуют общий каталог).
Это лучше обеспечивает управление атрибутами объектов файловой системы,
а также решает многие проблемы определения сборочных зависимостей между пакетами.

\section{Атрибуты файлов и каталогов.}
(секции: \%install, \%files).

\subsection{Права доступа на привилегированные исполняемые файлы.}
Привилегированные исполняемые файлы, т.е. исполняемые файлы с установленными битами
{\it suid} и/или {\it sgid}, {\bf НЕ ДОЛЖНЫ} быть доступны по чтению (и тем более по записи)
кому-либо, кроме процессов с uid==0.

\subsection{Разделы, предназначенные для использования readonly.}
Пакеты {\bf НЕ ДОЛЖНЫ} содержать файлы и каталоги в поддереве {\it /usr}, разрешающие
доступ по записи кому-либо, кроме процессов с uid==0. Более того, программам, входящим
в пакет, во время своей работы {\bf НЕ СЛЕДУЕТ} полагаться на то, что файловые
объекты, находящиеся в {\it /usr}, доступны по записи.

\subsection{Файлы и каталоги, доступные для записи.}
Пакеты {\bf НЕ ДОЛЖНЫ} содержать файлы и каталоги, доступные для записи всем
пользователям. Должны быть предусмотрены меры по разграничению доступа,
например, путем предоставления доступа по записи определенной группе(ам).

\subsection{Владельцы файлов.}
Пакеты {\bf НЕ ДОЛЖНЫ} содержать файлы, принадлежащие псевдо-пользователям, если в процессе
работы к этим файлам осуществляется доступ процессов с другим {\it uid}
либо с более широкими правами доступа.
К таким файлам, в частности, относятся исполняемые, конфигурационные и неизменяемые файлы.

Обоснование: Псевдо-пользователь не должен иметь право изменять эти файлы;
нарушение этого правила, как правило приводит к очевидной возможности осуществления
{\it pseudouser/root compromise}.

\subsection{Владельцы каталогов.}
Пакеты {\bf НЕ ДОЛЖНЫ} содержать каталоги, принадлежащие псевдо-пользователям.
Вместо этого следует использовать каталоги, принадлежащие {\it root},
с установленным {\it sticky bit} и доступом группы по записи.

Обоснование: Псевдо-пользователь не должен иметь право изменять атрибуты
каталогов, а также файлы и каталоги, созданные другими пользователями;
нарушение этого правила, как правило приводит к возможности осуществления
{\it pseudouser/root compromise}.

\section{Блокировки.}
(секции: \%build, \%install, \%files).

Разные пакеты, использующие блокировки для работы с общими файловыми
объектами, такими как mbox'ы, во избежание потери данных {\bf ДОЛЖНЫ}
придерживаться единого механизма блокировки.

Например, для блокировки mbox'ов {\bf НЕОБХОДИМО} использовать метод, за которым
закрепилось имя {\it fcntl}. Не допускается использование привилегированных
программ для {\it dotlocking}'а.

Обоснование: Каждая привилегированная программа - это дополнительная степень риска для системы,
в которой такая программа установлена. Поэтому следует минимизировать потребность в подобных средствах.
Метод блокировки {\it fcntl} опирается на системный вызов {\it fcntl(2)}, удовлетворяющий стандарту POSIX,
и, следовательно, более широко распространенный, чем его аналог {\it flock(2)}.

%\begin{thebibliography}{9}
%\bibitem{altrpm} ALT Linux packaging: ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/Sisyphus/doc/alt-packaging/
%\end{thebibliography}

\end{document}
