понедельник, 27 сентября 2010 г.

Как я харденил свой Арч / ArchLinux Hardening

Пара слов о словечке, которое я тут употребляю. Hardening - увеличение безопасности системы. Недавно мне мой боевой товарищ Сирожа давал ссылку на сравнительное тестирование различных дистрибутивов Linux при помощи какого-то клёвого немецкого скрипта, который проверял какие-то там параметры ядра (я в этом не разбираюсь), и мог ещё проверить вирусостойкость различных файлов или запущенных процессов. Параметров было всего четыре - RELRO, "Canary" stack protection, NX и PIE. Что конкретно каждая эта фиговина, я полностью не уверен, но в моём ненаглядном Арчлинуксе для всех-всех бинарников из репозитория было найдено только NX. И я задумал Арч захарденить. Правда, так и не захарденил, но всё уже готово. Итак...

Первым делом надо подготовиться к перекомпиляции всех установленных пакетов, это-то меня, в основном, и смутило. Даже не вероятность похерить всю систему, а большое время ожидания этого похеривания.
Но подготовиться, я подготовился. Потребуется ABS - Arch Build System. Чтоб её установить, надо набрать "pacman -S abs", а потом её надо запустить, и она в папке /var/abs сделает много-много папок, соответствующих всем пакетам, имеющимся в репозитории, а в каждом - будут лежать патчи (опционально) и файл с названием PKGBUILD. Как только вы запускаете abs, она синхронизирует всю эту свою большую папку с сервером, скачивая новые изменения. Для тех, кто ещё не догадалася: эта папка - аналог портов во FreeBSD.

В файле PKGBUILD содержится вся информация о том, как пакет собирать и откуда брать исходники - это аналог мэйкфайла порта FreeBSD или, как сказал мой боевой товарищ Сирожа, файлов *.ebuild из Gentoo. Короче, сборка порта - заходишь в эту папку, запускаешь makepkg, она делает пакет, который потом можно установить с помощью pacman. Да. Но редактировать PKGBUILDы прямо в дерево портов, как я понял, не comme il fault, надо их копировать в /var/abs/local, если есть желание собрать со своими настройками; да и configure часто не понимает даже опции --enable-pie... что же делать? И я придумал вот что:

Порты собирать прямо там, где они есть, ничего никуда копировать не нужно. А чтоб они собирались с включенными опциями защиты, надо отконфигурировать makepkg.
В файле /etc/makepkg.conf я добавил в флаги компилятора CFLAGS следующее: "-pie -fPIE -fno-stack-protector -fstack-protector-all" - для PIE и защиты стэка канареечным методом, а во флаги линкера LDFLAGS вот что: "-Wl,-z,relro -Wl,-z,now" - для включения опции RELRO. NX, как я уже говорил, было включено по умолчанию. Не думайте, что я так хопа! - и сразу всё просёк, неее... я три дня искал и гадал, куда что писать, чтоб makepkg собирал пакеты с такими параметрами.

Так вот, а дальше надо просто пересобрать всю систему, пройдясь по дереву портов. Я для этих целей даже написал скриптик на баше (запускать из-под рута, отредактировав начало по-своему):
#!/bin/sh
# ребилдить только указанные группы пакетов
pkggroupdir="core extra community";
# ребилдить не под рутом, а под этим пользователем
builduser="axshavan";
# окончание имени пакета (архитектура и расширение)
packagenameend="-i686.pkg.tar.xz";
# поехали
cd /var/abs/;
installed=$(pacman -Q);
# переберём только указанные группы пакетов
for pkggroup in $pkggroupdir
do
cd $pkggroup;
packagesls=$(ls);
for packagename in $packagesls
do
for inst in $installed
do
# ... то надо узнать номер версии
if [ $thispackage == 1 ]
then
# этот пакет установлен, можно пересобирать
cd $packagename;
# собираем
su $builduser -c "makepkg -f";
# накатываем
pacman -U $packagename-$inst$packagenameend --noconfirm;
cd ..;
fi;
thispackage=0;
# если имя пакета есть в установленных...
if [ $inst == $packagename ]
then
thispackage=1;
fi;
done;
done;
cd ..;
done;
К моему большому сожалению, я не очень хороший башеписец, поэтому тут мои вложенные циклы наверняка можно заменить на что-то более элегантное. Этот скрипт я запустил, посмотрел, как он работает, и оборвал его выполнение. Но acl он мне собрал и установил, всё как я хочу. Теперь вот надо выделить несколько дней себе и пересобрать хотя бы пакеты из core.

Комментариев нет:

Отправить комментарий

Ублюдочный Гугл поломал форму комментариев. Извините.