Bitcoin u kavezu?

Desilo se da sam po zanimanju administrator računarskih sistema i mreža (ukratko: sistem administrator), a nešto više od 10 godina imao sam priliku da govorim prof. aktivnosti širokog spektra sistema, uključujući one koji zahtijevaju [ekstremne] sigurnosne mjere. Desilo se i da mi je prije nekog vremena bilo zanimljivo bitcoin, i ne samo da je koristio, već je pokrenuo i nekoliko mikro-servisa kako bi naučio kako samostalno raditi sa Bitcoin mrežom (uostalom p2p) sa stanovišta programera (ja sam naravno jedan od njih dev, dakle, prolazio sam). Ali ne govorim o razvoju, govorim o sigurnom i efikasnom okruženju za aplikacije.

finansijska tehnologija (FinTech) idi pored informacione sigurnosti (infosec) a prvi može raditi i bez drugog, ali ne dugo. Zato želim podijeliti svoje iskustvo i skup alata koje koristim, a koji uključuje oboje FinTech, i infosec, a istovremeno, a može se koristiti i u širu ili potpuno drugačiju svrhu. U ovom članku ću vam reći ne toliko o Bitcoinu, već o infrastrukturnom modelu za razvoj i rad finansijskih (i ne samo) usluga - jednom riječju, onih usluga kod kojih je "B" bitno. Ovo se odnosi i na bitcoin burzu i na najtipičniji korporativni zoološki vrt usluga male kompanije koja nije ni na koji način povezana s Bitcoinom.

Želim da napomenem da sam pristalica principa "neka bude glupo jednostavno" и "manje je više", stoga će i članak i ono što je u njemu opisano imati svojstva o kojima se ti principi bave.

Imaginarni scenario: Pogledajmo sve na primjeru bitcoin izmjenjivača. Odlučili smo da pokrenemo razmjenu rubalja, dolara, eura za bitcoine i nazad, i već imamo radno rješenje, ali za drugi digitalni novac kao što su qiwi i webmoney, tj. Zatvorili smo sva pravna pitanja, imamo gotovu aplikaciju koja služi kao prolaz za plaćanje rublja, dolara i eura i drugih platnih sistema. Povezan je s našim bankovnim računima i ima neku vrstu API-ja za naše krajnje aplikacije. Imamo i web aplikaciju koja služi kao izmjenjivač za korisnike, pa, kao tipični qiwi ili webmoney račun - kreirajte račun, dodajte karticu itd. Komunicira s našom aplikacijom gateway-a, iako preko REST API-ja u lokalnom području. I tako smo odlučili da povežemo bitcoine i istovremeno unapredimo infrastrukturu, jer... U početku se sve na brzinu postavljalo na virtuelne kutije u kancelariji ispod stola... sajt je počeo da se koristi, a mi smo počeli da brinemo o vremenu rada i performansama.

Dakle, počnimo s glavnom stvari - odabirom servera. Jer posao u našem primjeru je mali i vjerujemo hosteru (OVH) kojeg ćemo izabrati budžetska opcija u kojoj je nemoguće instalirati sistem sa originalne .iso slike, ali nema veze, odeljenje IT bezbednosti će svakako analizirati instaliranu sliku. A kad odrastemo, iznajmit ćemo vlastiti ormar pod ključem s ograničenim fizičkim pristupom, a možda ćemo izgraditi vlastiti DC. U svakom slučaju, vrijedi zapamtiti da prilikom iznajmljivanja hardvera i instaliranja gotovih slika postoji šansa da na vašem sistemu visi “trojanac sa hostera”, koji u većini slučajeva nema namjeru da vas špijunira ali ponuditi pogodnije alate za upravljanje serverom.

Instalacija servera

Ovdje je sve jednostavno. Biramo hardver koji odgovara našim potrebama. Zatim odaberite FreeBSD sliku. Pa, ili se povezujemo (u slučaju drugog hostera i vlastitog hardvera) preko IPMI-a ili sa monitorom i ubacimo .iso FreeBSD sliku u preuzimanje. Za orkestarsku postavu koristim Ansible и mfsbsd. Jedinu stvar, u našem slučaju sa kimsufijem, mi smo odabrali prilagođena instalacija kako bi dva diska u ogledalu imali „otvorene“ samo particije za pokretanje i /home, ostatak prostora na disku će biti šifriran, ali o tome kasnije.

Bitcoin u kavezu?

Instalacija sistema se odvija na standardni način, neću se zadržavati na tome, samo ću napomenuti da prije početka rada vrijedi obratiti pažnju kaljenje opcije koje nudi bsdinstaller na kraju instalacije (ako sami instalirate sistem):

Bitcoin u kavezu?

Postoje dobar materijal na ovu temu, ukratko ću ponoviti.

Također je moguće omogućiti gore navedene parametre na već instaliranom sistemu. Da biste to učinili, trebate urediti datoteku pokretača i omogućiti parametre kernela. *ee je uređivač poput ovog 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 biste trebali biti sigurni da imate instaliranu najnoviju verziju sistema i izvršite sva ažuriranja i nadogradnje. U našem slučaju, na primjer, potrebna je nadogradnja na najnoviju verziju, jer... slike pre instalacije zaostaju za šest meseci do godinu dana. Pa, tu mijenjamo SSH port u nešto drugačije od zadanog, dodajemo autentifikaciju ključem i onemogućujemo autentifikaciju lozinkom.

Zatim konfigurišemo aide, nadgledanje statusa konfiguracijskih datoteka sistema. Možete pročitati više detalja ovdje.

pkg install aide

i uredite naš crontab

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

Uključi revizija sistema

sysrc auditd_enable=YES

# service auditd start

Kako upravljati ovom materijom savršeno je opisano u vodič.

Sada ponovo pokrećemo sistem i nastavljamo sa softverom na serveru. Svaki server je hipervizor za kontejnere ili pune virtuelne mašine. Stoga je važno da procesor podržava VT-x i EPT ako planiramo da koristimo punu virtuelizaciju.

Za upravljanje kontejnerima i virtuelnim mašinama koje koristim cbsd iz olevole, zelim mu jos zdravlja i blagoslova za ovu divnu utility!

Kontejneri? Opet Docker ili šta?

Ali ne. FreeBSD Jails je odličan alat za kontejnerizaciju, ali spomenuti cbsd za orkestriranje ovih kontejnera, koji se nazivaju ćelije.

Kavez je izuzetno efikasno rešenje za izgradnju infrastrukture za različite namene, gde je na kraju potrebna potpuna izolacija pojedinačnih usluga ili procesa. U suštini, to je klon host sistema, ali ne zahteva potpunu virtuelizaciju hardvera. I zahvaljujući tome, resursi se ne troše na „gostujući OS“, već samo na rad koji se obavlja. Kada se ćelije koriste za interne potrebe, ovo je vrlo zgodno rješenje za optimalno korištenje resursa - gomila ćelija na jednom hardverskom serveru može svaka pojedinačno koristiti cijeli resurs servera ako je potrebno. S obzirom na to da su obično različite podusluge potrebne dodatne. resurse u različito vrijeme, možete izvući maksimalne performanse sa jednog servera ako pravilno planirate i balansirate ćelije između servera. Ako je potrebno, ćelijama se također mogu dati ograničenja na korišteni resurs.

Bitcoin u kavezu?

Šta je sa potpunom virtuelizacijom?

Koliko znam cbsd podržava rad bhyve i XEN hipervizori. Drugi nikad nisam koristio, ali prvi je relativno nov hipervizor iz FreeBSD-a. Pogledat ćemo primjer upotrebe bhyve u primjeru ispod.

Instalacija i konfiguracija okruženja domaćina

Koristimo FS ZFS. Ovo je izuzetno moćan alat za upravljanje serverskim prostorom. Zahvaljujući ZFS-u, možete direktno graditi nizove raznih konfiguracija sa diskova, dinamički „vruće“ proširivati ​​prostor, mijenjati mrtve diskove, upravljati snimcima i još mnogo, mnogo više, što se može opisati u čitavom nizu članaka. Vratimo se našem serveru i njegovim diskovima. Na početku instalacije ostavili smo slobodan prostor na diskovima za šifrirane particije. Žašto je to? Ovo je tako da se sistem automatski budi i sluša preko SSH-a.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

dodajte particiju diska u preostali prostor

geli init /dev/ada0p4

unesite našu šifru za šifriranje

geli attach /dev/ada0p4

Ponovo unosimo lozinku i imamo uređaj /dev/ada0p4.eli - ovo je naš šifrirani prostor. Zatim ponavljamo isto za /dev/ada1 i ostale diskove u nizu. I kreiramo novu ZFS bazen.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - Pa, mi imamo spreman minimalni borbeni komplet. Zrcaljeni niz diskova u slučaju da jedan od tri pokvari.

Kreiranje skupa podataka na novom "pulu"

zfs create vms/jails

pkg install cbsd — pokrenuli smo tim i postavili menadžment za naše ćelije.

Nakon cbsd instaliran, potrebno ga je inicijalizirati:

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

Pa, odgovaramo na gomilu pitanja, uglavnom sa standardnim odgovorima.

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

**Također ne koristim NAT iz cbsd, i sam ga konfiguriram 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 for jails
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC

## Bitcoin network port forward
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 pravila zaštitnog zida je također posebna tema, tako da neću ulaziti duboko u postavljanje BLOCK ALL politike i postavljanje bijelih lista, to možete učiniti čitanjem službena dokumentacija ili bilo koji od ogromnog broja članaka dostupnih na Googleu.

Pa... imamo instaliran cbsd, vrijeme je da kreiramo našeg prvog radnog konja - Bitcoin demona u kavezu!

cbsd jconstruct-tui

Bitcoin u kavezu?

Ovdje vidimo dijalog za kreiranje ćelije. Nakon što su sve vrijednosti postavljene, krenimo!

Kada kreirate svoju prvu ćeliju, trebali biste odabrati šta ćete koristiti kao osnovu za ćelije. Odaberem distribuciju iz FreeBSD spremišta pomoću naredbe repo. Ovaj izbor se vrši samo prilikom kreiranja prve ćelije određene verzije (možete ugostiti ćelije bilo koje verzije koja je starija od verzije hosta).

Nakon što je sve postavljeno, pokrećemo kavez!

# cbsd jstart bitcoind

Ali moramo instalirati softver u kavez.

# jls

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

jexec bitcoind da uđete u ćelijsku konzolu

i već unutar ćelije instaliramo softver sa 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

U kavezu je Bitcoin, ali nam je potrebna anonimnost jer želimo da se povežemo sa nekim kavezima preko TOP mreže. Općenito, planiramo pokrenuti većinu ćelija sa sumnjivim softverom samo preko proxyja. Hvala za pf Možete onemogućiti NAT za određeni raspon IP adresa na lokalnoj mreži i dozvoliti NAT samo za naš TOR čvor. Dakle, čak i ako zlonamjerni softver uđe u ćeliju, on najvjerovatnije neće komunicirati sa vanjskim svijetom, a ako i dođe, neće otkriti IP našeg servera. Stoga kreiramo još jednu ćeliju za „prosleđivanje“ usluga kao „.onion“ servis i kao proxy za pristup Internetu pojedinačnim ćelijama.

# 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

Postavite za slušanje na lokalnoj adresi (dostupno za sve ćelije)

SOCKSPort 192.168.0.2:9050

Šta nam je još potrebno za potpunu sreću? Da, potrebna nam je usluga za naš web, možda više od jedne. Pokrenimo nginx, koji će djelovati kao reverse-proxy i brinuti se za obnavljanje Let's Encrypt certifikata

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

I tako smo stavili 150 MB zavisnosti u kavez. A domaćin je i dalje čist.

Vratimo se kasnije na podešavanje nginxa, potrebno je da podignemo još dvije ćelije za naš gateway za plaćanje na nodejs i rust i web aplikaciju koja je iz nekog razloga u Apache i PHP-u, a za ovu drugu je potrebna i 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 izoliranih paketa

Zatim preuzimamo našu aplikaciju sa git-om i pokrećemo je.

# 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 programeru pristup preko SSH-a direktno u ćeliju, oni će tamo sve raditi sami:

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

Port 2267 — promijenite SSH port ćelije na bilo koji proizvoljan

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

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

Pa, servis radi, ostaje samo dodati pravilo pf firewall

Hajde da vidimo kakav IP imaju naše ćelije i kako generalno izgleda naša "lokalna oblast".

# 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 dodajte 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, pošto smo tu, dodajmo i 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

Pa, sada malo o bitcoinima

Ono što imamo je da imamo web aplikaciju koja je eksterno izložena i lokalno razgovara sa našim pristupom za plaćanje. Sada treba da pripremimo radno okruženje za interakciju sa samom Bitcoin mrežom – čvorom bitcoind to je samo demon koji održava lokalnu kopiju blockchaina ažurnom. Ovaj demon ima funkciju RPC-a i novčanika, ali postoje zgodniji "omoti" za razvoj aplikacija. Za početak smo odlučili staviti electrum je CLI novčanik. Ovaj novčanik koristit ćemo ga kao “hladno skladište” za naše bitcoine – općenito, one bitcoine koji će morati biti pohranjeni “izvan” sistema dostupnih korisnicima i općenito daleko od svih. Takođe ima GUI, tako da ćemo koristiti isti novčanik na našem
laptopovi. Za sada ćemo koristiti Electrum sa javnim serverima, a kasnije ćemo ga podići u drugoj ćeliji ElectrumXda uopšte ne zavisi ni od koga.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

još 700 MB softvera u našem kavezu

electrum:/@[8:53] # adduser

Username: wallet
Full name: 
Uid (Leave empty for default): 
Login group [wallet]: 
Login group is wallet. Invite wallet into other groups? []: 
Login class [default]: 
Shell (sh csh tcsh nologin) [sh]: tcsh
Home directory [/home/wallet]: 
Home directory permissions (Leave empty for default): 
Use password-based authentication? [yes]: no
Lock out the account after creation? [no]: 
Username   : wallet
Password   : <disabled>
Full Name  : 
Uid        : 1001
Class      : 
Groups     : wallet 
Home       : /home/wallet
Home Mode  : 
Shell      : /bin/tcsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (wallet) to the user database.
Add another user? (yes/no): no
Goodbye!
electrum:/@[8:53] # su wallet

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

wallet@electrum:/ % electrum-3.6 create

{
    "msg": "Please keep your seed in a safe place; if you lose it, you will not be able to restore your wallet.",
    "path": "/usr/home/wallet/.electrum/wallets/default_wallet",
    "seed": "jealous win pig material ribbon young punch visual okay cactus random bird"
}

Sada imamo kreiran novčanik.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

Za naše na lancu Samo ograničen broj ljudi će od sada moći da se poveže na novčanik. Kako se ne bi otvorio pristup ovoj ćeliji izvana, veze preko SSH-a će se odvijati preko TOP-a (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 isključimo ćeliju s pristupom Internetu novčanika. Hajde da mu damo IP adresu iz drugog podmrežnog prostora koji nije NAT. Prvo da se promijenimo /etc/pf.conf na domaćinu

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" promenimo to u JAIL_IP_POOL="192.168.0.0/25", tako da sve adrese 192.168.0.126-255 neće imati direktan pristup Internetu. Neka vrsta softverske mreže “air-gap”. I NAT pravilo ostaje kao što je bilo

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

Preopterećenje pravila

# pfctl -f /etc/pf.conf

Hajdemo sada na našu ćeliju

# cbsd jconfig jname=electrum

Bitcoin u kavezu?

Bitcoin u kavezu?

jset mode=quiet jname=electrum ip4_addr="192.168.0.200"
Remove old IP: /sbin/ifconfig em0 inet 192.168.0.6 -alias
Setup new IP: /sbin/ifconfig em0 inet 192.168.0.200 alias
ip4_addr: 192.168.0.200

Hm, ali sada će sam sistem prestati raditi za nas. Međutim, možemo odrediti sistemski proxy. Ali postoji jedna stvar, na TOR-u je to SOCKS5 proxy, a radi pogodnosti bismo također željeli 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

Pa, sada u našem sistemu postoje dva proxy servera i oba izlaze preko TOR-a: socks5://192.168.0.2:9050 i http://192.168.0.6:8123

Sada možemo konfigurirati naše okruženje 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

Pa, sada će shell raditi ispod proxyja. Ako želimo da instaliramo pakete, onda treba da ih dodamo /usr/local/etc/pkg.conf ispod korena kaveza

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

Pa, sada je vrijeme da dodate skrivenu uslugu TOR kao adresu naše SSH usluge u ćeliju 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

Ovo je naša adresa veze. Provjerimo sa lokalne mašine. Ali prvo moramo dodati naš SSH ključ:

wallet@electrum:/ % mkdir ~/.ssh

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

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

Pa, sa Linux klijentske mašine

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

Hajde da se povežemo (Da bi ovo funkcioniralo, potreban vam je lokalni TOR demon koji sluša 9050)

user@local ~$ ssh remotebtc

The authenticity of host 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion' (ECDSA) to the list of known hosts.
FreeBSD 12.1-RELEASE-p1 GENERIC 
To save disk space in your home directory, compress files you rarely
use with "gzip filename".
        -- Dru <[email protected]>
wallet@electrum:~ % logout

Uspeh!

Za rad sa trenutnim i mikro-plaćanjima, potreban nam je i čvor Mreža munje, u stvari, ovo će biti naš glavni radni alat sa Bitcoinom. U*c-lightningkoji ćemo koristiti kao demon Sparko plugin, koji je punopravni HTTP (REST) ​​sučelje i omogućava vam da radite sa transakcijama izvan lanca i na lancu. c-lightning potrebno za funkcionisanje bitcoind ali da.

*Postoje različite implementacije Lightning Network protokola na različitim jezicima. Od onih koje smo testirali, c-lightning (napisan u C) se činio najstabilnijim i najefikasnijim

# cbsd jsconstruct-tui

# cbsd jstart cln

# jexec cln

lightning:/@[10:23] # adduser

Username: 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 je sve potrebno kompajlirano i instalirano, napravimo RPC korisnika za lightningd в bitcoind

# jexec bitcoind

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

rpcbind=192.168.0.1
rpcuser=test
rpcpassword=test
#allow only c-lightning
rpcallowip=192.168.0.7/32

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

Moje haotično prebacivanje između ćelija se ispostavilo da nije tako haotično ako zapazite uslužni program tmux, koji vam omogućava da kreirate više terminalskih podsesija unutar jedne sesije. analogno: screen

Bitcoin u kavezu?

Dakle, ne želimo da otkrivamo stvarnu IP adresu našeg čvora, i želimo da sve finansijske transakcije obavljamo preko TOP-a. Dakle, još jedan luk nije potreban.

# 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 napravimo 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-tls

#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
# for the example above the initialization logs (mixed with lightningd logs) should print something like

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 morate kreirati konfiguracijsku datoteku za bitcoin-cli, uslužni program koji komunicira s njim bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

ček

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

[
  "test"
]

lansiranje lightningd

lightning@lightning:~ % lightningd --daemon

Sam lightningd možete kontrolisati uslužni program lightning-cli, na primjer:

lightning-cli newaddr dobiti adresu za novu dolaznu uplatu

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all pošaljite sav novac u novčaniku na adresu (sve adrese na lancu)

Također komande za vanlančane operacije lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay itd.

Pa, za komunikaciju sa aplikacijom imamo REST Api

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

Hajde da sumiramo rezultate

# 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
     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 skup kontejnera, svaki sa svojim nivoom pristupa i sa i na lokalnu mrežu.

# zfs list

NAME                    USED  AVAIL  REFER  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 vidite, bitcoind zauzima svih 190 GB prostora. Šta ako nam treba još jedan čvor za testiranje? Ovdje ZFS dobro dolazi. Uz pomoć cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com možete kreirati snimak i priložiti novu ćeliju ovom snimku. Nova ćelija će imati svoj prostor, ali će samo razlika između trenutnog stanja i originala biti uzeta u obzir u sistemu datoteka (uštedićemo najmanje 190 GB)

Svaka ćelija je zaseban ZFS skup podataka, i to je izuzetno zgodno. ZFS takođe dozvoljava radite razne druge cool stvari, poput slanja snimaka putem SSH-a. Nećemo to opisivati, već ima mnogo toga.

Također je vrijedno napomenuti potrebu za daljinskim nadzorom hosta, za ove namjene imamo Zabbix.

B - sigurnost

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

Povjerljivost - Standardni alati sistema sličnih UNIX-u osiguravaju implementaciju ovog principa. Logički razdvajamo pristup svakom logički odvojenom elementu sistema - ćeliji. Pristup je omogućen standardnom autentifikacijom korisnika pomoću ličnih ključeva korisnika. Sva komunikacija između i do krajnjih ćelija odvija se u šifriranom obliku. Zahvaljujući šifriranju diska, ne moramo brinuti o sigurnosti podataka prilikom zamjene diska ili migracije na drugi server. Jedini kritičan pristup je pristup host sistemu, pošto takav pristup generalno obezbeđuje pristup podacima unutar kontejnera.

Integritet “Primjena ovog principa se odvija na nekoliko različitih nivoa. Prvo, važno je napomenuti da se u slučaju serverskog hardvera, ECC memorije, ZFS već „iz kutije“ brine o integritetu podataka na nivou informacionih bitova. Trenutni snimci vam omogućavaju da napravite sigurnosne kopije u bilo kojem trenutku u hodu. Pogodni alati za izvoz/uvoz ćelija čine replikaciju ćelije jednostavnom.

Dostupnost - Ovo je već opciono. Zavisi od stepena tvoje slave i činjenice da imaš hejtere. U našem primjeru osigurali smo da je novčanik dostupan isključivo sa TOP mreže. Ako je potrebno, možete blokirati sve na firewall-u i dozvoliti pristup serveru isključivo kroz tunele (TOR ili VPN su druga stvar). Tako će server biti što je moguće više odsječen od vanjskog svijeta i samo mi sami ćemo moći utjecati na njegovu dostupnost.

Nemogućnost odbijanja - A to zavisi od daljeg rada i poštivanja ispravnih politika za korisnička prava, pristup itd. Ali uz pravi pristup, sve radnje korisnika se revidiraju, a zahvaljujući kriptografskim rješenjima moguće je nedvosmisleno identificirati ko je i kada izvršio određene radnje.

Naravno, opisana konfiguracija nije apsolutni primjer kako bi uvijek trebala biti, to je prije jedan primjer kako može biti, uz zadržavanje vrlo fleksibilnih mogućnosti skaliranja i prilagođavanja.

Šta je sa potpunom virtuelizacijom?

O potpunoj virtuelizaciji koristeći cbsd možete read here. To ću dodati samo za posao bhyve Morate omogućiti neke opcije kernela.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Dakle, ako iznenada trebate pokrenuti docker, onda instalirajte neki debian i krenite!

Bitcoin u kavezu?

To je sve

Valjda je to sve što sam htio podijeliti. Ako vam se svidio članak, možete mi poslati neke bitcoine - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Ako želite isprobati ćelije u akciji i imati malo bitcoina, možete otići na moj pet-projekat.

izvor: www.habr.com