Безопасный запуск p2p клиентских программ в Linux


Я, конечно не открою Америку сказав, что доля p2p софта, который пишется, скачивается и запускается на ваших десктопах, неуклонно растет. В этой рассказке речь пойдет о некоторых приемах по настройке p2p клиентов, которые могут улучшить такой параметр вашего компьютера как security. Я рассмотрю две программы, eDonkey MLdonkey и BitTorrent, которые будут установлены одновременно на ваш компьютер.

Замечания общего характера
Все p2p программы запускаются таким же образом как и любые другие демоны, они слушают TCP порты, принимают соединения и занимаются приемом-передачей файлов. Официальный клиент eDonkey поставляется без sourcesMLdonkey может иметь дыры, а что касается BitTorrent, то просмотреть и понять логику работы 13k строчек Python кода мне не представляется возможным. Есть ли у нас гарантия, что по случайности или злому умыслу наш ослик не забредет в огород /home/что-то и не начнет поедать капус... то есть передавать все файлы любезно попросившему? То-то.

Linux Kernel. Ну тут нет нужды говорить, что последнее из 2.4 или 2.6 - must have. Но этого недостаточно! Идем на Openwall, скачиваем patch для того что у нас установлено, выставляем все галочки в security при перекомпиляции ядра, смотрим:

# cd /usr/src/linux
# cat .config | grep CONFIG_HARDEN_

CONFIG_HARDEN_STACK=y
CONFIG_HARDEN_LINK=y
CONFIG_HARDEN_FIFO=y
CONFIG_HARDEN_PROC=y
CONFIG_HARDEN_RLIMIT_NPROC=y
CONFIG_HARDEN_SHM=y
Отлично, компилим, перезагружаемся.

Далее нужно сделать безопасную песочницу aka chroot, в которую поместим потом наших p2p клиентов. Если и произойдет нечто непредвиденное, то весь ущерб будет локализован лишь в отведенном месте.
Предположим, мы решили выделить '/opt/chroot'. Берем вот этот С-шный исходник, компилим и устанавливаем:

# gcc -o chroot-shell chroot-shell.c -DCHROOT_DIR="\"/opt/chroot\""
# cp chroot-shell /usr/local/bin
# strip /usr/local/bin/chroot-shell
# chmod 4111 /usr/local/bin/chroot-shell
Теперь заводим 'ослиного' пользователя:
# mkdir -p /opt/chroot/home 
# groupadd osel
# adduser -g osel -d /opt/chroot/home/osel -s /usr/local/bin/chroot-shell osel

# passwd osel
********
Копируем либы и прочую лабуду в нашу песочницу:
# mkdir -p /opt/chroot/{bin,lib,usr,dev,etc,tmp,opt}
# chmod 1777 /opt/chroot/tmp
# cp /lib/* /opt/chroot/lib
# cp /usr/lib/* /opt/chroot/lib
# chmod 555 /opt/chroot/lib/*
# cp /etc/{protocols,localtime,resolv.conf,services} /opt/chroot/etc 
# cp /bin/* /opt/chroot/bin
# chmod 555 /opt/chroot/bin/*
Далее запускаем screen и в нем говорим:
# su - osel
# Password: ********
Песочница готова!

eDonkeyMLdonkey
Забираем клиентскую часть отсюда, копируем в /opt/chroot/bin и запускаем из screen терминала. Поскольку осел иногда падает, то пишем небольшой скрипт, который будет перезапускать осла до посинения. Для его остановки нужно будет взвести 'флажок',

# touch /opt/chroot/tmp/donkey.stop
а после этого уже жать 'q' в ослином терминале. Из конфигурации нужно обязательно выбрать нестандартный порт, скажем 47890 и указать username/password для GUI login.

BitTorrent
Забираем клиентскую часть отсюда и разворачиваем ее в /opt/chroot/opt.
Поскольку все это добро написано на Python, копируем питона вместе с хвостом библиотек в песочницу. Более привильный вариант - собрать с prefix=/python, и переместить потом /python в /opt/chroot, не забыв добавить /python/bin в PATH пользователя 'osel'.

Для более удобного запуска пишем вот такой скрипт. Таким способом получаем автоматически новый свободный порт всякий раз при запуске нового торрента. Поскольку из песочницы не узнать ничего о происходящем снаружи, нужно добавить следующие строки в /etc/xinetd.conf:

service freeport
{
	type		= UNLISTED
	socket_type     = stream
	wait            = no
	bind            = 127.0.0.1
	protocol        = tcp
        port            = 1800
        user            = root
        server          = /usr/local/sbin/freeport.plx
        instances       = 3
        log_on_success  += DURATION USERID
        log_on_failure  += USERID
        nice            = 17
}
Теперь список занятых портов будет запрашиваться скриптом через порт.

Доводку и шлифовку я оставляю вам в качестве домашнего задания ;-)

Tags: linux p2p edonkey mldonkey osel security


Назад в оглавление



[Home] [TTL] [Unix] [Sdictionary] [ROW Programmer] [Symbian] [Misc] [News] [Search] [Contacts] [Guestbook]


Copyright (c) 1999-2017 Alexey Semenoff