Konfiguracja serwera VPS dla TOR pod HiddenService

background image

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

background image

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

background image

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:

background image

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

background image

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

background image

(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>";

background image

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

i

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

background image

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.

background image

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.


Wyszukiwarka

Podobne podstrony:
2007 10 Konfiguracja serwera IIS dla ASP NET z protokołem SSL
DNS konfiguracja serwera
Konfiguracja serwera Apache, SSL w systemie GNU Linux
Konfiguracja serwera pocztowego
04 Linux Konfiguracja serwera poczty elekrtonicznej POSTFIX
03 Linux Konfiguracja serwera FTP PROFTPD
Instalacja i konfigurowanie serwera
Instrukcja konfiguracji modemu ADSL Router Request pod Neostrade
Definiowanie wirtualnego serwera WWW dla potrzeb gazetki szkolnej
Konfigurowanie serwera Dial Up
automatyczne wykrywanie i konfigurowanie serwera proxy RBFJH6HC4NHJNWNURXZXTAFFDXQQT3BVI6QNM6Y
podstawowa konfiguracja serwera(od blumena)
02 Linux Konfiguracja serwera WWW APACHE
Instalacja i konfiguracja serwera vsFTPd
DNS konfiguracja serwera
Konfiguracja serwera Apache, SSL w systemie GNU Linux
konfiguracja serwera pocztowego
Konfiguracja serwerów sieci VPN i zapory

więcej podobnych podstron