Bitcoin i et bur?

Det skete sådan, at jeg af erhverv er administrator af computersystemer og netværk (kort sagt: systemadministrator), og jeg fik lejlighed til at fortælle prof. i lidt mere end 10 år. aktiviteterne i en lang række systemer, herunder dem, der kræver [ekstremt] sikkerhedsforanstaltninger. Det skete også, at jeg for noget tid siden fandt det interessant bitcoin, og ikke kun brugte det, men også lanceret flere mikrotjenester for at lære at arbejde selvstændigt med Bitcoin-netværket (aka p2p trods alt) fra en udviklers synspunkt (jeg er selvfølgelig en af ​​dem dev, så jeg gik forbi). Men jeg taler ikke om udvikling, jeg taler om et sikkert og effektivt miljø for applikationer.

Finansiel teknologi (fintech) gå ved siden af ​​informationssikkerhed (INFOSEC) og den første kan fungere uden den anden, men ikke længe. Derfor vil jeg dele min erfaring og det sæt værktøjer, jeg bruger, som omfatter begge dele fintechOg INFOSEC, og på samme tid, og kan også bruges til et bredere eller helt andet formål. I denne artikel vil jeg fortælle dig ikke så meget om Bitcoin, men om infrastrukturmodellen til udvikling og drift af finansielle (og ikke kun) tjenester - med et ord, de tjenester, hvor "B" betyder noget. Dette gælder både for Bitcoin-udvekslingen og for den mest typiske virksomhedszoo af tjenester fra en lille virksomhed, der ikke er forbundet med Bitcoin på nogen måde.

Jeg vil gerne bemærke, at jeg er tilhænger af principperne "hold det dumt enkelt" и "mindre er mere", derfor vil både artiklen og det der er beskrevet i den have de egenskaber, som disse principper handler om.

Imaginært scenarie: Lad os se på alt ved at bruge eksemplet med en bitcoin-veksler. Vi besluttede at lancere udvekslingen af ​​rubler, dollars, euros for bitcoins og tilbage, og vi har allerede en fungerende løsning, men for andre digitale penge som qiwi og webmoney, dvs. Vi har lukket alle juridiske spørgsmål, vi har en færdig applikation, der fungerer som en betalingsgateway for rubler, dollars og euro og andre betalingssystemer. Den er forbundet til vores bankkonti og har en form for API til vores slutapplikationer. Vi har også en webapplikation, der fungerer som en udveksler for brugere, ja, som en typisk qiwi- eller webmoney-konto - opret en konto, tilføj et kort og så videre. Den kommunikerer med vores gateway-applikation, dog via REST API i lokalområdet. Og så besluttede vi at forbinde bitcoins og samtidig opgradere infrastrukturen, fordi... I første omgang blev alt sat op i en fart på virtualboxes på kontoret under bordet... siden begyndte at blive brugt, og vi begyndte at bekymre os om oppetid og ydeevne.

Så lad os starte med det vigtigste - at vælge en server. Fordi virksomheden i vores eksempel er lille, og vi stoler på den hoster (OVH), vi vil vælge en budgetmulighed hvor det er umuligt at installere systemet fra det originale .iso-image, men det gør ikke noget, IT-sikkerhedsafdelingen vil helt sikkert analysere det installerede billede. Og når vi bliver voksne, lejer vi vores eget skab under lås og slå med begrænset fysisk adgang, og måske bygger vi vores eget DC. Under alle omstændigheder er det værd at huske på, at når du lejer hardware og installerer færdige billeder, er der en chance for, at du vil have en "trojaner fra hosteren" hængende på dit system, som i de fleste tilfælde ikke er beregnet til at spionere på dig men for at tilbyde mere bekvemme administrationsværktøjer server.

Server installation

Alt er enkelt her. Vi vælger den hardware, der passer til vores behov. Vælg derefter FreeBSD-billedet. Nå, eller vi forbinder (i tilfælde af en anden hoster og vores egen hardware) via IPMI eller med en skærm og fodrer .iso FreeBSD-billedet ind i download. Til en orkesteropsætning bruger jeg Ansible и mfsbsd. Det eneste, i vores tilfælde med kimsufi, valgte vi specialinstallation for at de to diske i spejlet kun skal have boot- og /home-partitionerne "åbne", vil resten af ​​diskpladsen blive krypteret, men mere om det senere.

Bitcoin i et bur?

Installation af systemet sker på en standard måde, jeg vil ikke dvæle ved dette, jeg vil kun bemærke, at det er værd at være opmærksom på før driften starter hærdning muligheder, det tilbyder bsdinstaller i slutningen af ​​installationen (hvis du selv installerer systemet):

Bitcoin i et bur?

Der er godt materiale om dette emne, vil jeg kort gentage det her.

Det er også muligt at aktivere de ovennævnte parametre på et allerede installeret system. For at gøre dette skal du redigere bootloader-filen og aktivere kerneparametre. *ee er en editor som denne i 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

Du bør også sikre dig, at du har den nyeste version af systemet installeret, og udføre alle opdateringer og opgraderinger. I vores tilfælde kræves for eksempel en opgradering til den nyeste version, fordi... billeder før installation halter seks måneder til et år bagud. Nå, der ændrer vi SSH-porten til noget andet end standardporten, tilføjer nøglegodkendelse og deaktiverer adgangskodegodkendelse.

Så konfigurerer vi aide, overvågning af status for systemkonfigurationsfiler. Du kan læse mere detaljeret her.

pkg install aide

og rediger vores 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

Tænde for systemrevision

sysrc auditd_enable=YES

# service auditd start

Hvordan man administrerer denne sag er perfekt beskrevet i guide.

Nu genstarter vi og fortsætter til softwaren på serveren. Hver server er en hypervisor for containere eller komplette virtuelle maskiner. Derfor er det vigtigt, at processoren understøtter VT-x og EPT, hvis vi planlægger at bruge fuld virtualisering.

Til at administrere containere og virtuelle maskiner bruger jeg cbsd fra olevole, Jeg ønsker ham mere sundhed og velsignelser for dette vidunderlige værktøj!

Containere? Docker igen eller hvad?

Og her ikke. FreeBSD-fængsler er et glimrende værktøj til containerisering, men det nævnte cbsd at orkestrere disse beholdere, som kaldes celler.

Buret er en ekstremt effektiv løsning til opbygning af infrastruktur til en række forskellige formål, hvor fuldstændig isolering af individuelle tjenester eller processer i sidste ende er påkrævet. Grundlæggende er det en klon af værtssystemet, men det kræver ikke fuld hardwarevirtualisering. Og takket være dette bruges ressourcer ikke på "gæsteoperativsystemet", men kun på det arbejde, der udføres. Når celler bruges til interne behov, er dette en meget praktisk løsning til optimal ressourceudnyttelse - en flok celler på én hardwareserver kan hver for sig bruge hele serverressourcen, hvis det er nødvendigt. I betragtning af, at forskellige undertjenester normalt har brug for yderligere. ressourcer på forskellige tidspunkter, kan du udtrække maksimal ydeevne fra én server, hvis du planlægger og afbalancerer cellerne mellem serverne korrekt. Om nødvendigt kan celler også gives begrænsninger på den anvendte ressource.

Bitcoin i et bur?

Hvad med fuld virtualisering?

Som jeg ved, cbsd understøtter arbejdet bhyve og XEN hypervisorer. Jeg har aldrig brugt den anden, men den første er forholdsvis ny hypervisor fra FreeBSD. Vi vil se på et eksempel på brug bhyve i eksemplet nedenfor.

Installation og konfiguration af værtsmiljøet

Vi bruger FS ZFS. Dette er et ekstremt kraftfuldt værktøj til at administrere serverplads. Takket være ZFS kan du direkte bygge arrays af forskellige konfigurationer fra diske, dynamisk "hot" udvide plads, ændre døde diske, administrere snapshots og meget, meget mere, som kan beskrives i en hel serie af artikler. Lad os vende tilbage til vores server og dens diske. I begyndelsen af ​​installationen efterlod vi ledig plads på diskene til krypterede partitioner. Hvorfor det? Dette er for at systemet vågner automatisk og lytter via SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

tilføje en diskpartition til den resterende plads

geli init /dev/ada0p4

indtast vores krypteringsadgangskode

geli attach /dev/ada0p4

Vi indtaster adgangskoden igen, og vi har en enhed /dev/ada0p4.eli - dette er vores krypterede rum. Derefter gentager vi det samme for /dev/ada1 og resten af ​​diskene i arrayet. Og vi skaber en ny ZFS pool.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - Nå, vi har minimumskampsættet klar. Et spejlet array af diske, hvis en af ​​de tre fejler.

Oprettelse af et datasæt på en ny "pulje"

zfs create vms/jails

pkg install cbsd — vi lancerede et team og oprettede ledelse for vores celler.

Efter cbsd installeret, skal det initialiseres:

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

Nå, vi besvarer en masse spørgsmål, for det meste med standardsvar.

*Hvis du bruger kryptering, er det vigtigt, at dæmonen cbsdd startede ikke automatisk, før du dekrypterede diskene manuelt eller automatisk (i vores eksempel er dette gjort af zabbix)

**Jeg bruger heller ikke NAT fra cbsd, og jeg konfigurerer det selv i 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

Opsætning af firewall-politikker er også et separat emne, så jeg vil ikke gå dybt ind i opsætningen af ​​BLOKER ALLE-politikken og opsætning af hvidlister, det kan du gøre ved at læse officiel dokumentation eller nogen af ​​det store antal artikler, der er tilgængelige på Google.

Nå... vi har cbsd installeret, det er tid til at skabe vores første arbejdshest - den burede Bitcoin-dæmon!

cbsd jconstruct-tui

Bitcoin i et bur?

Her ser vi dialogboksen for oprettelse af celler. Når alle værdierne er blevet sat, lad os skabe!

Når du opretter din første celle, bør du vælge, hvad du vil bruge som base for cellerne. Jeg vælger en distribution fra FreeBSD-lageret med kommandoen repo. Dette valg foretages kun, når du opretter den første celle i en specifik version (du kan være vært for celler af enhver version, der er ældre end værtsversionen).

Når alt er installeret, starter vi buret!

# cbsd jstart bitcoind

Men vi skal installere software i buret.

# jls

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

jexec bitcoind for at komme ind i cellekonsollen

og allerede inde i cellen installerer vi softwaren med dens afhængigheder (vores værtssystem forbliver rent)

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

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

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

Der er Bitcoin i buret, men vi har brug for anonymitet, fordi vi vil oprette forbindelse til nogle bure via TOP-netværket. Generelt planlægger vi kun at køre de fleste celler med mistænkelig software via en proxy. Tak til pf Du kan deaktivere NAT for et bestemt område af IP-adresser på det lokale netværk og kun tillade NAT for vores TOR-node. Selv hvis malware kommer ind i cellen, vil den højst sandsynligt ikke kommunikere med omverdenen, og hvis den gør det, vil den ikke afsløre IP'en på vores server. Derfor opretter vi en anden celle til at "viderestille" tjenester som en ".onion"-tjeneste og som en proxy for adgang til internettet til individuelle celler.

# 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

Indstil til at lytte på en lokal adresse (tilgængelig for alle celler)

SOCKSPort 192.168.0.2:9050

Hvad har vi ellers brug for for fuldstændig lykke? Ja, vi har brug for en tjeneste til vores web, måske mere end én. Lad os lancere nginx, som vil fungere som en omvendt proxy og sørge for at forny Let's Encrypt-certifikater

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

Så vi placerede 150 MB afhængigheder i et bur. Og værten er stadig ren.

Lad os vende tilbage til opsætningen af ​​nginx senere, vi skal have to celler mere til vores betalingsgateway på nodejs og rust og en webapplikation, som af en eller anden grund er i Apache og PHP, og sidstnævnte kræver også en MySQL-database.

# 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

...og yderligere 380 MB isolerede pakker

Dernæst downloader vi vores applikation med git og starter den.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

450 MB pakker. i et bur.

her giver vi udvikleren adgang via SSH direkte til cellen, de vil gøre alt der selv:

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

Port 2267 — skift cellens SSH-port til en hvilken som helst vilkårlig

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

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

Tjenesten kører, det eneste der er tilbage er at tilføje reglen til pf firewall

Lad os se, hvilken IP vores celler har, og hvordan vores "lokalområde" generelt ser ud.

# 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

og tilføje en regel

# 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

Nå, da vi er her, lad os også tilføje en regel for omvendt 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

Nå, nu lidt om bitcoins

Det, vi har, er, at vi har en webapplikation, der er eksponeret eksternt, og den taler lokalt til vores betalingsgateway. Nu skal vi forberede et arbejdsmiljø til at interagere med selve Bitcoin-netværket - noden bitcoind det er bare en dæmon, der holder den lokale kopi af blockchain opdateret. Denne dæmon har RPC- og tegnebogsfunktionalitet, men der er mere praktiske "indpakninger" til applikationsudvikling. Til at begynde med besluttede vi at sætte electrum er en CLI-pung. Denne pung vi vil bruge det som "koldlager" for vores bitcoins - generelt de bitcoins, der skal opbevares "uden for" systemet, der er tilgængeligt for brugere og generelt væk fra alle. Den har også en GUI, så vi kommer til at bruge den samme pung på vores
bærbare computere. For nu vil vi bruge Electrum med offentlige servere, og senere vil vi hæve det i en anden celle ElectrumXfor ikke at være afhængig af nogen overhovedet.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

yderligere 700 MB software i vores bur

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 har vi lavet en tegnebog.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

Til vores on-kæde Kun et begrænset antal personer vil være i stand til at oprette forbindelse til tegnebogen fra nu af. For ikke at åbne adgang til denne celle udefra, vil forbindelser via SSH ske gennem TOP (en decentral version af VPN). Vi starter SSH i cellen, men rører ikke vores pf.conf på værten.

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

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

Lad os nu slukke for cellen med tegnebogens internetadgang. Lad os give den en IP-adresse fra et andet undernetrum, der ikke er NATeret. Lad os først ændre os /etc/pf.conf på værten

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" lad os ændre det til JAIL_IP_POOL="192.168.0.0/25", således vil alle adresser 192.168.0.126-255 ikke have direkte adgang til internettet. En slags software "air-gap" netværk. Og NAT-reglen forbliver, som den var

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

Overbelastning af reglerne

# pfctl -f /etc/pf.conf

Lad os nu tage fat på vores celle

# cbsd jconfig jname=electrum

Bitcoin i et bur?

Bitcoin i et bur?

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, men nu holder selve systemet op med at virke for os. Vi kan dog angive en systemproxy. Men der er én ting, på TOR er det en SOCKS5 proxy, og for nemheds skyld vil vi også gerne have en 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

Nå, nu er der to proxy-servere i vores system, og begge udsendes via TOR: socks5://192.168.0.2:9050 og http://192.168.0.6:8123

Nu kan vi konfigurere vores tegnebogsmiljø

# 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

Nå, nu vil skallen arbejde fra under en proxy. Hvis vi vil installere pakker, skal vi tilføje til /usr/local/etc/pkg.conf fra under roden af ​​buret

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

Nå, nu er det tid til at tilføje den skjulte TOR-tjeneste som adressen på vores SSH-tjeneste i tegnebogen.

# 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

Dette er vores forbindelsesadresse. Lad os tjekke fra den lokale maskine. Men først skal vi tilføje vores SSH-nøgle:

wallet@electrum:/ % mkdir ~/.ssh

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

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

Nå, fra en Linux-klientmaskine

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

Lad os forbinde (For at dette skal virke, har du brug for en lokal TOR-dæmon, der lytter på 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!

For at arbejde med øjeblikkelige og mikrobetalinger har vi også brug for en node Lynnetværk, faktisk vil dette være vores vigtigste arbejdsværktøj med Bitcoin. U*c-lynsom vi skal bruge som en dæmon er Sparko plugin, som er en fuldgyldig HTTP (REST)-grænseflade og giver dig mulighed for at arbejde med både off-chain og on-chain transaktioner. c-lightning nødvendig for at fungere bitcoind Men ja.

*Der er forskellige implementeringer af Lightning Network-protokollen på forskellige sprog. Af dem, vi testede, virkede c-lightning (skrevet i C) den mest stabile og ressourceeffektive

# 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

Mens alt nødvendigt er kompileret og installeret, lad os oprette en RPC-bruger til 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

Mit kaotiske skift mellem celler viser sig ikke at være så kaotisk, hvis du bemærker nytten tmux, som giver dig mulighed for at oprette flere terminalundersessioner inden for en session. Analog: screen

Bitcoin i et bur?

Så vi ønsker ikke at afsløre den rigtige IP af vores node, og vi ønsker at udføre alle finansielle transaktioner gennem TOP. Derfor er endnu et .løg ikke nødvendigt.

# 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

Lad os nu oprette en konfiguration til c-lightning

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

lightning@lightning:~ % mkdir .lightning

lightning@lightning:~ % ee .lightning/config

alias=My-LN-Node
bind-addr=192.168.0.7:9735
rgb=ff0000
announce-addr=en5wbkavnytti334jc5uzaudkansypfs6aguv6kech4hbzpcz2ove3yd.onion:9735
network=bitcoin
log-level=info
fee-base=0
fee-per-satoshi=1
proxy=192.168.0.2:9050
log-file=/home/lightning/.lightning/c-lightning.log
min-capacity-sat=200000

# sparko plugin
# https://github.com/fiatjaf/lightningd-gjson-rpc/tree/master/cmd/sparko

sparko-host=192.168.0.7
sparko-port=9737

sparko-tls-path=sparko-tls

#sparko-login=mywalletusername:mywalletpassword

#sparko-keys=masterkey;secretread:+listchannels,+listnodes;secretwrite:+invoice,+listinvoices,+delinvoice,+decodepay,+waitpay,+waitinvoice
sparko-keys=masterkey;secretread:+listchannels,+listnodes;ultrawrite:+invoice,+listinvoices,+delinvoice,+decodepay,+waitpay,+waitinvoice
# for the example above the initialization logs (mixed with lightningd logs) should print something like

lightning@lightning:~ % mkdir .lightning/plugins

lightning@lightning:~ % cd .lightning/plugins/

lightning@lightning:~/.lightning/plugins:% fetch https://github.com/fiatjaf/sparko/releases/download/v0.2.1/sparko_full_freebsd_amd64

lightning@lightning:~/.lightning/plugins % mkdir ~/.lightning/sparko-tls

lightning@lightning:~/.lightning/sparko-tls % cd ~/.lightning/sparko-tls

lightning@lightning:~/.lightning/sparko-tls % openssl genrsa -out key.pem 2048

lightning@lightning:~/.lightning/sparko-tls % openssl req -new -x509 -sha256 -key key.pem -out cert.pem -days 3650

lightning@lightning:~/.lightning/plugins % chmod +x sparko_full_freebsd_amd64

lightning@lightning:~/.lightning/plugins % mv sparko_full_freebsd_amd64 sparko

lightning@lightning:~/.lightning/plugins % cd ~

du skal også oprette en konfigurationsfil til bitcoin-cli, et hjælpeprogram, der kommunikerer med bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

kontrol

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

[
  "test"
]

lancering lightningd

lightning@lightning:~ % lightningd --daemon

Sig selv lightningd du kan styre værktøjet lightning-cli, for eksempel:

lightning-cli newaddr få adressen til en ny indgående betaling

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all send alle pengene i pungen til adressen (alle on-chain-adresser)

Også kommandoer til off-chain operationer lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay etc.

Nå, til kommunikation med applikationen har vi en REST Api

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

Opsummere

# 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 i et bur?

Vi har et sæt containere med hver sit adgangsniveau både fra og til det lokale netværk.

# 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

Som du kan se, optager bitcoind alle 190 GB plads. Hvad hvis vi har brug for en anden node til test? Det er her, ZFS kommer til nytte. Med hjælp cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com du kan oprette et snapshot og vedhæfte en ny celle til dette snapshot. Den nye celle vil have sin egen plads, men kun forskellen mellem den nuværende tilstand og den originale vil blive taget i betragtning i filsystemet (vi sparer mindst 190 GB)

Hver celle er sit eget separate ZFS-datasæt, og det er ekstremt praktisk. ZFS tillader også lave forskellige andre fede ting, som at sende snapshots via SSH. Vi vil ikke beskrive det, der er allerede meget.

Det er også værd at bemærke behovet for fjernovervågning af værten, til disse formål har vi Zabbix.

B - sikkerhed

Med hensyn til sikkerhed, lad os tage udgangspunkt i nøgleprincipperne i forbindelse med infrastruktur:

Privacy Policy - Standardværktøjer af UNIX-lignende systemer sikrer implementeringen af ​​dette princip. Vi adskiller logisk adgang til hvert logisk adskilt element i systemet - en celle. Adgang gives gennem standardbrugergodkendelse ved hjælp af brugernes personlige nøgler. Al kommunikation mellem og til slutcellerne foregår i krypteret form. Takket være diskkryptering behøver vi ikke bekymre os om datasikkerheden, når vi udskifter en disk eller migrerer til en anden server. Den eneste kritiske adgang er adgang til værtssystemet, da sådan adgang generelt giver adgang til data inde i containere.

Integritet ”Implementeringen af ​​dette princip sker på flere forskellige niveauer. For det første er det vigtigt at bemærke, at i tilfælde af serverhardware, ECC-hukommelse, sørger ZFS allerede "out of the box" for dataintegritet på niveau med informationsbits. Øjeblikkelige snapshots giver dig mulighed for at lave sikkerhedskopier når som helst på farten. Praktiske celleeksport-/importværktøjer gør cellereplikering enkel.

tilgængelighed - Dette er allerede valgfrit. Afhænger af graden af ​​din berømmelse og det faktum, at du har hadere. I vores eksempel sikrede vi, at tegnebogen udelukkende var tilgængelig fra TOP-netværket. Hvis det er nødvendigt, kan du blokere alt på firewallen og tillade adgang til serveren udelukkende gennem tunneler (TOR eller VPN er en anden sag). Dermed vil serveren være afskåret fra omverdenen så meget som muligt, og kun vi selv vil kunne påvirke dens tilgængelighed.

Umulighed af afslag - Og dette afhænger af videre drift og overholdelse af de korrekte politikker for brugerrettigheder, adgang mv. Men med den rigtige tilgang bliver alle brugerhandlinger auditeret, og takket være kryptografiske løsninger er det muligt entydigt at identificere, hvem der udførte bestemte handlinger og hvornår.

Den beskrevne konfiguration er naturligvis ikke et absolut eksempel på, hvordan den altid skal være, den er snarere et eksempel på, hvordan den kan være, samtidig med at den bibeholder meget fleksible skalerings- og tilpasningsmuligheder.

Hvad med fuld virtualisering?

Om fuld virtualisering ved hjælp af cbsd kan du læs her. Jeg vil bare tilføje det til arbejdet bhyve Du skal aktivere nogle kerneindstillinger.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Så hvis du pludselig har brug for at starte en docker, så installer noget debian og gå!

Bitcoin i et bur?

Det er alt

Det var vist alt, jeg ville dele. Hvis du kunne lide artiklen, så kan du sende mig nogle bitcoins - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Hvis du vil prøve celler i aktion og have nogle bitcoins, kan du gå til min pet-projekt.

Kilde: www.habr.com