Безопасный запуск 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
Назад в оглавление
|