Bitcoin en kaĝo?

Okazis, ke profesie mi estas administranto de komputilaj sistemoj kaj retoj (mallonge: sistemadministranto), kaj mi havis la okazon rakonti al prof. iom pli ol 10 jarojn. la agadoj de vasta gamo de sistemoj, inkluzive de tiuj, kiuj postulas [ekstremajn] sekureciniciatojn. Okazis ankaŭ, ke antaŭ iom da tempo mi trovis ĝin interesa bitcoin, kaj ne nur uzis ĝin, sed ankaŭ lanĉis plurajn mikro-servojn por lerni kiel sendepende labori kun la reto Bitcoin (alinome p2p finfine) el la vidpunkto de programisto (mi kompreneble estas unu el tiuj dev, do, mi estis preterpasanta). Sed mi ne parolas pri evoluo, mi parolas pri sekura kaj efika medio por aplikoj.

Financa teknologio (fintech) iru apud informa sekureco (infosek) kaj la unua povas funkcii sen la dua, sed ne longe. Tial mi volas kunhavigi mian sperton kaj la aron da iloj, kiujn mi uzas, kiu inkluzivas ambaŭ fintech, kaj infosek, kaj samtempe, kaj ankaŭ povas esti uzata por pli larĝa aŭ tute alia celo. En ĉi tiu artikolo mi rakontos al vi ne tiom pri Bitcoin, sed pri la infrastruktura modelo por la disvolviĝo kaj funkciado de financaj (kaj ne nur) servoj - unuvorte, tiuj servoj kie "B" gravas. Ĉi tio validas kaj por la Bitcoin-interŝanĝo kaj por la plej tipa kompania zoo de servoj de malgranda kompanio neniel ligita kun Bitcoin.

Mi ŝatus rimarki, ke mi estas subtenanto de la principoj "teni ĝin stulta simpla" и "malpli estas pli", do, kaj la artikolo kaj tio, kio estas priskribita en ĝi, havos la ecojn, pri kiuj temas ĉi tiuj principoj.

Imaga scenaro: Ni rigardu ĉion uzante la ekzemplon de bitcoin-interŝanĝilo. Ni decidis lanĉi la interŝanĝon de rubloj, dolaroj, eŭroj por bitcoins kaj reen, kaj ni jam havas funkciantan solvon, sed por alia cifereca mono kiel qiwi kaj webmoney, t.e. Ni fermis ĉiujn leĝajn aferojn, ni havas pretan aplikaĵon, kiu servas kiel pagpordo por rubloj, dolaroj kaj eŭroj kaj aliaj pagsistemoj. Ĝi estas konektita al niaj bankkontoj kaj havas ian API por niaj finaj aplikoj. Ni ankaŭ havas TTT-aplikaĵon kiu funkcias kiel interŝanĝilo por uzantoj, nu, kiel tipa qiwi aŭ retmonkonto - kreu konton, aldonu karton, ktp. Ĝi komunikas kun nia enirejo-aplikaĵo, kvankam per la REST API en la loka areo. Kaj do ni decidis konekti bitcoins kaj samtempe altgradigi la infrastrukturon, ĉar... Komence, ĉio estis metita en haste sur virtualkestoj en la oficejo sub la tablo... la retejo komencis esti uzata, kaj ni komencis zorgi pri funkciado kaj rendimento.

Do, ni komencu per la ĉefa afero - elekti servilon. Ĉar la komerco en nia ekzemplo estas malgranda kaj ni fidas la gastiganton (OVH), kiun ni elektos buĝeta elekto en kiu estas neeble instali la sistemon de la originala .iso-bildo, sed ne gravas, la IT-sekureca fako certe analizos la instalitan bildon. Kaj kiam ni kreskos, ni luis nian propran ŝrankon sub ŝlosilo kun limigita fizika aliro, kaj eble ni konstruos nian propran DC. Ĉiukaze, indas memori, ke luante aparataron kaj instalante pretajn bildojn, ekzistas ŝanco, ke vi havos "Trojanon de la gastiganto" pendanta sur via sistemo, kiu plejofte ne intencas spioni vin. sed por oferti pli oportunajn mastrumajn ilojn servilon.

Instalado de servilo

Ĉio estas simpla ĉi tie. Ni elektas la aparataron, kiu konvenas al niaj bezonoj. Tiam elektu la FreeBSD-bildon. Nu, aŭ ni konektas (kaze de alia gastiganto kaj nia propra aparataro) per IPMI aŭ per monitoro kaj nutras la bildon .iso FreeBSD en la elŝuton. Por orkestra aranĝo mi uzas Respondema и mfsbsd. La sola afero, en nia kazo kun kimsufi, ni elektis kutima instalado por ke la du diskoj en la spegulo havu nur la lanĉajn kaj /hejmajn sekciojn "malfermitaj", la resto de la diskospaco estos ĉifrita, sed pli pri tio poste.

Bitcoin en kaĝo?

Instalado de la sistemo okazas laŭ norma maniero, mi ne pritraktos ĉi tion, mi nur rimarkos, ke antaŭ ol ekfunkciigi, indas atenti. obstinigxo ebloj kiujn ĝi proponas bsdinstaller ĉe la fino de la instalado (se vi mem instalas la sistemon):

Bitcoin en kaĝo?

Ekzistas bona materialo pri ĉi tiu temo, mi mallonge ripetos ĝin ĉi tie.

Eblas ankaŭ ebligi la supre menciitajn parametrojn sur jam instalita sistemo. Por fari tion, vi devas redakti la ŝargilon-dosieron kaj ebligi kernajn parametrojn. *ee estas redaktilo kiel ĉi tiu en 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

Vi ankaŭ devas certigi, ke vi havas la lastan version de la sistemo instalita, kaj plenumi ĉiujn ĝisdatigojn kaj ĝisdatigojn. En nia kazo ekzemple necesas ĝisdatigo al la plej nova versio, ĉar... antaŭinstalaj bildoj postrestas de ses monatoj ĝis unu jaro. Nu, tie ni ŝanĝas la SSH-havenon al io malsama ol la defaŭlta, aldonu ŝlosilan aŭtentikigon kaj malŝaltas pasvortan aŭtentigon.

Tiam ni agordas aide, monitorante la staton de sistemaj agordaj dosieroj. Vi povas legi pli detale tie.

pkg install aide

kaj redakti nian 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

Ni inkluzivas sistema revizio

sysrc auditd_enable=YES

# service auditd start

Kiel administri ĉi tiun aferon estas perfekte priskribita en gvidado.

Nun ni rekomencas kaj iras al la programaro sur la servilo. Ĉiu servilo estas hiperviziero por ujoj aŭ plenaj virtualaj maŝinoj. Tial gravas, ke la procesoro subtenas VT-x kaj EPT se ni planas uzi plenan virtualigon.

Por administri ujojn kaj virtualajn maŝinojn mi uzas cbsd el olevole, Mi deziras al li pli da sano kaj benoj por ĉi tiu mirinda utileco!

Ujoj? Docker denove aŭ kio?

Sed ne. FreeBSD Malliberejoj estas bonega ilo por kontenerigo, sed la menciita cbsd orkestri ĉi tiujn ujojn, kiujn oni nomas ĉeloj.

La kaĝo estas ekstreme efika solvo por konstrui infrastrukturon por diversaj celoj, kie kompleta izolado de individuaj servoj aŭ procezoj estas finfine postulata. Esence, ĝi estas klono de la gastiga sistemo, sed ĝi ne postulas plenan aparataron virtualigon. Kaj danke al ĉi tio, rimedoj ne estas elspezitaj por la "gasta OS", sed nur por la laboro farita. Kiam ĉeloj estas uzataj por internaj bezonoj, ĉi tio estas tre oportuna solvo por optimuma uzado de rimedoj - amaso da ĉeloj sur unu aparataro-servilo povas ĉiu individue uzi la tutan servilan rimedon se necese. Konsiderante, ke kutime malsamaj subservoj bezonas pliajn. rimedoj en malsamaj tempoj, vi povas ĉerpi maksimuman rendimenton de unu servilo se vi ĝuste planas kaj ekvilibrigas la ĉelojn inter serviloj. Se necese, ĉeloj ankaŭ povas ricevi limigojn pri la uzata rimedo.

Bitcoin en kaĝo?

Kio pri plena virtualigo?

Koncerne al mi scias, cbsd subtenas laboron bhyve kaj XEN-hiperviziiloj. Mi neniam uzis la duan, sed la unua estas relative nova hiperviziero de FreeBSD. Ni rigardos ekzemplon de uzo bhyve en la malsupra ekzemplo.

Instalado kaj Agordo de la Gastiganta Medio

Ni uzas FS ZFS. Ĉi tio estas ekstreme potenca ilo por administri servilan spacon. Danke al ZFS, vi povas rekte konstrui tabelojn de diversaj agordoj el diskoj, dinamike "varma" vastigi spacon, ŝanĝi mortintajn diskojn, administri momentfotojn kaj multe, multe pli, kiuj povas esti priskribitaj en tuta serio de artikoloj. Ni revenu al nia servilo kaj ĝiaj diskoj. Komence de la instalado, ni lasis liberan spacon sur la diskoj por ĉifritaj subdiskoj. Kial estas tio? Ĉi tio estas por ke la sistemo vekiĝas aŭtomate kaj aŭskultu per SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

aldonu diskdiskon al la restanta spaco

geli init /dev/ada0p4

enigu nian ĉifradan pasvorton

geli attach /dev/ada0p4

Ni enigas la pasvorton denove kaj ni havas aparaton /dev/ada0p4.eli - ĉi tiu estas nia ĉifrita spaco. Tiam ni ripetas la samon por /dev/ada1 kaj la resto de la diskoj en la tabelo. Kaj ni kreas novan ZFS-naĝejo.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - Nu, ni havas la minimuman batalkompleton preta. Spegulita aro de diskoj en kazo unu el la tri malsukcesas.

Kreante datumaron sur nova "naĝejo"

zfs create vms/jails

pkg install cbsd — ni lanĉis teamon kaj starigis administradon por niaj ĉeloj.

Post cbsd instalita, ĝi devas esti pravigita:

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

Nu, ni respondas multajn demandojn, plejparte kun defaŭltaj respondoj.

*Se vi uzas ĉifradon, gravas ke la demono cbsdd ne komenciĝis aŭtomate ĝis vi deĉifri la diskojn permane aŭ aŭtomate (en nia ekzemplo tio estas farita per zabbix)

**Mi ankaŭ ne uzas NAT de cbsd, kaj mi mem agordas ĝin en 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

Agordo de fajroŝirmilaj politikoj ankaŭ estas aparta temo, do mi ne profundiĝos pri agordo de la politiko BLOKU ĈIUJ kaj starigo de blankaj listoj, vi povas fari tion legante. oficiala dokumentaro aŭ iu el la grandega nombro da artikoloj disponeblaj en Guglo.

Nu... ni havas cbsd instalitan, estas tempo krei nian unuan laborĉevalon - la enkaĝigitan Bitcoin-demonon!

cbsd jconstruct-tui

Bitcoin en kaĝo?

Ĉi tie ni vidas la dialogon pri kreado de ĉeloj. Post kiam ĉiuj valoroj estas fiksitaj, ni kreu!

Kreante vian unuan ĉelon, vi devas elekti kion uzi kiel bazon por la ĉeloj. Mi elektas distribuon el la deponejo de FreeBSD per la komando repo. Ĉi tiu elekto estas farita nur dum kreado de la unua ĉelo de specifa versio (vi povas gastigi ĉelojn de iu ajn versio kiu estas pli malnova ol la gastiga versio).

Post kiam ĉio estas instalita, ni lanĉas la kaĝon!

# cbsd jstart bitcoind

Sed ni devas instali programaron en la kaĝo.

# jls

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

jexec bitcoind por eniri la ĉelan konzolon

kaj jam ene de la ĉelo ni instalas la programaron kun ĝiaj dependecoj (nia gastiga sistemo restas pura)

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

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

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

Estas Bitcoin en la kaĝo, sed ni bezonas anonimecon ĉar ni volas konekti al iuj kaĝoj per la TOP-reto. Ĝenerale, ni planas ruli plej multajn ĉelojn kun suspektinda programaro nur per prokurilo. Danke al pf Vi povas malŝalti NAT por certa gamo da IP-adresoj en la loka reto, kaj permesi NAT nur por nia TOR-nodo. Tiel, eĉ se malware eniros en la ĉelon, ĝi plej verŝajne ne komunikados kun la ekstera mondo, kaj se ĝi faros, ĝi ne malkaŝos la IP de nia servilo. Tial ni kreas alian ĉelon por "sendi" servojn kiel servon ".onion" kaj kiel prokurilon por aliri la Interreton al individuaj ĉeloj.

# 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

Agordi por aŭskulti ĉe loka adreso (havebla por ĉiuj ĉeloj)

SOCKSPort 192.168.0.2:9050

Kion alian ni bezonas por kompleta feliĉo? Jes, ni bezonas servon por nia retejo, eble pli ol unu. Ni lanĉu nginx, kiu funkcios kiel inversa prokurilo kaj zorgos pri renovigo de Let's Encrypt atestiloj

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

Kaj tiel ni metis 150 MB da dependecoj en kaĝon. Kaj la gastiganto estas ankoraŭ pura.

Ni revenu al agordo de nginx poste, ni devas levi du pliajn ĉelojn por nia pagpordejo sur nodejs kaj rust kaj TTT-aplikaĵo, kiu ial estas en Apache kaj PHP, kaj ĉi-lasta ankaŭ postulas MySQL-datumbazon.

# 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

...kaj pliaj 380 MB da pakaĵoj izolitaj

Poste ni elŝutas nian aplikaĵon per git kaj lanĉas ĝin.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

450 MB-pakaĵoj. en kaĝo.

ĉi tie ni donas al la programisto aliron per SSH rekte al la ĉelo, ili faros ĉion tie mem:

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

Port 2267 — ŝanĝu la SSH-pordon de la ĉelo al iu ajn arbitra

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

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

Nu, la servo funkcias, restas nur aldoni la regulon al pf fajroŝirmilo

Ni vidu kian IP havas niaj ĉeloj kaj kiel nia "loka areo" ĝenerale aspektas.

# 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

kaj aldonu regulon

# ee /etc/pf.conf

## SSH for web-Devs
IP_JAIL="192.168.0.5"
PORT_JAIL="{ 2267 }"
rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL

Nu, ĉar ni estas ĉi tie, ni ankaŭ aldonu regulon por inversa prokurilo:

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

Nu, nun iomete pri bitcoins

Kion ni havas, ni havas TTT-aplikaĵon kiu estas elmontrita ekstere kaj ĝi parolas loke al nia pagpordejo. Nun ni devas prepari labormedion por interagi kun la Bitcoin-reto mem - la nodo bitcoind ĝi estas nur demono, kiu tenas la lokan kopion de la blokĉeno ĝisdatigita. Ĉi tiu demono havas RPC kaj monujo-funkciecon, sed ekzistas pli oportunaj "envolvaĵoj" por aplikaĵa disvolviĝo. Por komenci, ni decidis meti electrum estas CLI-monujo. Ĉi tiu monujo ni uzos ĝin kiel "malvarma stokado" por niaj bitcoins - ĝenerale, tiuj bitcoins, kiuj devos esti stokitaj "ekster" la sistemo alirebla por uzantoj kaj ĝenerale for de ĉiuj. Ĝi ankaŭ havas GUI, do ni uzos la saman monujon ĉe nia
tekkomputiloj. Nuntempe ni uzos Electrum kun publikaj serviloj, kaj poste ni levos ĝin en alia ĉelo ElektroXpor tute ne dependi de iu ajn.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

pliaj 700 MB da programaro en nia kaĝo

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

Nun ni havas monujon kreita.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

Al nia surĉene Nur limigita nombro da homoj povos konektiĝi al la monujo de nun. Por ne malfermi aliron al ĉi tiu ĉelo de ekstere, konektoj per SSH okazos per TOP (malcentralizita versio de VPN). Ni lanĉas SSH en la ĉelo, sed ne tuŝas nian pf.conf sur la gastiganto.

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

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

Nun ni malŝaltu la ĉelon kun la interreta aliro de la monujo. Ni donu al ĝi IP-adreson de alia subreta spaco, kiu ne estas NATigita. Unue ni ŝanĝu /etc/pf.conf sur la gastiganto

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" ni ŝanĝu ĝin al JAIL_IP_POOL="192.168.0.0/25", tiel ĉiuj adresoj 192.168.0.126-255 ne havos rektan aliron al Interreto. Speco de programara "aera breĉo" reto. Kaj la regulo NAT restas tia, kia ĝi estis

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

Troŝarĝante la regulojn

# pfctl -f /etc/pf.conf

Nun ni alprenu nian ĉelon

# cbsd jconfig jname=electrum

Bitcoin en kaĝo?

Bitcoin en kaĝo?

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, sed nun la sistemo mem ĉesos funkcii por ni. Tamen ni povas specifi sisteman prokurilon. Sed estas unu afero, ĉe TOR ĝi estas SOCKS5-prokurilo, kaj por oportuno ni ankaŭ ŝatus HTTP-prokurilon.

# 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

Nu, nun estas du prokuraj serviloj en nia sistemo, kaj ambaŭ eligas per TOR: socks5://192.168.0.2:9050 kaj http://192.168.0.6:8123

Nun ni povas agordi nian monujo-medion

# 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

Nu, nun la ŝelo funkcios de sub prokurilo. Se ni volas instali pakaĵojn, tiam ni devus aldoni al /usr/local/etc/pkg.conf de sub la radiko de la kaĝo

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

Nu, nun estas tempo aldoni la kaŝitan servon TOR kiel la adreson de nia SSH-servo en la monujo-ĉelo.

# 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

Jen nia konekta adreso. Ni kontrolu de la loka maŝino. Sed unue ni devas aldoni nian SSH-ŝlosilon:

wallet@electrum:/ % mkdir ~/.ssh

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

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

Nu, de Linuksa klienta maŝino

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

Ni konektu (Por ke tio funkciu, vi bezonas lokan TOR-demonon kiu aŭskultas ĉe 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

Sukceso!

Por labori kun tujaj kaj mikro-pagoj, ni ankaŭ bezonas nodon Fulma Reto, fakte, ĉi tio estos nia ĉefa laborilo kun Bitcoin. U*c-fulmokiun ni uzos kiel demono estas Sparko kromaĵo, kiu estas plentaŭga HTTP (REST) ​​​​interfaco kaj permesas vin labori kun ambaŭ eksterĉenaj kaj surĉenaj transakcioj. c-lightning necesa por funkciado bitcoind sed jes.

*Estas malsamaj efektivigoj de la protokolo Lightning Network en malsamaj lingvoj. El tiuj, kiujn ni provis, c-fulmo (skribita en C) ŝajnis la plej stabila kaj rimedo-efika

# 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

Dum ĉio necesa estas kompilita kaj instalita, ni kreu RPC-uzanto por 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

Mia ĥaosa ŝanĝado inter ĉeloj montriĝas ne tiom ĥaosa se vi notas la utilecon tmux, kiu ebligas al vi krei plurajn finajn subsesiojn ene de unu sesio. Analogo: screen

Bitcoin en kaĝo?

Do, ni ne volas malkaŝi la realan IP de nia nodo, kaj ni volas fari ĉiujn financajn transakciojn per TOP. Tial, alia .cepo ne estas bezonata.

# 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

Nun ni kreu agordon por c-fulmo

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 ~

vi ankaŭ bezonas krei agordan dosieron por bitcoin-cli, ilo kun kiu komunikas bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

kontroli

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

[
  "test"
]

lanĉo lightningd

lightning@lightning:~ % lightningd --daemon

Li mem lightningd vi povas kontroli la utilecon lightning-cliekzemple:

lightning-cli newaddr ricevi la adreson por nova envenanta pago

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all sendu la tutan monon en la monujo al la adreso (ĉiuj enĉenaj adresoj)

Ankaŭ komandoj por eksterĉenaj operacioj lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay ktp

Nu, por komunikado kun la aplikaĵo ni havas REST Api

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

Ni sumigu la rezultojn

# 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 en kaĝo?

Ni havas aron da ujoj, ĉiu kun sia propra nivelo de aliro kaj de kaj al la loka reto.

# 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

Kiel vi povas vidi, bitcoind okupas ĉiujn 190 GB da spaco. Kio se ni bezonas alian nodon por testado? Jen kie ZFS utilas. Kun helpo cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com vi povas krei momentfoton kaj alfiksi novan ĉelon al ĉi tiu momentfoto. La nova ĉelo havos sian propran spacon, sed nur la diferenco inter la nuna stato kaj la originalo estos konsiderata en la dosiersistemo (ni ŝparos almenaŭ 190 GB)

Ĉiu ĉelo estas sia aparta ZFS-datumaro, kaj ĉi tio estas ege oportuna. ZFS ankaŭ permesas faru diversajn aliajn bonegajn aferojn, kiel sendi momentfotojn per SSH. Ni ne priskribos ĝin, estas jam multe.

Ĝi ankaŭ indas noti la bezonon de fora monitorado de la gastiganto, por ĉi tiuj celoj ni havas Zabbikh.

B - sekureco

Koncerne sekurecon, ni komencu de la ŝlosilaj principoj en la kunteksto de infrastrukturo:

Konfidenco - Normaj iloj de UNIX-similaj sistemoj certigas la efektivigon de ĉi tiu principo. Ni logike apartigas aliron al ĉiu logike aparta elemento de la sistemo - ĉelo. Aliro estas disponigita per norma uzantaŭtentigo uzante personajn ŝlosilojn de la uzantoj. Ĉiu komunikado inter kaj ĝis la fino ĉeloj okazas en ĉifrita formo. Danke al disko-ĉifrado, ni ne devas zorgi pri la sekureco de datumoj dum anstataŭigo de disko aŭ migrado al alia servilo. La nura kritika aliro estas aliro al la gastiga sistemo, ĉar tia aliro ĝenerale disponigas aliron al datenoj ene de ujoj.

Integreco "La efektivigo de ĉi tiu principo okazas sur pluraj malsamaj niveloj. Unue, estas grave rimarki, ke en la kazo de servila aparataro, ECC-memoro, ZFS jam "el la skatolo" prizorgas datuman integrecon je la nivelo de informaj bitoj. Tujaj momentfotoj permesas vin fari sekurkopiojn iam ajn sur la flugo. Konvenaj ĉelaj eksportaj/importaj iloj simpligas ĉelreproduktadon.

Disponibilidad - Ĉi tio jam estas laŭvola. Dependas de la grado de via famo kaj de la fakto, ke vi havas malamikojn. En nia ekzemplo, ni certigis, ke la monujo estis alirebla ekskluzive de la TOP-reto. Se necese, vi povas bloki ĉion sur la fajroŝirmilo kaj permesi aliron al la servilo ekskluzive per tuneloj (TOR aŭ VPN estas alia afero). Tiel, la servilo estos fortranĉita de la ekstera mondo kiel eble plej multe, kaj nur ni mem povos influi ĝian haveblecon.

Neebleco de rifuzo - Kaj tio dependas de plua funkciado kaj plenumo de la ĝustaj politikoj pri uzantrajtoj, aliro, ktp. Sed kun la ĝusta aliro, ĉiuj agoj de uzantoj estas reviziitaj, kaj danke al kriptografaj solvoj eblas senambigue identigi, kiu faris iujn agojn kaj kiam.

Kompreneble, la priskribita agordo ne estas absoluta ekzemplo de kiel ĝi ĉiam devus esti, ĝi estas prefere unu ekzemplo de kiel ĝi povas esti, konservante tre flekseblajn skalo- kaj personigokapablojn.

Kio pri plena virtualigo?

Pri plena virtualigo uzante cbsd vi povas legu ĉi tie. Mi nur aldonos tion por laboro bhyve Vi devas ebligi kelkajn kernajn opciojn.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Do se vi subite bezonas komenci docker, tiam instalu iun debianon kaj iru!

Bitcoin en kaĝo?

Tio estas ĉio

Mi supozas, ke tio estas ĉio, kion mi volis dividi. Se vi ŝatis la artikolon, tiam vi povas sendi al mi kelkajn bitcoins - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Se vi volas provi ĉelojn en ago kaj havi iujn bitcoins, vi povas iri al mia pet-projekto.

fonto: www.habr.com