Bitcoin in een kooi?

Het is zo gegaan dat ik beroepsmatig systeem- en netwerkbeheerder ben (kortweg: systeembeheerder), en ik heb in iets meer dan 10 jaar professionele ervaring met de meest uiteenlopende systemen, inclusief die welke [verhoogde|extra] veiligheidsmaatregelen vereisen. En ook is het zo dat ik enige tijd geleden bitcoin interessant vond bitcoin, en het niet alleen heb gebruikt, maar ook verschillende micro-services heb gelanceerd, om zelf te leren werken met het bitcoin-netwerk (het is tenslotte p2p) vanuit het perspectief van een ontwikkelaar (ik ben natuurlijk niet echt een ontwikkelaar, meer van de toeschouwer). Maar ik ben niet hier voor de ontwikkeling, ik praat over een veilige en efficiƫnte omgeving voor toepassingen. , maar volgt geen wijzigingen), gebruikmakend van een andere configuratie.Financiƫle technologieƫn (

fintech) gaan hand in hand met informatiebeveiliging (infosec), en het eerste kan zonder het tweede werken, maar niet lang. Daarom wil ik mijn ervaring en de set tools die ik gebruik delen, die zowel, en tegelijkertijd, kunnen worden gebruikt voor een breder of volledig ander doel. In dit artikel zal ik niet zozeer over bitcoin vertellen, maar over het infrastructuurmodel voor de ontwikkeling en exploitatie van financiƫle (en andere) diensten - met andere woorden, de diensten waar ) gaan hand in hand met informatiebeveiliging (, als voor ), en het eerste kan zonder het tweede werken, maar niet lang. Daarom wil ik mijn ervaring en de set tools die ik gebruik delen, die zowelB een belangrijke rol speelt. Dit is zowel toepasbaar op een bitcoinbeurs als op een typische zakelijke zoo van diensten voor een klein bedrijf dat verder niets met bitcoin te maken heeft.

Ik wil opmerken dat ik voorstander ben van de principes «keep it stupid simple» en «less is more», daarom zullen zowel het artikel als de inhoud ervan eigenschappen bevatten die deze principes weerspiegelen.

Hypothetisch scenario: Laten we alles uitleggen aan de hand van een voorbeeld van een bitcoin exchange. We hebben besloten om een wisselservice voor roebels, dollars en euro's naar bitcoins en terug te starten, en we hebben al een werkende oplossing, maar voor andere digitale valuta zoals Qiwi en WebMoney, dat wil zeggen, we hebben alle juridische kwesties opgelost, er is een kant-en-klaar programma dat als betaalgateway fungeert voor roebels, dollars en euro's en andere betaalsystemen. Het is verbonden met onze bankrekeningen en heeft een soort API voor onze eindtoepassingen. Daarnaast hebben we een webapplicatie die fungeert als exchange voor gebruikers, vergelijkbaar met een typische Qiwi of WebMoney-omgeving — maak een account aan, voeg een kaart toe, enzovoort. Het communiceert met onze gateway-app, laten we zeggen via REST API in de lokale omgeving. En nu hebben we besloten om bitcoins aan te sluiten en ondertussen de infrastructuur op te waarderen, aangezien alles aanvankelijk haastig is opgezet op VirtualBox in het kantoor onder de tafel... de website wordt gebruikt, en we beginnen ons zorgen te maken over uptime en prestaties.

Laten we beginnen met het belangrijkste — de keuze van de server. Aangezien het bedrijf in ons voorbeeld klein is en we de hoster (OVH) vertrouwen, kiezen we een budgetoptie waarop je geen systeem kunt installeren vanaf een origineel .iso-image, maar dat is geen probleem, de IT-beveiligingsafdeling zal het geĆÆnstalleerde image zeker analyseren. En wanneer we groeien, huren we zelfs een eigen kast met een slot en beperkte fysieke toegang, of misschien bouwen we ons eigen datacenter. In ieder geval is het belangrijk om te onthouden dat wanneer je hardware huurt en kant-en-klare images installeert, er een kans is dat er een 'trojan van de hoster' in je systeem zit, die in de meeste gevallen niet bedoeld is om jou te bespioneren, maar om meer handige serverbeheer-tools aan te bieden.

Serverinstallatie

Hier is alles eenvoudig. We kiezen hardware die aan onze behoeften voldoet. Vervolgens kiezen we het FreeBSD-image. Of we verbinden (in het geval van een andere hoster en onze eigen hardware) via IPMI of met een monitor en voeren we het .iso FreeBSD-image in voor de opstart. Voor het orchestreren van de installatie gebruik ik Ansible en mfsbsd. Het enige is, in ons geval met Kimsufi, dat we hebben gekozen voor aangepaste installatie zodat de twee schijven in mirror slechts 'open' zijn voor de opstart- en /home-partities, de rest van de schijfruimte zal versleuteld zijn, maar daarover later meer.

Bitcoin in een kooi?

De installatie van het systeem verloopt op de standaard manier, ik zal hier niet bij stilstaan, maar ik wil alleen opmerken dat u voor het in gebruik nemen aandacht moet besteden aan versteviging de opties die worden aangeboden door bsdinstaller aan het einde van de installatie (als u het systeem zelf installeert):

Bitcoin in een kooi?

Er is goed materiaal over dit onderwerp, kort gezegd, herhaal ik het hier.

De eerder genoemde parameters kunnen ook geactiveerd worden op een reeds geĆÆnstalleerd systeem. Om dit te doen, moet u het opstartbestand bewerken en de kernelparameters inschakelen.*ee is een 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

U moet ook ervoor zorgen dat u de laatste versie van het systeem heeft geĆÆnstalleerd, en alle updates en upgrades uitvoeren. In ons geval is bijvoorbeeld een upgrade naar de laatste versie vereist, omdat de vooraf geĆÆnstalleerde beelden een achterstand van zes maanden tot een jaar hebben. En dan veranderen we de SSH-poort naar iets anders dan de standaard, voegen we sleutelauthenticatie toe en schakelen we wachtwoordauthenticatie uit.

Vervolgens configureren we aide, het monitoren van de status van de configuratiebestanden van het systeem. U kunt hier uitgebreider over lezen here.

pkg install aide

en we bewerken 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

Activeer systeem auditing

sysrc auditd_enable=YES

# service auditd start

Hoe deze zaak te beheren wordt uitstekend beschreven in handleiding.

Laten we nu opnieuw opstarten en beginnen met de software op de server. Elke server fungeert als hypervisor voor containers of volledige virtuele machines. Daarom is het belangrijk dat de processor VT-x en EPT ondersteunt als we volledige virtualisatie willen gebruiken.

Voor het beheer van containers en virtuele machines gebruik ik cbsd van olevole, ik wens hem veel gezondheid en zegeningen voor dit prachtige hulpprogramma!

Containers? Is het weer Docker?

Maar dat is het niet. FreeBSD Jails is een geweldig hulpmiddel voor containerisatie, terwijl de eerder genoemde cbsd is voor de orkestratie van deze containers, die de naam - cellen draagt.

Een container is een uiterst effectieve oplossing voor het opzetten van een infrastructuur voor verschillende doeleinden, waarbij volledige isolatie van afzonderlijke services of processen vereist is. In wezen is het een kloon van het hostsysteem, maar het heeft geen volledige virtualisatie van de hardware nodig. Hierdoor worden de middelen niet verspild aan een 'gast-OS', maar alleen aan het uitgevoerde werk. Wanneer containers voor interne doeleinden worden gebruikt, biedt dit een zeer handige oplossing voor een optimaal gebruik van de middelen — een hoop containers op ƩƩn fysieke server kunnen elk afzonderlijk alle serverbronnen gebruiken indien nodig. Aangezien verschillende subsystems vaak op verschillende tijdstippen extra middelen nodig hebben, kan de maximale prestaties uit ƩƩn server worden gehaald door containers goed te plannen en evenwichtig tussen servers te verdelen. Indien nodig kan aan containers ook een beperking op het gebruik van middelen worden opgelegd.

Bitcoin in een kooi?

En hoe zit het met volledige virtualisatie?

Voor zover ik weet, cbsd ondersteunt het de werking van bhyve en XEN hypervisors. De tweede heb ik nooit gebruikt, maar de eerste is een relatief jonge hypervisor van FreeBSD. We zullen een voorbeeld van gebruik bekijken bhyve in het volgende voorbeeld.

Installatie en configuratie van de hostomgeving

We gebruiken het bestandssysteem ZFS. Dit is een uiterst krachtig instrument voor het beheren van opslag op de server. Met ZFS is het mogelijk om direct vanuit schijven arrays van verschillende configuraties op te zetten, de opslag 'on-the-fly' uit te breiden, defecte schijven te vervangen, snapshots te beheren en nog veel, veel meer dat in een hele serie 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 versleutelde partities. Waarom zo? Dit is zodat het systeem automatisch kan opstarten en via SSH kan luisteren.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

we voegen een partitie toe aan de resterende ruimte

geli init /dev/ada0p4

we voeren ons versleuteling wachtwoord in

geli attach /dev/ada0p4

we voeren opnieuw het wachtwoord in en we krijgen het apparaat /dev/ada0p4.eli — dit is onze versleutelde ruimte. Vervolgens herhalen we hetzelfde voor /dev/ada1 en de andere 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, daar hebben we een minimale strijdset gereed. Een spiegelarray van schijven voor het geval een van de drie defect raakt.

Laten we een dataset maken op een nieuwe "pool"

zfs create vms/jails

pkg install cbsd — we hebben het commando uitgevoerd en installeren het beheer voor onze jails.

Nadat cbsd het is geĆÆnstalleerd, moet het worden geĆÆnitialiseerd:

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

en we antwoorden op een heleboel vragen, vooral met de standaardantwoorden.

*Als je encryptie gebruikt, is het belangrijk dat de daemon cbsdd niet automatisch start, totdat je de schijven handmatig of automatisch (in ons voorbeeld doet zabbix dit) ontsleutelt.

**Ik gebruik ook geen NAT van cbsd, maar 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 voor jails
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC

## Bitcoin netwerk poort doorsturen
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

De configuratie van firewallbeleid is ook een apart onderwerp, dus ik zal niet dieper ingaan op de configuratie van het BLOCK ALL-beleid en de instellingen van whitelist, dit kan gedaan worden door te lezen de officiƫle documentatie of een van de vele artikelen die beschikbaar zijn op Google.

Nou, we hebben cbsd geĆÆnstalleerd, het is tijd om onze eerste werkkracht te creĆ«ren — de Bitcoin-daemon in de jail!

cbsd jconstruct-tui

Bitcoin in een kooi?

Hier zien we de dialoog voor het maken van een jail. Zodra alle waarden zijn ingesteld, creƫren we het!

Bij het maken van de eerste jail moet je kiezen wat je als basis wilt gebruiken voor de jails. Ik kies de distributie uit de FreeBSD-repository met het commando repo. Deze keuze wordt alleen gemaakt bij het creƫren van de eerste jail van een specifieke versie (je kunt jails van elke versie hosten die ouder is dan de hostversie).

Nadat alles is geĆÆnstalleerd, starten we de jail!

# cbsd jstart bitcoind

Maar we moeten software in de jail installeren.

# jls

   JID  IP Adres      Hostnaam                      Pad
     1  192.168.0.1     bitcoind.space.com            /zroot/jails/jails/bitcoind

jexec bitcoind om de console van de jail binnen te komen

en al binnen de jail installeren we de software met de 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

Bitcoin is er in de jail, maar we hebben anonimiteit nodig, omdat we verbinding willen maken met sommige jails via het TOR-netwerk. En we hebben in feite van plan om de meeste jails met verdachte software alleen via een proxy te draaien. Dankzij pf we kunnen NAT voor een bepaald bereik IP-adressen in het lokale netwerk uitschakelen, en NAT alleen toestaan voor onze TOR-knoop. Op deze manier, zelfs als een schadelijk element de cel binnendringt, zal het hoogstwaarschijnlijk geen verbinding maken met de buitenwereld, en als het dat wel doet, zal het ons server-IP niet onthullen. Daarom creƫren we nog een cel voor het 'doorsturen' van diensten zoals '.onion'-diensten en als proxy om een verbinding met het internet voor afzonderlijke cellen mogelijk te maken.

# 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

Laten we instellen dat deze op het lokale adres luistert (voor alle cellen beschikbaar)

SOCKSPort 192.168.0.2:9050

Wat missen we nog voor volledig geluk? Ja, we hebben een dienst nodig voor onze webomgeving, misschien zelfs meer dan ƩƩn. Laten we nginx starten, dat als reverse-proxy zal fungeren en zorgt voor de verlenging 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 zo hebben we 150 MB aan afhankelijkheden in de cel geplaatst. En de host is nog steeds schoon.

Laten we later terugkomen op de configuratie van nginx, we moeten nog twee cellen opzetten voor onze betalingsgateway op nodejs en rust, en een webapplicatie die om de een of andere reden op apache en php draait, en voor de laatste hebben we een MySQL-database nodig.

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

verder downloaden we onze applicatie met git en starten we deze op.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

450 MB aan pakketten. in de cel.

hier geven we de ontwikkelaars toegang via SSH rechtstreeks in de cel, zij kunnen daar zelf alles doen:

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

Port 2267 — we veranderen de SSH-poort van de cel naar een willekeurige waarde

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

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

Nou, de service is gestart, we moeten alleen nog een regel toevoegen aan de pf firewall

Laten we kijken welke IP's onze cellen hebben en hoe onze 'lokale' netwerk eruit ziet

# jls

   JID  IP Adres      Hostnaam                      Pad
     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 we zullen een regel toevoegen

# 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

nou en aangezien we hier zijn, voegen we ook een regel toe aan de 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

Nou, nu iets over bitcoins

Wat we hebben — we hebben een webapplicatie die van buitenaf toegankelijk is, en het communiceert lokaal met onze betalingsgateway. Nu moeten we een werkomgeving voorbereiden om interactie te hebben met het bitcoin-netwerk zelf — de node bitcoind dit is slechts een demon die een lokale kopie van de actuele blockchain ondersteunt. Deze demon heeft RPC en portemonnee-functionaliteit, maar voor het ontwikkelen van toepassingen zijn er handigere Ā«wrappersĀ». Laten we beginnen met het installeren van electrum — dit is een CLI-portemonnee. Deze portemonnee zullen we gebruiken als Ā«cold storageĀ» voor onze bitcoins — in feite de bitcoins die ā€˜buiten’ het systeem dat toegankelijk is voor gebruikers moeten worden opgeslagen en zo ver mogelijk verwijderd van iedereen. Het heeft ook een GUI, dus we zijn van plan een soortgelijke portemonnee te gebruiken op onze
laptops. Voorlopig zullen we electrum gebruiken met openbare servers, en later zullen we nog een andere instantie opzetten ElectrumX, zodat we volledig onafhankelijk zijn.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

nog eens 700 MB software hebben we in de cel

electrum:/@[8:53] # adduser

Gebruikersnaam: wallet
Volledige naam: 
Uid (Laat leeg voor standaard): 
Login groep [wallet]: 
Login groep is wallet. Wil je wallet in andere groepen uitnodigen? []: 
Login klasse [default]: 
Shell (sh csh tcsh nologin) [sh]: tcsh
Hometrirectory [home/wallet]: 
Hometrirectory-permissies (Laat leeg voor standaard): 
Gebruik je wachtwoordgebaseerde authenticatie? [ja]: nee
Vergrendel je het account na aanmaak? [nee]: 
Gebruikersnaam   : wallet
Wachtwoord   : 
Volledige naam  : 
Uid        : 1001
Klasse      : 
Groepen     : wallet 
Hometrirectory       : /home/wallet
Hometrirectory-modus  : 
Shell      : /bin/tcsh
Vergrendeld     : nee
OK? (ja/nee): ja
adduser: INFO: Succesvol toegevoegd (wallet) aan de gebruikersdatabase.
Nog een gebruiker toevoegen? (ja/nee): nee
Vaarwel!
electrum:/@[8:53] # su wallet

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

wallet@electrum:/ % electrum-3.6 create

{
    "msg": "Houd je seed op een veilige plaats; als je deze verliest, kun je je portemonnee niet herstellen.",
    "path": "/usr/home/wallet/.electrum/wallets/default_wallet",
    "seed": "jaloerse win pig materiaal lint jong punch visuele okƩ cactus random vogel"
}

We hebben nu een portemonnee gemaakt.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

Voor onze on-chain portemonnee zal alleen een beperkte groep mensen verbinding kunnen maken. Om toegang van buitenaf naar deze cel te voorkomen, zullen verbindingen via SSH plaatsvinden via TOR (een gedecentraliseerde variant van VPN). We starten SSH in de cel, maar we raken onze pf.conf op de host niet aan.

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

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

Nu schakelen we de cel met de portemonnee uit van het internet. We geven het een IP-adres uit een ander subnet dat niet NAT't. Eerst vervangen we /etc/pf.conf op de host

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" vervangen door JAIL_IP_POOL="192.168.0.0/25", zodat alle adressen 192.168.0.126-255 geen directe toegang tot internet hebben. Een soort softwarematige "air-gap" netwerk. En de NAT-regel blijft zoals die was.

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

Laten we de regels opnieuw laden.

# pfctl -f /etc/pf.conf

Laten we nu aan onze cel beginnen.

# cbsd jconfig jname=electrum

Bitcoin in een kooi?

Bitcoin in een kooi?

jset mode=quiet jname=electrum ip4_addr="192.168.0.200"
Verwijder oud IP: /sbin/ifconfig em0 inet 192.168.0.6 -alias
Stel nieuw IP in: /sbin/ifconfig em0 inet 192.168.0.200 alias
ip4_addr: 192.168.0.200

Hmmm, maar nu zal ons systeem zelf ook stoppen met werken. We kunnen echter de systeemproxy opgeven. Maar er is een maar, in TOR is dit een SOCKS5-proxy, en voor de gebruiksvriendelijkheid 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

Zo, nu hebben we twee proxyservers in ons systeem, en beide gaan via TOR: socks5://192.168.0.2:9050 en http://192.168.0.6:8123

Nu kunnen we de omgeving van onze wallet instellen.

# 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

nou, nu zal de shell werken via de proxy. Als we pakketten willen installeren, moeten we dit toevoegen aan /usr/local/etc/pkg.conf vanuit de root van de cel.

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

En nu is het tijd om de TOR hidden service toe te voegen als het adres van onze SSH-service in de walletcel.

# 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

Hier is ons adres voor verbinding. Laten we het testen 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

En vanaf de client Linux-machine

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

Verbinden (Om dit te laten werken, is een lokale TOR-daemon nodig die luistert op 9050)

user@local ~$ ssh remotebtc

De authenticiteit van de host 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion ()' kan niet worden vastgesteld.
ECDSA sleutelvingerafdruk is SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4.
Weet u zeker dat u wilt doorverbinden (ja/nee/[vingerafdruk])? ja
Waarschuwing: 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion' (ECDSA) permanent toegevoegd aan de lijst van bekende hosts.
FreeBSD 12.1-RELEASE-p1 GENERIC 
Om schijfruimte in uw home directory te besparen, comprimeert u bestanden die u zelden gebruikt met "gzip bestandsnaam".
        -- Dru 
wallet@electrum:~ % logout

Succes!

Voor het werken met instant- en microbetalingen hebben we ook een node nodig. Lightning Network, dit zal in feite onze belangrijkste werktool met Bitcoin zijn. U *c-lightning, die we willen gebruiken als demon, heeft de Sparko-plugin, die een volledige HTTP (REST) interface biedt en zowel met off-chain als on-chain transacties kan werken. c-lightning voor het functioneren heeft het een bitcoind node nodig.

*Er zijn verschillende implementaties van het Lightning Network-protocol in verschillende programmeertalen. Van de testen die we hebben uitgevoerd, leek c-lightning (geschreven in C) de meest stabiele en resource-efficiƫnte.

# cbsd jsconstruct-tui

# cbsd jstart cln

# jexec cln

lightning:/@[10:23] # adduser

Gebruikersnaam: 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 alles nodig te compileren en te installeren, creƫren we een RPC-gebruiker voor lightningd in bitcoind

# jexec bitcoind

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

rpcbind=192.168.0.1
rpcuser=test
rpcpassword=test
# alleen c-lightning toestaan
rpcallowip=192.168.0.7/32

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

Mijn chaotische overschakelingen tussen cellen blijken helemaal niet zo chaotisch te zijn als we de utility markeren, tmux, die het mogelijk maakt om binnen ƩƩn sessie meerdere subsessies van terminals te creƫren. Vergelijkbaar met: screen

Bitcoin in een kooi?

Nou, we willen ons echte IP van onze node niet onthullen en willen alle financiƫle transacties via TOR uitvoeren. Daarom hebben we nog een .onion 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 de configuratie voor c-lightning aanmaken

lightning:/home/lightning/lightning@[10:31] # su lightning

lightning@lightning:~ % mkdir .lightning

lightning@lightning:~ % ee .lightning/config

alias=Mijn-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
# voor het voorbeeld hierboven zouden de initialisatie logs (gemengd met lightningd logs) iets moeten printen als

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, de tool die communiceert met bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

we controleren

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

[
  "test"
]

starten we lightningd

lightning@lightning:~ % lightningd --daemon

werkt niet, omdat lightningd je kunt de tool beheren lightning-cli, bijvoorbeeld:

lightning-cli newaddr ontvang een adres voor een nieuwe inkomende betaling

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all verzend alle geld van de portemonnee naar het adres (alle on-chain adressen)

Ook zijn er commando's voor off-chain operaties lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay enz.

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'

Laten we de resultaten samenvatten

# jls

   JID  IP Adres      Hostnaam                      Pad
     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 hebben een reeks containers, elk met zijn eigen toegangsniveau zowel naar als vanuit het lokale netwerk.

# zfs list

NAAM                    GEBRUIKT  BESCHIKBAAR  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 je kunt zien, neemt bitcoind alle 190 GB ruimte in beslag. En wat als we nog een node nodig hebben voor tests? Hier komt ZFS goed van pas. Met behulp van cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com Je kunt een snapshot maken en een nieuwe cel aan dit snapshot koppelen. De nieuwe cel heeft volledig zijn eigen ruimte, maar in het bestandssysteem wordt alleen het verschil tussen de huidige staat en het origineel in aanmerking genomen (minimaal 190 GB besparen).

Elke cel is een aparte ZFS-dataset en dat is uiterst handig. ZFS maakt ook mogelijk verschillende andere coole dingen te doen, zoals het verzenden van snapshots via SSH. We zullen dit niet beschrijven, er is al genoeg gezegd.

Het is ook belangrijk om de noodzaak van externe monitoring van de host op te merken, hiervoor hebben we Zabbix.

B - veiligheid

Wat betreft veiligheid, laten we uitgaan van de kernprincipes in de context van infrastructuur:

Privacy — Standaardtools van UNIX-achtige systemen zorgen voor de uitvoering van dit principe. We splitsen de toegang logisch naar elk logisch afzonderlijk element van het systeem — de cel. Toegang gebeurt via standaard gebruikersauthenticatie met persoonlijke sleutels. Alle communicatie tussen en naar de eindcellen gebeurt versleuteld. Dankzij schijfversleuteling hoeven we ons geen zorgen te maken over gegevensbehoud tijdens het vervangen van een schijf of migratie naar een andere server. De enige kritieke toegang is toegang tot het host-systeem, omdat deze toegang doorgaans toegang tot gegevens binnen de containers mogelijk maakt.

Integriteit — De uitvoering van dit principe gebeurt op verschillende niveaus. Ten eerste is het belangrijk op te merken dat in het geval van serverhardware, ECC-geheugen, ZFS al 'uit de doos' zorgt voor de integriteit van gegevens op het niveau van bits. Instantane snapshots maken het mogelijk om op elk moment live een back-up te maken. Handige export- en importtools voor cellen maken het eenvoudig om cellen te repliceren.

Beschikbaarheid — Dit is al optioneel. Het hangt af van hoe bekend je bent en of je vijanden hebt. In ons voorbeeld hebben we de beschikbaarheid van de portemonnee uitsluitend vanuit het TOR-netwerk gewaarborgd. Indien nodig kan je de firewall zo configureren dat alles wordt geblokkeerd en toegang tot de server alleen via tunnels wordt toegestaan (TOR of VPN is een ander onderwerp). Hierdoor wordt de server zoveel mogelijk afgesneden van de buitenwereld, en kunnen alleen wij de beschikbaarheid beĆÆnvloeden.

Onvoorziene weigering — Dit hangt af van het verdere gebruik en het naleven van de juiste beleidsregels voor gebruikersrechten, toegang enzovoort. Maar met de juiste aanpak worden al onze acties van gebruikers geaudit en dankzij cryptografische oplossingen is het mogelijk om precies te identificeren wie wanneer welke actie heeft ondernomen.

Natuurlijk is de beschreven configuratie geen absoluut voorbeeld van hoe het altijd moet zijn; het is eerder een van de voorbeelden van hoe het kan zijn, met behoud van zeer flexibele mogelijkheden voor schaling en maatwerk.

En hoe zit het met volledige virtualisatie?

Over volledige virtualisatie met cbsd gesproken, hier te lezen. Ik voeg alleen toe dat voor het werk, bhyve bepaalde kernelparameters moeten worden ingeschakeld.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="JA"
...

Dus als er plotseling behoefte is om Docker te gebruiken, dan starten we een of andere Debian en gaan we ervoor!

Bitcoin in een kooi?

Dat is alles.

Dit is eigenlijk alles wat ik wilde delen. Als je het artikel leuk vond, kun je me Bitcoin sturen — bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Als je de cellen in actie wilt proberen en een beetje Bitcoin hebt, kun je mijn pet-project.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster