Bitcoin u kavezu?

Tako se dogodilo da sam po struci administrator računalnih sustava i mreža (ukratko: sistemski administrator), a imao sam priliku nešto više od 10 godina reći prof. aktivnosti širokog spektra sustava, uključujući one koji zahtijevaju [ekstremne] sigurnosne mjere. Dogodilo se i da mi je prije nekog vremena bilo zanimljivo bitcoin, i ne samo da ga je koristio, već je pokrenuo i nekoliko mikro servisa kako bi naučio kako samostalno raditi s Bitcoin mrežom (ipak p2p) sa stajališta programera (ja sam naravno jedan od tih dev, dakle, bio sam u prolazu). Ali ne govorim o razvoju, govorim o sigurnom i učinkovitom okruženju za aplikacije.

Financijska tehnologija (fintech) prijeđite na informacijsku sigurnost (infosec) i prvi može raditi bez drugog, ali ne dugo. Zato želim podijeliti svoje iskustvo i skup alata koje koristim, a koji uključuje oboje fintechI infosec, a ujedno, a može se koristiti i za širu ili sasvim drugu svrhu. U ovom članku neću govoriti toliko o Bitcoinu, koliko o modelu infrastrukture za razvoj i rad financijskih (i ne samo) usluga - jednom riječju, onih usluga kojima je "B" važno. To se odnosi i na razmjenu Bitcoina i na najtipičniji korporativni zoološki vrt usluga male tvrtke koja ni na koji način nije povezana s Bitcoinom.

Napominjem da sam pristalica načela "neka bude jednostavno" и "manje je više", stoga će i članak i ono što je u njemu opisano imati svojstva o kojima govore ova načela.

Imaginarni scenarij: Pogledajmo sve na primjeru izmjenjivača bitcoina. Odlučili smo pokrenuti razmjenu rublja, dolara, eura za bitcoine i natrag i već imamo radno rješenje, ali za drugi digitalni novac poput qiwi i webmoney, tj. Riješili smo sva pravna pitanja, imamo gotovu aplikaciju koja služi kao pristupnik za plaćanje za rublje, dolare i eure i druge sustave plaćanja. Povezan je s našim bankovnim računima i ima neku vrstu API-ja za naše krajnje aplikacije. Također imamo web aplikaciju koja djeluje kao izmjenjivač za korisnike, pa, kao tipični qiwi ili webmoney račun - kreirajte račun, dodajte karticu i tako dalje. Komunicira s našom aplikacijom pristupnika, iako putem REST API-ja u lokalnom području. I tako smo odlučili povezati bitcoine i ujedno unaprijediti infrastrukturu, jer... U početku je sve bilo na brzinu postavljeno na virtualne kutije u uredu ispod stola... stranica se počela koristiti, a mi smo počeli brinuti o neprekidnom radu i performansama.

Dakle, počnimo s glavnom stvari - odabirom poslužitelja. Jer posao u našem primjeru je mali i vjerujemo hosteru (OVH) kojeg ćemo izabrati proračunska opcija u kojima je nemoguće instalirati sustav s originalne .iso slike, ali nema veze, odjel IT sigurnosti ć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 kod iznajmljivanja hardvera i instaliranja gotovih slika postoji šansa da vam na sustavu visi “trojanac s hostera” koji u većini slučajeva nije namijenjen špijuniranju već ponuditi prikladnije alate za upravljanje poslužiteljem.

Instalacija poslužitelja

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) putem IPMI-ja ili s monitorom i stavljamo .iso FreeBSD sliku u preuzimanje. Za orkestralni postav koji koristim Ansible и mfsbsd. Jedinu stvar, u našem slučaju s kimsufijem, mi smo odabrali Prilagođena instalacija kako bi dva diska u zrcalu imala “otvorene” samo boot i /home particije, ostatak diskovnog prostora će biti šifriran, ali o tome kasnije.

Bitcoin u kavezu?

Instalacija sustava odvija se na standardan način, neću se zadržavati na ovome, samo ću primijetiti da prije početka rada vrijedi obratiti pozornost na kaljenje opcije koje nudi bsdinstaller na kraju instalacije (ako sami instalirate sustav):

Bitcoin u kavezu?

Tu je dobar materijal o ovoj temi, ovdje ću ukratko ponoviti.

Također je moguće omogućiti gore navedene parametre na već instaliranom sustavu. Da biste to učinili, morate urediti datoteku pokretačkog programa i omogućiti parametre kernela. *ee je ovakav 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 biste trebali provjeriti imate li instaliranu najnoviju verziju sustava i izvršiti sva ažuriranja i nadogradnje. U našem slučaju, na primjer, potrebna je nadogradnja na najnoviju verziju, jer... slike prije instalacije zaostaju šest mjeseci do godinu dana. Pa, tu mijenjamo SSH port u nešto što se razlikuje od zadanog, dodajemo autentifikaciju ključem i onemogućujemo autentifikaciju lozinkom.

Zatim konfiguriramo aide, praćenje statusa konfiguracijskih datoteka sustava. Detaljnije možete pročitati 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 sustava

sysrc auditd_enable=YES

# service auditd start

Kako upravljati ovim pitanjem savršeno je opisano u rukovodstvo.

Sada se ponovno pokrećemo i prelazimo na softver na poslužitelju. Svaki poslužitelj je hipervizor za spremnike ili pune virtualne strojeve. Stoga je važno da procesor podržava VT-x i EPT ako planiramo koristiti punu virtualizaciju.

Za upravljanje spremnicima i virtualnim strojevima koje koristim cbsd iz maslinovo ulje, želim mu više zdravlja i blagoslova za ovaj prekrasan alat!

Kontejneri? Opet doker ili što?

Ali ne. FreeBSD zatvori izvrstan je alat za kontejnerizaciju, ali spomenuti cbsd za orkestriranje ovih spremnika, koji se nazivaju stanice.

Kavez je iznimno učinkovito rješenje za izgradnju infrastrukture za razne namjene, gdje je u konačnici potrebna potpuna izolacija pojedinih usluga ili procesa. U biti, to je klon host sustava, ali ne zahtijeva punu hardversku virtualizaciju. I zahvaljujući tome, resursi se ne troše na "gostujući OS", već samo na posao koji se obavlja. Kada se ćelije koriste za interne potrebe, ovo je vrlo zgodno rješenje za optimalno korištenje resursa - hrpa ćelija na jednom hardverskom poslužitelju može svaka pojedinačno koristiti cijeli resurs poslužitelja ako je potrebno. S obzirom da obično različite podusluge trebaju dodatne. resursa u različito vrijeme, možete izvući maksimalnu izvedbu iz jednog poslužitelja ako ispravno planirate i uravnotežite ćelije između poslužitelja. Ako je potrebno, ćelijama se također mogu dati ograničenja u korištenim resursima.

Bitcoin u kavezu?

Što je s potpunom virtualizacijom?

Koliko ja znam cbsd podupire rad bhyve i XEN hipervizori. Drugi nisam nikad koristio, ali prvi je relativno nov hipervizor iz FreeBSD-a. Pogledat ćemo primjer korištenja bhyve u donjem primjeru.

Instaliranje i konfiguriranje host okruženja

Koristimo FS ZFS. Ovo je iznimno moćan alat za upravljanje prostorom na poslužitelju. Zahvaljujući ZFS-u, možete izravno graditi nizove različitih konfiguracija s diskova, dinamički “vruće” širiti prostor, mijenjati mrtve diskove, upravljati snimkama i još mnogo, mnogo više, što se može opisati u cijelom nizu članaka. Vratimo se našem poslužitelju i njegovim diskovima. Na početku instalacije ostavili smo slobodan prostor na diskovima za kriptirane particije. Zašto je to? To je tako da se sustav automatski budi i sluša putem SSH-a.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

dodajte particiju diska na preostali prostor

geli init /dev/ada0p4

unesite našu lozinku za šifriranje

geli attach /dev/ada0p4

Ponovno unosimo lozinku i imamo uređaj /dev/ada0p4.eli - ovo je naš šifrirani prostor. Zatim ponavljamo isto za /dev/ada1 i ostatak diskova u nizu. I stvaramo novi ZFS bazen.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - Pa imamo spreman minimalni borbeni pribor. Zrcaljeni niz diskova u slučaju kvara jednog od tri.

Stvaranje skupa podataka na novom "poolu"

zfs create vms/jails

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

Nakon cbsd instaliran, treba ga inicijalizirati:

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

Pa, odgovaramo na hrpu pitanja, uglavnom sa zadanim odgovorima.

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

**Također ne koristim NAT iz cbsd, i sam ga konfiguriram 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 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 vatrozida također je posebna tema, stoga neću ulaziti duboko u postavljanje pravila BLOKIRAJ SVE i postavljanje popisa dopuštenih, 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 stvorimo našu prvu radnu snagu - Bitcoin demona u kavezu!

cbsd jconstruct-tui

Bitcoin u kavezu?

Ovdje vidimo dijalog za stvaranje ćelije. Nakon što su postavljene sve vrijednosti, idemo stvarati!

Kada stvarate svoju prvu ćeliju, trebali biste odabrati što ćete koristiti kao bazu za ćelije. Odaberem distribuciju iz FreeBSD repozitorija pomoću naredbe repo. Ovaj izbor se vrši samo kada se stvara prva ćelija određene verzije (možete ugostiti ćelije bilo koje verzije koja je starija od verzije glavnog računala).

Nakon što je sve instalirano, lansiramo 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đu u konzolu ćelije

i već unutar ćelije instaliramo softver s njegovim ovisnostima (naš host sustav 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 treba nam anonimnost jer se želimo spojiti na neke kaveze preko TOP mreže. Općenito, većinu ćelija sa sumnjivim softverom planiramo pokretati samo putem proxyja. Zahvaljujući pf Možete onemogućiti NAT za određeni raspon IP adresa na lokalnoj mreži i dopustiti NAT samo za naš TOR čvor. Dakle, čak i ako zlonamjerni softver uđe u ćeliju, najvjerojatnije neće komunicirati s vanjskim svijetom, a ako i uđe, neće otkriti IP našeg poslužitelja. Stoga stvaramo drugu ćeliju za "prosljeđivanje" usluga kao ".onion" uslugu 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 slušanje na lokalnoj adresi (dostupno za sve ćelije)

SOCKSPort 192.168.0.2:9050

Što nam još treba za potpunu sreću? Da, trebamo uslugu za naš web, možda više od jedne. Pokrenimo nginx, koji će djelovati kao obrnuti proxy i pobrinuti 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 ovisnosti u kavez. A domaćin je i dalje čist.

Vratimo se kasnije na postavljanje nginxa, moramo podići još dvije ćelije za naš payment gateway na nodejs i rust te web aplikaciju, koja je iz nekog razloga u Apacheu i PHP-u, a za potonji također treba 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 pomoću gita 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

Paketi od 450 MB. u kavezu.

ovdje razvojnom programeru dajemo pristup putem SSH-a izravno ćeliji, oni će tamo sve učiniti sami:

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

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

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

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

Pa, usluga radi, preostaje samo dodati pravilo pf vatrozid

Pogledajmo koji IP imaju naše ćelije i kako općenito izgleda naše "lokalno područje".

# 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, kad smo već ovdje, dodajmo i pravilo za obrnuti 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

E, sad malo o bitcoinima

Ono što imamo jest da imamo web aplikaciju koja je eksterno izložena i komunicira lokalno s našim pristupnikom plaćanja. Sada moramo pripremiti 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 RPC i funkciju novčanika, ali postoje prikladniji "omotači" 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 trebati biti pohranjeni "izvan" sustava dostupnog korisnicima i općenito daleko od svih. Također ima GUI, tako da ćemo koristiti isti novčanik na našem
prijenosna računala. Za sada ćemo koristiti Electrum s javnim poslužiteljima, a kasnije ćemo ga podići u drugu ćeliju ElectrumXkako ne bi uopće ovisio ni o kome.

# 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

Našim na lancu Od sada će se samo ograničeni broj ljudi moći spojiti na novčanik. Kako ne bi otvorili pristup ovoj ćeliji izvana, veze putem SSH-a odvijat će se putem 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 internetskim pristupom novčanika. Dajmo mu IP adresu iz drugog podmrežnog prostora koji nije NAT-ovan. Prvo da se presvučemo /etc/pf.conf na domaćinu

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" promijenimo to u JAIL_IP_POOL="192.168.0.0/25", stoga sve adrese 192.168.0.126-255 neće imati izravan pristup Internetu. Neka vrsta softverske “zračne” mreže. I NAT pravilo ostaje kao što je bilo

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

Preopterećenje pravilima

# pfctl -f /etc/pf.conf

Sada uzmimo 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

Hmm, ali sad će nam sam sustav prestati raditi. Međutim, možemo navesti proxy sustava. Ali ima jedna stvar, na TOR-u je to SOCKS5 proxy, a zbog praktičnosti bismo željeli 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

Pa, sada postoje dva proxy poslužitelja u našem sustavu, i oba izlaze putem 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 ljuska raditi ispod proxyja. Ako želimo instalirati pakete, onda bismo trebali dodati /usr/local/etc/pkg.conf ispod korijena kaveza

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

Pa, sada je vrijeme da dodate TOR skrivenu uslugu 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 za vezu. Provjerimo s lokalnog stroja. 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, s Linux klijentskog stroja

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

Povežimo se (Da bi ovo radilo, 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

Uspjeh!

Za rad s instant i mikro-plaćanjima također nam je potreban čvor Mreža munje, zapravo, ovo će biti naš glavni radni alat s Bitcoinom. U*c-munjakojeg ćemo koristiti kao demona Sparko dodatak, koje je punopravno HTTP (REST) ​​sučelje i omogućuje vam rad s transakcijama izvan lanca i on-lanca. c-lightning potrebna za funkcioniranje bitcoind ali da.

*Postoje različite implementacije protokola Lightning Network na različitim jezicima. Od onih koje smo testirali, čini se da je c-lightning (napisano u C-u) najstabilniji i resursno učinkovitiji

# 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, kreirajmo 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

Ispada da moje kaotično prebacivanje između ćelija nije tako kaotično ako primijetite korisnost tmux, koji vam omogućuje stvaranje više podsesija terminala unutar jedne sesije. Analogno: screen

Bitcoin u kavezu?

Dakle, ne želimo otkriti pravi IP našeg čvora, a sve financijske transakcije želimo provoditi preko TOP-a. Stoga, drugi .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

Kreirajmo sada 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 trebate izraditi konfiguracijsku datoteku za bitcoin-cli, uslužni program koji komunicira s bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

provjeravanje

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

[
  "test"
]

lansirati lightningd

lightning@lightning:~ % lightningd --daemon

sam lightningd možete kontrolirati uslužni program lightning-cli, na primjer:

lightning-cli newaddr dobiti adresu za novu pristiglu uplatu

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

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

Također naredbe za operacije izvan lanca lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay i tako dalje

Pa, 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'

Sumirati

# 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 spremnika, svaki sa svojom vlastitom razinom pristupa iz lokalne mreže i prema njoj.

# 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, bitcoin zauzima svih 190 GB prostora. Što ako trebamo 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 stvoriti snimku i priložiti novu ćeliju ovoj snimci. Nova ćelija će imati svoj prostor, ali će se u datotečnom sustavu uzeti u obzir samo razlika između trenutnog stanja i originala (uštedjet ćemo najmanje 190 GB)

Svaka ćelija je zaseban ZFS skup podataka, a to je izuzetno zgodno. ZFS također dopušta raditi razne druge cool stvari, poput slanja snimaka putem SSH-a. Nećemo to opisivati, već ima puno.

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

B - sigurnost

Što se tiče sigurnosti, pođimo od ključnih načela u kontekstu infrastrukture:

Povjerljivost - Standardni alati UNIX-sličnih sustava osiguravaju implementaciju ovog principa. Logički odvajamo pristup svakom logički zasebnom elementu sustava - ćeliji. Pristup je omogućen standardnom autentifikacijom korisnika korištenjem osobnih ključeva korisnika. Sva komunikacija između i do krajnjih stanica odvija se u šifriranom obliku. Zahvaljujući enkripciji diska, ne moramo brinuti o sigurnosti podataka prilikom zamjene diska ili migracije na drugi poslužitelj. Jedini kritični pristup je pristup glavnom sustavu, budući da takav pristup općenito omogućuje pristup podacima unutar spremnika.

integritet “Provedba ovog načela odvija se na nekoliko različitih razina. Prvo, važno je napomenuti da u slučaju serverskog hardvera, ECC memorije, ZFS već “out of the box” brine o integritetu podataka na razini informacijskih bitova. Trenutačne snimke omogućuju vam izradu sigurnosnih kopija u bilo kojem trenutku u hodu. Prikladni alati za izvoz/uvoz stanica čine replikaciju stanica jednostavnom.

dostupnost - Ovo je već izborno. Ovisi o stupnju vaše slave i činjenici da imate hejtere. U našem smo primjeru osigurali da novčanik bude dostupan isključivo s TOP mreže. Po potrebi možete blokirati sve na firewallu i omogućiti pristup serveru isključivo kroz tunele (TOR ili VPN je druga stvar). Tako će poslužitelj biti maksimalno odsječen od vanjskog svijeta, a samo ćemo mi sami moći utjecati na njegovu dostupnost.

Nemogućnost odbijanja - A to ovisi o daljnjem radu i usklađenosti s ispravnim politikama za korisnička prava, pristup itd. No uz pravilan pristup, sve radnje korisnika se revidiraju, a zahvaljujući kriptografskim rješenjima moguće je nedvosmisleno identificirati tko je i kada izvršio određene radnje.

Naravno, opisana konfiguracija nije apsolutni primjer kako bi uvijek trebala biti, prije je jedan primjer kako može biti, a da pritom zadrži vrlo fleksibilne mogućnosti skaliranja i prilagodbe.

Što je s potpunom virtualizacijom?

O potpunoj virtualizaciji pomoću cbsd-a možete pročitajte ovdje. Samo ću to dodati 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"
...

Pa ako iznenada trebate pokrenuti docker, onda instalirajte neki debian i samo naprijed!

Bitcoin u kavezu?

To je sve

Pretpostavljam da je to sve što sam htio podijeliti. Ako vam se svidio članak, možete mi poslati nešto bitcoina - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Ako želite isprobati ćelije u akciji i imati nešto bitcoina, možete otići na moj ljubimac-projekt.

Izvor: www.habr.com