# Настраиваем изолированную ноду TOR
Difrex(mira, 14) — All
2015-01-22 08:25:29


Что-то эта эха совсем пустует. Да, честно говоря, вообще сеть населена роботами по
больше части. Попробую немного оживить хотябы эту эху. Периодически буду писать
сюда всякие мыслишки.

Настраиваем изолированную ноду TOR

* Хост-система Ubuntu 14.04 amd64
* Гостевая система Gentoo
* Шифрование dm-crypt/LUKS
* Контейнерная виртуализация LXC
* btrfs
* TOR
* Lighttpd

Поехали!
Допустим у нас уже есть минимальная установка Ubuntu с OpenSSH. По-этому на
установке Убунты останавливаться не будем.

Шифрование LUKS

Устанавливаем пакеты необходимые для шифрования диска нашего гостя.
[home ~ root]# apt-get install cryptsetup

Подготавливаем файл, который будет служить диском:
[home ~ root]# mkdir -p /srv/luks/gentoo-guest
[home luks root]# cd /srv/luks/
[home luks root]# # Создаем файл размером 5.2Гб
[home luks root]# dd if=/dev/zero of=./gentoo-img bs=32M count=155
155+0 записей получено
155+0 записей отправлено
скопировано 5200936960 байт (5,2 GB), 88,0945 c, 59,0 MB/c

Инициализируем его с LUKS:
[home luks root]# cryptsetup -y -v luksFormat ./gentoo-img 

WARNING!

Данные на ./gentoo-img будут перезаписаны без возможности восстановления.

Are you sure? (Type uppercase yes): YES
Введите пароль: 
Verify passphrase: 
Команда выполнена успешно.

Тут мы вводим пароль. Не забывайте его, восстановить будет невозможно. Используйте
менеджеры паролей.

Открываем наш файл:
[home luks root]# cryptsetup luksOpen gentoo-img gentoo-luks
Введите пароль для gentoo-img: 
[home luks root]# ls /dev/mapper/ -l
итого 0
crw------- 1 root root 10, 236 янв.  21 14:20 control
lrwxrwxrwx 1 root root       7 янв.  21 21:24 gentoo-luks -> ../dm-0

Как мы видим у нас появилось блочное устройство /dev/dm-0, с которым мы теперь
можем работать, как и с любым другим.

Создаем файловую систему и монтируем:
[home luks root]# mkfs.btrfs /dev/mapper/gentoo-luks 

WARNING! - Btrfs v3.14.1 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

Performing full device TRIM (4.84GiB) ...
Turning ON incompat feature 'extref': increased hardlink limit per file to 65536 fs 
created label (null) on /dev/mapper/gentoo-luks
        nodesize 16384 leafsize 16384 sectorsize 4096 size 4.84GiB
Btrfs v3.14.1
[home luks root]# mount /dev/mapper/gentoo-luks ./gentoo-guest/
[home luks root]# df -h | grep luks
/dev/mapper/gentoo-luks   4,9G         320K  4,4G            1% /srv/luks/gentoo-guest

Почему btrfs? Потому, что в ней есть такие фичи, как снапшоты. Да и не надо сидеть на
месте -- вперед к новым технологиям! :)

*Гость*

Настало время для первоначальной настройки нашей гостевой ОС, в которой уже будет
работать TOR.

Устанавливаем необходимые пакеты
[home luks root]# apt-get install lxc lxc-templates lxctl

Создаем файл конфигурации для нашего контейнера:
[home luks root]# cat > gentoo.conf << EOF
> lxc.network.type=veth
> lxc.network.link=lxcbr0
> lxc.network.flags=up
> EOF

Разворачиваем контейнер:
[home luks root]# lxc-create -f gentoo.conf -t gentoo -P /srv/luks/gentoo-guest/ -n 
gentoo-lxc

Здесь мы указываем наш конфиг, шаблон, каталог в которой будет развернут rootfs и имя
контейнера.
Можно пока сходить заварить чаю. LXC начнет загружать stage3 gentoo, распаковывать его
и.т.д. Пароль для root по-умолчанию будет установлен в toor, а SSH добавлен в
автозагрузку.

Посмотрим, что у нас получилось в итоге:
[home luks root]# tree -L 3 gentoo-guest/
gentoo-guest/
└── gentoo-lxc
    ├── config
    └── rootfs
        ├── bin
        ├── boot
        ├── dev
        ├── etc
        ├── home
        ├── lib -> lib64
        ├── lib32
        ├── lib64
        ├── media
        ├── mnt
        ├── opt
        ├── proc
        ├── root
        ├── run
        ├── sbin
        ├── sys
        ├── tmp
        ├── usr
        └── var

21 directories, 1 file

Копируем конфигурацию для нашего контейнера:
[home luks root]# mkdir /var/lib/lxc/gentoo-lxc/
[home luks root]# cp gentoo-guest/gentoo-lxc/config /var/lib/lxc/gentoo-lxc/

Отключаем apparmor для LXC:
[home luks root]# apparmor_parser -R /etc/apparmor.d/usr.bin.lxc-start     
[home luks root]# ln -s /etc/apparmor.d/usr.bin.lxc-start /etc/apparmor.d/disabled/

Пускаем наш контейнер в screen:
[home luks root]# screen -S gentoo-lxc lxc-start -n gentoo-lxc
# Поскипан вывод
 *     received address 10.0.3.45/24
 [ ok ]
 * Starting local
 [ ok ]


This is gentoo-lxc. (Linux x86_64 3.16.0-29-generic) 22:21:47

gentoo-lxc login: root
Password: 
gentoo-lxc ~ #
gentoo-lxc ~ # # Меняем сразу же пароль
gentoo-lxc ~ # passwd 
New password: 
Retype new password: 
passwd: password updated successfully
gentoo-lxc ~ # # Обновляемся
gentoo-lxc ~ # emerge --sync
gentoo-lxc ~ # emerge -uDN world
gentoo-lxc ~ # etc-update

Настраиваем сеть:
gentoo-lxc ~ # cat > /etc/conf.d/net << EOF
> rc_keyword="-stop"
> config_eth0="10.0.3.45/24"
> routes_eth0="default via 10.0.3.1"
> dns_servers_eth0="10.0.3.1"
EOF

Устанавливаем софт:
gentoo-lxc ~ # USE="tor-hardening transparent-proxy threads memcache" emerge -av lighttpd 
tor vim

Настраиваем tor. Редактируем файл /etc/tor/torrc и приводим его к следующему виду:
User tor
PIDFile /var/run/tor/tor.pid
Log notice syslog
DataDirectory /var/lib/tor/data
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:8080

Создаем каталог для нашего скрытого сервиса и даем ему правильные права:
gentoo-lxc ~ # mkdir /var/lib/tor/hidden_service
gentoo-lxc ~ # chown -R tor /var/lib/tor/

Настройка lighttpd. Редактируем файл /etc/lighttpd/lighttpd.conf. Раскомментим строчку
server.port. Конфиг хорошо комментирован, по-этому настройка не
составит труда. Вот, как примерно будет выглядеть конфиг:
var.basedir  = "/var/www/onion"
var.logdir   = "/var/log/lighttpd"
var.statedir = "/var/lib/lighttpd"

server.modules = (
    "mod_access",
    "mod_accesslog"
)

include "mime-types.conf"

server.username      = "lighttpd"
server.groupname     = "lighttpd"

server.document-root = var.basedir
server.pid-file      = "/var/run/lighttpd.pid"
server.errorlog      = var.logdir  + "/error.log"
server.indexfiles    = ("index.php", "index.html",
server.follow-symlink = "enable"

server.port          = 8080

static-file.exclude-extensions = (".php", ".pl", ".cgi", ".fcgi")
accesslog.filename   = var.logdir + "/access.log"

url.access-deny = ("~", ".inc")

# vim: set ft=conf foldmethod=marker et :

Тестовая страничка:
gentoo-lxc ~ # mkdir /var/www/onion
gentoo-lxc ~ # echo '<!DOCTYPE html><html><head><meta charset="utf-8"></head>
> <body><h1>Привет, Лукосеть!</h1></body></html>' > /var/www/onion/index.html

Пускаем все это дело:
gentoo-lxc ~ # /etc/init.d/lighttpd start
 * Starting lighttpd ...                                                                   
        [ ok ]
gentoo-lxc ~ # /etc/init.d/tor start
 * Tor configuration (/etc/tor/torrc) is valid.
 * /var/run/tor: correcting mode
 * Starting Tor ...                                                                        
        [ ok ]
gentoo-lxc ~ # ls /var/lib/tor/hidden_service/
hostname  private_key

Скопируйте сразу же куда-нибудь эти файлы. В /var/lib/tor/hidden_service/hostname
записан, как не сложно догадаться, наш хостнейм вида XXXXXXXXXXXXXXX.onion. Открыв его в
торобраузере мы увидим нашу страничку.

Автозапуск:
gentoo-lxc ~ # rc-update add lighttpd default
 * service lighttpd added to runlevel default
gentoo-lxc ~ # rc-update add tor default
 * service tor added to runlevel default

На этом минимальная настройка гостя закончена.

*Скрипты*

Т.к. гость у нас находится на зашифрованном luks файле, мы не сможем поднимать его при
загрузке хоста(будет необходимо ввести пароль).

Напишем совсем небольшой скрипт для упрощения жизни:
[home luks root]# vim /usr/local/bin/gentoo-lxc
#!/bin/bash
function start_lxc() {
        cryptsetup luksOpen /srv/luks/gentoo-img gentoo-luks
        mount /dev/mapper/gentoo-img /srv/luks/gentoo-guest
        screen -S gentoo-lxc -d -m lxc-start -n gentoo-lxc
}
function stop_lxc() {
        lxc-stop -n gentoo-lxc
        umount /srv/luks/gentoo-guest
        cryptsetup luksClose gentoo-lxc
}
function status() {
        lxc-info -n gentoo-lxc
}
function panic() {
        stop_lxc
        lxc-destroy -n gentoo-lxc
        rm -rf /srv/luks/gentoo*
}
case $1 in start)
        start_lxc
        ;;
        stop)
        stop_lxc
        ;;
        status)
        status
        ;;
        panic)
        panic
        ;;
        *)
        echo -e "USAGE: $0 [start|stop|panic]\npanic - destroy all data"
        ;;
esac
:wq
[home luks root]# chmod +x /usr/local/bin/gentoo-lxc

На этом пока все. Вот так с минимальными усилиями мы настроили изолированный LXC узел тор
на зашифрованном LUKS файле с "тревожной кнопкой". В статье не описываются принципы
безопасности и многое другое. В следующий раз поговорим про btrfs.

ↄ⃝ Difrex <me@difrex.ru> 2015
Attribution-ShareAlike http://creativecommons.org/licenses/by-sa/4.0/

# Re: Настраиваем изолированную ноду TOR
spline(station13, 1) — Difrex
2015-01-22 08:58:06


Молодец какой. А я даже и не знаю о чём писать что может быть интересно другим пользователям сети. Иногда появляются такие мысли "написать о чём-нить в ii", но, поразмыслив, прихожу к мнению что это будет не интересно.

>Да, честно говоря, вообще сеть населена роботами по больше части.

Прискорбно, но факт.

# Re: Настраиваем изолированную ноду TOR
Difrex(mira, 14) — spline
2015-01-22 09:13:50


>"написать о чём-нить в ii", но, поразмыслив, прихожу к мнению что это будет не интересно.
Да ну. Мне кажется, что надо обо всем писать.

# Re: Настраиваем изолированную ноду TOR
Difrex(mira, 14) — spline
2015-01-22 11:51:03


Кстати, @spline, пришли мне в джаббер строку авторизации от твоей ноды, а то я ее потерял =)

# Re: Настраиваем изолированную ноду TOR
vit01(mira, 1) — Difrex
2015-01-22 12:54:18


Очень интересная статья, спасибо. Сам никогда dm-crypt/LUKS не использовал, поэтому будет, с чем поэкспериментировать. Интересно было бы узнать про аспекты безопасности при взаимодействии Тора и lighttpd.

>"написать о чём-нить в ii", но, поразмыслив, прихожу к мнению что это будет не интересно.
Такая же ситуация. Правда, мне обычно писать не о чем.

# Re: Настраиваем изолированную ноду TOR
spline(station13, 1) — Difrex
2015-01-24 19:27:26


>Кстати, @spline, пришли мне в джаббер строку авторизации от твоей ноды, а то я ее потерял =)

Кинь сюда (можно в base64) свой адрес. Я чёт найти не могу.

# Re: Настраиваем изолированную ноду TOR
Difrex(mira, 14) — spline
2015-01-26 09:36:35


>Кинь сюда (можно в base64) свой адрес. Я чёт найти не могу.
Держи: cm9vdEBkaWZyZXgucnUK