Bitcoin narve?

Taip jau susiklostė, kad pagal profesiją esu kompiuterinių sistemų ir tinklų administratorius (trumpiau: sistemos administratorius), o kiek daugiau nei 10 metų turėjau galimybę pasakyti prof. įvairių sistemų veikla, įskaitant tas, kurioms reikalingos [ekstremalios] saugumo priemonės. Taip pat atsitiko, kad prieš kurį laiką man tai buvo įdomu bitkoinas, ir ne tik juo pasinaudojo, bet ir paleido kelias mikropaslaugas, siekdamas išmokti savarankiškai dirbti su Bitcoin tinklu (visgi dar žinomas kaip p2p) kūrėjo požiūriu (aišku, esu vienas iš tų dev, taigi, ėjau pro šalį). Bet aš nekalbu apie plėtrą, aš kalbu apie saugią ir efektyvią aplinką programoms.

Finansinės technologijos (fintech) pereiti prie informacijos saugumo (infosek) ir pirmasis gali veikti be antrojo, bet neilgai. Todėl noriu pasidalinti savo patirtimi ir naudojamų įrankių rinkiniu, kuris apima abu fintechIr infosek, ir tuo pačiu, taip pat gali būti naudojamas platesnei ar visiškai kitokiam tikslui. Šiame straipsnyje papasakosiu ne tiek apie Bitcoin, kiek apie finansinių (ir ne tik) paslaugų kūrimo ir veiklos infrastruktūros modelį – žodžiu, apie tas paslaugas, kuriose svarbus „B“. Tai taikoma ir Bitcoin biržai, ir tipiškiausiam mažos įmonės, niekaip nesusijusios su Bitcoin, paslaugų zoologijos sodui.

Noriu pažymėti, kad esu principų šalininkas "laikyk tai kvaila paprasta" и "mažiau yra daugiau", todėl ir straipsnis, ir tai, kas jame aprašyta, turės tas savybes, apie kurias kalba šie principai.

Įsivaizduojamas scenarijus: Pažvelkime į viską naudodami bitkoinų keitiklio pavyzdį. Nusprendėme pradėti keisti rublius, dolerius, eurus į bitkoinus ir atgal, ir jau turime veikiantį sprendimą, bet į kitus skaitmeninius pinigus kaip qiwi ir webmoney, t.y. Išsprendėme visus teisinius klausimus, turime paruoštą programą, kuri tarnauja kaip mokėjimo vartai rubliais, doleriais ir eurais bei kitomis mokėjimo sistemomis. Jis susietas su mūsų banko sąskaitomis ir turi tam tikrą API, skirtą mūsų galinėms programoms. Taip pat turime žiniatinklio programą, kuri veikia kaip vartotojų mainai, na, kaip įprasta qiwi ar webmoney sąskaita – susikurkite paskyrą, pridėkite kortelę ir pan. Jis palaiko ryšį su mūsų šliuzo programa, nors ir per REST API vietinėje srityje. Taigi nusprendėme prijungti bitkoinus ir tuo pačiu atnaujinti infrastruktūrą, nes... Iš pradžių viskas buvo paskubomis išdėliota virtualiose dėžėse biure po stalu... svetainė pradėjo naudotis, pradėjome nerimauti dėl veikimo laiko ir našumo.

Taigi, pradėkime nuo pagrindinio dalyko – serverio pasirinkimo. Nes mūsų pavyzdyje pateiktas verslas yra mažas ir mes pasitikime prieglobos prieglobsčiu (OVH), kurį pasirinksime biudžeto variantas kuriame neįmanoma įdiegti sistemos iš originalaus .iso vaizdo, bet nesvarbu, IT saugos skyrius būtinai išanalizuos įdiegtą vaizdą. O kai užaugsime, paprastai nuomosime savo spintą su rakinama ir ribota fizine prieiga, o galbūt pasistatysime savo nuolatinę srovę. Bet kokiu atveju verta prisiminti, kad nuomojant techninę įrangą ir diegiant paruoštus vaizdus, ​​yra tikimybė, kad jūsų sistemoje kabės „Trojos arklys iš prieglobos“, kuris daugeliu atvejų nėra skirtas jūsų šnipinėjimui. bet pasiūlyti patogesnius valdymo įrankius serverį.

Serverio diegimas

Čia viskas paprasta. Mes pasirenkame įrangą, kuri atitinka mūsų poreikius. Tada pasirinkite FreeBSD vaizdą. Na, arba jungiamės (kito prieglobos ir savo techninės įrangos atveju) per IPMI arba su monitoriumi ir įkeliame .iso FreeBSD vaizdą į atsisiuntimą. Aš naudoju orkestro sąrankai Galimas и mfsbsd. Vienintelį dalyką, mūsų atveju su kimsufi, pasirinkome Pasirinktinis diegimas tam, kad veidrodyje esantys du diskai būtų „atidaryti“ tik įkrovos ir /home skaidiniai, likusi disko vieta bus užšifruota, bet apie tai vėliau.

Bitcoin narve?

Sistemos diegimas vyksta standartiniu būdu, aš apie tai nesigilinsiu, tik pažymėsiu, kad prieš pradedant eksploatuoti verta atkreipti dėmesį į grūdinimas siūlomų variantų bsdinstaller diegimo pabaigoje (jei sistemą įdiegiate patys):

Bitcoin narve?

Yra gera medžiaga šia tema čia trumpai pakartosiu.

Taip pat galima įjungti aukščiau minėtus parametrus jau įdiegtoje sistemoje. Norėdami tai padaryti, turite redaguoti įkrovos failą ir įjungti branduolio parametrus. *ee yra BSD redaktorius

# 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

Taip pat turėtumėte įsitikinti, kad įdiegta naujausia sistemos versija ir atlikti visus atnaujinimus ir atnaujinimus. Pavyzdžiui, mūsų atveju reikia atnaujinti į naujausią versiją, nes... vaizdai prieš įdiegimą atsilieka nuo šešių mėnesių iki metų. Na, mes pakeičiame SSH prievadą į kažką kitokio nei numatytojo, pridedame rakto autentifikavimą ir išjungiame slaptažodžio autentifikavimą.

Tada konfigūruojame aide, stebi sistemos konfigūracijos failų būseną. Išsamiau galite perskaityti čia.

pkg install aide

ir redaguoti mūsų 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

Įjunkite sistemos auditas

sysrc auditd_enable=YES

# service auditd start

Kaip sutvarkyti šį reikalą, puikiai aprašyta vadovavimas.

Dabar paleidžiame iš naujo ir pereiname prie programinės įrangos serveryje. Kiekvienas serveris yra konteinerių arba pilnų virtualių mašinų hipervizorius. Todėl svarbu, kad procesorius palaikytų VT-x ir EPT, jei planuojame naudoti pilną virtualizaciją.

Naudoju konteineriams ir virtualiosioms mašinoms valdyti cbsd nuo olevole, linkiu jam daugiau sveikatos ir palaiminimų šiam nuostabiam įrankiui!

Konteineriai? Vėl Dokeris ar kaip?

Bet ne. FreeBSD kalėjimai yra puiki priemonė konteinerizavimui, tačiau minėta cbsd orkestruoti šiuos konteinerius, kurie vadinami ląstelėmis.

Narvas yra itin efektyvus sprendimas kuriant infrastruktūrą įvairiems tikslams, kai galiausiai reikalinga visiška atskirų paslaugų ar procesų izoliacija. Iš esmės tai yra pagrindinės sistemos klonas, tačiau jam nereikia visos aparatinės įrangos virtualizacijos. Ir dėl to ištekliai išleidžiami ne „svečio OS“, o tik atliekamam darbui. Kai ląstelės naudojamos vidiniams poreikiams, tai yra labai patogus sprendimas optimaliam resursų naudojimui – krūva celių viename aparatiniame serveryje gali prireikus kiekviena atskirai naudoti visą serverio resursą. Atsižvelgiant į tai, kad dažniausiai skirtingoms subpaslaugoms reikia papildomų. išteklius skirtingu laiku, galite išgauti maksimalų vieno serverio našumą, jei tinkamai suplanuosite ir subalansuosite ląsteles tarp serverių. Jei reikia, langeliams taip pat gali būti taikomi naudojamų išteklių apribojimai.

Bitcoin narve?

Ką apie visišką virtualizaciją?

Kiek žinau cbsd palaiko darbą bhyve ir XEN hipervizoriai. Antrojo niekada nenaudojau, bet pirmasis palyginti naujas hipervizorius iš FreeBSD. Pažiūrėsime į naudojimo pavyzdį bhyve toliau pateiktame pavyzdyje.

Prieglobos aplinkos diegimas ir konfigūravimas

Mes naudojame FS ZFS. Tai itin galingas serverio vietos valdymo įrankis. Dėka ZFS galite tiesiogiai kurti įvairių konfigūracijų masyvus iš diskų, dinamiškai „karštai“ išplėsti erdvę, keisti negyvus diskus, tvarkyti momentines nuotraukas ir daug, daug daugiau, ką galima aprašyti visoje straipsnių serijoje. Grįžkime prie savo serverio ir jo diskų. Diegimo pradžioje diskuose palikome laisvos vietos šifruotiems skaidiniams. Kodėl taip? Tai daroma tam, kad sistema atsibustų automatiškai ir klausytųsi per SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

pridėti disko skaidinį prie likusios vietos

geli init /dev/ada0p4

įveskite mūsų šifravimo slaptažodį

geli attach /dev/ada0p4

Dar kartą įvedame slaptažodį ir turime įrenginį /dev/ada0p4.eli – tai mūsų užšifruota erdvė. Tada tą patį pakartojame /dev/ada1 ir likusiems masyvo diskams. Ir sukuriame naują ZFS baseinas.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - Na, mes turime paruošę minimalų kovos komplektą. Veidrodinis diskų masyvas, jei vienas iš trijų sugestų.

Duomenų rinkinio sukūrimas naujame „banke“

zfs create vms/jails

pkg install cbsd — sukūrėme komandą ir nustatėme savo ląstelių valdymą.

Po cbsd įdiegtas, jį reikia inicijuoti:

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

Na, mes atsakome į daugybę klausimų, dažniausiai pateikiame numatytuosius atsakymus.

*Jei naudojate šifravimą, svarbu, kad demonas cbsdd neprasidėjo automatiškai, kol neiššifravote diskų rankiniu būdu arba automatiškai (mūsų pavyzdyje tai atlieka zabbix)

**Aš taip pat nenaudoju NAT nuo cbsd, ir aš pats ją konfigūruoju 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

Užkardos politikos nustatymas taip pat yra atskira tema, todėl nesigilinsiu į strategijos BLOKUOTI VISKĄ ir baltųjų sąrašų nustatymą, tai galite padaryti perskaitę oficialius dokumentus arba bet kurį iš daugybės „Google“ pasiekiamų straipsnių.

Na... mes įdiegėme cbsd, laikas sukurti savo pirmąjį darbinį arkliuką – narvelį įkalintą Bitcoin demoną!

cbsd jconstruct-tui

Bitcoin narve?

Čia matome langelio kūrimo dialogą. Nustačius visas vertybes, kurkime!

Kurdami pirmąjį langelį turėtumėte pasirinkti, ką naudoti kaip langelių pagrindą. Pasirenku distribuciją iš FreeBSD saugyklos su komanda repo. Šis pasirinkimas atliekamas tik kuriant pirmą konkrečios versijos langelį (galite priimti bet kurios versijos, senesnės už pagrindinio kompiuterio versiją, langelius).

Viską sumontavus, paleidžiame narvą!

# cbsd jstart bitcoind

Bet mes turime įdiegti programinę įrangą narve.

# jls

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

jexec bitcoind patekti į ląstelių konsolę

ir jau ląstelės viduje įdiegiame programinę įrangą su jos priklausomybėmis (mūsų pagrindinė sistema išlieka švari)

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

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

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

Narve yra Bitcoin, bet mums reikia anonimiškumo, nes norime prisijungti prie kai kurių narvų per TOP tinklą. Apskritai, daugumą ląstelių su įtartina programine įranga planuojame paleisti tik per tarpinį serverį. Ačiū pf Galite išjungti NAT tam tikram IP adresų diapazonui vietiniame tinkle ir leisti NAT tik mūsų TOR mazgui. Taigi, net jei kenkėjiška programa pateks į ląstelę, ji greičiausiai nebendraus su išoriniu pasauliu, o jei taip, tai neatskleis mūsų serverio IP. Todėl sukuriame kitą langelį, kad galėtume „persiųsti“ paslaugas kaip „.onion“ paslaugą ir kaip tarpinį serverį, skirtą prieiti prie interneto prie atskirų langelių.

# 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

Nustatyti klausytis vietiniu adresu (galima visuose langeliuose)

SOCKSPort 192.168.0.2:9050

Ko dar reikia pilnai laimei? Taip, mums reikia savo žiniatinklio paslaugos, galbūt daugiau nei vienos. Paleiskime nginx, kuris veiks kaip atvirkštinis tarpinis serveris ir pasirūpins Let's Encrypt sertifikatų atnaujinimu

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

Taigi į narvą įdėjome 150 MB priklausomybių. O šeimininkas vis dar švarus.

Grįžkime prie nginx nustatymo vėliau, turime pakelti dar du langelius mūsų mokėjimo šliuzui ant nodejs ir rust ir žiniatinklio aplikacijos, kuri kažkodėl yra Apache ir PHP, o pastarajai taip pat reikalinga MySQL duomenų bazė.

# 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

...ir dar 380 MB atskirtų paketų

Tada atsisiunčiame savo programą su git ir paleidžiame ją.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

450 MB paketai. narve.

čia suteikiame kūrėjui prieigą per SSH tiesiai į langelį, jie ten viską padarys patys:

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

Port 2267 - pakeiskite ląstelės SSH prievadą į bet kurį savavališką

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

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

Na, paslauga veikia, belieka pridėti taisyklę pf užkarda

Pažiūrėkime, kokį IP turi mūsų ląstelės ir kaip apskritai atrodo mūsų „vietinė sritis“.

# 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

ir pridėkite taisyklę

# 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

Na, kadangi esame čia, taip pat pridėkime atvirkštinio tarpinio serverio taisyklę:

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

Na, o dabar šiek tiek apie bitkoinus

Mes turime žiniatinklio programą, kuri veikia išorėje ir vietiniu mastu bendrauja su mūsų mokėjimo šliuzu. Dabar turime paruošti darbo aplinką sąveikai su pačiu Bitcoin tinklu – mazgu bitcoind tai tik demonas, kuris nuolat atnaujina vietinę blokų grandinės kopiją. Šis demonas turi RPC ir piniginės funkcionalumą, tačiau yra ir patogesnių programų kūrimo „įvyniojimų“. Pirmiausia nusprendėme įdėti electrum yra CLI piniginė. Ši piniginė mes naudosime jį kaip „šaltąją saugyklą“ savo bitkoinams – apskritai tuos bitkoinus, kuriuos reikės saugoti „už“ sistemos, pasiekiamos vartotojams ir paprastai toli nuo visų. Ji taip pat turi GUI, todėl tą pačią piniginę naudosime ir savo
nešiojamieji kompiuteriai. Kol kas Electrum naudosime su viešaisiais serveriais, o vėliau kelsime kitame langelyje ElectrumXkad visiškai nuo nieko nepriklausytų.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

dar 700 MB programinės įrangos mūsų narve

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

Dabar turime sukurtą piniginę.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

Mūsų ant grandinės Nuo šiol prie piniginės galės prisijungti tik ribotas skaičius žmonių. Kad nebūtų atidaryta prieiga prie šio langelio iš išorės, ryšiai per SSH vyks per TOP (decentralizuota VPN versija). Paleidžiame SSH langelyje, bet neliečiame pagrindinio kompiuterio mūsų pf.conf.

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

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

Dabar išjunkite mobilųjį telefoną su piniginės interneto prieiga. Suteikime jam IP adresą iš kitos potinklio erdvės, kuri nėra NAT. Pirmiausia pasikeiskime /etc/pf.conf ant šeimininko

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" pakeiskime į JAIL_IP_POOL="192.168.0.0/25", taigi visi adresai 192.168.0.126-255 neturės tiesioginės prieigos prie interneto. Tam tikras programinės įrangos „oro tarpo“ tinklas. Ir NAT taisyklė lieka tokia, kokia buvo

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

Taisyklių perkrovimas

# pfctl -f /etc/pf.conf

Dabar paimkime savo kamerą

# cbsd jconfig jname=electrum

Bitcoin narve?

Bitcoin narve?

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, bet dabar pati sistema pas mus nustos veikti. Tačiau galime nurodyti sistemos tarpinį serverį. Tačiau yra vienas dalykas, TOR tai yra SOCKS5 tarpinis serveris, o patogumui taip pat norėtume HTTP tarpinio serverio.

# 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

Na, dabar mūsų sistemoje yra du tarpiniai serveriai ir abu išveda per TOR: socks5://192.168.0.2:9050 ir http://192.168.0.6:8123

Dabar galime konfigūruoti savo piniginės aplinką

# 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

Na, dabar apvalkalas veiks iš tarpinio serverio. Jei norime įdiegti paketus, turėtume pridėti prie /usr/local/etc/pkg.conf iš po narvo šaknies

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

Na, dabar laikas pridėti paslėptą TOR paslaugą kaip mūsų SSH paslaugos adresą piniginės langelyje.

# 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

Tai mūsų ryšio adresas. Patikrinkime iš vietinės mašinos. Bet pirmiausia turime pridėti savo SSH raktą:

wallet@electrum:/ % mkdir ~/.ssh

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

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

Na, iš Linux kliento mašinos

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

Prisijunkite (Kad tai veiktų, jums reikia vietinio TOR demono, kuris klausosi 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

Sėkmė!

Norint dirbti su momentiniais ir mikro mokėjimais, mums taip pat reikia mazgo Žaibų tinklas, iš tikrųjų tai bus mūsų pagrindinis darbo įrankis su Bitcoin. U*c-žaibaskurį naudosime kaip demoną Sparko įskiepis, kuri yra visavertė HTTP (REST) ​​sąsaja ir leidžia dirbti tiek su grandine, tiek su grandinės operacijomis. c-lightning reikalingas funkcionavimui bitcoind bet taip.

*Yra įvairių „Lightning Network“ protokolo įdiegimų skirtingomis kalbomis. Iš tų, kuriuos išbandėme, c-lightning (parašyta C) atrodė stabiliausias ir efektyviausias išteklius

# 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

Kol viskas, ko reikia, yra sukompiliuota ir įdiegta, sukurkime RPC vartotoją 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

Mano chaotiškas perjungimas tarp langelių pasirodo ne toks chaotiškas, jei atkreipsite dėmesį į naudingumą tmux, kuri leidžia sukurti kelis terminalo poseansus per vieną sesiją. Analogas: screen

Bitcoin narve?

Taigi, mes nenorime atskleisti tikrojo savo mazgo IP, o norime atlikti visas finansines operacijas per TOP. Todėl kito .svogūno nereikia.

# 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

Dabar sukurkime c-lightning konfigūraciją

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 ~

taip pat turite sukurti bitcoin-cli konfigūracijos failą, programą, kuri palaiko ryšį bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

patikrinti

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

[
  "test"
]

paleisti lightningd

lightning@lightning:~ % lightningd --daemon

Pats lightningd galite valdyti naudingumą lightning-cli, pavyzdžiui:

lightning-cli newaddr gauti naujo gaunamo mokėjimo adresą

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all siųsti visus piniginėje esančius pinigus nurodytu adresu (visi tinkle esantys adresai)

Taip pat komandos off-chain operacijoms lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay tt

Na, bendravimui su programa turime REST Api

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

Apibendrinant

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

Turime konteinerių rinkinį, kurių kiekvienas turi savo prieigos lygį tiek iš vietinio tinklo, tiek prie jo.

# 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

Kaip matote, bitcoind užima visus 190 GB vietos. Ką daryti, jei mums reikia kito mazgo testams? Čia praverčia ZFS. Su pagalba cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com galite sukurti momentinę nuotrauką ir prie šios nuotraukos pridėti naują langelį. Naujasis langelis turės savo erdvę, tačiau failų sistemoje bus atsižvelgta tik į skirtumą tarp dabartinės būsenos ir originalo (sutaupysime mažiausiai 190 GB)

Kiekviena ląstelė yra atskiras ZFS duomenų rinkinys, ir tai labai patogu. ZFS taip pat leidžia atlikti įvairių kitų šaunių dalykų, pavyzdžiui, siųsti momentines nuotraukas per SSH. Mes to neaprašysime, jau yra daug.

Taip pat verta atkreipti dėmesį į nuotolinio pagrindinio kompiuterio stebėjimo poreikį, šiems tikslams mes turime Zabbix.

B – sauga

Kalbant apie saugumą, pradėkime nuo pagrindinių principų infrastruktūros kontekste:

Konfidencialumas – Šio principo įgyvendinimą užtikrina standartiniai UNIX tipo sistemų įrankiai. Logiškai atskiriame prieigą prie kiekvieno logiškai atskiro sistemos elemento – ląstelės. Prieiga suteikiama naudojant standartinį vartotojo autentifikavimą naudojant asmeninius vartotojų raktus. Visas ryšys tarp ir į galutinius langelius vyksta užšifruota forma. Disko šifravimo dėka mes neturime jaudintis dėl duomenų saugumo keičiant diską ar perkeliant į kitą serverį. Vienintelė svarbi prieiga yra prieiga prie pagrindinės sistemos, nes tokia prieiga paprastai suteikia prieigą prie duomenų konteineriuose.

Vientisumas „Šio principo įgyvendinimas vyksta keliais skirtingais lygmenimis. Pirma, svarbu pažymėti, kad serverio aparatinės įrangos, ECC atminties atveju ZFS jau „iš dėžutės“ rūpinasi duomenų vientisumu informacijos bitų lygyje. Momentinės momentinės nuotraukos leidžia bet kuriuo metu pasidaryti atsargines kopijas. Patogūs langelių eksporto / importavimo įrankiai palengvina ląstelių replikaciją.

Prieinamumas – Tai jau neprivaloma. Priklauso nuo jūsų šlovės laipsnio ir nuo to, ar turite neapykantų. Savo pavyzdyje užtikrinome, kad piniginė būtų pasiekiama tik iš TOP tinklo. Jei reikia, užkardoje galite užblokuoti viską ir leisti prieiti prie serverio tik per tunelius (TOR ar VPN – kitas reikalas). Taigi serveris bus kuo labiau atkirstas nuo išorinio pasaulio ir tik mes patys galėsime daryti įtaką jo pasiekiamumui.

Neįmanoma atsisakyti - Ir tai priklauso nuo tolesnio veikimo ir teisingos vartotojų teisių, prieigos ir pan. Bet taikant teisingą požiūrį, visi vartotojo veiksmai yra audituojami, o kriptografinių sprendimų dėka galima vienareikšmiškai nustatyti, kas ir kada atliko tam tikrus veiksmus.

Žinoma, aprašyta konfigūracija nėra absoliutus pavyzdys, kaip ji visada turėtų būti, tai veikiau vienas iš pavyzdžių, kaip ji gali būti, išlaikant labai lanksčias mastelio keitimo ir pritaikymo galimybes.

Ką apie visišką virtualizaciją?

Apie visišką virtualizaciją naudojant cbsd galite skaitykite čia. Pridėsiu tik dėl darbo bhyve Turite įjungti kai kurias branduolio parinktis.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Taigi, jei staiga reikia paleisti dokerį, įdiekite debianą ir pirmyn!

Bitcoin narve?

Tai viskas

Manau, tai viskas, kuo norėjau pasidalinti. Jei jums patiko straipsnis, galite atsiųsti man keletą bitkoinų - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Jei norite išbandyti ląsteles ir turėti bitkoinų, galite apsilankyti mano augintinio projektas.

Šaltinis: www.habr.com