Bitcoin u kavezu?

Zanimljivo je da sam po struci administrator računalnih sustava i mreža (ili jednostavno: sysadmin), i imao sam priliku raditi na raznim sustavima tijekom nešto više od 10 godina profesionalnog djelovanja, uključujući one koji zahtijevaju [po|za]višene mjere sigurnosti. Također, nedavno sam pronašao zanimljivost bitkoin, i ne samo da sam ga koristio, nego sam pokrenuo nekoliko mikro-servisa kako bih naučio kako raditi s bitcoin mrežom (jer je to p2p) iz perspektive programera (iako sam zapravo samo amater dev, tek sam prolazio). No, ne govorim o razvoju, već o sigurnom i učinkovitom okruženju za aplikacije.

Financijske tehnologije (fintech) povezane su s informatičkom sigurnošću (infosec), i prva bez druge može funkcionirati, ali ne dugo. Zato želim podijeliti svoje iskustvo i skup alata koji koristim, a koji uključuje fintech, kao i infosec, istovremeno, i može se koristiti u širem ili potpuno drugačijem kontekstu. U ovom članku ću pričati više o infrastrukturnom modelu za razvoj i operacije financijskih (i ne samo) usluga — jednim riječima o onim uslugama gdje

Želim napomenuti da sam pobornik principa „keep it stupid simple“ i „less is more“, pa će i članak i ono što je u njemu opisano imati karakteristike koje se temelje na tim principima.

Zamišljeni scenarij: Pogledajmo sve na primjeru bitcoin mjenjačnice. Odlučili smo pokrenuti razmjenu rubalja, dolara, eura za bitcoine i obrnuto, i već imamo funkcionalno rješenje, ali za druge digitalne novčanice poput Qiwi i Webmoney, tj. svi pravni aspekti su riješeni, imamo gotovu aplikaciju koja djeluje kao platni prolaz za rubalje, dolare i eure te ostale sustave plaćanja. Povezana je s našim bankovnim računima i ima neko API za naše krajnje aplikacije. Također imamo web aplikaciju koja služi kao mjenjačnica za korisnike, nešto poput tipičnog Qiwi ili Webmoney računa — otvorite račun, dodajte karticu i tako dalje. Ona komunicira s našom aplikacijom-prolazom, recimo putem REST API u lokalnoj mreži. I tako smo odlučili uključiti bitcoine i istovremeno unaprijediti infrastrukturu, jer je prvotno sve bilo brzinski postavljeno na virtualnim kutijama ispod stola u uredu... web stranica se koristila, a mi smo počeli brinuti o dostupnosti i performansama.

Dakle, krenimo od osnovnog — izbora servera. Budući da je posao u našem primjeru mali i vjerujemo našem hosting provideru (OVH), odabrati ćemo proračunsku opciju za koju nije moguće instalirati sustav iz originalne .iso slike, ali nema problema, odjel za IT sigurnost će sigurno provesti analizu instaliranog imidža. A kad narastemo, iznajmljujemo svoj ormar pod ključem s ograničenim fizičkim pristupom, ili možda čak i izgradimo vlastiti data centar. U svakom slučaju, treba imati na umu da pri iznajmljivanju hardvera i instalaciji gotovih slika postoji šansa da u vašem sustavu ostane 'trojanac od hostera', koji u većini slučajeva nije namijenjen praćenju vas, nego ponudi prikladnijih alata za upravljanje serverom.

Instalacija servera

Ovdje je sve jednostavno. Biramo hardver koji odgovara našim potrebama. Zatim biramo FreeBSD sliku. Ili se povezujemo (u slučaju drugog hostera i vlastitog hardvera) preko IPMI ili s monitorom i učitavamo FreeBSD .iso sliku. Za orkestriranu instalaciju koristim Ansible i mfsbsd. Jedina razlika, u našem slučaju s Kimsufi, odabrali smo prilagođenu instalaciju tako da dva diska u ogledalu imaju 'otvorene' samo boot i /home particije, a ostatak prostora diska bit će šifriran, ali o tome kasnije.

Bitcoin u kavezu?

Instalacija sustava odvija se standardnim načinom, neću se na tome zadržavati, samo ću napomenuti da je prije početka korištenja važno obratiti pažnju na hardening opcije koje nudi bsdinstaller na kraju instalacije (ukoliko sami instalirate sustav):

Bitcoin u kavezu?

Postoji dobar materijal o ovoj temi, ukratko ću ga ovdje ponoviti.

Aktivirati gore navedene parametre moguće je i na već instaliranom sustavu. Za to treba urediti datoteku pokretača i uključiti parametre jezgre. *ee — to je editor u BSD-u

# ee /etc/rc.conf

...
#sec hard
clear_tmp_enable="YES"
syslogd_flags="-ss"    
sendmail_enable="NONE"

# ee /etc/sysctl.conf

...
#sec hard
security.bsd.see_other_uids=0
security.bsd.see_other_gids=0
security.bsd.unprivileged_read_msgbuf=0
security.bsd.unprivileged_proc_debug=0
kern.randompid=$(jot -r 1 9999)
security.bsd.stack_guard_page=1

Također, važno je provjeriti da li imate najnoviju verziju sustava, i izvršiti sve nadogradnje i updateove. U našem slučaju, na primjer, potrebna je nadogradnja na najnoviju verziju, budući da su prethodne slike zastarjele za pola godine do godine. Također, mijenjamo SSH port na onaj koji nije zadani, dodajemo autentifikaciju putem ključeva i onemogućavamo lozinku.

Zatim postavljamo aide, praćenje stanja konfiguracijskih datoteka sustava. Detaljnije se može pročitati ovdje.

pkg install aide

i uređujemo naš cron tab

crontab -e

06 01 * * 0-6 /root/chkaide.sh

#! /bin/sh
#chkaide.sh
MYDATE=`date +%Y-%m-%d`
MYFILENAME="Aide-"$MYDATE.txt
/bin/echo "Aide check !! `date`" > /tmp/$MYFILENAME
/usr/local/bin/aide --check > /tmp/myAide.txt
/bin/cat /tmp/myAide.txt|/usr/bin/grep -v failed >> /tmp/$MYFILENAME
/bin/echo "**************************************" >> /tmp/$MYFILENAME
/usr/bin/tail -20 /tmp/myAide.txt >> /tmp/$MYFILENAME
/bin/echo "****************DONE******************" >> /tmp/$MYFILENAME

Omogućujemo sustavno audiranje

sysrc auditd_enable=YES

# service auditd start

Kako ovo administrirati odlično je opisano u priručniku.

Sada se ponovno pokrećemo i prelazimo na softver na serveru. Svaki server predstavlja hipervizor za kontejnere ili pune virtualne mašine. Zato je važno da procesor podržava VT-x i EPT ako planiramo koristiti potpunu virtualizaciju.

Kao menadžment kontejnera i virtualnih mašina koristim cbsd od olevole, želim mu puno zdravlja i blagoslova za ovu divnu alatku!

Kontejneri? Opet docker, zar ne?

Ali ne. FreeBSD Jails — to je odličan alat za kontejnerizaciju, a spomenuti cbsd za orkestraciju tih kontejnera, čije je ime — ćelije.

Kavez je izuzetno efikasno rešenje za izgradnju infrastrukture za razne svrhe, gde je potrebna potpuna izolacija pojedinačnih servisa ili procesa. U suštini, to je klon host sistema, ali mu nije potrebna potpuna virtualizacija 'hardvera'. Tako se resursi štede, jer se troše samo na obavljeni posao, a ne na 'gostujući OS'. Kada se kavezi koriste za unutrašnje potrebe, to je vrlo praktično rešenje za optimizaciju resursa — mnogo kaveza na jednom fizičkom serveru može svako od njih koristiti sve resurse servera po potrebi. S obzirom na to da različitim podservisima obično trebaju dodatni resursi u različito vreme, moguće je iz jednog servera izvući maksimalne performanse ako se pravilno planiraju i rasporede kavezi između servera. U slučaju potrebe, kavezima se takođe mogu postaviti ograničenja po korišćenim resursima.

Bitcoin u kavezu?

A šta je sa potpunom virtualizacijom?

Koliko ja znam, cbsd podržava rad bhyve i XEN hipervizore. Drugi nikada nisam koristio, ali prvi je relativno mlad hipervizor od FreeBSD. Razmotrimo primer korišćenja bhyve u sledećem primeru.

Instalacija i konfiguracija host okruženja

Koristimo FS ZFS. To je izuzetno moćan alat za upravljanje prostorom na serveru. Zahvaljujući ZFS-u, moguće je direktno iz diskova graditi nizove raznih konfiguracija, dinamički 'u hodu' proširivati prostor, menjati pokvarene diskove, upravljati snimcima i još mnogo toga što bi se moglo opisivati u celoj seriji članaka. Vratimo se našem serveru i njegovim diskovima. Na početku instalacije ostavili smo slobodan prostor na diskovima za šifrovane particije. Zašto tako? To je kako bi se sistem automatski podizao i slušao putem SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

dodajemo particiju diska na preostalom mestu

geli init /dev/ada0p4

ukucavamo naš šifrovanjski lozinku

geli attach /dev/ada0p4

ponovo unosimo lozinku i dobijamo uređaj /dev/ada0p4.eli — to je naš šifrovani prostor. Zatim ponavljamo isto za /dev/ada1 i ostale diskove u nizu. I kreiramo novi ZFS pool.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli — tako, imamo minimalni borbeni set spreman. Ogledni niz diskova u slučaju kvara jednog od tri.

Stvaramo dataset na novom „poolu“

zfs create vms/jails

pkg install cbsd — pokrenuli smo naredbu i instaliramo upravitelj za naše ćelije.

Nakon što cbsd je instaliran, potrebno ga je inicijalizirati:

# env workdir="/vms/jails" /usr/local/cbsd/sudoexec/initenv

i odgovaramo na mnoštvo pitanja, uglavnom odgovarajući prema zadanim postavkama.

*Ako koristite enkripciju, važno je da demon cbsdd ne započinje automatski, sve dok ne dešifrirate diskove ručno ili automatski (u našem primjeru to radi zabbix)

**Također ne koristim NAT od cbsd, već ga postavljam sam u pf.

# sysrc pf_enable=YES

# ee /etc/pf.conf

IF_PUBLIC="em0"
IP_PUBLIC="1.23.34.56"
JAIL_IP_POOL="192.168.0.0/24"

#WHITE_CL="{ 127.0.0.1 }"

icmp_types="echoreq"

set limit { states 20000, frags 20000, src-nodes 20000 }
set skip on lo0
scrub in all

#NAT za ćelije
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC

## Preusmjeravanje Bitcoin mrežnog porta
IP_JAIL="192.168.0.1"
PORT_JAIL="{8333}"
rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL

# service pf start

# pfctl -f /etc/pf.conf

Postavljanje politika vatrozida je također posebna tema, stoga se neću detaljnije upuštati u postavljanje politike BLOCK ALL i postavljanje lista dozvola, to se može učiniti čitajući službenu dokumentaciju ili bilo koji od brojnih članaka dostupnih na Googleu.

Pa, imamo instaliran cbsd, vrijeme je da stvorimo našu prvu radnu konju — bitcoin demon u ćeliji!

cbsd jconstruct-tui

Bitcoin u kavezu?

Ovdje vidimo dijalog za stvaranje ćelije. Nakon što smo postavili sve vrijednosti, kreiramo!

Pri stvaranju prve ćelije, treba odabrati što koristiti kao osnovu za ćelije. Ja biram distribuciju iz repozitorija FreeBSD naredbom repo. Ovaj izbor se vrši samo pri stvaranju prve ćelije određene verzije (možete hostati ćelije bilo koje verzije, koja je novija od verzije hosta).

Nakon što je sve instalirano — pokrećemo ćeliju!

# cbsd jstart bitcoind

Ali moramo instalirati softver u ćeliju.

# jls

   JID  IP Address      Hostname                      Path
     1  192.168.0.1     bitcoind.space.com            /zroot/jails/jails/bitcoind

jexec bitcoind da uđemo u konzolu ćelije

i već unutar ćelije instaliramo softver s njegovim zavisnostima (naš host sistem ostaje čist)

bitcoind:/@[15:25] # pkg install bitcoin-daemon bitcoin-utils

bitcoind:/@[15:30] # sysrc bitcoind_enable=YES

bitcoind:/@[15:30] # service bitcoind start

Bitcoin je u ćeliji, ali nam treba anonimnost jer želimo povezati se s nekim ćelijama preko TOR mreže. I uopće, planiramo da većinu ćelija sa sumnjivim softverom pokrećemo samo preko prokija. Zahvaljujući pf Možete isključiti NAT za određeni raspon IP adresa unutar lokalne mreže i omogućiti NAT samo za naš TOR čvor. Tako da, čak i ako u kavez uđe zlonamjeran softver, on vjerojatno neće uspostaviti vezu s vanjskim svijetom, a ako i uspije, ne će otkriti IP našeg servera. Zbog toga stvaramo još jedan kavez za 'provođenje' usluga kao što su '.onion' usluge i kao proxy za izlaz na internet odvojenim kavezima.

# cbsd jsconstruct-tui

# cbsd jstart tor

# jexec tor

tor:‏@[15:38] # pkg install tor

tor:‏@[15:38] # sysrc tor_enable=YES

tor:‏@[15:38] # ee /usr/local/etc/tor/torrc

Postavljamo da sluša na lokalnoj adresi (dostupnoj za sve kaveze)

SOCKSPort 192.168.0.2:9050

Što nam još nedostaje za potpuno zadovoljstvo? Da, potrebna nam je usluga za naš web, možda i više od jedne. Pokrenut ćemo nginx koji će igrati ulogu reverse-proxy i brinuti se o produženju Let’s Encrypt certifikata.

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

nginx-rev:‏@[15:47] # pkg install nginx py36-certbot

I evo, 150 MB ovisnosti smo stavili u kavez. A host je i dalje čist.

Vratit ćemo se postavkama nginx-a kasnije, trebamo podići još dva kaveza za našu platnu prolaznu točku na nodejs i rust, kao i web-aplikaciju, koja iz nekog razloga radi na apache-u i php-u, a za posljednju je potrebna MySQL baza podataka.

# cbsd jsconstruct-tui

# cbsd jstart paygw

# jexec paygw

paygw:‏@[15:55] # pkg install git node npm

paygw:‏@[15:55] # curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

… i još 380 MB paketa izolirano

Nakon toga povlačimo naše aplikacije putem gita i pokrećemo ih.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

webapp:‏@[16:02] # pkg install mariadb104-server apache24 php74 mod_php74 php74-pdo_mysql

450 MB paketa. u kavezu.

Ovdje dajemo pristup programerima putem SSH-a direktno u kavez, oni će sve sami obaviti:

webapp:‏@[16:02] # ee /etc/ssh/sshd_config

Port 2267 — mijenjamo SSH port kaveza na bilo koji proizvoljan

webapp:‏@[16:02] # sysrc sshd_enable=YES

webapp:‏@[16:02] # service sshd start

Eto, usluga je pokrenuta, ostaje dodati pravilo u pf firewall

Pogledajmo koje IP adrese imamo u kavezima i kako zapravo izgledaju naše 'lokalke'

# jls

   JID  IP Address      Hostname                      Path
     1  192.168.0.1     bitcoind.space.com            /zroot/jails/jails/bitcoind
     2  192.168.0.2     tor.space.com                 /zroot/jails/jails/tor
     3  192.168.0.3     nginx-rev.space.com           /zroot/jails/jails/nginx-rev
     4  192.168.0.4     paygw.space.com               /zroot/jails/jails/paygw
     5  192.168.0.5     webapp.my.domain              /zroot/jails/jails/webapp

i dodajemo pravilo

# ee /etc/pf.conf

## SSH for web-Devs
IP_JAIL="192.168.0.5"
PORT_JAIL="{ 2267 }"
rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL

pa, budući da smo ovdje, dodajmo također pravilo za reverse-proxy:

## web-ports for nginx-rev
IP_JAIL="192.168.0.3"
PORT_JAIL="{ 80, 443 }"
rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL

# pfctl -f /etc/pf.conf

Sada malo o bitcoinima

Što imamo — imamo web-aplikaciju koja je dostupna izvana, i koja lokalno komunicira s našom platnom prolaznom točkom. Sada trebamo pripremiti radno okruženje za interakciju s samom bitcoin mrežom — nodom. bitcoind ovo je samo demon koji podržava lokalnu kopiju aktualnog blockchaina. Ovaj demon ima RPC i funkcionalnost novčanika, no za razvoj aplikacija postoje prikladnije "omotnice". Na početku smo odlučili postaviti electrum – to je CLI novčanik. Ovaj novčanik koristit ćemo kao "hladno skladište" za naše bitcoine – u suštini, za one bitcoine koje treba pohraniti "izvan" sustava dostupnog korisnicima i općenito dalje od svih. Također ima GUI, pa ćemo sličan novčanik koristiti na
laptopima. Za sada ćemo koristiti elektrum s javnim serverima, a kasnije ćemo podići ElectrumX, da bismo u potpunosti bili neovisni.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

electrum:‍/@[8:45] # pkg install py36-electrum

još 700 MB softvera imamo u kavezu

electrum:‍/@[8:53] # adduser

Korisničko ime: wallet
Puno ime: 
Uid (Ostavite prazno za zadano): 
Login grupa [wallet]: 
Login grupa je wallet. Pozvati wallet u druge grupe? []: 
Login klasa [default]: 
Shell (sh csh tcsh nologin) [sh]: tcsh
Home direktorij [/home/wallet]: 
Dozvole za home direktorij (Ostavite prazno za zadano): 
Koristite autentifikaciju na temelju lozinke? [da]: ne
Zaključati račun nakon stvaranja? [ne]: 
Korisničko ime   : wallet
Lozinka   : 
Puno ime  : 
Uid        : 1001
Klasa      : 
Grupe     : wallet 
Home       : /home/wallet
Home Mode  : 
Shell      : /bin/tcsh
Zaključano     : ne
OK? (da/ne): da
adduser: INFO: Uspješno dodano (wallet) u bazu korisnika.
Dodati drugog korisnika? (da/ne): ne
Doviđenja!
electrum:‍/@[8:53] # su wallet

electrum:‍/@[8:53] # su wallet

wallet@electrum:/ % electrum-3.6 create

{
    "msg": "Molimo vas da svoj seed čuvate na sigurnom mjestu; ako ga izgubite, nećete moći obnoviti svoj novčanik.",
    "path": "/usr/home/wallet/.electrum/wallets/default_wallet",
    "seed": "ljubomoran vjetar svinja materijal vrpca mladi udar vizualno u redu kaktus nasumična ptica"
}

Evo, sada imamo stvoren novčanik.

wallet@electrum:/ % electrum-3.6 listaddresses

[
    "18WEhbjvMLGRMfwudzUrUd25U5C7uZYkzE",
    "14XHSejhxsZNDRtk4eFbqAX3L8rftzwQQU",
    "1KQXaN8RXiCN1ne9iYngUWAr6KJ6d4pPas",
    ...
    "1KeVcAwEYhk29qEyAfPwcBgF5mMMoy4qjw",
    "18VaUuSeBr6T2GwpSHYF3XyNgLyLCt1SWk"
]

wallet@electrum:/ % electrum-3.6 help

Našemu on-chain novčaniku ubuduće će se moći povezati samo ograničeni krug osoba. Da ne bismo otvorili pristup izvana u ovu ćeliju, povezivanje preko SSH će se odvijati putem TOR-a (takva decentralizirana verzija VPN-a). Pokrećemo SSH u ćeliji, ali ne diramo naš pf.conf na hostu.

electrum:‍/@[9:00] # sysrc sshd_enable=YES

electrum:‍/@[9:00] # service sshd start

Sada ćemo onemogućiti ćeliju s novčanikom pristup internetu. Postavit ćemo joj IP adresu iz drugog prostora podmreže, koji se ne NAT-a. Prvo ćemo promijeniti /etc/pf.conf na hostu

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" promijeniti na JAIL_IP_POOL="192.168.0.0/25", tako da će svi adrese 192.168.0.126-255 imati onemogućen direktni pristup internetu. Tiho „air-gap“ mreža. I NAT pravilo ostaje isto

nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC

Ponovo učitavamo pravila

# pfctl -f /etc/pf.conf

Sada se bavimo našom stanicom

# cbsd jconfig jname=electrum

Bitcoin u kavezu?

Bitcoin u kavezu?

jset mode=quiet jname=electrum ip4_addr="192.168.0.200"
Ukloni stari IP: /sbin/ifconfig em0 inet 192.168.0.6 -alias
Postavi novi IP: /sbin/ifconfig em0 inet 192.168.0.200 alias
ip4_addr: 192.168.0.200

Hmm, ali sada će nam prestati raditi i sam sistem. Međutim, možemo odrediti sistemski proxy. Ali postoji jedan problem, na TOR-u je to SOCKS5 proxy, a za udobnost nam treba i HTTP proxy.

# cbsd jsconstruct-tui

# cbsd jstart polipo

# jexec polipo

polipo:/@[9:28] # pkg install polipo

polipo:/@[9:28] # ee /usr/local/etc/polipo/config

socksParentProxy = "192.168.0.2:9050"
socksProxyType = socks5

polipo:/@[9:42] # sysrc polipo_enable=YES

polipo:/@[9:43] # service polipo start

Eto, sada imamo dva proxy servera u našem sistemu, a oba izlaze kroz TOR: socks5://192.168.0.2:9050 i http://192.168.0.6:8123

Sada možemo postaviti okruženje našeg novčanika

# jexec electrum

electrum:/@[9:45] # su wallet

wallet@electrum:/ % ee ~/cshrc

#in the end of file proxy config
setenv http_proxy http://192.168.0.6:8123
setenv https_proxy http://192.168.0.6:8123

Dakle, sada će shell raditi pod proxy-jem. Ako želimo instalirati pakete, trebali bismo dodati /usr/local/etc/pkg.conf iz super korisnika stanice

pkg_env: {
               http_proxy: "http://my_proxy_ip:8123",
           }

Sada je došlo vreme da dodamo TOR hidden service kao adresu našeg SSH servisa u stanicu novčanika.

# jexec tor

tor:/@[9:59] # ee /usr/local/etc/tor/torrc

HiddenServiceDir /var/db/tor/electrum/
HiddenServicePort 22 192.168.0.200:22

tor:/@[10:01] # mkdir /var/db/tor/electrum

tor:/@[10:01] # chown -R _tor:_tor /var/db/tor/electrum

tor:/@[10:01] # chmod 700 /var/db/tor/electrum

tor:/@[10:03] # service tor restart

tor:/@[10:04] # cat /var/db/tor/electrum/hostname

mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion

Evo našeg adresa za povezivanje. Vamos da proverimo s lokalnog računara. Ali prvo trebamo dodati naš SSH ključ:

wallet@electrum:/ % mkdir ~/.ssh

wallet@electrum:/ % ee ~/.ssh/authorized_keys

ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAG9Fk2Lqi4GQ8EXZrsH3EgSrVIQPQaAlS38MmJLBabihv9KHIDGXH7r018hxqLNNGbaJWO/wrWk7sG4T0yLHAbdQAFsMYof9kjoyuG56z0XZ8qaD/X/AjrhLMsIoBbUNj0AzxjKNlPJL4NbHsFwbmxGulKS0PdAD5oLcTQi/VnNdU7iFw== user@local

I sa klijentskog Linux računara

user@local ~$ nano ~/.ssh/config

#remote electrum wallet
Host remotebtc
        User wallet
        Port 22
        Hostname mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion
        ProxyCommand /bin/ncat --proxy localhost:9050 --proxy-type socks5 %h %p

Povezujemo se (Da bi ovo radilo, potreban je lokalni TOR daemon koji slusa na 9050)

user@local ~$ ssh remotebtc

Autentičnost hosta 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion ()' se ne može uspostaviti.
ECDSA ključ otisak je SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4.
Da li ste sigurni da želite nastaviti povezivanje (yes/no/[fingerprint])? yes
Upozorenje: 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion' (ECDSA) je trajno dodat na listu poznatih hostova.
FreeBSD 12.1-RELEASE-p1 GENERIC 
Da biste uštedeli prostor na disku u svom direktoriju, kompresujte datoteke koje retko koristite sa "gzip filename".
        -- Dru 
wallet@electrum:~ % logout

Uspjeh!

Za rad s trenutnim i mikro-plaćanjima također nam je potrebna čvor Lightning Network, zapravo će to biti naš glavni radni alat s bitcoinom. U *c-lightning, koji planiramo koristiti kao demona, ima Sparko plugin, koji je punopravni HTTP (REST) interfejs i omogućava rad s off-chain i on-chain transakcijama. c-lightning za funkcioniranje potrebna je bitcoind noda.

*postoje različite implementacije različitih programskih jezika za Lightning Network protokol. Od onih koje smo testirali, c-lightning (napisan u C) činilo se najstabilnijim i najučinkovitijim po resursima

# cbsd jsconstruct-tui

# cbsd jstart cln

# jexec cln

lightning: /@[10:23] # adduser

Korisničko ime: lightning
...

lightning: /@[10:24] # pkg install git

lightning: /@[10:23] # su lightning

cd ~ && git clone https://github.com/ElementsProject/lightning

lightning@lightning:~ % exit

lightning: /@[10:30] # cd /home/lightning/lightning/

lightning:/home/lightning/lightning@[10:31] # pkg install autoconf automake gettext git gmp gmake libtool python python3 sqlite3 libsodium py36-mako bash bitcoin-utils

lightning:/home/lightning/lightning@[10:34] # ./configure && gmake && gmake install

Dok se sve potrebno kompajlira i instalira, stvorimo RPC korisnika za lightningd u bitcoind

# jexec bitcoind

bitcoind: /@[10:36] # ee /usr/local/etc/bitcoin.conf

rpcbind=192.168.0.1
rpcuser=test
rpcpassword=test
#dozvoli samo c-lightning
rpcallowip=192.168.0.7/32

bitcoind: /@[10:39] # service bitcoind restart

Moje haotično prebacivanje između ćelija nije zapravo tako haotično ako se označi alat tmux, koji omogućava stvaranje više pod-session terminala unutar jedne sesije. Analognija: screen

Bitcoin u kavezu?

Tako, ne želimo otkriti pravi IP naše node, i želimo obavljati sve financijske transakcije preko TOR-a. Stoga nam treba još jedan .onion.

# jexec tor

tor:/@[9:59] # ee /usr/local/etc/tor/torrc

HiddenServiceDir /var/db/tor/cln/
HiddenServicePort 9735 192.168.0.7:9735

tor: /@[10:01] # mkdir /var/db/tor/cln

tor: /@[10:01] # chown -R _tor:_tor /var/db/tor/cln

tor: /@[10:01] # chmod 700 /var/db/tor/cln

tor:/@[10:03] # service tor restart

tor: /@[10:04] # cat /var/db/tor/cln/hostname

en5wbkavnytti334jc5uzaudkansypfs6aguv6kech4hbzpcz2ove3yd.onion

sada stvorimo konfiguraciju za c-lightning

lightning: /home/lightning/lightning@[10:31] # su lightning

lightning@lightning:~ % mkdir .lightning

lightning@lightning:~ % ee .lightning/config

alias=My-LN-Node
bind-addr=192.168.0.7:9735
rgb=ff0000
announce-addr=en5wbkavnytti334jc5uzaudkansypfs6aguv6kech4hbzpcz2ove3yd.onion:9735
network=bitcoin
log-level=info
fee-base=0
fee-per-satoshi=1
proxy=192.168.0.2:9050
log-file=/home/lightning/.lightning/c-lightning.log
min-capacity-sat=200000

# sparko plugin
# https://github.com/fiatjaf/lightningd-gjson-rpc/tree/master/cmd/sparko

sparko-host=192.168.0.7
sparko-port=9737

sparko-tls-path=sparko

#sparko-login=mywalletusername:mywalletpassword

#sparko-keys=masterkey;secretread:+listchannels,+listnodes;secretwrite:+invoice,+listinvoices,+delinvoice,+decodepay,+waitpay,+waitinvoice
sparko-keys=masterkey;secretread:+listchannels,+listnodes;ultrawrite:+invoice,+listinvoices,+delinvoice,+decodepay,+waitpay,+waitinvoice
# za gornji primjer, inicijalizacijski logovi (pomiješani s lightningd logovima) trebaju ispisati nešto poput

lightning@lightning:~ % mkdir .lightning/plugins

lightning@lightning:~ % cd .lightning/plugins/

lightning@lightning:~/.lightning/plugins:% fetch https://github.com/fiatjaf/sparko/releases/download/v0.2.1/sparko_full_freebsd_amd64

lightning@lightning:~/.lightning/plugins % mkdir ~/.lightning/sparko-tls

lightning@lightning:~/.lightning/sparko-tls % cd ~/.lightning/sparko-tls

lightning@lightning:~/.lightning/sparko-tls % openssl genrsa -out key.pem 2048

lightning@lightning:~/.lightning/sparko-tls % openssl req -new -x509 -sha256 -key key.pem -out cert.pem -days 3650

lightning@lightning:~/.lightning/plugins % chmod +x sparko_full_freebsd_amd64

lightning@lightning:~/.lightning/plugins % mv sparko_full_freebsd_amd64 sparko

lightning@lightning:~/.lightning/plugins % cd ~

također je potrebno stvoriti konfiguracijski datoteka za bitcoin-cli, alat koji komunicira s bitcoind

lightning@lightning:~ % mkdir .bitcoin

lightning@lightning:~ % ee .bitcoin/bitcoin.conf

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

provjeravamo

lightning@lightning:~ % bitcoin-cli echo "test"

[
  "test"
]

pokrećemo lightningd

lightning@lightning:~ % lightningd --daemon

Ja lightningd možete upravljati alatom lightning-cli, na primjer:

lightning-cli newaddr dobiti adresu za novu primljenu uplatu

{
   "address": "bc1q2n2ffq3lplhme8jufcxahfrnfhruwjgx3c78pv",
   "bech32": "bc1q2n2ffq3lplhme8jufcxahfrnfhruwjgx3c78pv"
}

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all poslati svu novčanicu na adresu (sve on-chain adrese)

Također postoji naredba za off-chain operacije lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay itd.

Za komunikaciju s aplikacijom imamo REST API

curl -k https://192.168.0.7:9737/rpc -d '{"method": "pay", "params": ["lnbc..."]}' -H 'X-Access masterkey'

Sumirajmo

# jls

   JID  IP Adresa      Ime hosta                     Putanja
     1  192.168.0.1     bitcoind.space.com            /zroot/jails/jails/bitcoind
     2  192.168.0.2     tor.space.com                 /zroot/jails/jails/tor
     3  192.168.0.3     nginx-rev.space.com           /zroot/jails/jails/nginx-rev
     4  192.168.0.4     paygw.space.com               /zroot/jails/jails/paygw
     5  192.168.0.5     webapp.my.domain              /zroot/jails/jails/webapp
     7  192.168.0.200   electrum.space.com            /zroot/jails/jails/electrum
     8  192.168.0.6     polipo.space.com              /zroot/jails/jails/polipo
     9  192.168.0.7     lightning.space.com           /zroot/jails/jails/cln

Bitcoin u kavezu?

Imamo set kontejnera, svaki sa svojim nivoom pristupa iz i u lokalnu mrežu.

# zfs list

IME                    KORIŠTENO  DOSTUPNO  ODNOS  MOUNTPOINT
zroot                   279G  1.48T    88K  /zroot
zroot/ROOT             1.89G  1.48T    88K  none
zroot/ROOT/default     1.89G  17.6G  1.89G  /
zroot/home               88K  1.48T    88K  /home
zroot/jails             277G  1.48T   404M  /zroot/jails
zroot/jails/bitcoind    190G  1.48T   190G  /zroot/jails/jails-data/bitcoind-data
zroot/jails/cln         653M  1.48T   653M  /zroot/jails/jails-data/cln-data
zroot/jails/electrum    703M  1.48T   703M  /zroot/jails/jails-data/electrum-data
zroot/jails/nginx-rev   190M  1.48T   190M  /zroot/jails/jails-data/nginx-rev-data
zroot/jails/paygw      82.4G  1.48T  82.4G  /zroot/jails/jails-data/paygw-data
zroot/jails/polipo     57.6M  1.48T  57.6M  /zroot/jails/jails-data/polipo-data
zroot/jails/tor        81.5M  1.48T  81.5M  /zroot/jails/jails-data/tor-data
zroot/jails/webapp      360M  1.48T   360M  /zroot/jails/jails-data/webapp-data

Kao što se može vidjeti, bitcoind zauzima svih 190 GB prostora. A šta ako nam bude potrebna još jedna nod za testove? Tada ZFS zaista pomaže. Pomoću cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com Možete stvoriti snimak i povezati novu ćeliju s tim snimkom. Nova ćelija će imati potpuno svoj prostor, ali će se u FS-u uzimati u obzir samo razlika između trenutnog stanja i originala (uštedjet ćemo najmanje 190 GB)

Svaka ćelija je svoj odvojeni ZFS skup podataka, i to je veoma praktično. ZFS također omogućuje izvođenje različitih drugih sjajnih stvari, poput slanja snimaka putem SSH-a. O tome nećemo govoriti, ionako je već mnogo.

Također, važno je napomenuti potrebu za udaljenim nadgledanjem hosta, za te svrhe imamo Zabbix,.

B — sigurnost

Što se tiče sigurnosti, krenimo od ključnih principa u kontekstu infrastrukture:

Povjerljivost — Standardni alati UNIX-sličnih sustava omogućuju ostvarivanje ovog principa. Logički dijelimo pristup svakom logički odvojenom elementu sustava — ćeliji. Pristup se ostvaruje putem standardne korisničke autentifikacije po osobnim ključevima korisnika. Sva komunikacija između i do krajnjih ćelija odvija se u šifriranom obliku. Zahvaljujući enkripciji diskova, možemo biti bez brige o očuvanju podataka tokom zamjene diska ili migracije na drugi server. Jedini kritični pristup je pristup host-sustavu, jer takav pristup općenito osigurava pristup podacima unutar kontejnera.

Integritet — Ovaj princip se ostvaruje na nekoliko različitih nivoa. Prvo, važno je napomenuti da u slučaju serverske opreme, ECC memorije, ZFS već “iz kutije” brine o integritetu podataka na razini bitova informacija. Trenutni snimci omogućuju pravljenje sigurnosnih kopija u bilo kojem trenutku u hodu. Praktični alati za izvoz-uvoz ćelija olakšavaju replikaciju ćelija.

Dostupnost — Ovo je već opcionalno. Ovisi o stepenu vaše poznatosti i o tome imate li neprijatelje. U našem primjeru osigurali smo dostupnost novčanika isključivo iz TOR mreže. Po potrebi, na vatrozidu možete blokirati sve i omogućiti pristup serveru isključivo putem tunela (TOR ili VPN je druga priča). Na taj način, server će biti odrezan od vanjskog svijeta koliko god je to moguće, a na njegovu dostupnost moći ćemo utjecati samo mi sami.

Nemogućnost odbijanja — To ovisi o daljnjoj upotrebi i poštivanju pravih politika korisničkih prava, pristupa itd. No, uz pravi pristup, sve aktivnosti korisnika se auditiraju, a zahvaljujući kriptografskim rješenjima moguće je jednoznačno identificirati tko i kada je izvršio određene radnje.

Naravno, opisana konfiguracija nije apsolutni primjer kako bi to uvijek trebalo biti, to je više jedan od primjera kako bi moglo biti, zadržavajući vrlo fleksibilne mogućnosti skaliranja i prilagodbe.

A što sa potpunom virtualizacijom?

O potpunoj virtualizaciji putem cbsd možemo pročitati ovdje. Samo ću dodati da za rad bhyve treba uključiti neke parametre jezgre.

# cat /etc/rc.conf

...
kld_list="vmm if_tap if_bridge nmdm"
...

# cat /boot/loader.conf

...
vmm_load="DA"
...

Dakle, ako postoji potreba za podizanjem dokera, podižemo neki debian i dalje!

Bitcoin u kavezu?

To je to

Mislim da je to sve što sam želio podijeliti. Ako vam se svidio članak, možete mi poslati bitcoine — bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Ako želite isprobati stanice u akciji i imate malo bitcoina, možete posjetiti moj pet-project.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster