Bitcoin në një kafaz?

Ndodhi që me profesion jam administrator i sistemeve dhe i rrjeteve kompjuterike (shkurt: administrator i sistemit), dhe pata rastin t'i tregoja për pak më shumë se 10 vjet prof. aktivitetet e një shumëllojshmërie të gjerë sistemesh, duke përfshirë ato që kërkojnë masa [ekstreme] sigurie. Ndodhi gjithashtu që disa kohë më parë më dukej interesante bitcoin, dhe jo vetëm që e përdori atë, por gjithashtu nisi disa mikro-shërbime për të mësuar se si të punoni në mënyrë të pavarur me rrjetin Bitcoin (aka p2p në fund të fundit) nga këndvështrimi i një zhvilluesi (sigurisht që jam një nga ata dev, pra, po kaloja). Por nuk po flas për zhvillim, po flas për një mjedis të sigurt dhe efikas për aplikacionet.

Teknologjia financiare (FINTECH) shkoni pranë sigurisë së informacionit (infosec) dhe e para mund të funksionojë pa të dytën, por jo për shumë kohë. Kjo është arsyeja pse unë dua të ndaj përvojën time dhe grupin e mjeteve që përdor, i cili përfshin të dyja FINTECHDhe infosec, dhe në të njëjtën kohë, dhe gjithashtu mund të përdoret për një qëllim më të gjerë ose krejtësisht të ndryshëm. Në këtë artikull do t'ju tregoj jo aq shumë për Bitcoin, por për modelin e infrastrukturës për zhvillimin dhe funksionimin e shërbimeve financiare (dhe jo vetëm) - me një fjalë, ato shërbime ku "B" ka rëndësi. Kjo vlen si për shkëmbimin e Bitcoin ashtu edhe për kopshtin zoologjik më tipik të korporatës të shërbimeve të një kompanie të vogël që nuk është e lidhur në asnjë mënyrë me Bitcoin.

Dua të theksoj se jam mbështetës i parimeve "Mbaje budallallëkun e thjeshtë" и "më pak është më shumë", prandaj, si artikulli ashtu edhe ajo që përshkruhet në të do të kenë vetitë për të cilat kanë të bëjnë këto parime.

Skenari imagjinar: Le të shohim gjithçka duke përdorur shembullin e një shkëmbyesi bitcoin. Ne vendosëm të nisim shkëmbimin e rublave, dollarëve, eurove për bitcoin dhe mbrapa, dhe tashmë kemi një zgjidhje funksionale, por për para të tjera dixhitale si qiwi dhe webmoney, d.m.th. Kemi mbyllur të gjitha çështjet ligjore, kemi një aplikacion të gatshëm që shërben si portë pagese për rubla, dollarë dhe euro dhe sisteme të tjera pagesash. Ai është i lidhur me llogaritë tona bankare dhe ka një lloj API për aplikacionet tona përfundimtare. Ne kemi gjithashtu një aplikacion në internet që vepron si një shkëmbyes për përdoruesit, mirë, si një llogari tipike qiwi ose webmoney - krijoni një llogari, shtoni një kartë, etj. Ai komunikon me aplikacionin tonë të portës, megjithëse nëpërmjet API-së REST në zonën lokale. Dhe kështu vendosëm të lidhim bitcoin dhe në të njëjtën kohë të përmirësojmë infrastrukturën, sepse... Fillimisht, gjithçka u vendos me nxitim në kutitë virtuale në zyrën poshtë tavolinës... faqja filloi të përdorej dhe ne filluam të shqetësoheshim për kohën dhe performancën.

Pra, le të fillojmë me gjënë kryesore - zgjedhjen e një serveri. Sepse biznesi në shembullin tonë është i vogël dhe ne i besojmë hosterit (OVH) që do të zgjedhim opsioni i buxhetit në të cilën është e pamundur të instalosh sistemin nga imazhi origjinal .iso, por nuk ka rëndësi, departamenti i sigurisë së IT do të analizojë patjetër imazhin e instaluar. Dhe kur të rritemi, do të marrim me qira dollapin tonë të mbyllur me çelës me akses të kufizuar fizik dhe ndoshta do të ndërtojmë DC-në tonë. Në çdo rast, ia vlen të mbani mend se kur merrni me qira pajisje dhe instaloni imazhe të gatshme, ekziston mundësia që të keni një "Trojan nga hosti" të varur në sistemin tuaj, i cili në shumicën e rasteve nuk ka për qëllim t'ju spiunojë. por për të ofruar server më të përshtatshëm të mjeteve të menaxhimit.

Instalimi i serverit

Gjithçka është e thjeshtë këtu. Ne zgjedhim pajisjen që i përshtatet nevojave tona. Pastaj zgjidhni imazhin FreeBSD. Epo, ose lidhemi (në rastin e një hosti tjetër dhe harduerit tonë) nëpërmjet IPMI ose me një monitor dhe fusim imazhin .iso FreeBSD në shkarkim. Unë përdor për një organizim orkestral Ansible и mfsbsd. Të vetmen gjë, në rastin tonë me kimsufi, zgjodhëm instalim specifik në mënyrë që dy disqet në pasqyrë të kenë "të hapura" vetëm ndarjet boot dhe /home, pjesa tjetër e hapësirës së diskut do të kodohet, por më shumë për këtë më vonë.

Bitcoin në një kafaz?

Instalimi i sistemit ndodh në një mënyrë standarde, nuk do të ndalem në këtë, do të vërej vetëm se para fillimit të funksionimit ia vlen t'i kushtohet vëmendje forcim opsionet që ofron bsdinstaller në fund të instalimit (nëse e instaloni vetë sistemin):

Bitcoin në një kafaz?

Ka material i mirë për këtë temë, do ta përsëris shkurt këtu.

Është gjithashtu e mundur të aktivizoni parametrat e lartpërmendur në një sistem tashmë të instaluar. Për ta bërë këtë, duhet të redaktoni skedarin e ngarkuesit dhe të aktivizoni parametrat e kernelit. *ee është një redaktues si ky në 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

Ju gjithashtu duhet të siguroheni që keni të instaluar versionin më të fundit të sistemit dhe kryeni të gjitha përditësimet dhe përmirësimet. Në rastin tonë, për shembull, kërkohet një përmirësim në versionin më të fundit, sepse... Imazhet e para-instalimit mbeten prapa nga gjashtë muaj deri në një vit. Epo, atje ne ndryshojmë portën SSH në diçka të ndryshme nga ajo e paracaktuar, shtojmë vërtetimin e çelësit dhe çaktivizojmë vërtetimin e fjalëkalimit.

Pastaj vendosëm aide, monitorimi i statusit të skedarëve të konfigurimit të sistemit. Mund të lexoni më në detaje këtu.

pkg install aide

dhe redaktoni krontabin tonë

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

Ndizeni auditimi i sistemit

sysrc auditd_enable=YES

# service auditd start

Mënyra e administrimit të kësaj çështje është përshkruar në mënyrë të përsosur në udhëheqja.

Tani rinisim dhe vazhdojmë te softueri në server. Çdo server është një hipervizor për kontejnerë ose makina të plota virtuale. Prandaj, është e rëndësishme që procesori të mbështesë VT-x dhe EPT nëse planifikojmë të përdorim virtualizimin e plotë.

Për të menaxhuar kontejnerët dhe makinat virtuale që përdor cbsd nga olevole, i uroj më shumë shëndet dhe bekime për këtë dobi të mrekullueshme!

Kontejnerët? Docker përsëri apo çfarë?

Por jo. Burgjet e FreeBSD është një mjet i shkëlqyer për kontejnerizimin, por i përmendur cbsd për të orkestruar këto enë, të cilat quhen qeliza.

Kafazi është një zgjidhje jashtëzakonisht efektive për ndërtimin e infrastrukturës për qëllime të ndryshme, ku në fund kërkohet izolim i plotë i shërbimeve ose proceseve individuale. Në thelb, është një klon i sistemit pritës, por nuk kërkon virtualizim të plotë të harduerit. Dhe falë kësaj, burimet nuk shpenzohen për "OS-in e ftuar", por vetëm për punën që po kryhet. Kur qelizat përdoren për nevoja të brendshme, kjo është një zgjidhje shumë e përshtatshme për përdorim optimal të burimeve - një grup qelizash në një server harduerësh mund të përdorin secili individualisht të gjithë burimin e serverit nëse është e nevojshme. Duke pasur parasysh që zakonisht nënshërbime të ndryshme kanë nevojë për shtesë. burime në kohë të ndryshme, ju mund të nxirrni performancën maksimale nga një server nëse planifikoni dhe balanconi siç duhet qelizat midis serverëve. Nëse është e nevojshme, qelizave gjithashtu mund t'u jepen kufizime në burimin e përdorur.

Bitcoin në një kafaz?

Po virtualizimi i plotë?

Me sa di unë cbsd mbështet punën bhyve dhe hipervizorët XEN. Të dytën nuk e kam përdorur kurrë, por i pari është relativisht i ri hipervizor nga FreeBSD. Ne do të shohim një shembull të përdorimit bhyve në shembullin e mëposhtëm.

Instalimi dhe konfigurimi i mjedisit pritës

Ne përdorim FS ZFS. Ky është një mjet jashtëzakonisht i fuqishëm për menaxhimin e hapësirës së serverit. Falë ZFS, ju mund të ndërtoni drejtpërdrejt grupe konfigurimesh të ndryshme nga disqe, të zgjeroni dinamikisht hapësirën "të nxehtë", të ndryshoni disqet e vdekur, të menaxhoni fotografitë e çastit dhe shumë e shumë më tepër, të cilat mund të përshkruhen në një seri të tërë artikujsh. Le të kthehemi te serveri ynë dhe disqet e tij. Në fillim të instalimit, ne kemi lënë hapësirë ​​të lirë në disqe për ndarjet e koduara. Pse eshte ajo? Kjo është në mënyrë që sistemi të zgjohet automatikisht dhe të dëgjojë nëpërmjet SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

shtoni një ndarje të diskut në hapësirën e mbetur

geli init /dev/ada0p4

shkruani fjalëkalimin tonë të enkriptimit

geli attach /dev/ada0p4

Vendosim përsëri fjalëkalimin dhe kemi një pajisje /dev/ada0p4.eli - kjo është hapësira jonë e koduar. Pastaj ne përsërisim të njëjtën gjë për /dev/ada1 dhe pjesën tjetër të disqeve në grup. Dhe ne krijojmë një të re Pishina ZFS.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - Epo, ne kemi gati kompletin minimal të luftimit. Një grup i pasqyruar i disqeve në rast se një nga tre dështon.

Krijimi i një grupi të dhënash në një "pishinë" të re

zfs create vms/jails

pkg install cbsd — krijuam një ekip dhe krijuam menaxhim për qelizat tona.

pas cbsd instaluar, duhet të inicializohet:

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

Epo, ne i përgjigjemi një sërë pyetjesh, kryesisht me përgjigje të paracaktuara.

*Nëse jeni duke përdorur enkriptim, është e rëndësishme që daemon cbsdd nuk filloi automatikisht derisa të deshifroni disqet manualisht ose automatikisht (në shembullin tonë kjo bëhet nga zabbix)

**Unë gjithashtu nuk përdor NAT nga cbsd, dhe e konfiguroj vetë 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

Vendosja e politikave të murit të zjarrit është gjithashtu një temë më vete, kështu që nuk do të hyj thellë në konfigurimin e politikës BLOCK ALL dhe vendosjen e listave të bardha, këtë mund ta bëni duke lexuar dokumentacion zyrtar ose ndonjë nga numri i madh i artikujve të disponueshëm në Google.

Epo... ne kemi instaluar cbsd, është koha për të krijuar kalin tonë të parë të punës - demonin e Bitcoin të mbyllur në kafaz!

cbsd jconstruct-tui

Bitcoin në një kafaz?

Këtu shohim dialogun e krijimit të qelizës. Pasi të jenë vendosur të gjitha vlerat, le të krijojmë!

Kur krijoni qelizën tuaj të parë, duhet të zgjidhni se çfarë të përdorni si bazë për qelizat. Unë zgjedh një shpërndarje nga depoja e FreeBSD me komandën repo. Kjo zgjedhje bëhet vetëm kur krijohet qeliza e parë e një versioni specifik (mund të presë qelizat e çdo versioni që është më i vjetër se versioni pritës).

Pasi të jetë instaluar gjithçka, ne lëshojmë kafazin!

# cbsd jstart bitcoind

Por ne duhet të instalojmë softuer në kafaz.

# jls

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

jexec bitcoind për të hyrë në tastierën e celularit

dhe tashmë brenda qelizës ne instalojmë softuerin me varësitë e tij (sistemi ynë pritës mbetet i pastër)

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

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

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

Ka Bitcoin në kafaz, por na duhet anonimiteti sepse duam të lidhemi me disa kafaze nëpërmjet rrjetit TOP. Në përgjithësi, ne planifikojmë të ekzekutojmë shumicën e qelizave me softuer të dyshimtë vetëm përmes një përfaqësuesi. Falë pf Ju mund të çaktivizoni NAT për një gamë të caktuar adresash IP në rrjetin lokal dhe të lejoni NAT vetëm për nyjen tonë TOR. Kështu, edhe nëse malware hyn në qelizë, me shumë mundësi nuk do të komunikojë me botën e jashtme dhe nëse e bën, nuk do të zbulojë IP-në e serverit tonë. Prandaj, ne krijojmë një qelizë tjetër për të "përcjellur" shërbimet si një shërbim ".onion" dhe si një përfaqësues për hyrjen në internet në qelizat individuale.

# 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

Cakto për të dëgjuar në një adresë lokale (e disponueshme për të gjitha qelizat)

SOCKSPort 192.168.0.2:9050

Çfarë tjetër na nevojitet për lumturinë e plotë? Po, ne kemi nevojë për një shërbim për ueb-in tonë, ndoshta më shumë se një. Le të hapim nginx, i cili do të veprojë si një përfaqësues i kundërt dhe do të kujdeset për rinovimin e certifikatave Let's Encrypt

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

Dhe kështu vendosëm 150 MB varësi në një kafaz. Dhe nikoqiri është akoma i pastër.

Le të kthehemi te konfigurimi i nginx më vonë, duhet të ngremë dy qeliza të tjera për portën tonë të pagesave në nodejs dhe rust dhe një aplikacion ueb, i cili për disa arsye është në Apache dhe PHP, dhe kjo e fundit kërkon gjithashtu një bazë të dhënash MySQL.

# cbsd jsconstruct-tui

# cbsd jstart paygw

# jexec paygw

paygw:/@[15:55] # pkg install git node npm

paygw:/@[15:55] # curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

...dhe 380 MB të tjera paketa të izoluara

Më pas, ne shkarkojmë aplikacionin tonë me git dhe e hapim atë.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

Paketat 450 MB. në një kafaz.

këtu ne i japim zhvilluesit qasje përmes SSH direkt në qelizë, ata do të bëjnë gjithçka vetë atje:

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

Port 2267 — ndryshoni portën SSH të qelizës në ndonjë arbitrar

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

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

Epo, shërbimi po funksionon, gjithçka që mbetet është të shtoni rregullin pf firewall

Le të shohim se çfarë IP kanë qelizat tona dhe si duket përgjithësisht "zona jonë lokale".

# 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

dhe shtoni një rregull

# 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

Epo, meqë jemi këtu, le të shtojmë gjithashtu një rregull për përfaqësuesin e kundërt:

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

Epo, tani pak për bitcoins

Ajo që ne kemi është se ne kemi një aplikacion në internet që është i ekspozuar nga jashtë dhe ai flet në nivel lokal me portën tonë të pagesave. Tani duhet të përgatisim një mjedis pune për ndërveprim me vetë rrjetin Bitcoin - nyjen bitcoind është thjesht një demon që mban të përditësuar kopjen lokale të blockchain. Ky daemon ka funksionalitet RPC dhe portofol, por ka "mbështjellës" më të përshtatshëm për zhvillimin e aplikacioneve. Për të filluar, ne vendosëm të vendosnim electrum është një portofol CLI. Kjo portofol ne do ta përdorim atë si "ruajtje të ftohtë" për bitcoin-ët tanë - në përgjithësi, ato bitcoin që do të duhet të ruhen "jashtë" sistemit të aksesueshëm për përdoruesit dhe në përgjithësi larg nga të gjithë. Ai gjithashtu ka një GUI, kështu që ne do të përdorim të njëjtin portofol në tonë
laptopë. Tani për tani ne do të përdorim Electrum me serverë publikë, dhe më vonë do ta ngremë atë në një qelizë tjetër ElectrumXnë mënyrë që të mos varemi fare nga askush.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

700 MB të tjera softuer në kafazin tonë

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

Tani kemi krijuar një portofol.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

Për tonat on-zinxhirit Vetëm një numër i kufizuar njerëzish do të mund të lidhen me portofolin tani e tutje. Për të mos hapur aksesin në këtë qelizë nga jashtë, lidhjet përmes SSH do të ndodhin përmes TOP (një version i decentralizuar i VPN). Ne lëshojmë SSH në qelizë, por nuk prekim pf.conf tonë në host.

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

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

Tani le të çaktivizojmë qelizën me aksesin në internet të portofolit. Le t'i japim një adresë IP nga një hapësirë ​​tjetër e nënrrjetit që nuk është NATed. Fillimisht le të ndryshojmë /etc/pf.conf mbi hostin

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" le ta ndryshojmë në JAIL_IP_POOL="192.168.0.0/25", kështu që të gjitha adresat 192.168.0.126-255 nuk do të kenë akses të drejtpërdrejtë në internet. Një lloj rrjeti softuerësh "air-gap". Dhe rregulli NAT mbetet ashtu siç ishte

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

Mbingarkesa e rregullave

# pfctl -f /etc/pf.conf

Tani le të marrim qelinë tonë

# cbsd jconfig jname=electrum

Bitcoin në një kafaz?

Bitcoin në një kafaz?

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, por tani vetë sistemi do të pushojë së punuari për ne. Megjithatë, ne mund të specifikojmë një përfaqësues të sistemit. Por ka një gjë, në TOR është një përfaqësues SOCKS5, dhe për lehtësi do të donim gjithashtu një përfaqësues HTTP.

# 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

Epo, tani ka dy serverë proxy në sistemin tonë, dhe të dy dalin përmes TOR: socks5://192.168.0.2:9050 dhe http://192.168.0.6:8123

Tani mund të konfigurojmë mjedisin tonë të portofolit

# 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

Epo, tani guaska do të funksionojë nën një përfaqësues. Nëse duam të instalojmë paketa, atëherë duhet t'i shtojmë /usr/local/etc/pkg.conf nga poshtë rrënjës së kafazit

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

Epo, tani është koha për të shtuar shërbimin e fshehur TOR si adresën e shërbimit tonë SSH në kafazin e portofolit.

# 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

Kjo është adresa jonë e lidhjes. Le të kontrollojmë nga makina lokale. Por së pari duhet të shtojmë çelësin tonë SSH:

wallet@electrum:/ % mkdir ~/.ssh

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

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

Epo, nga një makinë klienti Linux

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

Le të lidhemi (Që kjo të funksionojë, ju nevojitet një demon lokal TOR që dëgjon në 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

Urgjent!

Për të punuar me pagesa të menjëhershme dhe mikro, na duhet gjithashtu një nyje Rrufeja Rrjetit, në fakt, ky do të jetë mjeti ynë kryesor i punës me Bitcoin. U*c-rrufejatë cilin do ta përdorim si një demon është Shtojca Sparko, i cili është një ndërfaqe e plotë HTTP (REST) ​​dhe ju lejon të punoni me transaksione jashtë zinxhirit dhe brenda zinxhirit. c-lightning të nevojshme për funksionimin bitcoind por po.

*Ekzistojnë implementime të ndryshme të protokollit të Rrjetit Lightning në gjuhë të ndryshme. Nga ato që testuam, c-lightning (i shkruar në C) dukej më i qëndrueshëm dhe më efikas në burime

# 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

Ndërsa gjithçka e nevojshme është përpiluar dhe instaluar, le të krijojmë një përdorues RPC për 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

Ndërrimi im kaotik midis qelizave rezulton të jetë jo aq kaotik nëse vini re dobinë tmux, e cila ju lejon të krijoni nënsesione të shumta terminale brenda një sesioni. Analoge: screen

Bitcoin në një kafaz?

Pra, ne nuk duam të zbulojmë IP-në e vërtetë të nyjës sonë dhe duam të kryejmë të gjitha transaksionet financiare përmes TOP. Prandaj, një qepë tjetër nuk është e nevojshme.

# 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

Tani le të krijojmë një konfigurim për 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 ~

ju gjithashtu duhet të krijoni një skedar konfigurimi për bitcoin-cli, një mjet që komunikon me bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

kontrolloni

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

[
  "test"
]

Nisja lightningd

lightning@lightning:~ % lightningd --daemon

Vetë lightningd ju mund të kontrolloni shërbimin lightning-cli, për shembull:

lightning-cli newaddr merrni adresën për një pagesë të re hyrëse

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all dërgoni të gjitha paratë në portofol në adresë (të gjitha adresat në zinxhir)

Gjithashtu komandat për operacione jashtë zinxhirit lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay dhe kështu me radhë.

Epo, për komunikim me aplikacionin kemi një Api REST

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

Përmbledh

# 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 në një kafaz?

Ne kemi një grup kontejnerësh, secila me nivelin e vet të aksesit nga dhe në rrjetin lokal.

# 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

Siç mund ta shihni, bitcoind zë të gjitha 190 GB hapësirë. Po sikur të kemi nevojë për një nyje tjetër për teste? Kjo është ajo ku ZFS vjen në ndihmë. Me ndihmë cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com mund të krijoni një fotografi dhe të bashkëngjitni një qelizë të re në këtë fotografi. Qeliza e re do të ketë hapësirën e saj, por vetëm ndryshimi midis gjendjes aktuale dhe origjinalit do të merret parasysh në sistemin e skedarëve (ne do të kursejmë të paktën 190 GB)

Çdo qelizë është grupi i saj i veçantë i të dhënave ZFS, dhe kjo është jashtëzakonisht e përshtatshme. ZFS gjithashtu lejon bëni gjëra të tjera interesante, si dërgimi i fotografive përmes SSH. Ne nuk do ta përshkruajmë atë, tashmë ka shumë.

Vlen gjithashtu të theksohet nevoja për monitorim në distancë të hostit, për këto qëllime që kemi Zabbix.

B - siguria

Për sa i përket sigurisë, le të fillojmë nga parimet kryesore në kontekstin e infrastrukturës:

Konfidencialiteti - Mjetet standarde të sistemeve të ngjashme me UNIX-in sigurojnë zbatimin e këtij parimi. Ne veçojmë logjikisht aksesin në çdo element logjikisht të veçantë të sistemit - një qelizë. Qasja sigurohet përmes vërtetimit standard të përdoruesit duke përdorur çelësat personalë të përdoruesve. I gjithë komunikimi ndërmjet qelizave dhe deri në fund ndodh në formë të koduar. Falë kriptimit të diskut, ne nuk duhet të shqetësohemi për sigurinë e të dhënave kur zëvendësojmë një disk ose migrojmë në një server tjetër. Qasja e vetme kritike është qasja në sistemin pritës, pasi një akses i tillë në përgjithësi siguron qasje në të dhënat brenda kontejnerëve.

ndershmëri “Zbatimi i këtij parimi ndodh në disa nivele të ndryshme. Së pari, është e rëndësishme të theksohet se në rastin e harduerit të serverit, memoria ECC, ZFS tashmë "jashtë kutisë" kujdeset për integritetin e të dhënave në nivelin e biteve të informacionit. Fotot e çastit ju lejojnë të bëni kopje rezervë në çdo kohë gjatë fluturimit. Mjetet e përshtatshme të eksportit/importit të qelizave e bëjnë të thjeshtë riprodhimin e qelizave.

disponueshmëri - Kjo tashmë është fakultative. Varet nga shkalla e famës suaj dhe nga fakti që keni urrejtës. Në shembullin tonë, ne siguruam që portofoli të ishte i aksesueshëm ekskluzivisht nga rrjeti TOP. Nëse është e nevojshme, mund të bllokoni gjithçka në murin e zjarrit dhe të lejoni hyrjen në server ekskluzivisht përmes tuneleve (TOR ose VPN është një çështje tjetër). Kështu, serveri do të shkëputet nga bota e jashtme sa më shumë që të jetë e mundur, dhe vetëm ne vetë do të mund të ndikojmë në disponueshmërinë e tij.

Pamundësia e refuzimit - Dhe kjo varet nga funksionimi i mëtejshëm dhe pajtueshmëria me politikat e sakta për të drejtat e përdoruesit, aksesin, etj. Por me qasjen e duhur, të gjitha veprimet e përdoruesit kontrollohen dhe falë zgjidhjeve kriptografike është e mundur të identifikohet pa mëdyshje se kush ka kryer veprime të caktuara dhe kur.

Natyrisht, konfigurimi i përshkruar nuk është një shembull absolut se si duhet të jetë gjithmonë, është më tepër një shembull se si mund të jetë, duke ruajtur aftësitë shumë fleksibël të shkallëzimit dhe personalizimit.

Po virtualizimi i plotë?

Mundeni rreth virtualizimit të plotë duke përdorur cbsd lexo ketu. Do ta shtoj vetëm për punë bhyve Duhet të aktivizoni disa opsione të kernelit.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Pra, nëse papritmas ju duhet të filloni një docker, atëherë instaloni disa debian dhe shkoni!

Bitcoin në një kafaz?

Kjo eshte e gjitha

Mendoj se kjo është gjithçka që doja të ndaja. Nëse ju pëlqeu artikulli, atëherë mund të më dërgoni disa bitcoin - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Nëse dëshironi të provoni qelizat në veprim dhe të keni disa bitcoin, mund të shkoni tek im pet-projekt.

Burimi: www.habr.com