Bitcoin in een kooi?

Zo gebeurde het dat ik van beroep beheerder ben van computersystemen en netwerken (kortweg: systeembeheerder), en ik heb iets meer dan 10 jaar de kans gehad om prof. te vertellen. de activiteiten van een grote verscheidenheid aan systemen, inclusief systemen die [extreme] beveiligingsmaatregelen vereisen. Het gebeurde ook dat ik het enige tijd geleden interessant vond bitcoin, en heb het niet alleen gebruikt, maar ook verschillende microservices gelanceerd om zelfstandig te leren werken met het Bitcoin-netwerk (ook wel p2p genoemd) vanuit het standpunt van een ontwikkelaar (ik ben natuurlijk een van die dev, dus ik kwam langs). Maar ik heb het niet over ontwikkeling, ik heb het over een veilige en efficiënte omgeving voor applicaties.

Financiële technologie (FinTech) ga naar informatiebeveiliging (infosec) en de eerste kan zonder de tweede werken, maar niet voor lang. Daarom wil ik mijn ervaring delen en de set tools die ik gebruik, die beide omvat FinTechEn infosec, en tegelijkertijd, en kan ook voor een breder of heel ander doel worden gebruikt. In dit artikel zal ik je niet zozeer over Bitcoin vertellen, maar over het infrastructuurmodel voor de ontwikkeling en exploitatie van financiële (en niet alleen) diensten - in één woord, die diensten waarbij "B" ertoe doet. Dit geldt zowel voor de Bitcoin-uitwisseling als voor de meest typische zakelijke dienstverlening van een klein bedrijf dat op geen enkele manier met Bitcoin verbonden is.

Ik wil hierbij opmerken dat ik een voorstander ben van de beginselen "houd het dom simpel" и "minder is meer"Daarom zullen zowel het artikel als wat erin wordt beschreven de eigenschappen hebben waar deze principes over gaan.

Denkbeeldig scenario: Laten we alles bekijken aan de hand van het voorbeeld van een bitcoin-wisselaar. We hebben besloten om de uitwisseling van roebels, dollars, euro’s voor bitcoins en terug te lanceren, en we hebben al een werkende oplossing, maar dan voor ander digitaal geld zoals qiwi en webmoney, d.w.z. We hebben alle juridische kwesties afgesloten, we hebben een kant-en-klare applicatie die dient als betalingsgateway voor roebels, dollars en euro's en andere betalingssystemen. Het is verbonden met onze bankrekeningen en heeft een soort API voor onze eindtoepassingen. We hebben ook een webapplicatie die fungeert als uitwisselaar voor gebruikers, nou ja, zoals een typisch Qiwi- of webmoney-account: maak een account aan, voeg een kaart toe, enzovoort. Het communiceert met onze gateway-applicatie, zij het via de REST API in de lokale omgeving. En dus besloten we om bitcoins te verbinden en tegelijkertijd de infrastructuur te upgraden, omdat... Aanvankelijk werd alles haastig op virtualboxen op kantoor onder de tafel gezet... de site begon in gebruik te worden genomen en we begonnen ons zorgen te maken over de uptime en prestaties.

Laten we dus beginnen met het belangrijkste: het kiezen van een server. Omdat het bedrijf in ons voorbeeld is klein en we vertrouwen op de hoster (OVH) die we zullen kiezen een budgetoptie waarin het onmogelijk is om het systeem vanaf de originele .iso-image te installeren, maar het maakt niet uit: de IT-beveiligingsafdeling zal de geïnstalleerde image zeker analyseren. En als we groot zijn, huren we onze eigen kast achter slot en grendel met beperkte fysieke toegang, en misschien bouwen we wel ons eigen DC. Houd er in ieder geval rekening mee dat bij het huren van hardware en het installeren van kant-en-klare images de kans bestaat dat je een “Trojan van de hoster” op je systeem hebt hangen, die in de meeste gevallen niet bedoeld is om je te bespioneren maar om de server handiger te bieden voor beheertools.

Serverinstallatie

Alles is hier eenvoudig. We kiezen de hardware die bij onze behoeften past. Selecteer vervolgens de FreeBSD-image. Nou ja, of we verbinden (in het geval van een andere hoster en onze eigen hardware) via IPMI of met een monitor en voeren de .iso FreeBSD-image in de download in. Voor een orkestrale opstelling gebruik ik Ansible и mfsbsd. Het enige waar we in ons geval met kimsufi voor kozen aangepaste installatie Om ervoor te zorgen dat de twee schijven in de spiegel alleen de boot- en /home-partities “open” hebben, zal de rest van de schijfruimte worden gecodeerd, maar daarover later meer.

Bitcoin in een kooi?

De installatie van het systeem gebeurt op een standaardmanier, ik zal hier niet op ingaan, ik merk alleen op dat het de moeite waard is om aandacht te besteden voordat u met het gebruik begint verharding opties die het biedt bsdinstaller aan het einde van de installatie (als u het systeem zelf installeert):

Bitcoin in een kooi?

Er is goed materiaal over dit onderwerp zal ik het hier kort herhalen.

Het is ook mogelijk om bovengenoemde parameters in te schakelen op een reeds geïnstalleerd systeem. Om dit te doen, moet je het bootloaderbestand bewerken en kernelparameters inschakelen. *ee is zo'n editor in 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

Zorg er ook voor dat u de nieuwste versie van het systeem hebt geïnstalleerd, en voer alle updates en upgrades uit. In ons geval is bijvoorbeeld een upgrade naar de nieuwste versie vereist, omdat... afbeeldingen vóór installatie blijven zes maanden tot een jaar achter. Welnu, daar veranderen we de SSH-poort in iets anders dan de standaardpoort, voegen we sleutelauthenticatie toe en schakelen we wachtwoordauthenticatie uit.

Vervolgens configureren wij aide, het bewaken van de status van systeemconfiguratiebestanden. U kunt meer in detail lezen hier.

pkg install aide

en bewerk onze 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

We omvatten systeemaudit

sysrc auditd_enable=YES

# service auditd start

Hoe u deze zaak moet beheren, wordt perfect beschreven in leiderschap.

Nu starten we opnieuw op en gaan we verder met de software op de server. Elke server is een hypervisor voor containers of volledige virtuele machines. Daarom is het belangrijk dat de processor VT-x en EPT ondersteunt als we van plan zijn volledige virtualisatie te gebruiken.

Om containers en virtuele machines te beheren die ik gebruik cbsd van olevole, ik wens hem meer gezondheid en zegeningen voor dit prachtige hulpprogramma!

Containers? Docker weer of wat?

Maar nee. FreeBSD-gevangenissen is een uitstekend hulpmiddel voor containerisatie, maar het genoemde cbsd om deze containers, die cellen worden genoemd, te orkestreren.

De kooi is een uiterst effectieve oplossing voor het bouwen van infrastructuur voor uiteenlopende doeleinden, waarbij uiteindelijk volledige isolatie van individuele diensten of processen vereist is. In wezen is het een kloon van het hostsysteem, maar er is geen volledige hardwarevirtualisatie voor nodig. En dankzij dit worden de middelen niet besteed aan het "gastbesturingssysteem", maar alleen aan het werk dat wordt uitgevoerd. Wanneer cellen worden gebruikt voor interne behoeften, is dit een zeer handige oplossing voor optimaal gebruik van bronnen: een aantal cellen op één hardwareserver kan indien nodig elk afzonderlijk de volledige serverbron gebruiken. Gezien het feit dat meestal verschillende subservices extra nodig hebben. bronnen op verschillende tijdstippen kunt u maximale prestaties uit één server halen als u de cellen tussen servers goed plant en verdeelt. Indien nodig kunnen cellen ook beperkingen krijgen op de gebruikte bron.

Bitcoin in een kooi?

Hoe zit het met volledige virtualisatie?

Zoals ik weet, cbsd ondersteunt het werk bhyve en XEN-hypervisors. De tweede heb ik nog nooit gebruikt, maar de eerste is relatief nieuw hypervisor van FreeBSD. We zullen een voorbeeld van gebruik bekijken bhyve in het onderstaande voorbeeld.

De hostomgeving installeren en configureren

Wij gebruiken FS ZFS. Dit is een uiterst krachtig hulpmiddel voor het beheren van serverruimte. Dankzij ZFS kun je direct arrays van verschillende configuraties vanaf schijven bouwen, dynamisch "hot" ruimte uitbreiden, dode schijven vervangen, snapshots beheren en nog veel, veel meer, wat in een hele reeks artikelen kan worden beschreven. Laten we terugkeren naar onze server en zijn schijven. Aan het begin van de installatie hebben we vrije ruimte op de schijven gelaten voor gecodeerde partities. Waarom is dat? Dit is zodat het systeem automatisch wakker wordt en luistert via SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

voeg een schijfpartitie toe aan de resterende ruimte

geli init /dev/ada0p4

voer ons coderingswachtwoord in

geli attach /dev/ada0p4

We voeren het wachtwoord opnieuw in en we hebben een apparaat /dev/ada0p4.eli - dit is onze gecodeerde ruimte. Vervolgens herhalen we hetzelfde voor /dev/ada1 en de rest van de schijven in de array. En we creëren een nieuwe ZFS-pool.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - Nou, we hebben de minimale gevechtsuitrusting klaar. Een gespiegelde reeks schijven voor het geval een van de drie defect raakt.

Een dataset maken op een nieuwe “pool”

zfs create vms/jails

pkg install cbsd — we hebben een team gelanceerd en het management voor onze cellen opgezet.

Na cbsd geïnstalleerd, moet het worden geïnitialiseerd:

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

Welnu, we beantwoorden een aantal vragen, meestal met standaardantwoorden.

*Als u encryptie gebruikt, is het belangrijk dat de daemon cbsdd startte pas automatisch als je de schijven handmatig of automatisch decodeerde (in ons voorbeeld wordt dit gedaan door zabbix)

**Ik gebruik ook geen NAT van cbsd, en ik configureer het zelf in 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

Het instellen van firewallbeleid is ook een apart onderwerp, dus ik zal niet diep ingaan op het instellen van het BLOCK ALL-beleid en het instellen van witte lijsten, dat kun je doen door te lezen officiële documentatie of een van de vele artikelen die beschikbaar zijn op Google.

Nou... we hebben cbsd geïnstalleerd, het is tijd om ons eerste werkpaard te creëren: de gekooide Bitcoin-demon!

cbsd jconstruct-tui

Bitcoin in een kooi?

Hier zien we het dialoogvenster voor het maken van cellen. Nadat alle waarden zijn ingesteld, gaan we creëren!

Wanneer u uw eerste cel maakt, moet u kiezen wat u als basis voor de cellen wilt gebruiken. Ik selecteer een distributie uit de FreeBSD-repository met het commando repo. Deze keuze wordt alleen gemaakt bij het maken van de eerste cel van een specifieke versie (u kunt cellen hosten van elke versie die ouder is dan de hostversie).

Nadat alles is geïnstalleerd, lanceren we de kooi!

# cbsd jstart bitcoind

Maar we moeten software in de kooi installeren.

# jls

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

jexec bitcoind om in de celconsole te komen

en al in de cel installeren we de software met zijn afhankelijkheden (ons hostsysteem blijft schoon)

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

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

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

Er zit Bitcoin in de kooi, maar we hebben anonimiteit nodig omdat we via het TOP-netwerk verbinding willen maken met sommige kooien. Over het algemeen zijn we van plan de meeste cellen met verdachte software alleen via een proxy te laten werken. Dankzij pf U kunt NAT uitschakelen voor een bepaald bereik aan IP-adressen op het lokale netwerk, en NAT alleen toestaan ​​voor ons TOR-knooppunt. Dus zelfs als malware de cel binnendringt, zal deze hoogstwaarschijnlijk niet communiceren met de buitenwereld, en als dat wel het geval is, zal het het IP-adres van onze server niet onthullen. Daarom creëren we een andere cel om services te ‘doorsturen’ als een ‘.onion’-service en als proxy voor toegang tot internet naar individuele cellen.

# 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

Instellen om te luisteren op een lokaal adres (beschikbaar voor alle cellen)

SOCKSPort 192.168.0.2:9050

Wat hebben we nog meer nodig voor volledig geluk? Ja, we hebben een service nodig voor ons web, misschien meer dan één. Laten we nginx lanceren, die zal fungeren als een reverse-proxy en zorgt voor het vernieuwen van Let's Encrypt-certificaten

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

En dus plaatsten we 150 MB aan afhankelijkheden in een kooi. En de gastheer is nog steeds schoon.

Laten we later terugkomen op het instellen van nginx, we moeten nog twee cellen verhogen voor onze betalingsgateway op nodejs en rust en een webapplicatie, die om de een of andere reden in Apache en PHP staat, en voor de laatste is ook een MySQL-database vereist.

# 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

...en nog eens 380 MB aan pakketten geïsoleerd

Vervolgens downloaden we onze applicatie met git en starten deze.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

450 MB-pakketten. in een kooi.

hier geven we de ontwikkelaar via SSH rechtstreeks toegang tot de cel, ze zullen daar alles zelf doen:

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

Port 2267 - verander de SSH-poort van de cel in een willekeurige poort

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

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

Welnu, de service draait, het enige dat overblijft is het toevoegen van de regel pf firewall

Laten we eens kijken welke IP's onze cellen hebben en hoe onze “lokale omgeving” er in het algemeen uitziet.

# 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

en voeg een regel toe

# 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

Nu we er toch zijn, laten we ook een regel voor reverse-proxy toevoegen:

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

Nou, nu een beetje over bitcoins

Wat we hebben is dat we een webapplicatie hebben die extern wordt blootgesteld en die lokaal met onze betalingsgateway praat. Nu moeten we een werkomgeving voorbereiden voor interactie met het Bitcoin-netwerk zelf: het knooppunt bitcoind het is slechts een daemon die de lokale kopie van de blockchain up-to-date houdt. Deze daemon heeft RPC- en portemonnee-functionaliteit, maar er zijn handigere “wrappers” voor applicatie-ontwikkeling. Om te beginnen hebben we besloten om te zetten electrum is een CLI-portemonnee. Deze portemonnee we zullen het gebruiken als ‘koude opslag’ voor onze bitcoins – in het algemeen de bitcoins die ‘buiten’ het systeem moeten worden opgeslagen, toegankelijk voor gebruikers en in het algemeen weg van iedereen. Het heeft ook een GUI, dus we gaan dezelfde portemonnee op onze
laptops. Voorlopig zullen we Electrum gebruiken met openbare servers, en later zullen we het in een andere cel verhogen ElectrumXom van niemand afhankelijk te zijn.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

nog eens 700 MB software in onze kooi

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"
}

Nu hebben we een portemonnee gemaakt.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

Naar onze on-chain Slechts een beperkt aantal mensen kan voortaan verbinding maken met de portemonnee. Om de toegang tot deze cel niet van buitenaf te openen, zullen verbindingen via SSH plaatsvinden via TOP (een gedecentraliseerde versie van VPN). We starten SSH in de cel, maar raken onze pf.conf op de host niet aan.

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

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

Laten we nu de cel uitschakelen met de internettoegang van de portemonnee. Laten we het een IP-adres geven van een andere subnetruimte die niet NATed is. Laten we eerst veranderen /etc/pf.conf op de gastheer

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" laten we het veranderen in JAIL_IP_POOL="192.168.0.0/25", dus alle adressen 192.168.0.126-255 hebben geen directe toegang tot internet. Een soort softwarematig ‘air-gap’-netwerk. En de NAT-regel blijft zoals hij was

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

Overbelasting van de regels

# pfctl -f /etc/pf.conf

Laten we nu onze cel aanpakken

# cbsd jconfig jname=electrum

Bitcoin in een kooi?

Bitcoin in een kooi?

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, maar nu werkt het systeem zelf niet meer voor ons. We kunnen echter een systeemproxy opgeven. Maar er is één ding: op TOR is het een SOCKS5-proxy, en voor het gemak zouden we ook graag een HTTP-proxy willen.

# 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

Welnu, nu zijn er twee proxyservers in ons systeem, en beide worden uitgevoerd via TOR: sokken5://192.168.0.2:9050 en http://192.168.0.6:8123

Nu kunnen we onze portemonnee-omgeving configureren

# 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

Welnu, nu zal de shell werken onder een proxy. Als we pakketten willen installeren, moeten we toevoegen aan /usr/local/etc/pkg.conf van onder de wortel van de kooi

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

Welnu, nu is het tijd om de verborgen TOR-service toe te voegen als het adres van onze SSH-service in de portemonneecel.

# 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

Dit is ons verbindingsadres. Laten we het controleren vanaf de lokale machine. Maar eerst moeten we onze SSH-sleutel toevoegen:

wallet@electrum:/ % mkdir ~/.ssh

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

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

Nou ja, vanaf een Linux-clientmachine

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

Laten we verbinding maken (Om dit te laten werken, heb je een lokale TOR-daemon nodig die luistert op 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

Succes!

Om met instant- en microbetalingen te kunnen werken, hebben we ook een knooppunt nodig Bliksem netwerkIn feite zal dit ons belangrijkste werkinstrument met Bitcoin zijn. U*c-bliksemdie we als daemon gaan gebruiken Sparko-plug-in, een volwaardige HTTP (REST)-interface waarmee u zowel met off-chain als on-chain transacties kunt werken. c-lightning nodig voor het functioneren bitcoind maar ja.

*Er zijn verschillende implementaties van het Lightning Network-protocol in verschillende talen. Van degenen die we hebben getest, leek c-lightning (geschreven in C) het meest stabiel en hulpbronnenefficiënt

# 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

Terwijl al het noodzakelijke is gecompileerd en geïnstalleerd, gaan we een RPC-gebruiker voor maken 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

Mijn chaotische schakelen tussen cellen blijkt niet zo chaotisch te zijn als je het nut opmerkt tmux, waarmee u binnen één sessie meerdere terminal-subsessies kunt maken. Analoog: screen

Bitcoin in een kooi?

We willen dus het echte IP-adres van ons knooppunt niet onthullen en we willen alle financiële transacties via TOP uitvoeren. Er is dus geen extra ui nodig.

# 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

Laten we nu een configuratie voor c-lightning maken

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 ~

je moet ook een configuratiebestand maken voor bitcoin-cli, een hulpprogramma waarmee je kunt communiceren bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

controleren

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

[
  "test"
]

launch lightningd

lightning@lightning:~ % lightningd --daemon

Zichzelf lightningd u kunt het hulpprogramma beheren lightning-cli, bijvoorbeeld:

lightning-cli newaddr het adres opvragen voor een nieuwe inkomende betaling

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all stuur al het geld in de portemonnee naar het adres (alle adressen in de keten)

Ook opdrachten voor operaties buiten de keten lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay enz.

Welnu, voor communicatie met de applicatie hebben we een REST Api

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

Opsommen

# 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 in een kooi?

We beschikken over een set containers, elk met een eigen toegangsniveau, zowel van als naar het lokale netwerk.

# 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

Zoals u kunt zien, neemt BitcoinD alle 190 GB aan ruimte in beslag. Wat als we een ander knooppunt nodig hebben om te testen? Dit is waar ZFS van pas komt. Met hulp cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com u kunt een momentopname maken en een nieuwe cel aan deze momentopname koppelen. De nieuwe cel krijgt zijn eigen ruimte, maar in het bestandssysteem wordt alleen rekening gehouden met het verschil tussen de huidige staat en het origineel (we besparen minimaal 190 GB)

Elke cel is zijn eigen afzonderlijke ZFS-dataset, en dit is uiterst handig. ZFS staat het ook toe doe verschillende andere leuke dingen, zoals het verzenden van snapshots via SSH. We zullen het niet beschrijven, er is al veel.

Het is ook vermeldenswaard dat er behoefte is aan monitoring op afstand van de host, voor deze doeleinden hebben we Zabbix.

B - veiligheid

Laten we wat betreft beveiliging uitgaan van de belangrijkste principes in de context van infrastructuur:

Privacy - Standaardtools van UNIX-achtige systemen zorgen voor de implementatie van dit principe. We scheiden logisch de toegang tot elk logisch gescheiden element van het systeem: een cel. Toegang wordt verleend via standaard gebruikersauthenticatie met behulp van de persoonlijke sleutels van de gebruiker. Alle communicatie tussen en naar de eindcellen vindt plaats in gecodeerde vorm. Dankzij schijfversleuteling hoeven we ons geen zorgen te maken over de veiligheid van gegevens bij het vervangen van een schijf of het migreren naar een andere server. De enige kritische toegang is toegang tot het hostsysteem, aangezien dergelijke toegang doorgaans toegang biedt tot gegevens in containers.

integriteit “De implementatie van dit principe vindt plaats op verschillende niveaus. Ten eerste is het belangrijk op te merken dat in het geval van serverhardware, ECC-geheugen, ZFS al “out of the box” zorgt voor de data-integriteit op het niveau van informatiebits. Met instant snapshots kunt u op elk gewenst moment back-ups maken. Handige tools voor het exporteren/importeren van cellen maken celreplicatie eenvoudig.

Beschikbaarheid - Dit is al optioneel. Hangt af van de mate van je bekendheid en het feit dat je haters hebt. In ons voorbeeld hebben we ervoor gezorgd dat de portemonnee uitsluitend toegankelijk was vanuit het TOP-netwerk. Indien nodig kunt u alles op de firewall blokkeren en uitsluitend via tunnels toegang tot de server toestaan ​​(TOR of VPN is een andere zaak). Zo wordt de server zoveel mogelijk afgesloten van de buitenwereld en kunnen alleen wijzelf de beschikbaarheid ervan beïnvloeden.

Onmogelijkheid van weigering - En dit is afhankelijk van de verdere werking en naleving van het juiste beleid voor gebruikersrechten, toegang etc. Maar met de juiste aanpak worden alle gebruikersacties geaudit en is het dankzij cryptografische oplossingen mogelijk om ondubbelzinnig te identificeren wie bepaalde acties wanneer heeft uitgevoerd.

Uiteraard is de beschreven configuratie geen absoluut voorbeeld van hoe het altijd zou moeten zijn, het is eerder een voorbeeld van hoe het kan zijn, met behoud van zeer flexibele schaal- en aanpassingsmogelijkheden.

Hoe zit het met volledige virtualisatie?

Over volledige virtualisatie met cbsd kunt u dat doen lees hier. Voor mijn werk voeg ik dat gewoon toe bhyve U moet enkele kernelopties inschakelen.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Dus als je plotseling een docker moet starten, installeer dan wat debian en ga aan de slag!

Bitcoin in een kooi?

Dat is alles

Ik denk dat dat alles is wat ik wilde delen. Als je het artikel leuk vond, kun je mij wat bitcoins sturen - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Als je cellen in actie wilt proberen en wat bitcoins wilt hebben, kun je naar mijn gaan lievelingsproject.

Bron: www.habr.com