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

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

Настраиваем изолированную ноду 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/