Konfiguracja serwera VPS dla TOR pod HiddenService
Krang mieć nadzieja, że ukryte usługi wyrosną dzięki temu jak grzyby po deszczu. A najlepiej jak
muchomorki.
Wszyscy dodawać swoje sugestie, uwagi i korekty!
UWAGA: Nie jest to ostateczna wersja, to na razie przemyslenia z wdrażanej konfiguracji
środowiska testowego!
Wstęp:
1. Krang brać pod uwagę fakt, że serwer VPS powinien być niewidoczny dla clearnet'u i mieć z nim
jak najmniej wspólnego.
2. Zakup VPS powinien odbyć się anonimowo, może i nawet z niezarejestrowanego PayPala
(ograniczenia są przecież co do dużych kwot oraz mnogości transakcji) lub poprzez płatności
Bitcoin bo i kwota mała biorąc pod uwagę, że serwer VPS można dostać o fajnych parametrach już
od 12 do 15 dolców.
3. Jeśli ma być to usługa typu www lub mail to wystarczy jedno corowa maszyna od 256 do 512
pamięci ram i dyskiem minimum 20 GB. (7$ do 15$ rocznie)
4. Gdyby miałaby uciągnąć VM z Tailsem (lub innym linuchem jako serwer www) lub Whonixem
+ Gateway Whonixa (bez Xów) to już by można pomyśleć o minimum 2 rdzenie a miło gdyby 4
były plus 1 do 2 GB Ram oraz około 20 do 50 GB powierzchni. (od 15 do 30$ rocznie)
Wszystko oczywiście też zależy jakie www ma uciągnąć, gdyż w hostingu plików oczywiście
ogromną rolę będzie odgrywać np. dysk.
5. Lokalizacja serwera, tu można gdybać. Myślę, że USA to zły pomysł mimo, że są i przeciwnicy
tej teorii, kwestia dyskusyjna. Może Mexico City smile Dla świętego spokoju wybrałbym
serwerownie zlokalizowaną w Europie poza mackami Unii Europejskiej.
Im mniej zorganizowane organy ścigania tym lepiej mimo, że każdy może sprzedać info co dzieje
się na jego serwerze byle komu. Najgorsi są ciekawscy admini.
2 rozwiązania postawienia bezpiecznego www (w żadnym przypadku VPS nie powinien gadać z
Torem w inny sposób niż jako klient, żadne nody obojętnie czy pierwsze środkowe czy wyjściowe)
np:
a) VPS + Serwer www -> TOR
[czyli www stoi bezpośrednio na VPSie a VPS gada z Torem jako klient]
lub
b) VPS ->(Szyfrowane VM Whonix + Serwer www) -> Szyfrowany VM Whonix Gateway
[VPS stoi dla utrzymywania VMek, które są zaszyfrowane, w locie czy też jako pliki albo i to i to,
zapewnia to mniejszy wgląd admina VPS w to co dzieje się na naszym serwerze jak i w razie
wpadki szybki reset VPS'a czy samych VMek uniemożliwi do nich dostęp gdyż są zaszyfrowane.
Whonix Workstation ma na sobie serwer www a Whonix Gateway puszcza cały ruch z Workstation
w świat, takie rozwiązanie sprawia, ze VPS jest czysty i obojętnie co się nie stanie na serwerze
www nie ma żadnego powiązania z VPSem.]
W obu przypadkach trzeba brać pod uwagę backup www. W przypadku a) zaszyfrowana paczka z
www nawet i na dropboksie może leżeć. Opcja b) tak samo lub po prostu większa przestrzeń i kopia
VMki na której leży www.
Skupie się głównie na konfiguracji opcji a) jednak będę dodawał informacje na temat tego co
dodać, żeby było dobrze w przypadku b) [co nie zmienia faktu, że konfiguracja, która zostanie
przedstawiona poniżej jest podstawą i podwalina pod b)]. W niedalekiej przyszłości kiedy skończę
pierwszy etap zawładnięcia światem postaram się znaleźć czas aby zrobić kompleksowy tutorial dla
b). Teraz o tym tylko gdybam i teoretyzuje mimo, że zdaję sobie sprawę, że takie rozwiązania od
dawna działają a jedno niedawno miałem okazję połowicznie oglądać. Psst... tak na marginesie
powiem, że do drugiej opcji widziałem serwer www, który same pliki miał u siebie a na drugim
podobnym rozwiązaniu, na drugim końcu świata stała baza MySQL, która rozmawiała z www i to
jeszcze w zaszyfrowany tunelu. Takie rozwiązanie wyglądało mniej więcej tak: VPS->(VM www)-
>VM Gateway TOR->VPN->Tunel->VPS->VM MySQL
Dzięki czemu VPSy były niezależne a serwer www z baza danych gadał za pośrednictwem VPN'a i
Tor'a. W razie wpadki baza była bezpieczna, VPSy się nie zdradzały. Trochę padaka na prędkości
ale dało się żyć.
Back to the temat.
Nasz VPS ma usługę ssh, ftp oraz www z mysql (pocztę sobie darujemy). Wszystkie usługi
będziemy konfigurować tak by komunikowały się tylko przez cebulę. Cebulowe ssh, cebulowy ftp,
cebulowe www (www to przecież logiczne) Wszystkie porty niestandardowe i wysooookie, www
bindowane lokalnie. (dla niewtajemniczonych: serwer www nie może działać i w torze i być
widocznym w clearnecie bo zdradzi to nasze słynne IP po, którym milicja na sygnale za nami
jeździ, serwer www musi chodzić lokalnie i być wypuszczony na świat przez Tor)
Firewall ma wycinać wszystko łącznie z PING. Im mniej wiadomo o naszej maszynie tym lepiej.
Bo przecież interesujące nas porty będą dostępne tylko z Cebulandii.
Biorcą pod uwagę rozwiązanie b) musimy pamiętać o tym, że trzeba będzie puścić clearnetowe
VNC, które pozwoli dostać się na VMki. Rozwiązanie b) wymaga xów z np. Openboxem lub innym
jeszcze lżejszym gównem np. tinywm (najmniejsza ilość kodu) Na ten temat jeszcze nie
kontemplowałem.
Konfigurujmy więc:
1. Kilka podstawowych kroków.
apt-get update
apt-get dist-upgrade
apt-get install nano screen tor connect-proxy
(nano jako ulubiony edytor plików, screen jako rozwiązanie podtrzymywania usługi Tor, Tor
wiadomo a connect-proxy dla ssh przez Tor'a, jak mamy inną wersje jak minimal to wywalamy
Apache i Sendmail, które są domyślnie zainstalowane)
2. Konfiguracja Tor, Lighttpd i PHP.
cd /usr/local/etc/tor
cp torrc.sample torrc
nano torrc
Dodaj lub zmodyfikuj:
HiddenServiceDir /tor/hidden_service/
HiddenServicePort 80 127.0.0.1:8765
SocksPort 0
(domyślny katalog dla linków .onion naszej strony której domyślny port www 80 zostanie
przekierowany na 8765 na naszym serwerze, warto nie ustawiać domyślnych 80 i 8080, chcemy się
przecież ukrywać)
Teraz instalacja lighttpd i php.
apt-get install lighttpd php5-cgi
plus aktywacja php dla lighttpd
lighty-enable-mod fastcgi
lighty-enable-mod fastcgi-php
/etc/init.d/lighttpd restart
Konfiguracja serwera www
nano /etc/lighttpd/lighttpd.conf
server.port = 8765
$HTTP["remoteip"] !~ "127.0.0.1" {
url.access-deny = ( "" )
}
server.dir-listing = "disable"
(Dzięki tym zmianom serwer słucha na wskazanym przez nas porcie w konfiguracji Tor, pozwala na
dostęp tylko z naszego serwera i zabrania z każdego innego IP, nasz serwer będzie przekazywał
ruch przez Tor. Ustawiony jest tez zakaz listowania katalogów)
Teraz uruchamiamy Tor jako sesja. Można oczywiście uruchomić go jako demona ale takie
rozwiązanie jest chyba ciekawsze. Po uruchomieniu można przejść do folderu hidden_service i
otworzyć plik "hostname", który zawiera link .onion do naszej strony.
screen tor
[CTRL + A + D (aby pozostawić sesje)]
cd /tor/hidden_service
nano hostname
Warto skonfigurować PHP tak aby wiadomości błędów były wyłączone, a www tak aby błędy 404,
503 itp itd nie zdradzały żadnych informacji o serwerze.
Error log:
nano /var/log/lighttpd/error.log
No i korzystamy ze skryptów z głową aby nie instalować jakiś starych lub dziurawych jak i
utrzymywać nasze cmsy, fora itp itd w aktualnych wersjach.
3. Konfiguracja SSH dla Tor
nano /etc/ssh/sshd_config
Wszystkie połączenia dla TOR:
Host *
CheckHostIP no
Compression yes
Protocol 2
ProxyCommand connect -4 -S localhost:9050 $(tor-resolve %h localhost:9050) %p
Określone połączenia:
Host mydomain
HostName mydomain.com
User myaccount
CheckHostIP no
Compression yes
Protocol 2
ProxyCommand connect -4 -S localhost:9050 $(tor-resolve %h localhost:9050) %p
4. Bezpieczniej czyli chroot jail dla lighttpd, php i mysql.
Jeśli będzie włam na www to atakujący dzięki temu utknie w katalogu i żaden exploit na lighttpd
lub samego Tora na nic mu się nie zda, bo będzie zamknięty w katalogu danej usługi.
Zacznijmy od przygotowania systemu:
Tworzymy katalog:
mkdir /webroot
W nim temp:
mkdir /webroot/tmp/
chmod 1777 /webroot/tmp/
etc dla trzymania php.ini
mkdir /webroot/etc
Katalog logów dla lighttpd
mkdir -p /webroot/var/log/lighttpd
chown www-data:www-data /webroot/var/log/lighttpd
Katalog na cache
mkdir -p /webroot/var/tmp/lighttpd/cache/compress/
chown www-data:www-data /webroot/var/tmp/lighttpd/cache/compress/
Tworzenie katalogu domowego lighttpd dla naszego wirtualnego hostingu
mkdir -p /webroot/home/lighttpd
chown www-data:www-data /webroot/home/lighttpd
chmod 0700 /webroot/home/lighttpd
ls -dl /webroot/home/lighttpd
Wyświetli się:
drwx------ 2 www-data www-data 4096 Sep 5 23:20 /webroot/home/lighttpd
Podręczny skrypcik do kopiowania niezbędnych plików: (chrootscript)
#!/bin/bash
BASE="/webroot"
if [ $# -eq 0 ]; then
echo "Syntax : $0 /path/to/executable"
echo "Example: $0 /usr/bin/php5-cgi"
exit 1
fi
[ ! $BASE ] && mkdir -p $BASE || :
# iggy ld-linux* file as it is not shared one
FILES="$(ldd $1 | awk '{ print $3 }' |egrep -v ^'\(')"
echo "Copying shared files/libs to $BASE..."
for i in $FILES
do
d="$(dirname $i)"
[ ! -d $BASE$d ] && mkdir -p $BASE$d || :
/bin/cp $i $BASE$d
done
# copy /lib/ld-linux* or /lib64/ld-linux* to $BASE/$sldlsubdir
# get ld-linux full file location
sldl="$(ldd $1 | grep 'ld-linux' | awk '{ print $1}')"
# now get sub-dir
sldlsubdir="$(dirname $sldl)"
if [ ! -f $BASE$sldl ];
then
echo "Copying $sldl $BASE$sldlsubdir..."
/bin/cp $sldl $BASE$sldlsubdir
else
:
fi
Tak przygotowany skrypt wrzucamy do /bin i nadajemy uprawnienia wykonania:
cp chrootscript /bin
chmod +x /bin/chrootscript
Wsadzamy PHP do więzienia (policji spodoba się nazwa tego etapu)
Kopiujemy pliki wykonywalne php i niezbędne pliki do obsługi mysql:
mkdir -p /webroot/usr/bin
cp /usr/bin/php5-cgi /webroot/usr/bin/
cp /usr/bin/php5 /webroot/usr/bin/
Niezbędne php.ini też:
cd /webroot/etc/
cp -avr /etc/php5
No i reszta plików do "paki":
cp /etc/hosts /webroot/etc/
cp /etc/nsswitch.conf /webroot/etc/
cp /etc/resolv.conf /webroot/etc/
cp /etc/services /webroot/etc/
cp /etc/localtime /webroot/etc/
Kopiujemy biblioteki php za pomocą skryptu chrootscript przygotowanego wcześniej:
/bin/chrootscript /usr/bin/php5
/bin/chrootscript /usr/bin/php5-cgi
Można sprawdzić poleceniem ls czy wszystko się skopiowało.
Jeden plik musimy skopiować ręcznie:
cp /lib/ld-linux.so.2 /webroot/lib
Kolejny krok ro wrzucenie rozszerzenia MySQL dla php do jail.
Dostęp do bazy MySQL musimy uzyskać poprzez rozszerzenie php5-mysql.
Kopiujemy rozszerzenie z katalogu /usr/lib/php5/20130710, uzyj polecenia poniżej aby
zlokalizować dokładna lokalizację pliku mysql.so
dpkg -L php5-mysql
Wyświetli się:
/.
/usr
/usr/lib
/usr/lib/php5
/usr/lib/php5/20130710
/usr/lib/php5/20130710/mysql.so
/usr/share
/usr/share/doc
/usr/share/doc/php5-mysql
Skopiuj mysql.so do /webroot/usr/lib/php5/20130710/mysql.so i biblioteki za pomocą naszego
skryptu chrootscript:
mkdir -p /webroot/usr/lib/php5/20130710
cp /usr/lib/php5/20130710/mysql.so /webroot/usr/lib/php5/20130710/
/bin/chrootscript /usr/lib/php5/20130710/mysql.so
Powyższa procedurę należy powtórzyć dla wszystkich udostępnionych modułów jak np. php-imap
(wymagany do webmail) czy php-gd (moduł wymagany do Wordpressa), php-memcache itp. itd.
Teraz najważniejsze czyli konfiguracja lighttpd tak aby uruchamiał się z chrooted jail.
Upewniamy się, ze moduł fastcgi jest właczony:
lighty-enable-mod fastcgi
Efekt polecenia:
Available modules: auth cgi cml fastcgi proxy simple-vhost ssi ssl trigger-b4-dl
userdir
Already enabled modules:
Enabling fastcgi: ok
Run /etc/init.d/lighttpd force-reload to enable changes
Konfigurujemy lighttpd edytując plik /etc/lighttpd/lighttpd.conf
nano /etc/lighttpd/lighttpd.conf
Najważniejsza część to dyrektywa server.chroot.
Tu ustawiamy nasz przygotowany katalog:
server.chroot = "/webroot"
Startujemy:
/etc/init.d/lighttpd start
Test konfiguracji więzienia:
Tworzymy dwa pliki w katalogu /webroot/home/lighttpd
-db.php : Do testowania połączenia bazy danych MySQL, upewnij się, że plik jest zmodyfikowany
pod odpowiednią bazę danych, uzytkownika i hasło.
Zawartość:
<?php
// in chroot use mysql host IP 127.0.0.1
// if you want to use localhost put /etc/resolve.conf /etc/hosts file
// to /webroot/etc directory
$link = mysql_connect("127.0.0.1", "root", "PASSWORD");
mysql_select_db("mysql");
$query = "show tables";
$result = mysql_query($query);
print "<h1>MySQL DB Test executed from ". $_SERVER['SCRIPT_NAME']. "</h1>\n";
print "Script name: ". $_SERVER['SCRIPT_FILENAME'] ."<hr>\n";
while ($line = mysql_fetch_array($result))
{
print "$line[0]<br>\n";
}
mysql_close($link);
// try to open real /etc/passwd file
print "<h1>Trying to open /etc/passwd file</h1>";
try2OpenFile("/etc/passwd");
// try to open real /etc/hosts file
print "<h1>Trying to open /etc/hosts file</h1>";
try2OpenFile("/etc/hosts");
function try2OpenFile($file){
$f = @fopen($file, "r");
if ( !$f ) { print "Error - Cannot open file <b>".$file."</b>"; return;}
echo "<hr>File: $file<hr><pre>";
while ( $line = fgets($f, 1000) ) {
print $line;
}
echo "</pre>";
}
?>
-test.php : Test php poprzez phpinfo()
Zawartość pliku:
<?php
phpinfo();
?>
Otwieramy przeglądarkę i wpisujemy adres naszego serwera:
http://twojadomena.onion/test.php
http://twojadomena.onion/db.php
Jeśli oba wyświetlają info to cała konfiguracja przeszła ok.
Wszystkie errory analizujemy tu:
/var/log/message
Można sobie jeszcze sprawdzić rozmiar katalogu webroot:
du -ch
zajmuje pewnie koło 20 mega.
5. FTP
Tutaj najważniejsze aby z softu do FTP nie wyciekał adres IP naszego hosta. W sumie to we
wszystkich apkach jest to ważne.
Ważne jest aby zmienić też tryb pracy z active mode na passive mode.
Konfigurujemy też port tak aby poruszał się tylko w jego zakresie oraz był puszczony na firewallu.
Przykład na vsftpd.
Instalacja:
sudo apt-get install vsftpd
Deaktywacja active mode:
sudo nano /etc/vsftpd/vsftpd.conf
port_enable=NO
W tym samym pliku kontynuujemy konfigurację i bindujemy serwer na localhost
listen_address=127.0.0.1
Wymuszamy port:
pasv_max_port=2000
pasv_min_port=2000
Uruchamiamy serwer:
start vsftpd
W konfiguracji Tor dodajemy:
HiddenServiceDir /var/lib/tor/ftp-service/
HiddenServicePort 21
HiddenServicePort 2000
Restartujemy Tor:
service tor restart
Tu badamy adres:
/var/lib/tor/ftp-service/hostname
6. Firewall
Wykorzystałem ShoreWall
Kopiujemy przykładową konfiguracje:
cp /usr/share/doc/shorewall/examples/one-interface/
{zones,interfaces,policy,rules} /etc/shorewall/
Strefy sieci:
nano /etc/shorewall/zones
loc firewall
net ipv4
nano /etc/shorewall/interfaces
net venet0 detect tcpflags,blacklist
Polisy:
/etc/shorewall/policy:
loc net ACCEPT
net loc DROP info
all all REJECT info
Wyjątki:
/etc/shorewall/rules
SECTION NEW
Ping/DROP net loc
SSH/ACCEPT net loc
HTTP/ACCEPT net loc
Przykładowa polisa:
ACCEPT net loc tcp 8001
Wiadomo, że dodajemy to co chcemy puszczać a reszte blokujemy.
Autostart:
sudo nano /etc/default/shorewall
startup = 0
na
startup = 1
Uruchomienie:
shorewall safe-restart
Sprawdzanie:
sudo shorewall check.
7. Certyfikat SSL
Warto jeszcze dodać własny certyfikat ssl mimo, że Tor sam w sobie jest szyfrowany. Takie
rozwiązanie zwiększa też zaufanie odwiedzających.
Potrzebny jest zainstalowany OpenSSL
Ogólne tworzenie:
openssl req -newkey rsa:2048 -days 730 -x509 -keyout certyfikat.key -out
certyfikat.cert
Enter PEM pass phrase:
Verifying – Enter PEM pass phrase:
—– Country Name (2 letter code) [AU]:CA
State or Province Name (full name) [Some-State]:Saskatchewan
Locality Name (eg, city) []:Saskatoon
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:Information Logistics
Common Name (eg, YOUR name) []:Nifflewhim Bunderluff
Email Address []:test@example.com
cat certyfikat.cert certyfikat.key > certyfikat.pem
Już specjalnie pod lighttpd mozna zrobić tak:
cd /etc/lighttpd/certs
openssl req -new -x509 -keyout lighttpd.pem -out lighttpd.pem -days 365 -nodes
chmod 400 lighttpd.pem
nano /etc/lighttpd/lighttpd.conf
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/certs/lighttpd.pem"
}
Teraz śmiało można wbijać przez https.