Дмитрий Сергеевич (axshavan) wrote,
Дмитрий Сергеевич
axshavan

Category:

Как я харденил свой Арч / 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.

Оригинал записи http://axshavan.blogspot.com/2010/09/archlinux-hardening.html
Теперь можно и баиньки.
Tags: *nix
Subscribe

  • Баловство с картинками

    Долгие годы разглядывая разные фотографии в разных местах, я пришёл к выводу, что выигрышно смотрятся такие фотки, у которых есть два, скажем так,…

  • Заметка про джаваскрипт

    Больше часа потратил всяким гугленгием и экспериментами, и в итоге всё равно пришлось придумывать обходной маршрут. Проблема такая. Есть некий кусок…

  • Признание ошибок

    Иногда признавать свои ошибки очень просто. Например, моя теория о том, что я, такой молодец, по маркам восстановил историю экономической жопы в…

  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 14 comments

  • Баловство с картинками

    Долгие годы разглядывая разные фотографии в разных местах, я пришёл к выводу, что выигрышно смотрятся такие фотки, у которых есть два, скажем так,…

  • Заметка про джаваскрипт

    Больше часа потратил всяким гугленгием и экспериментами, и в итоге всё равно пришлось придумывать обходной маршрут. Проблема такая. Есть некий кусок…

  • Признание ошибок

    Иногда признавать свои ошибки очень просто. Например, моя теория о том, что я, такой молодец, по маркам восстановил историю экономической жопы в…