Bitcoin v kletki?

Zgodilo se je, da sem po poklicu administrator računalniških sistemov in omrežij (na kratko: sysadmin) in imam več kot 10 let poklicnih izkušenj z različnimi sistemi, vključno tistimi, ki zahtevajo [po|za]višene ukrepe varnosti. Poleg tega sem pred časom odkril zanimanje za bitcoin, in ne samo, da sem ga uporabljal, temveč sem zagnal tudi nekaj mikroservisov, da bi se naučil samostojno delati z bitcoin omrežjem (to je p2p, kot da) z vidika razvijalca (seveda sem le tak, ki sem mimo šel). Ampak ne govorim o razvoju, govorim o varnem in učinkovitom okolju za aplikacije. devFinančne tehnologije (

fintech) gredo z roko v roki z informacijsko varnostjo (infosec) in prve brez druge ne morejo delovati dolgo. Zato želim deliti svoje izkušnje in niz orodij, ki jih uporabljam, kar vključuje, in to hkrati, lahko pa se uporabljajo tudi v širši ali povsem drugačni namen. V tem članku ne bom govoril toliko o bitcoinu, ampak o infrastrukturnem modelu za razvoj in delovanje finančnih (in ne samo) storitev - v dveh besedah, tistih storitev, kjer ima 'B' pomene. To je uporabno tako za bitcoin borzo kot za klasičen korporativni zoo storitev majhnega podjetja, ki ni povezan z bitcoini. ) gredo z roko v roki z informacijsko varnostjo (, kot tudi ) in prve brez druge ne morejo delovati dolgo. Zato želim deliti svoje izkušnje in niz orodij, ki jih uporabljam, kar vključujeŽelim poudariti, da sem zagovornik načel

„keep it stupid simple“ „less is more“ in , zato bo članek in to, kar je v njem opisano, imelo lastnosti, o katerih govorijo ta načela.Domnevni scenarij:

Imaginaren scenarij: Poglejmo si primer z menjavo bitcoinov. Odločili smo se za zagon menjave rubljev, dolarjev in evrov za bitcoine in obratno, ter že imamo delujočo rešitev, vendar za druge digitalne valute, kot sta Qiwi in WebMoney, t.j. vse pravne zadeve so rešene. Imamo pripravljeno aplikacijo, ki deluje kot plačilni prehod za rublje, dolarje in evre ter druge plačilne sisteme. Povezana je z našimi bančnimi računi in ima določeno API za naše končne aplikacije. Prav tako imamo spletno aplikacijo, ki deluje kot menjalnica za uporabnike, podobno tipičnemu kabinetu Qiwi ali WebMoney — ustvarite račun, dodajte kartico in tako naprej. Komunicira z našo aplikacijo-prehodom, verjetno prek REST API v lokalnem omrežju. Odločili smo se, da vključimo bitcoine in hkrati nadgradimo infrastrukturo, saj je bilo vse sprva hitro vzpostavljeno na VirtualBoxih pod mizo v pisarni... spletno mesto se uporablja, mi pa smo postali zaskrbljeni glede uptime in zmogljivosti.

Torej, začnimo z osnovami — izbira strežnika. Ker je posel v našem primeru majhen in zaupamo gostitelju (OVH), izberemo proračunsko možnost , pri kateri ni mogoče namestiti sistema iz originalne slike .iso, vendar to ni težava, oddelek za IT varnost bo zagotovo opravil analizo nameščene slike. Ko bomo zrasli, lahko najetek svoj zaklenjen prostor in omejen fizični dostop, morda pa tudi zgradimo svoj podatkovni center. V vsakem primeru se je treba zavedati, da pri najemu strojne opreme in nameščanju prednastavljenih slik obstaja možnost, da imate v sistemu „trojanca od gostitelja“, ki je v večini primerov namenjen ne za nadzor nad vami, temveč za to, da ponudi bolj priročna orodja za upravljanje strežnika.

Namestitev strežnika

Tu je vse preprosto. Izberemo strojno opremo, ki ustreza našim potrebam. Nato izberemo sliko FreeBSD. Ali pa se povežemo (v primeru drugega gostitelja in lastne strojne opreme) preko IPMI ali s monitorjem in naložimo sliko .iso FreeBSD. Za orkestracijo namestitve uporabljam Ansible in mfsbsd. Edina izjema je, da smo v našem primeru s Kimsufi izbrali prilagojeno namestitev , da bi imela dva diska v zrcalu „odprti” le sistemski in /home particiji, preostali prostor diska pa bo šifriran, vendar o tem pozneje.

Bitcoin v kletki?

Namestitev sistema poteka na standarden način, ne bom se na tem ustavil, le opazil bom, da mora pred začetkom uporabe biti pozornost namenjena utrjevanju možnostim, ki jih ponuja bsdinstaller na koncu namestitve (če sistem nameščate sami):

Bitcoin v kletki?

Je dobro gradivo na to temo, na kratko ga tukaj ponovim.

Vključiti zgoraj omenjene nastavitve je mogoče tudi na že nameščenem sistemu. Za to morate urediti datoteko zaganjalnika in vključiti nastavitve jedra. *ee — to je tak urednik v BSD

# 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

Prav tako je treba zagotoviti, da imate nameščeno najnovejšo različico sistema, in izvesti vse posodobitve in nadgradnje. V našem primeru, na primer, je potrebna nadgradnja na najnovejšo različico, saj prednameščene slike zaostajajo za šest mesecev do enega leta. No, in tam spremeni SSH vrata na drugačna od privzetih, doda avtentikacijo s ključi in onemogoči geslo.

Nato nastavimo aide, spremljanje stanja konfiguracijskih datotek sistema. Bolj podrobno lahko preberete tukaj.

pkg install aide

in uredimo naš cronjob

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

Aktiviramo sistemsko avdio

sysrc auditd_enable=YES

# service auditd start

Kako to upravljati je odlično opisano v priručniku.

Zdaj se znova zaženemo in se lotimo programske opreme na strežniku. Vsak strežnik predstavlja hipervizor za kontejnerje ali polne virtualne stroje. Zato je pomembno, da procesor podpira VT-x in EPT, če nameravamo uporabiti polno virtualizacijo.

Kot upravljanje kontejnerjev in virtualnih strojev uporabljam cbsd od olevole, želim mu veliko zdravja in blagoslovov za to čudovito orodje!

Kontejnerji? Spet docker ali kaj?

A ne. FreeBSD Jails — to je odlično orodje za kontejnerizacijo, omenjeni cbsd pa za orkestracijo teh kontejnerjev, ki jim ime — kletke.

Kletka je izredno učinkovita rešitev za gradnjo infrastrukture za različne namene, kjer je potreben popoln nadzor nad ločenimi storitvami ali procesi. Dejansko gre za klon gostiteljske metode, vendar ne zahteva popolne virtualizacije „strojne opreme“. Viri se zato ne porabljajo za „gostiteljski OS“, temveč samo za opravljeno delo. Ko se kletke uporabljajo za notranje potrebe, so to zelo priročne rešitve za optimalno izkoriščanje virov — veliko kletk na enem fizičnem strežniku lahko vsaka posebej po potrebi izkoristi celoten vir strežnika. Glede na to, da različnim podstoritev običajno na različne načine potrebujemo dodatne vire, lahko iz enega strežnika izvlečemo maksimalno zmogljivost, če pravilno načrtujemo in razporedimo kletke med strežniki. Po potrebi je tudi mogoče omejiti vire, ki jih kletke uporabljajo.

Bitcoin v kletki?

Kaj pa popolna virtualizacija?

Kolikor vem, cbsd podpira delovanje bhyve ter XEN hipervizorje. Nikoli nisem uporabljal drugega, prvi pa je razmeroma mlad hipervizor iz FreeBSD. Zdaj bomo preučili primer uporabe bhyve v spodnjem primeru.

Namestitev in nastavitev gostiteljskega okolja

Uporabljamo FS ZFS. To je izredno močno orodje za upravljanje prostora na strežniku. Z ZFS lahko neposredno iz diskov gradimo nizov različnih konfiguracij, dinamično „v živo“ širimo prostor, menjamo umrle diske, upravljamo s posnetki in še mnogo, mnogo drugega, kar bi lahko opisovali v celotni seriji člankov. Vrnimo se k našemu strežniku in njegovim diskom. Na začetku namestitve smo na diskih pustili prost prostor za šifrirane particije. Zakaj tako? To zato, da bi se sistem samodejno zagnal in poslušal prek SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

dodamo particijo diska na preostali prostor

geli init /dev/ada0p4

vpišemo našo šifrirno geslo

geli attach /dev/ada0p4

spet vpišemo geslo in dobimo napravo /dev/ada0p4.eli — to je naš šifriran prostor. Potem ponovimo enako za /dev/ada1 in ostale diske v nizu. In ustvarimo nov ZFS bazen.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli — no, zdaj imamo minimalni borbeni sklop pripravljen. Zrcalni niz diskov v primeru okvare enega od treh.

Ustvarjamo niz podatkov na novem „pulu“

zfs create vms/jails

pkg install cbsd — zagnali smo ukaz in namestili upravljanje za naše celice.

Potem ko cbsd je nameščen, ga je treba inicializirati:

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

in odgovarjamo na kup vprašanj, večinoma z odgovori po privzetku.

*Če uporabljate šifriranje, je pomembno, da demon cbsdd ne zažene samodejno, dokler ne dešifrirate diskov ročno ali samodejno (v našem primeru to dela zabbix)

**Prav tako ne uporabljam NAT od cbsd, ampak ga nastavim sam v 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 celice
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC

## Bitcoin omrežni prenos
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

Nastavitev politik požarnega zidu je tudi posebna tema, zato se ne bom poglabljal v nastavitev politike BLOCK ALL in nastavitev belih seznamov, to lahko storite z branjem uradno dokumentacijo ali katere koli od številnih člankov, ki so na voljo na googlu.

No, imamo nameščen cbsd, čas je, da ustvarimo našo prvo delovno konja — Bitcoin demon v celici!

cbsd jconstruct-tui

Bitcoin v kletki?

Tukaj vidimo dialog za ustvarjanje celice. Ko so vse vrednosti nastavljene, ustvarimo!

Pri ustvarjanju prve celice je treba izbrati, kaj uporabiti kot osnovo za celice. Jaz izbiram distribucijo iz repozitorija FreeBSD z ukazom repo. Ta izbira se izvede le pri ustvarjanju prve celice določene različice (gostiti je možno celice vseh različic, ki so starejše od različice gostitelja).

Ko je vse nameščeno — zagnamo celico!

# cbsd jstart bitcoind

Toda v celico moramo namestiti programsko opremo.

# jls

   JID  IP naslov      Ime gostitelja                     Pot
     1  192.168.0.1     bitcoind.space.com            /zroot/jails/jails/bitcoind

jexec bitcoind da pridemo v konzolo celice

in že znotraj celice namestimo programsko opremo z njenimi odvisnostmi (naš gostiteljski sistem ostaja čist)

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

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

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

Bitcoin v celici je, vendar potrebujemo anonimnost, ker se želimo povezati z nekaterimi celicami preko omrežja TOR. Načeloma imamo v načrtu, da večino celic s sumljivo programsko opremo obračamo samo preko proxy strežnika. Hvala pf Možno vypnúť NAT pre určité rozmedzie IP adries v lokálnej sieti a povoliť NAT len pre náš TOR uzol. Takže, aj keď do klietky vnikne zlomyseľný kód, pravdepodobne sa nedostane do kontaktu so svetom, a ak aj áno, neodhalí IP našich serverov. Preto vytvárame ďalšiu klietku, pre „prenos“ služieb ako „.onion“ služba a ako proxy pre prístup na internet pre samostatné klietky.

# 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

Nastavíme počúvanie na lokálnej adrese (prístupná pre všetky klietky)

SOCKSPort 192.168.0.2:9050

Čo nám ešte chýba na úplné šťastie. Áno, potrebujeme službu pre náš web, možno aj nie jednu. Spustíme nginx, ktorý bude plniť úlohu reverznej proxy a postará sa o predĺženie certifikátov Let’s Encrypt.

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

A tak sme umiestnili 150 MB závislostí do klietky. A hostiteľ je stále čistý.

K nastavovaniu nginx sa vrátime neskôr, potrebujeme tiež zdvihnúť ďalšie dve klietky pre náš platobný bránu na nodejs a rust a webovú aplikáciu, ktorá z nejakého dôvodu beží na apáči a php, a pre poslednú potrebujeme databázu MySQL.

# 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

… a ešte 380 MB balíkov izolovaných

Ďalej si stiahneme naše aplikácie cez git a spustíme ich.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

450 MB balíkov. v klietke.

Tu dávame prístup vývojárom cez SSH priamo do klietky, oni si tam všetko spravia sami:

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

Port 2267 — meníme port SSH klietky na akýkoľvek ľubovoľný

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

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

No a je to, služba je spustená, zostáva pridať pravidlo do pf firewall

Pozrime sa, aké IP adresy máme pre klietky a ako vyzerá naša „lokálka“

# 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

a pridáme pravidlo

# 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

No a keď sme tu, pridáme aj pravidlo na reverznú 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

Teraz trochu o bitcoinoch

Čo máme — máme webovú aplikáciu, ktorá je dostupná zvonku, a tá lokálne komunikuje s našou platobnou bránou. Teraz potrebujeme pripraviť pracovné prostredie pre interakciu so samotnou sieťou bitcoinu — uzlom bitcoind to je le demon, ki podpira lokalno kopijo aktualne blokchaina. Ta demon ima RPC in funkcionalnost denarnice, vendar za razvoj aplikacij obstajajo bolj priročne 'ovijke'. Najprej smo se odločili namestiti electrum — to je CLI denarnica. Ta denarnica bo pri nas uporabljena kot 'hladna shramba' za naše bitcoine — na splošno tiste bitcoine, ki jih je treba shraniti 'izven' sistema dostopnega uporabnikom in sploh čim dlje od vseh. Ima tudi GUI, zato točno takšno denarnico nameravamo uporabljati na
prenosnikih. Zaenkrat bomo elektrum uporabljali s javnimi strežniki, kasneje pa v še eni kletki postavili ElectrumX, da ne bi bili od nikogar odvisni.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

še 700 MB programske opreme imamo v kletki

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

Uporabniško ime: wallet
Polno ime: 
Uid (pustite prazno za privzeto): 
Skupina za prijavo [wallet]: 
Skupina za prijavo je wallet. Ali želite povabiti wallet v druge skupine? []: 
Razred prijave [default]: 
Shell (sh csh tcsh nologin) [sh]: tcsh
Domovska mapa [\/home\/wallet]: 
Dovoljenja za domačo mapo (pustite prazno za privzeto): 
Ali želite uporabiti avtentikacijo na osnovi gesel? [yes]: no
Zakleniti račun po ustvaritvi? [no]: 
Uporabniško ime   : wallet
Geslo   : <disabled>
Polno ime  : 
Uid        : 1001
Razred      : 
Skupine     : wallet 
Domov       : \/home\/wallet
Domači način  : 
Shell      : \/bin\/tcsh
Zaklenjeno     : no
OK? (yes\/no): yes
adduser: INFO: Uspešno dodan (wallet) v uporabniški imenik.
Dodati še enega uporabnika? (yes\/no): no
Nasvidenje!
electrum:\/@[8:53] # su wallet

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

wallet@electrum:\/ % electrum-3.6 create

{
    "msg": "Prosimo, obdržite svoj seed na varnem mestu; če ga izgubite, ne boste mogli obnoviti svojega denarnice.",
    "path": "\/usr\/home\/wallet\/.electrum\/wallets\/default_wallet",
    "seed": "jealous win pig material ribbon young punch visual okay cactus random bird"
}

Torej imamo zdaj ustvarjeno denarnico.

wallet@electrum:\/ % electrum-3.6 listaddresses

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

wallet@electrum:\/ % electrum-3.6 help

Naša on-chain denarnica bo v prihodnje dostopna le omejenemu krogu ljudi. Da ne bi odprli dostopa od zunaj v to kletko, bodo povezave preko SSH potekale preko TOR (takšna decentralizirana različica VPN). Začnemo s SSH v kletki, vendar ne dotaknemo našega pf.conf na gostitelju.

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

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

Zdaj bomo kletko z denarnico odrezali od interneta. Dali ji bomo IP-naslov iz drugega prostora podomrežja, ki se ne NAT-a. Najprej bomo spremenili /etc/pf.conf na gostitelju

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0\/24" spremenili v JAIL_IP_POOL="192.168.0.0\/25", tako da vsi naslovi 192.168.0.126-255 ne bodo imeli neposrednega dostopa do interneta. Nekakšna programska 'air-gap' omrežja. In NAT pravilo ostaja takšno, kot je bilo.

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

Osvežujemo pravila

# pfctl -f /etc/pf.conf

Zdaj se lotimo naše celice

# cbsd jconfig jname=electrum

Bitcoin v kletki?

Bitcoin v kletki?

jset mode=quiet jname=electrum ip4_addr="192.168.0.200"
Odstranite staro IP: /sbin/ifconfig em0 inet 192.168.0.6 -alias
Nastavite novo IP: /sbin/ifconfig em0 inet 192.168.0.200 alias
ip4_addr: 192.168.0.200

Hm, toda zdaj nam bo prenehal delovati tudi sistem. Vendar lahko navedemo sistemski proxy. A obstaja eno 'ampak', pri TOR-u je to SOCKS5 proxy, za udobje bi potrebovali še 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

No, zdaj imava v našem sistemu dva proxy strežnika, oba pa preusmerjata preko TOR: socks5://192.168.0.2:9050 in http://192.168.0.6:8123

Zdaj lahko nastavimo okolje našega denarnice

# 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

No, zdaj bo shell delal preko proxyja. Če želimo namestiti pakete, je dobro dodati v /usr/local/etc/pkg.conf iz pod root-a celice

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

No, zdaj je prišel čas, da dodamo TOR skrito storitev kot naslov našega SSH servisa v celici denarnice.

# 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

Tukaj je naš naslov za povezovanje. Poglejmo iz lokalnega računalnika. Ampak najprej 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

No in s klientskega linux računalnika

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 (Za to, da deluje, potrebujete lokalni TOR demon, ki posluša na 9050)

user@local ~$ ssh remotebtc

Avtentičnost gostitelja 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion ()' ni mogoče potrditi.
ECDSA ključni odtis je SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4.
Ali ste prepričani, da se želite nadaljevati v povezovanju (yes/no/[fingerprint])? yes
Opozorilo: 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion' (ECDSA) je bil trajno dodan na seznam znanih gostiteljev.
FreeBSD 12.1-RELEASE-p1 GENERIC 
Za prihranek prostora na disku v vašem domačem direktoriju, stisnite datoteke, ki jih redko
uporabite z "gzip filename".
        -- Dru 
wallet@electrum:~ % logout

Uspeh!

Za delo z instantnimi in mikroplačili potrebujemo tudi vozlišče. Lightning Network, to je vlastně náš hlavní pracovní nástroj s bitcoiny. U *c-lightning, který hodláme použít jako démona, existuje plugin Sparko, který je plnohodnotným HTTP (REST) rozhraním a umožňuje pracovat jak s off-chain transakcemi, tak s on-chain transakcemi. c-lightning pro fungování potřebuje bitcoind uzel.

*existují různé implementace na různých JAZY protokolu Lightning Network. Z těch, které jsme otestovali, se c-lightning (napsaný v C) jevil jako nejstabilnější a nejvíce efektivní na zdroje

# cbsd jsconstruct-tui

# cbsd jstart cln

# jexec cln

lightning:/@[10:23] # adduser

Uživatelské jméno: 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

Zatímco se kompilují a instalují všechny potřebné věci, vytvoříme uživatele RPC pro lightningd u bitcoind

# jexec bitcoind

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

rpcbind=192.168.0.1
rpcuser=test
rpcpassword=test
# povoleno pouze c-lightning
rpcallowip=192.168.0.7/32

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

Moje chaotické přepínání mezi buňkami se ukazuje jako vůbec ne chaotické, pokud zmíníme utilitu tmux, která umožňuje v rámci jedné relace vytvářet mnoho podsestav terminálů. Analog: screen

Bitcoin v kletki?

Takže, nechceme odhalit skutečnou IP našeho uzlu a chceme provádět všechny finanční operace přes TOR. Proto potřebujeme další .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

nyní vytvoříme konfiguraci pro 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
# pro výše uvedený příklad by měly inicializační logy (smíšené s logy lightningd) vytisknout něco jako

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 ~

prav tako je treba ustvariti konfiguracijsko datoteko za bitcoin-cli, orodje, ki komunicira z bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

preverjamo

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

[
  "test"
]

zagnemo lightningd

lightning@lightning:~ % lightningd --daemon

Sam lightningd lahko upravljaš z orodjem lightning-cli, na primer:

lightning-cli newaddr pridobiti naslov za novo prihajajoče plačilo

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all poslati vse denarja denarnice (vseh on-chain naslovov) na naslov

Prav tako ukazi za off-chain operacije lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay itd.

Za komunikacijo z aplikacijo imamo REST Api

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

Sklenimo

# jls

   JID  IP naslov      Ime gostitelja                      Pot
     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 v kletki?

Imamo nabor kontejnerjev, vsak z lastnim nivojem dostopa iz in v lokalno omrežje.

# zfs list

IME                    UPORABLJENO  NA VOLJO  OBNOVA  TOČKA MOUNT
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

Kot je razvidno, bitcoind zavzema vseh 190 GB prostora. Kaj pa, če potrebujemo še eno vozlišče za teste? Tu je ZFS še kako prav. cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com Można utworzyć zrzut i powiązać nową komórkę z tym zrzutem. Nowa komórka będzie miała całkowicie swoją przestrzeń, ale w systemie plików będzie brana pod uwagę tylko różnica między bieżącym stanem a oryginałem (zaoszczędzimy przynajmniej 190 GB).

Każda komórka to osobny zestaw danych ZFS, co jest bardzo wygodne. ZFS pozwala również robić wiele innych fajnych rzeczy, takich jak wysyłanie zrzutów przez SSH. Nie będziemy tego opisywać, i tak już jest wiele informacji.

Warto również zauważyć konieczność zdalnego monitorowania hosta, mamy do tych celów Zabbix.

B — bezpieczeństwo

Jeśli chodzi o bezpieczeństwo, zacznijmy od kluczowych zasad w kontekście infrastruktury:

Zasebnost — Standardowe narzędzia systemów podobnych do UNIX-a zapewniają realizację tej zasady. Logicznym sposobem dzielimy dostęp do każdego logicznie oddzielnego elementu systemu — komórki. Dostęp uzyskuje się poprzez standardową autoryzację użytkowników za pomocą kluczy osobistych. Cała komunikacja między a do końcowych komórek odbywa się w formie zaszyfrowanej. Dzięki szyfrowaniu dysków nie musimy się martwić o bezpieczeństwo danych podczas wymiany dysku lub migracji na inny serwer. Jedynym krytycznym dostępem jest dostęp do systemu gospodarza, ponieważ ten dostęp zapewnia w ogólnym przypadku dostęp do danych wewnątrz kontenerów.

Celovitost — Realizacja tej zasady odbywa się na kilku różnych poziomach. Po pierwsze, ważne jest, aby zauważyć, że w przypadku sprzętu serwerowego, pamięć ECC, ZFS już „prosto z pudełka” dba o integralność danych na poziomie bitów informacji. Natychmiastowe zrzuty pozwalają na wykonywanie kopii zapasowych w dowolnym momencie w trybie online. Wygodne narzędzia do eksportowania i importowania komórek ułatwiają replikację komórek.

Dostopnost — To już jest opcjonalne. Zależy od stopnia twojej rozpoznawalności oraz faktu posiadania wrogów. W naszym przykładzie zapewniliśmy dostępność portfela wyłącznie z sieci TOR. W razie potrzeby można na zaporze zablokować wszystko i zezwolić na dostęp do serwera wyłącznie przez tunele (TOR lub VPN to inna sprawa). W ten sposób serwer będzie odcięty od zewnętrznego świata, tak bardzo jak to możliwe, a wpływ na jego dostępność będziemy mieli tylko my sami.

Niezawodność — To ovisi od daljnjeg korištenja i poštivanja 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 primjer kako može izgledati, zadržavajući vrlo fleksibilne mogućnosti skaliranja i prilagodbe.

A što je s punom virtualizacijom?

O punoj virtualizaciji se može govoriti pomoću cbsd. preberete tukaj. Samo ću dodati da je potrebno uključiti neke parametre jezgre. bhyve kld_list="vmm if_tap if_bridge nmdm"

# cat /etc/rc.conf

...

# cat /boot/loader.conf

vmm_load="YES"

Dakle, ako postoji potreba za pokretanjem Dockera, onda podižemo neku debian verziju i naprijed!

Bitcoin v kletki?

To je to.

Mislim da je to sve što sam htio podijeliti. Ako vam se svidio članak, možete mi poslati malo bitcoina — bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Ako želite isprobati kaveze u akciji i imate malo bitcoina, možete otići na moj pet-project.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster