\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 \\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}