Bitcoin v kleci?

Tak se stalo, že jsem profesionální administrátor počítačových systémů a sítí (zkráceně: sysadmin) a měl jsem možnost pracovat s nejrůznějšími systémy během více než 10 let své profesní činnosti, včetně těch, které vyžadují [po|za]výšená bezpečnostní opatření. A také se stalo, že před nějakým časem jsem našel zajímavý bitcoin, a nejenže jsem ho používal, ale také jsem spustil několik mikroservisů, abych se naučil samostatně pracovat s bitcoinovou sítí (p2p přece jen) z pohledu vývojáře (jsem sice tak trošku amatérský dev, jen jsem kolem projížděl). Ale nemluvím o vývoji, mluvím o bezpečném a efektivním prostředí pro aplikace.

Finanční technologie (fintech) jdou ruku v ruce s informační bezpečností (infosec), a první bez druhého sice může fungovat, ale ne dlouho. A proto se chci podělit o svou zkušenost a o soubor nástrojů, které používám, což zahrnuje jak fintech, tak i infosec, přičemž obojí může být použito i v širším nebo úplně jiném smyslu. V tomto článku nebudu mluvit tolik o bitcoinu, jako spíše o modelu infrastruktury pro vývoj a provoz finančních (a nejen) služeb — jednoduše řečeno těch služeb, kde má „B“ význam. To platí jak pro bitcoinovou burzu, tak pro typický korporátní „zoo“ služeb malé firmy, která s bitcoinem vůbec nesouvisí.

Chci poznamenat, že jsem zastáncem principů „keep it stupid simple“ a „less is more“, takže jak článek, tak popsané v něm bude mít vlastnosti, které tyto principy odrážejí.

Představovaný scénář: Pojďme si vše přesně ukázat na příkladu bitcoinové směnárny. Rozhodli jsme se spustit směnu rublů, dolarů a eur za bitcoiny a zpět, a už máme funkční řešení, ale pro jiné digitální měny jako jsou Qiwi a Webmoney, tzn. vyřešili jsme všechny právní otázky, máme hotovou aplikaci, která slouží jako platební brána pro rublů, dolarů a eur a další platební systémy. Je propojena s našimi bankovními účty a má určité API pro naše koncové aplikace. Také máme webovou aplikaci, která funguje jako směnárna pro uživatele, něco jako typický Qiwi nebo Webmoney účet — založte si účet, přidejte kartu, atd. Komunikuje s naší bránou, třeba pomocí REST API v lokálním prostředí. A teď jsme se rozhodli připojit bitcoiny a současně vylepšit infrastrukturu, protože původně vše bylo rychle zprovozněno na VirtualBoxech v kanceláři pod stolem... lidé začali používat web a my jsme se začali obávat o dostupnost a výkonnost.

Takže začneme s hlavním — výběrem serveru. Protože podnikání v našem příkladu je malé a důvěřujeme poskytovateli (OVH), zvolíme cenově dostupnou variantu ve které nelze nainstalovat systém z originálního obrazu .iso, ale nevadí, oddělení IT bezpečnosti určitě provedou analýzu nainstalovaného obrazu. A když porosteme, pronajmeme si vůbec vlastní skříň se zámkem a omezeným fyzickým přístupem, nebo možná postavíme vlastní datové centrum. V každém případě je dobré mít na paměti, že při pronájmu hardwaru a instalaci hotových obrazů je šance, že ve vašem systému bude viset 'trojský kůň od poskytovatele', který v většině případů není určen pro sledování vás, ale aby poskytl pohodlnější nástroje pro správu serveru.

Instalace serveru

Tady je to jednoduché. Vybereme hardware, který splňuje naše potřeby. Poté vybereme obraz FreeBSD. Nebo se připojíme (v případě jiného poskytovatele a našeho hardwaru) přes IPMI nebo s monitorem a načteme .iso obraz FreeBSD. Pro orchestrální instalaci používám Ansible a mfsbsd. Jediné, v našem případě s Kimsufi, jsme vybrali vlastní instalaci aby dva disky v zrcadle měly 'otevřené' pouze zaváděcí a /home oddíly, zbytek prostoru disku bude zašifrován, ale o tom později.

Bitcoin v kleci?

Instalace systému probíhá standardním způsobem, nebudu se na tom zdržovat, pouze poznamenám, že před zahájením provozu byste měli věnovat pozornost hardeningu možnostem, které nabízí bsdinstaller na konci instalace (pokud systém instalujete sami):

Bitcoin v kleci?

Existuje dobrý materiál na toto téma, stručně ho zde zopakuji.

Zmiňované parametry lze také aktivovat na již nainstalovaném systému. K tomu je potřeba upravit soubor zaváděče a povolit parametry jádra. *ee — to je editor 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

Také byste měli zajistit, že máte nainstalovanou nejnovější verzi systému, a provést všechny aktualizace a upgrady. V našem případě například vyžaduje upgrade na nejnovější verzi, protože předinstalované obrazy zaostávají o půl roku až rok. A také upravujeme SSH port na jiný než je standardní, přidáváme autentizaci pomocí klíčů a vypínáme hesla.

Poté nastavíme aide, monitorování stavu konfiguračních souborů systému. Podrobněji si o tom můžete přečíst tady.

pkg install aide

a upravíme náš 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

Aktivujeme systémové audity

sysrc auditd_enable=YES

# service auditd start

Jak tuto věc spravovat, je výborně popsáno v příručce.

Nyní restartujeme a přejdeme k softwaru na serveru. Každý server představuje hypervisor pro kontejnery nebo celé virtuální stroje. Proto je důležité, aby procesor podporoval VT-x a EPT, pokud plánujeme používat plnou virtualizaci.

Jako správu kontejnerů a virtuálních strojů používám cbsd od olevole, přeji mu hodně zdraví a úspěchů za tuto skvělou utilitu!

Kontejnery? Zase docker?

Ale kdepak. FreeBSD Jails — to je skvělý nástroj pro kontejnerizaci, a zmiňovaný cbsd pro orchestraci těchto kontejnerů, jehož jméno je — buňky.

Klece jsou vysoce efektivním řešením pro vytváření infrastruktury pro různé účely, kde je nakonec požadována úplná izolace jednotlivých služeb nebo procesů. V podstatě se jedná o klon hostitelského systému, ale není potřeba plná virtualizace «hardwaru». Díky tomu se prostředky neztrácejí na «hostitelské OS», ale pouze na vykonávanou práci. Když se klece používají pro vnitřní potřeby, je to velmi pohodlné řešení pro optimální využití zdrojů – množství klecí na jednom fyzickém serveru může každá samostatně využívat veškeré prostředky serveru, pokud je to potřeba. Vzhledem k tomu, že různé podslužby obvykle potřebují dodatečné prostředky v různých dobách, lze z jednoho serveru vytěžit maximální výkon, pokud správně naplánujeme a rozložíme klece mezi servery. V případě potřeby lze klecím také nastavit omezení na používané zdroje.

Bitcoin v kleci?

Jak to vypadá s plnou virtualizací?

Jak mi je známo, cbsd podporuje práci bhyve a XEN hypervisory. Druhý jsem nikdy nepoužíval, ale první je relativně mladý hypervizor od FreeBSD. Podíváme se na příklad použití bhyve v dalším příkladu.

Instalace a nastavení hostitelského prostředí

Používáme FS ZFS. To je velmi mocný nástroj pro správu prostoru na serveru. Díky ZFS můžeme přímo z disků vytvářet pole nejrůznějších konfigurací, dynamicky «za chodu» rozšiřovat prostor, měnit vadné disky, spravovat snímky a mnoho, mnoho dalšího, co by se dalo popsat v celé sérii článků. Vraťme se k našemu serveru a jeho diskům. Na začátku instalace jsme na discích nechali volné místo pro šifrované oddíly. Proč tak? To proto, aby se systém automaticky spouštěl a naslouchal přes SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

přidáváme oddíl disku na zbývající místo

geli init /dev/ada0p4

zadáme naše šifrovací heslo

geli attach /dev/ada0p4

opět zadáváme heslo a objeví se nám zařízení /dev/ada0p4.eli — to je náš šifrovaný prostor. Poté opakujeme totéž pro /dev/ada1 a další disky v poli. A vytvoříme nový ZFS pool.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli — no a máme minimální bojovou sestavu připravenou. Zrcadlové pole disků pro případ, že jeden ze tří selže.

Vytváříme dataset na novém „poolu“

zfs create vms/jails

pkg install cbsd — spustili jsme příkaz a instalujeme management pro naše jails.

Poté co cbsd je nainstalován, je třeba ho inicializovat:

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

a odpovíme na spoustu otázek, většinou odpovědí podle výchozího nastavení.

*Pokud používáte šifrování, je důležité, aby démon cbsdd nebude automaticky spuštěn, dokud neodšifrujete disky ručně nebo automaticky (v našem příkladu to dělá zabbix)

**Také nepoužívám NAT od cbsd, ale nastavím ho sám 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 pro jails
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC

## Port forward pro Bitcoin síť
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

Nastavení pravidel firewallu je také samostatné téma, proto se nebudu hlouběji zabývat nastavením politiky BLOCK ALL a nastavením whitelistů, to lze provést přečtením oficiální dokumentaci nebo jakéhokoli z obrovského množství článků dostupných na googlu.

No co… máme nainstalováno cbsd, je čas vytvořit našeho prvního pracovního koně — bitcoinového démona v jailu!

cbsd jconstruct-tui

Bitcoin v kleci?

Tady vidíme dialog pro vytvoření jailu. Po nastavení všech hodnot jej vytvoříme!

Při vytváření prvního jailu je třeba zvolit, co použít jako základ pro jaily. Já volím distribuci z repozitáře FreeBSD pomocí příkazu repo. Tento výběr se provádí pouze při vytváření prvního jailu konkrétní verze (můžete hostit jaily jakýchkoli verzí, které jsou starší než verze hostitele).

Poté, co je vše nainstalováno — spouštíme jail!

# cbsd jstart bitcoind

Ale potřebujeme do jailu nainstalovat software.

# jls

   JID  IP Adresa      Hostname                      Cesta
     1  192.168.0.1     bitcoind.space.com            /zroot/jails/jails/bitcoind

jexec bitcoind abychom se dostali do konzole jailu

a uvnitř jailu nainstalujeme software s jeho závislostmi (náš hostitelský systém zůstává č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 jailu je, ale potřebujeme anonymitu, protože se chceme připojit k některým jailům přes síť TOR. A vůbec, máme v plánu většinu jailů se podezřelým softwarem provozovat pouze přes proxy. Díky pf Můžeme vypnout NAT pro určitý rozsah IP adres v místní síti a povolit NAT pouze pro náš TOR uzel. Tak i když se do klece dostane škodlivý software, pravděpodobně se nedostane do kontaktu se světem venku, a i když se dostane, neodhalí IP našeho serveru. Proto vytváříme ještě jednu klec pro "přesměrování" služeb jako je " .onion" služba a pro proxy pro přístup na internet pro jednotlivé klece.

# 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

Nastavujeme naslouchání na lokální adrese (přístupné pro všechny klece)

SOCKSPort 192.168.0.2:9050

Co nám ještě chybí pro úplné štěstí? Ano, potřebujeme službu pro náš web, možná i víc než jednu. Spustíme nginx, který bude sloužit jako reverse-proxy a postará se o prodloužení certifikátů Let’s Encrypt.

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

A tak jsme umístili 150 MB závislostí do klece. A hostitel stále zůstává čistý.

K nastavení nginx se vrátíme později, potřebujeme vztyčit ještě dvě klece pro náš platební bránu na nodejs a rust a webovou aplikaci, která je z nějakého důvodu na apachu a PHP, a také pro tuto potřebujeme databázi 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 dalších 380 MB balíků izolováno.

Dále stáhneme naše aplikace pomocí gitu a spustíme 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 balíků. v kleci.

Tady dáváme přístup vývojářům přes SSH přímo do klece, oni si tam už vše udělají:

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

Port 2267 — měníme port SSH klece na libovolný náhodný

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

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

Tak, služba je spuštěna, zbývá přidat pravidlo do pf firewall

Podíváme se, jaké IP adresy máme u klecí a jak vůbec vypadá naše „lokalka“

# jls

   JID  IP Adresa      Hostitel                      Cesta
     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 přidá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 když jsme tu, přidáme také pravidlo na 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

A teď trochu o bitcoinech

Co máme — máme webovou aplikaci, která je dostupná zvenku, a místně komunikuje s naší platební branou. Teď potřebujeme připravit pracovní prostředí pro interakci s vlastní bitcoinovou sítí — node. bitcoind to je jen démon, který podporuje místní kopii aktuálního blockchainu. Tento démon má RPC a funkčnost peněženky, nicméně pro vývoj aplikací existují pohodlnější "obaly". Nejdříve jsme se rozhodli nainstalovat electrum — to je CLI peněženka. Tato peněženka bude u nás používána jako "studené úložiště" pro naše bitcoiny — v podstatě ty bitcoiny, které je třeba uchovávat "mimo" systém přístupný uživatelům a daleko od všech. Také má GUI, proto takovou peněženku plánujeme použít na
našich laptopech. Prozatím budeme používat electrum s veřejnými servery, a později v další kleci zprovozníme ElectrumX, abychom byli zcela nezávislí.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

ještě 700 MB softwaru máme v kleci

electrum:/@[8:53] # adduser

Uživatelské jméno: wallet
Celé jméno: 
Uid (nechejte prázdné pro výchozí hodnotu): 
Přihlašovací skupina [wallet]: 
Přihlašovací skupina je wallet. Pozvat wallet do dalších skupin? []: 
Přihlašovací třída [default]: 
Shell (sh csh tcsh nologin) [sh]: tcsh
Domovský adresář [ /home/wallet]: 
Oprávnění k domovskému adresáři (nechejte prázdné pro výchozí hodnotu): 
Použít ověřování s heslem? [yes]: no
Zamknout účet po vytvoření? [no]: 
Uživatelské jméno   : wallet
Heslo             : 
Celé jméno        : 
Uid               : 1001
Třída            : 
Skupiny           : wallet 
Domov            : /home/wallet
Mód domova       : 
Shell             : /bin/tcsh
Zamčeno          : ne
OK? (yes/no): yes
adduser: INFO: Úspěšně přidáno (wallet) do databáze uživatelů.
Přidat dalšího uživatele? (yes/no): no
Na shledanou!
electrum:/@[8:53] # su wallet

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

wallet@electrum:/ % electrum-3.6 create

{
    "msg": "Uložte si svůj seed na bezpečném místě; pokud jej ztratíte, nebudete schopni obnovit svou peněženku.",
    "path": "/usr/home/wallet/.electrum/wallets/default_wallet",
    "seed": "žárlivý vepř materiál stužka mladý úder vizuální v pořádku kaktus náhodný pták"
}

Takže teď máme vytvořenou peněženku.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

K naší on-chain peněžence se od nynějška bude moci připojit pouze omezený okruh osob. Abychom neotevřeli přístup zvenčí do této klece, připojení přes SSH proběhne prostřednictvím TOR (taková decentralizovaná varianta VPN). Spouštíme v kleci SSH, ale neleze do našeho pf.conf na hostiteli.

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

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

Teď vypneme kleci s peněženkou přístup k internetu. Dáme jí IP adresu z jiného prostoru podsítě, která není NAT-ována. Nejprve změníme /etc/pf.conf na hostiteli

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" změníme na JAIL_IP_POOL="192.168.0.0/25", tímto způsobem všechny adresy 192.168.0.126-255 nebudou mít přístup k internetu. Jakýsi softwarový „air-gap“ network. A pravidlo NAT zůstává stejné.

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

Přetížení pravidel

# pfctl -f /etc/pf.conf

Teď se pustíme do naší buněk

# cbsd jconfig jname=electrum

Bitcoin v kleci?

Bitcoin v kleci?

jset mode=quiet jname=electrum ip4_addr="192.168.0.200"
Odstranit starou IP: /sbin/ifconfig em0 inet 192.168.0.6 -alias
Nastavit novou IP: /sbin/ifconfig em0 inet 192.168.0.200 alias
ip4_addr: 192.168.0.200

Hmmm, ale teď nám přestane fungovat i samotný systém. Můžeme ale specifikovat systémový proxy. Ale je tu jedno velké ale, na TOR je to SOCKS5 proxy, a pro pohodlí bychom potřebovali ještě 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

Tak, nyní máme v našem systému dva proxy servery, a oba směrují přes TOR: socks5://192.168.0.2:9050 a http://192.168.0.6:8123

Teď můžeme nastavit prostředí našeho peněženky

# 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, nyní shell bude fungovat přes proxy. Pokud chceme instalovat balíčky, má smysl přidat do /usr/local/etc/pkg.conf z pod root buněk

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

A teď přišel čas přidat TOR hidden service jako adresu našeho SSH služby v buně peněženky.

# 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

Tady je naše adresa pro připojení. Pojďme to zkontrolovat z místního počítače. Ale nejprve musíme přidat náš SSH klíč:

wallet@electrum:/ % mkdir ~/ .ssh

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

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

No a z klientské linuxové mašiny

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

Připojujeme se (Aby to fungovalo, potřebujeme lokální TOR démon, který naslouchá na 9050)

user@local ~$ ssh remotebtc

Autenticita hostitele 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion (<no hostip for proxy command>)' nemůže být potvrzena.
ECDSA klíč otisk je SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4.
Jste si jisti, že chcete pokračovat v připojení (ano/ne/[otisk])? ano
Varování: Trvale přidáno 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion' (ECDSA) do seznamu známých hostitelů.
FreeBSD 12.1-RELEASE-p1 GENERIC 
Pro ušetření místa na disku ve vašem domácím adresáři, komprimujte soubory, které zřídka
používáte s "gzip název_souboru".
        -- Dru <genesis@istar.ca>
wallet@electrum:~ % logout

Úspěch!

Pro práci s okamžitými a mikro-platbami potřebujeme také uzel Lightning Network, to vlastně bude náš hlavní pracovní nástroj s bitcoiny. U *c-lightning, který zamýšlíme používat jako démona, je 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í je potřeba bitcoind noda.

*existují různé implementace v různých programovacích jazycích protokolu Lightning Network. Z těch, které jsme testovali, se c-lightning (napsaný v C) ukázal jako nejstabilnější a nejvíce efektivní z hlediska prostředků.

# 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

Pokud se teď během kompilace a instalace všeho potřebného vytvoříme RPC uživatele pro lightningd v bitcoind

# jexec bitcoind

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

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

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

Moje chaotické přepínání mezi okny se ukazuje být méně chaotické, pokud započítáme utilitu tmux, která umožňuje během jedné relace vytvářet více podsestavení terminálů. Analog: screen

Bitcoin v kleci?

Takže, nechceme odhalit skutečnou IP naší nody a chceme provádět všechny finanční operace přes TOR. Budeme potřebovat ještě jednu .onion.

# jexec tor

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

HiddenServiceDir \/var\/db\/tor\/cln\/\nHiddenServicePort 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

teď 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 počáteční protokoly (smíchané s protokoly lightningd) měly tisknout 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 ~

je také potřeba vytvořit konfigurační soubor pro bitcoin-cli, nástroj, který komunikuje s bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

kontrolujeme

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

[
  "test"
]

spouštíme lightningd

lightning@lightning:~ % lightningd --daemon

Samotný lightningd můžete ovládat nástroj lightning-cli, například:

lightning-cli newaddr získat adresu pro novou příchozí platbu

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all odeslat na adresu všechny peníze z peněženky (všechny on-chain adresy)

Také příkazy pro off-chain operace lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay atd.

A pro komunikaci s aplikací máme REST Api

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

Shrnujeme

# jls

   JID  IP Adresa      Název hostitele               Cesta
     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 kleci?

Máme sadu kontejnerů, každý s vlastním úrovněm přístupu jak do tak i z lokální sítě.

# zfs list

NÁZEV                    VYUŽITÍ  VOLNÉ  ODKAZ  MONTOVACÍ BOD
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

Jak je vidět, bitcoind zabírá všech 190 GB prostoru. A co když budeme potřebovat další uzel pro testy? Zde je ZFS jako stvořený pro tuto situaci. Pomocí cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com Můžete vytvořit snímek a připojit novou buňku k tomuto snímku. Nová buňka bude mít zcela vlastní prostor, ale ve FS se bude zohledňovat pouze rozdíl mezi aktuálním stavem a originálem (ušetříme minimálně 190 GB).

Každá buňka je samostatný datový set ZFS, což je velmi pohodlné. ZFS také umožňuje provádět různé další skvělé věci, jako je odesílání snímků přes SSH. Nehodláme to popisovat, už toho bylo dost.

Je také třeba zmínit potřebu vzdáleného monitorování hostitele, máme pro tyto účely Zabbix.

B — bezpečnost

Pokud jde o bezpečnost, vycházejme z klíčových principů v kontextu infrastruktury:

Ochrana soukromí — Standardní nástroje systémů podobných UNIXu zajišťují splnění tohoto principu. Logicky oddělujeme přístup k každému logicky samostatnému prvku systému — buňce. Přístup je realizován prostřednictvím standardní uživatelské autentizace na základě osobních klíčů uživatelů. Veškerá komunikace mezi a do konečných buněk probíhá v šifrované podobě. Díky šifrování disků se nemusíme obávat o bezpečnost dat při výměně disku nebo migraci na jiný server. Jediný kritický přístup je přístup k hostitelskému systému, protože tento přístup obvykle zajišťuje přístup k datům uvnitř kontejnerů.

Integrita — Vykonávání tohoto principu probíhá na několika různých úrovních. Nejprve je důležité zmínit, že v případě serverového hardware, ECC paměti, ZFS již „z krabice“ pečuje o integritu dat na úrovni bitů informací. Okamžité snímky umožňují zálohování kdykoliv v reálném čase. Pohodlné nástroje pro export a import buněk usnadňují replikaci buněk.

Dostupnost — To už je volitelné. Závisí na míře vaší známosti a na tom, zda máte nepřátele. V našem příkladu jsme zajistili dostupnost peněženky výhradně z TOR sítě. Pokud to bude nutné, můžete na firewallu zablokovat vše a povolit přístup na server výhradně prostřednictvím tunelů (TOR nebo VPN je jiná otázka). Tak bude server odříznut od vnějšího světa co nejvíce, a jeho dostupnost budeme moci ovlivnit pouze my sami.

Nemožnost odmítnutí — To záleží na dalším používání a dodržování správných politik uživatelských práv, přístupu atd. Ale při správném přístupu jsou všechny akce uživatelů auditovány a díky kryptografickým řešením je možné jednoznačně identifikovat, kdo a kdy prováděl určité akce.

Samozřejmě, popsaná konfigurace není absolutním příkladem toho, jak by to mělo být vždy, je to spíše jeden z příkladů, jak to může být, přičemž si zachovává velmi flexibilní možnosti škálování a přizpůsobení.

A co úplná virtualizace?

O úplné virtualizaci prostřednictvím cbsd lze říci přečíst zde. Jen dodám, že pro práci bhyve je nutné aktivovat některé parametry jádra.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="ANO"
...

Takže pokud by byla potřeba spustit docker, zvedneme nějaký debian a vpřed!

Bitcoin v kleci?

A to je vše

Snad je to vše, co jsem chtěl sdílet. Pokud se vám článek líbil, můžete mi poslat bitcoiny — bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Pokud chcete vyzkoušet buňky v akci a máte nějaké bitcoiny, můžete navštívit můj pet-project.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster