Bitcoin in una gabbia?

È successo che di professione sono amministratore di sistemi e reti informatiche (in breve: amministratore di sistema), e ho avuto modo di raccontarlo al prof.per poco più di 10 anni. le attività di un’ampia varietà di sistemi, compresi quelli che richiedono misure di sicurezza [estreme]. È anche successo che qualche tempo fa l'ho trovato interessante bitcoin, e non solo l'ha utilizzato, ma ha anche lanciato diversi microservizi per imparare a lavorare in modo indipendente con la rete Bitcoin (dopotutto anche p2p) dal punto di vista di uno sviluppatore (io ovviamente sono uno di quelli dev, quindi, passavo di lì). Ma non sto parlando di sviluppo, sto parlando di un ambiente sicuro ed efficiente per le applicazioni.

Tecnologia finanziaria (Fintech) vai accanto a Sicurezza delle informazioni (INFOSEC) e il primo può funzionare senza il secondo, ma non per molto. Ecco perché voglio condividere la mia esperienza e l'insieme di strumenti che utilizzo, che li include entrambi FintechE INFOSEC, e allo stesso tempo, e può essere utilizzato anche per uno scopo più ampio o completamente diverso. In questo articolo ti parlerò non tanto di Bitcoin, ma del modello di infrastruttura per lo sviluppo e il funzionamento dei servizi finanziari (e non solo), in una parola, quei servizi in cui conta la “B”. Ciò vale sia per lo scambio Bitcoin che per il più tipico zoo aziendale di servizi di una piccola azienda non collegata in alcun modo a Bitcoin.

Vorrei sottolineare che sono un sostenitore dei principi "mantienilo stupido e semplice" и "meno è meglio", pertanto, sia l'articolo che quanto in esso descritto avranno le proprietà di cui trattano questi principi.

Scenario immaginario: Diamo un'occhiata a tutto usando l'esempio di uno scambiatore di bitcoin. Abbiamo deciso di lanciare lo scambio di rubli, dollari, euro con bitcoin e viceversa, e abbiamo già una soluzione funzionante, ma per altri soldi digitali come qiwi e webmoney, ad es. Abbiamo chiuso tutte le questioni legali, abbiamo un'applicazione già pronta che funge da gateway di pagamento per rubli, dollari ed euro e altri sistemi di pagamento. È collegato ai nostri conti bancari e dispone di una sorta di API per le nostre applicazioni finali. Abbiamo anche un'applicazione web che funge da scambiatore per gli utenti, beh, come un tipico account qiwi o webmoney: crea un account, aggiungi una carta e così via. Comunica con la nostra applicazione gateway, anche se tramite l'API REST in ambito locale. E così abbiamo deciso di connettere i bitcoin e allo stesso tempo aggiornare l'infrastruttura, perché... Inizialmente tutto veniva montato in fretta e furia su virtualbox in ufficio sotto il tavolo... il sito cominciò ad essere utilizzato e cominciammo a preoccuparci dei tempi di attività e delle prestazioni.

Quindi iniziamo con la cosa principale: scegliere un server. Perché l'attività nel nostro esempio è piccola e ci fidiamo dell'hoster (OVH) che sceglieremo un'opzione di bilancio in cui è impossibile installare il sistema dall'immagine .iso originale, ma non importa, il dipartimento di sicurezza IT analizzerà sicuramente l'immagine installata. E quando saremo grandi, affitteremo il nostro armadio sotto chiave con accesso fisico limitato, e forse costruiremo il nostro DC. In ogni caso, vale la pena ricordare che quando si noleggia l'hardware e si installano immagini già pronte, c'è la possibilità che sul sistema sia appeso un "Trojan dell'hoster", che nella maggior parte dei casi non ha lo scopo di spiarti ma per offrire server di strumenti di gestione più convenienti.

Installazione del server

Tutto è semplice qui. Scegliamo l'hardware adatto alle nostre esigenze. Quindi seleziona l'immagine di FreeBSD. Bene, oppure ci colleghiamo (nel caso di un altro hoster e del nostro hardware) tramite IPMI o con un monitor e inseriamo l'immagine .iso di FreeBSD nel download. Per un setup orchestrale utilizzo ansible и mfsbsd. L'unica cosa, nel nostro caso con kimsufi, abbiamo scelto installazione personalizzata affinché i due dischi nel mirror abbiano solo le partizioni boot e /home “aperte”, il resto dello spazio su disco verrà crittografato, ma ne parleremo più avanti.

Bitcoin in una gabbia?

L'installazione del sistema avviene in modo standard, non mi soffermerò su questo, noterò solo che prima di iniziare l'operazione vale la pena prestare attenzione tempra opzioni che offre bsdinstaller al termine dell'installazione (se installi il sistema da solo):

Bitcoin in una gabbia?

C'è buon materiale su questo argomento lo ripeterò brevemente qui.

È possibile abilitare i parametri sopra indicati anche su un impianto già installato. Per fare ciò, è necessario modificare il file del bootloader e abilitare i parametri del kernel. *ee è un editor come questo in BSD

# ee /etc/rc.conf

...
#sec hard
clear_tmp_enable="YES"
syslogd_flags="-ss"    
sendmail_enable="NONE"

# ee /etc/sysctl.conf

...
#sec hard
security.bsd.see_other_uids=0
security.bsd.see_other_gids=0
security.bsd.unprivileged_read_msgbuf=0
security.bsd.unprivileged_proc_debug=0
kern.randompid=$(jot -r 1 9999)
security.bsd.stack_guard_page=1

Dovresti anche assicurarti di avere installata la versione più recente del sistema e eseguire tutti gli aggiornamenti e gli upgrade. Nel nostro caso, ad esempio, è necessario un aggiornamento all'ultima versione, perché... le immagini pre-installazione restano indietro da sei mesi a un anno. Bene, lì cambiamo la porta SSH in qualcosa di diverso da quella predefinita, aggiungiamo l'autenticazione con chiave e disabilitiamo l'autenticazione con password.

Quindi configuriamo aide, monitorando lo stato dei file di configurazione del sistema. Puoi leggere più in dettaglio qui.

pkg install aide

e modifica il nostro 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

Includiamo controllo del sistema

sysrc auditd_enable=YES

# service auditd start

Come amministrare questa materia è perfettamente descritto in guida.

Ora riavviamo e procediamo al software sul server. Ogni server è un hypervisor per contenitori o macchine virtuali complete. Pertanto, è importante che il processore supporti VT-x ed EPT se intendiamo utilizzare la virtualizzazione completa.

Per gestire contenitori e macchine virtuali utilizzo CBD от oleovole, Gli auguro più salute e benedizioni per questa meravigliosa utilità!

Contenitori? Di nuovo Docker o cosa?

E qui no. FreeBSD Jails è uno strumento eccellente per la containerizzazione, ma il menzionato cbsd per orchestrare questi contenitori, che sono chiamati celle.

La gabbia è una soluzione estremamente efficace per costruire infrastrutture per una varietà di scopi, dove in definitiva è richiesto il completo isolamento dei singoli servizi o processi. Essenzialmente è un clone del sistema host, ma non richiede la virtualizzazione completa dell'hardware. E grazie a ciò, le risorse non vengono spese per il "sistema operativo guest", ma solo per il lavoro svolto. Quando le celle vengono utilizzate per esigenze interne, questa è una soluzione molto conveniente per un utilizzo ottimale delle risorse: un gruppo di celle su un server hardware può utilizzare ciascuna individualmente l'intera risorsa del server, se necessario. Considerando che solitamente diversi sottoservizi necessitano di ulteriori. risorse in momenti diversi, è possibile ottenere le massime prestazioni da un server se si pianifica e bilancia adeguatamente le celle tra i server. Se necessario, alle celle possono essere assegnate anche restrizioni sulla risorsa utilizzata.

Bitcoin in una gabbia?

E la virtualizzazione completa?

Per quanto ne so cbsd sostiene il lavoro bhyve e hypervisor XEN. Non ho mai usato il secondo, ma il primo è relativamente nuovo hypervisor di FreeBSD. Vedremo un esempio di utilizzo bhyve nell'esempio seguente.

Installazione e configurazione dell'ambiente host

Usiamo FS ZFS. Questo è uno strumento estremamente potente per la gestione dello spazio del server. Grazie a ZFS, puoi creare direttamente array di varie configurazioni dai dischi, espandere dinamicamente lo spazio "a caldo", cambiare dischi morti, gestire istantanee e molto altro ancora, che può essere descritto in tutta una serie di articoli. Torniamo al nostro server e ai suoi dischi. All'inizio dell'installazione, abbiamo lasciato spazio libero sui dischi per le partizioni crittografate. Perché? In questo modo il sistema si attiva automaticamente e ascolta tramite SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

aggiungere una partizione del disco allo spazio rimanente

geli init /dev/ada0p4

inserisci la nostra password di crittografia

geli attach /dev/ada0p4

Inseriamo nuovamente la password e abbiamo un dispositivo /dev/ada0p4.eli: questo è il nostro spazio crittografato. Quindi ripetiamo lo stesso per /dev/ada1 e il resto dei dischi nell'array. E ne creiamo uno nuovo Piscina ZFS.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - Bene, abbiamo pronto il kit di combattimento minimo. Un array di dischi con mirroring nel caso in cui uno dei tre fallisca.

Creazione di un dataset su un nuovo “pool”

zfs create vms/jails

pkg install cbsd — abbiamo creato un team e istituito la gestione delle nostre cellule.

Dopo cbsd installato, deve essere inizializzato:

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

Bene, rispondiamo a una serie di domande, per lo più con risposte predefinite.

*Se stai utilizzando la crittografia, è importante che il daemon cbsdd non si avvia automaticamente finché non decidi i dischi manualmente o automaticamente (nel nostro esempio questo viene fatto da zabbix)

**Inoltre non utilizzo NAT from cbsd, e lo configuro da solo 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

Anche l'impostazione delle policy del firewall è un argomento separato, quindi non approfondirò l'impostazione della policy BLOCK ALL e dell'impostazione delle whitelist, puoi farlo leggendo documentazione ufficiale o uno qualsiasi degli enormi numeri di articoli disponibili su Google.

Bene... abbiamo installato CBD, è ora di creare il nostro primo cavallo di battaglia: il demone Bitcoin in gabbia!

cbsd jconstruct-tui

Bitcoin in una gabbia?

Qui vediamo la finestra di dialogo per la creazione della cella. Dopo che tutti i valori sono stati impostati, creiamo!

Quando crei la tua prima cella, dovresti scegliere cosa usare come base per le celle. Seleziono una distribuzione dal repository di FreeBSD con il comando repo. Questa scelta viene effettuata solo quando si crea la prima cella di una versione specifica (è possibile ospitare celle di qualsiasi versione precedente a quella host).

Dopo aver installato tutto, lanciamo la gabbia!

# cbsd jstart bitcoind

Ma dobbiamo installare il software nella gabbia.

# jls

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

jexec bitcoind per entrare nella console cellulare

e già all'interno della cella installiamo il software con le sue dipendenze (il nostro sistema host rimane pulito)

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

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

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

C'è Bitcoin nella gabbia, ma abbiamo bisogno dell'anonimato perché vogliamo connetterci ad alcune gabbie tramite la rete TOP. In generale, prevediamo di eseguire la maggior parte delle celle con software sospetto solo tramite un proxy. Grazie a pf Puoi disabilitare il NAT per un certo intervallo di indirizzi IP sulla rete locale e consentire il NAT solo per il nostro nodo TOR. Pertanto, anche se il malware entra nella cella, molto probabilmente non comunicherà con il mondo esterno e, in tal caso, non rivelerà l'IP del nostro server. Pertanto, creiamo un'altra cella per "inoltrare" i servizi come servizio ".onion" e come proxy per l'accesso a Internet alle singole celle.

# 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

Imposta per ascoltare su un indirizzo locale (disponibile per tutte le celle)

SOCKSPort 192.168.0.2:9050

Di cos’altro abbiamo bisogno per la completa felicità? Sì, abbiamo bisogno di un servizio per il nostro web, forse più di uno. Lanciamo nginx, che fungerà da reverse-proxy e si occuperà di rinnovare i certificati Let's Encrypt

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

E così abbiamo messo 150 MB di dipendenze in una gabbia. E l'host è ancora pulito.

Torniamo più tardi alla configurazione di nginx, dobbiamo creare altre due celle per il nostro gateway di pagamento su nodejs e ruggine e un'applicazione web, che per qualche motivo è in Apache e PHP, e quest'ultima richiede anche un database 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

...e altri 380 MB di pacchetti isolati

Successivamente scarichiamo la nostra applicazione con git e la lanciamo.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

Pacchetti da 450 MB. in una gabbia.

qui diamo allo sviluppatore l'accesso tramite SSH direttamente al cellulare, lì faranno tutto da soli:

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

Port 2267 - cambia la porta SSH della cella con una qualsiasi

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

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

Bene, il servizio è in esecuzione, non resta che aggiungere la regola pf firewall

Vediamo che IP hanno le nostre cellule e come si presenta in generale la nostra “zona locale”.

# 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

e aggiungi una regola

# 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

Bene, visto che siamo qui, aggiungiamo anche una regola per il proxy inverso:

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

Bene, ora parliamo un po’ dei bitcoin

Quello che abbiamo è un'applicazione web esposta esternamente e che comunica localmente con il nostro gateway di pagamento. Ora dobbiamo preparare un ambiente di lavoro per interagire con la rete Bitcoin stessa: il nodo bitcoind è solo un demone che mantiene aggiornata la copia locale della blockchain. Questo demone ha funzionalità RPC e portafoglio, ma esistono "wrapper" più convenienti per lo sviluppo di applicazioni. Per cominciare, abbiamo deciso di mettere electrum è un portafoglio CLI. Questo portafoglio lo useremo come “cold storage” per i nostri bitcoin - in generale, quei bitcoin che dovranno essere conservati “fuori” dal sistema accessibile agli utenti e generalmente lontano da tutti. Ha anche una GUI, quindi utilizzeremo lo stesso portafoglio sul nostro
computer portatili. Per ora utilizzeremo Electrum con server pubblici e in seguito lo solleveremo in un'altra cella ElectrumXper non dipendere affatto da nessuno.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

altri 700 MB di software nella nostra gabbia

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

Ora abbiamo creato un portafoglio.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

A noi on-catena D'ora in poi solo un numero limitato di persone potrà connettersi al portafoglio. Per non aprire l'accesso a questa cella dall'esterno, le connessioni tramite SSH avverranno tramite TOP (una versione decentralizzata della VPN). Lanciamo SSH nella cella, ma non tocchiamo il nostro pf.conf sull'host.

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

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

Adesso spegniamo il cellulare con l’accesso a Internet del portafoglio. Diamogli un indirizzo IP da un altro spazio di sottorete che non è NAT. Per prima cosa cambiamo /etc/pf.conf sull'ospite

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" cambiamolo in JAIL_IP_POOL="192.168.0.0/25", quindi tutti gli indirizzi 192.168.0.126-255 non avranno accesso diretto a Internet. Una sorta di rete software “air-gap”. E la regola NAT rimane la stessa

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

Sovraccaricare le regole

# pfctl -f /etc/pf.conf

Ora prendiamo il nostro cellulare

# cbsd jconfig jname=electrum

Bitcoin in una gabbia?

Bitcoin in una gabbia?

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, ma ora il sistema stesso smetterà di funzionare per noi. Tuttavia, possiamo specificare un proxy di sistema. Ma c'è una cosa, su TOR è un proxy SOCKS5, e per comodità vorremmo anche un proxy 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

Bene, ora ci sono due server proxy nel nostro sistema ed entrambi restituiscono tramite TOR: calzini5://192.168.0.2:9050 e http://192.168.0.6:8123

Ora possiamo configurare l'ambiente del nostro portafoglio

# 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

Bene, ora la shell funzionerà da un proxy. Se vogliamo installare pacchetti, allora dovremmo aggiungere a /usr/local/etc/pkg.conf da sotto la radice della gabbia

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

Bene, ora è il momento di aggiungere il servizio nascosto TOR come indirizzo del nostro servizio SSH nella gabbia del portafoglio.

# 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

Questo è il nostro indirizzo di connessione. Controlliamo dal computer locale. Ma prima dobbiamo aggiungere la nostra chiave SSH:

wallet@electrum:/ % mkdir ~/.ssh

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

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

Bene, da una macchina client 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

attaccare (Affinché funzioni, è necessario un demone TOR locale in ascolto su 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

Успех!

Per lavorare con pagamenti istantanei e micropagamenti, abbiamo bisogno anche di un nodo Lightning Network, infatti, questo sarà il nostro principale strumento di lavoro con Bitcoin. U*c-lampoche useremo come demone Plug-in Sparko, che è un'interfaccia HTTP (REST) ​​a tutti gli effetti e ti consente di lavorare sia con transazioni off-chain che on-chain. c-lightning necessari per il funzionamento bitcoind ma si.

*Esistono diverse implementazioni del protocollo Lightning Network in diverse lingue. Di quelli che abbiamo testato, c-lightning (scritto in C) sembrava il più stabile ed efficiente in termini di risorse

# 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

Mentre tutto il necessario viene compilato e installato, creiamo un utente RPC per 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

Il mio passaggio caotico tra le celle risulta non essere così caotico se si nota l'utilità tmux, che consente di creare più sottosessioni del terminale all'interno di una sessione. Analogico: screen

Bitcoin in una gabbia?

Quindi, non vogliamo rivelare il vero IP del nostro nodo e vogliamo condurre tutte le transazioni finanziarie tramite TOP. Pertanto non è necessaria un'altra cipolla.

# 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

Ora creiamo una configurazione per 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 ~

devi anche creare un file di configurazione per bitcoin-cli, un'utilità con cui comunica bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

dai un'occhiata

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

[
  "test"
]

lancio lightningd

lightning@lightning:~ % lightningd --daemon

Se stesso lightningd puoi controllare l'utilità lightning-cli, ad esempio:

lightning-cli newaddr ottenere l'indirizzo per un nuovo pagamento in entrata

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all invia tutto il denaro nel portafoglio all'indirizzo (tutti gli indirizzi on-chain)

Comandi anche per operazioni fuori catena lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay e così via

Bene, per la comunicazione con l'applicazione abbiamo un'API REST

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

Riassumere

# 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 in una gabbia?

Disponiamo di una serie di contenitori, ciascuno con il proprio livello di accesso sia da che verso la rete locale.

# 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

Come puoi vedere, bitcoind occupa tutti i 190 GB di spazio. Cosa succede se abbiamo bisogno di un altro nodo per i test? È qui che ZFS torna utile. Con aiuto cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com puoi creare un'istantanea e allegare una nuova cella a questa istantanea. La nuova cella avrà un suo spazio, ma nel file system verrà presa in considerazione solo la differenza tra lo stato attuale e quello originale (salveremo almeno 190 GB)

Ogni cella ha il proprio set di dati ZFS separato e questo è estremamente conveniente. ZFS lo consente anche fai varie altre cose interessanti, come inviare istantanee tramite SSH. Non lo descriveremo, c’è già molto.

Vale anche la pena notare la necessità del monitoraggio remoto dell'host, di cui disponiamo per questi scopi Zabbix.

B-sicurezza

Per quanto riguarda la sicurezza, partiamo dai principi chiave in ambito infrastrutturale:

Конфиденциальность - Gli strumenti standard dei sistemi simili a UNIX garantiscono l'attuazione di questo principio. Separiamo logicamente l'accesso a ciascun elemento logicamente separato del sistema: una cella. L'accesso viene fornito tramite l'autenticazione utente standard utilizzando le chiavi personali degli utenti. Tutte le comunicazioni tra e verso le celle terminali avvengono in forma crittografata. Grazie alla crittografia del disco non dobbiamo preoccuparci della sicurezza dei dati durante la sostituzione del disco o la migrazione su un altro server. L'unico accesso critico è l'accesso al sistema host, poiché tale accesso generalmente fornisce l'accesso ai dati all'interno dei contenitori.

integrità “L’attuazione di questo principio avviene a diversi livelli. In primo luogo, è importante notare che nel caso dell'hardware del server, della memoria ECC, ZFS già “pronto all'uso” si prende cura dell'integrità dei dati a livello di bit di informazione. Le istantanee istantanee ti consentono di eseguire backup in qualsiasi momento al volo. I pratici strumenti di esportazione/importazione delle cellule semplificano la replicazione delle cellule.

Disponibilità - Questo è già facoltativo. Dipende dal grado della tua fama e dal fatto che hai degli haters. Nel nostro esempio ci siamo assicurati che il portafoglio fosse accessibile esclusivamente dalla rete TOP. Se necessario, puoi bloccare tutto sul firewall e consentire l'accesso al server esclusivamente tramite tunnel (TOR o VPN è un'altra questione). In questo modo il server sarà il più possibile isolato dal mondo esterno e solo noi stessi potremo influenzarne la disponibilità.

Impossibilità di rifiuto - E questo dipende dall'ulteriore funzionamento e dal rispetto delle politiche corrette per i diritti utente, l'accesso, ecc. Ma con il giusto approccio, tutte le azioni dell'utente vengono controllate e grazie a soluzioni crittografiche è possibile identificare in modo inequivocabile chi ha eseguito determinate azioni e quando.

Naturalmente, la configurazione descritta non è un esempio assoluto di come dovrebbe essere sempre, è piuttosto un esempio di come può essere, pur mantenendo capacità di scalabilità e personalizzazione molto flessibili.

E la virtualizzazione completa?

Puoi farlo sulla virtualizzazione completa utilizzando CBD leggi qui. Lo aggiungerò solo per lavoro bhyve È necessario abilitare alcune opzioni del kernel.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Quindi, se all'improvviso hai bisogno di avviare una finestra mobile, installa un po' di Debian e vai!

Bitcoin in una gabbia?

Tutto qui

Immagino che fosse tutto ciò che volevo condividere. Se ti è piaciuto l'articolo, puoi inviarmi dei bitcoin - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Se vuoi provare le celle in azione e avere dei bitcoin, puoi andare sul mio progetto-animale domestico.

Fonte: habr.com