Преобразование оригинального текста в DocBook: Юрий Зотов
При массовой обработке файлов и каталогов (glob expansion, find и др.) НЕОБХОДИМО отделять команду с параметрами от списка аргументов разделителем «--» везде, где это поддерживается.
Обоснование: Массовые операции над файлами, имена которых начинаются на «-», могут давать неверный результат в случае неиспользования «--».
При использовании утилиты find для изменения файлов и каталогов НЕОБХОДИМО использовать параметр -print0; соответствующие ему параметры других утилит:
xargs: -r0
grep: -Z
sort: -z
Обоснование: Использование find при работе с каталогами, содержащими объекты с нестандартными именами (пробелами и др.), без использования -print0 приводит к неправильному результату.
Пример 4.1. Правильное использование find
find -type f -print0 | xargs -r0 %__grep -FZl 'mawk gawk' -- | xargs -r0 %__perl -pi -e 's/mawk gawk/gawk mawk/g' --
При необходимости создания временных файлов и/или каталогов следует использовать утилиту mktemp(1) совместно с командой trap, например:
TMPFILE="`mktemp -t somename.XXXXXXXXXX`" || exit 1 exit_handler() { local rc=$? trap '' EXIT rm -f -- "$TMPFILE" exit $rc } trap exit_handler EXIT HUP INT PIPE TERM QUIT
Не следует пользоваться фиксированными либо предсказуемыми именами для создания временных файлов в общедоступных каталогах, таких как /tmp. Не следует оставлять временные файлы в случае успешного окончания текущей стадии сборки пакета.
Пакеты НЕ ДОЛЖНЫ включать в свой состав чужие каталоги и файлы, в частности, системные объекты файловой системы, а также файлы устройств (последнее — прерогатива пакета dev).
Обоснование: У каждого объекта файловой системы, имеющего отношение к дистрибутиву, должен и может быть только один владелец (или группа родственных владельцев в случае, когда несколько подпакетов одного пакета совместно используют общий каталог). Это лучше обеспечивает управление атрибутами объектов файловой системы, а также решает многие проблемы определения сборочных зависимостей между пакетами.
Привилегированные исполняемые файлы, т.е. исполняемые файлы с установленными битами suid и/или sgid, НЕ ДОЛЖНЫ быть доступны по чтению (и тем более по записи) кому-либо, кроме процессов с uid==0.
Пакеты НЕ ДОЛЖНЫ содержать файлы и каталоги в поддереве /usr, разрешающие доступ по записи кому-либо, кроме процессов с uid==0. Более того, программам, входящим в пакет, во время своей работы НЕ СЛЕДУЕТ полагаться на то, что файловые объекты, находящиеся в /usr, доступны по записи.
Пакеты НЕ ДОЛЖНЫ содержать файлы и каталоги, доступные для записи всем пользователям. Должны быть предусмотрены меры по разграничению доступа, например, путём предоставления доступа по записи определённой группе(ам).
Пакеты НЕ ДОЛЖНЫ содержать файлы, принадлежащие псевдо-пользователям, если в процессе работы к этим файлам осуществляется доступ процессов с другим uid либо с более широкими правами доступа. К таким файлам, в частности, относятся исполняемые, конфигурационные и неизменяемые файлы.
Обоснование: Псевдо-пользователь не должен иметь право изменять эти файлы; нарушение этого правила, как правило приводит к очевидной возможности осуществления pseudouser/root compromise.
Пакеты НЕ ДОЛЖНЫ содержать каталоги, принадлежащие псевдо-пользователям. Вместо этого следует использовать каталоги, принадлежащие root, с установленным sticky bit и доступом группы по записи.
Обоснование: Псевдо-пользователь не должен иметь право изменять атрибуты каталогов, а также файлы и каталоги, созданные другими пользователями; нарушение этого правила, как правило приводит к возможности осуществления pseudouser/root compromise.
Разные пакеты, использующие блокировки для работы с общими файловыми объектами, такими как mbox'ы, во избежание потери данных ДОЛЖНЫ придерживаться единого механизма блокировки.
Например, для блокировки mbox'ов НЕОБХОДИМО использовать метод, за которым закрепилось имя fcntl. Не допускается использование привилегированных программ для dotlocking'а.
Обоснование: Каждая привилегированная программа — это дополнительная степень риска для системы, в которой такая программа установлена. Поэтому следует минимизировать потребность в подобных средствах. Метод блокировки fcntl опирается на системный вызов fcntl(2), удовлетворяющий стандарту POSIX, и, следовательно, более широко распространённый, чем его аналог flock(2).