Bitcoin in gabbia?

È interessante notare che per professione sono un amministratore di sistemi e reti informatiche (in breve: sistemista), e ho avuto l'opportunità di lavorare per oltre 10 anni con vari sistemi, compresi quelli che richiedono misure di sicurezza [alte|particolari]. Inoltre, è successo che un po' di tempo fa ho trovato interessante bitcoin, e non solo lo ho utilizzato, ma ho anche avviato diversi microservizi per imparare a lavorare autonomamente con la rete bitcoin (è pur sempre p2p) dal punto di vista dello sviluppatore (io, ovviamente, non sono un esperto dev, solo un curioso). Ma non parlo di sviluppo, parlo di un ambiente sicuro ed efficace per le applicazioni.

Le tecnologie finanziarie (fintech) vanno di pari passo con la sicurezza informatica (infosec) e la prima può funzionare senza la seconda, ma non a lungo. Ecco perché voglio condividere la mia esperienza e l'insieme di strumenti che utilizzo, che comprende sia fintech, sia infosec, e può essere utilizzato anche in un contesto più ampio o completamente diverso. In questo articolo non parlerò tanto di bitcoin, quanto del modello infrastrutturale per lo sviluppo e l'operatività di servizi finanziari (e non solo) — insomma, quei servizi dove la "B" ha importanza. Questo è valido sia per un exchange di bitcoin che per un tipico zootecnico di servizi di una piccola azienda non collegata al bitcoin.

Voglio sottolineare che sono sostenitore dei principi "keep it stupid simple" e "less is more", quindi sia l'articolo che quanto descritto in esso avranno caratteristiche coerenti con questi principi.

Scenari ipotetici: Affrontiamo il tutto con l'esempio di uno scambiatore di bitcoin. Abbiamo deciso di avviare uno scambio di rubli, dollari ed euro per bitcoin e viceversa, e abbiamo già una soluzione operativa. Ci occupiamo anche di altre valute digitali come QIWI e WebMoney; insomma, abbiamo risolto tutte le questioni legali. Dispone di un'applicazione pronta che funge da gateway di pagamento per rubli, dollari, euro e altri sistemi di pagamento. È collegata ai nostri conti bancari e integra un'API per le nostre applicazioni finali. Inoltre, abbiamo un'app web che svolge il ruolo di scambiatore per gli utenti, simile a un tipico portale QIWI o WebMoney: registrate un account, aggiungete una carta, ecc. Essa comunica con la nostra applicazione gateway, sempre tramite REST API in locale. E così, abbiamo deciso di collegare i bitcoin e nel contempo aggiornare l'infrastruttura, poiché inizialmente tutto era stato allestito in fretta su VirtualBox sotto la scrivania in ufficio... il sito ha iniziato a essere utilizzato, e ora ci preoccupiamo dell'uptime e delle prestazioni.

Iniziamo quindi con l'essenziale: la scelta del server. Poiché l'attività del nostro esempio è piccola e ci fidiamo dell'hosting (OVH), sceglieremo un'opzione economica in cui non è possibile installare il sistema da un'immagine .iso originale, ma non preoccuparti, il dipartimento IT della sicurezza effettuerà sicuramente un'analisi dell'immagine installata. E quando cresceremo, affitteremo addirittura il nostro armadio con lucchetto e accesso fisico limitato, o forse costruiremo il nostro data center. In ogni caso, è importante ricordare che quando si affitta l'hardware e si installano immagini pronte all'uso, c'è la possibilità che nel sistema ci sia un "trojan dell'hoster", che nella maggior parte dei casi non è destinato a spiarti, ma per offrirti strumenti di gestione del server più comodi.

Installazione del server

Qui è tutto semplice. Scegliamo l'hardware che soddisfa le nostre esigenze. Poi selezioniamo l'immagine di FreeBSD. Oppure ci colleghiamo (nel caso di un altro hoster e del nostro hardware) tramite IPMI o con un monitor e avviamo il caricamento dell'immagine .iso di FreeBSD. Per l'installazione orchestrata utilizzo Ansible e mfsbsd. L'unica cosa, nel nostro caso con kimsufi, abbiamo scelto installazione personalizzata affinché i due dischi in mirror avessero "aperti" solo le partizioni di avvio e /home, il resto dello spazio del disco sarà crittografato, ma ne parleremo più avanti.

Bitcoin in gabbia?

L'installazione del sistema avviene in modo standard, non mi soffermerò su questo, ma vorrei sottolineare che prima di iniziare a utilizzare il sistema, è importante prestare attenzione a hardening alle opzioni offerte da bsdinstaller alla fine dell'installazione (se installate il sistema da soli):

Bitcoin in gabbia?

un buon materiale su questo argomento, lo riassumerò qui brevemente.

È possibile attivare i parametri sopra citati anche su un sistema già installato. Per farlo, è necessario modificare il file di avvio e abilitare i parametri del kernel. *ee — è un editor presente 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

È anche importante assicurarsi di avere installato l'ultima versione del sistema e di eseguire tutti gli aggiornamenti e gli upgrade. Nel nostro caso, ad esempio, è necessario eseguire l'upgrade all'ultima versione, poiché le immagini preinstallate sono indietro di sei mesi o un anno. E poi cambiamo la porta SSH in una diversa da quella predefinita, aggiungiamo l'autenticazione tramite chiavi e disattiviamo l'accesso con password.

Dopodiché, configuriamo aide, il monitoraggio dello stato dei file di configurazione del sistema. Maggiori dettagli possono essere letti. qui.

pkg install aide

e modifichiamo 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

Attiviamo audit di sistema

sysrc auditd_enable=YES

# service auditd start

Come amministrare questo è descritto molto bene in guida.

Ora riavviamo e iniziamo a configurare il software sul server. Ogni server funge da hypervisor per i container o macchine virtuali complete. È quindi importante che il processore supporti VT-x e EPT se pianifichiamo di utilizzare la virtualizzazione completa.

Come gestione di container e macchine virtuali utilizzo cbsd da olevole, gli auguro buona salute e benedizioni per questo fantastico strumento!

Container? Di nuovo Docker?

E invece no. FreeBSD Jails — è uno strumento eccellente per la containerizzazione, mentre il citato cbsd per l'orchestrazione di questi container, il cui nome è — celle.

La cella è una soluzione estremamente efficace per la costruzione di infrastrutture per vari scopi, dove è necessaria la completa isolamento di servizi o processi distinti. Fondamentalmente, è un clone del sistema di hosting, ma non richiede una virtualizzazione completa dell'hardware. In questo modo, le risorse non vengono sprecate per un 'sistema operativo ospite', ma sono utilizzate solo per il lavoro effettivo. Quando le celle vengono utilizzate per scopi interni, rappresentano una soluzione molto comoda per un utilizzo ottimale delle risorse: un gran numero di celle su un singolo server fisico può utilizzare ogni cella separatamente l'intera risorsa del server, se necessario. Considerando che di solito diversi sottoservizi richiedono risorse aggiuntive in momenti diversi, si può estrarre la massima prestazione da un server se si pianificano e bilanciano correttamente le celle tra i server. Se necessario, le celle possono anche essere dotate di limiti sulle risorse utilizzate.

Bitcoin in gabbia?

E per quanto riguarda la virtualizzazione completa?

Per quanto ne so, cbsd supporta i bhyve e i hypervisor XEN. Non ho mai usato il secondo, mentre il primo è un hypervisor relativamente nuovo di FreeBSD.. Esamineremo un esempio di utilizzo bhyve nell'esempio seguente.

Installazione e configurazione dell'ambiente host

Utilizziamo FS ZFS. È uno strumento estremamente potente per la gestione dello spazio sul server. Grazie a ZFS, è possibile costruire array di configurazioni diverse direttamente dai dischi, ampliare dinamicamente lo spazio 'a caldo', sostituire dischi guasti, gestire snapshot e molto, molto altro che si potrebbe descrivere in una serie di articoli. Torniamo al nostro server e ai suoi dischi. All'inizio dell'installazione, abbiamo lasciato dello spazio libero sui dischi per le partizioni crittografate. Perché? In modo che il sistema possa avviarsi automaticamente e ascoltare tramite SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

aggiungiamo la partizione del disco sullo spazio rimanente

geli init /dev/ada0p4

inseriamo la nostra password di crittografia

geli attach /dev/ada0p4

inseriamo di nuovo la password e otteniamo il dispositivo /dev/ada0p4.eli — questo è il nostro spazio crittografato. Poi ripetiamo lo stesso per /dev/ada1 e gli altri dischi nell'array. E creiamo un nuovo ZFS pool.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli — ecco, il nostro set di base è pronto. Un array di dischi per eventualità di guasto di uno dei tre.

Creiamo un dataset su un nuovo "pool"

zfs create vms/jails

pkg install cbsd — abbiamo lanciato il comando, e stiamo installando il gestore per le nostre celle.

Dopo che cbsd è stato installato, deve essere inizializzato:

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

dobbiamo rispondere a molte domande, principalmente con le risposte predefinite.

*Se stai usando la crittografia, è importante che il demone cbsdd non parta automaticamente, finché non decritti i dischi manualmente o automaticamente (nel nostro esempio, questo viene fatto da zabbix)

**Inoltre, non uso il NAT di cbsd, ma lo configuro io stesso in 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 per le prigioni
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC

## Port forwarding per la rete Bitcoin
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

La configurazione delle politiche del firewall è un argomento a parte, quindi non approfondirò la configurazione della politica BLOCK ALL e le impostazioni delle liste bianche, questo può essere fatto leggendo la documentazione ufficiale o uno qualsiasi dei numerosi articoli disponibili su Google.

Bene... abbiamo installato cbsd, è ora di creare il nostro primo cavallo da lavoro: un demone Bitcoin in una cella!

cbsd jconstruct-tui

Bitcoin in gabbia?

Qui vediamo il dialogo di creazione della cella. Una volta impostati tutti i valori, creiamo!

Quando creiamo la prima cella, dobbiamo scegliere cosa usare come base per le celle. Io scelgo il pacchetto dal repository FreeBSD con il comando repo. Questa scelta viene effettuata solo durante la creazione della prima cella di una versione specifica (è possibile ospitare celle di qualsiasi versione superiore a quella dell'host).

Una volta che tutto è installato, avviamo la cella!

# cbsd jstart bitcoind

Ma dobbiamo installare il software nella cella.

# jls

   JID  Indirizzo IP      Nome host                         Percorso
     1  192.168.0.1     bitcoind.space.com            /zroot/jails/jails/bitcoind

jexec bitcoind per accedere alla console della cella

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

Bitcoin nella cella è attivo, ma abbiamo bisogno di anonimato, poiché vogliamo connetterci ad alcune celle tramite la rete TOR. In generale, abbiamo in programma di eseguire la maggior parte delle celle con software sospetto solo tramite proxy. Grazie pf è possibile disabilitare il NAT per un determinato intervallo di indirizzi IP nella rete locale e consentire il NAT solo per il nostro nodo TOR. In questo modo, anche se un malware entra nella cella, è probabile che non riesca a connettersi con il mondo esterno, e se lo fa, non rivelerà l'IP del nostro server. Pertanto, creiamo un'altra cella per il 'forwarding' di servizi come i servizi '.onion' e come proxy per l'accesso a Internet per celle separate.

# 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

Impostiamo l'ascolto su un indirizzo locale (disponibile per tutte le celle)

SOCKSPort 192.168.0.2:9050

Cosa ci manca per la felicità completa? Sì, abbiamo bisogno di un servizio per il nostro web, forse anche più di uno. Avviamo nginx, che fungerà da reverse-proxy e si occuperà del rinnovo dei certificati Let’s Encrypt.

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

Ecco, abbiamo inserito 150 MB di dipendenze nella cella. E l'host è ancora pulito.

Torniamo alla configurazione di nginx più tardi; dobbiamo alzare altre due celle per il nostro gateway di pagamento in nodejs e rust e per l'applicazione web, che per qualche motivo utilizza Apache e PHP, e per quest'ultima è necessaria 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

dopo di che utilizzeremo Git per caricare la nostra applicazione e avviarla.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

450 MB di pacchetti. nella gabbia.

qui diamo accesso allo sviluppatore via SSH direttamente nella gabbia, faranno tutto da soli:

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

Port 2267 — cambiamo la porta SSH della gabbia a una qualsiasi a piacere

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

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

Ecco, il servizio è avviato, resta da aggiungere una regola nel pf firewall

Vediamo quali IP abbiamo nelle gabbie e come appare la nostra "località"

# jls

   JID  Indirizzo IP      Nome host                      Percorso
     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 aggiungeremo la 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

e dato che siamo qui, aggiungeremo anche una regola per il reverse-proxy:

## web-ports for nginx-rev
IP_JAIL="192.168.0.3"
PORT_JAIL="{ 80, 443 }"
rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL

# pfctl -f /etc/pf.conf

Ora un po' sui bitcoin

Cosa abbiamo — abbiamo un'app web accessibile esternamente, e comunica localmente con il nostro gateway di pagamento. Ora dobbiamo preparare l'ambiente di lavoro per l'interazione con la rete Bitcoin stessa — nodo bitcoind questo è solo un demonio che supporta una copia locale della blockchain attuale. Questo demonio ha RPC e funzionalità di portafoglio, ma per lo sviluppo di applicazioni ci sono «wrapper» più convenienti. Per iniziare, abbiamo deciso di installare electrum — è un portafoglio CLI. Questo portafoglio sarà utilizzato come «cold storage» per i nostri bitcoin — in sostanza, quei bitcoin che devono essere conservati «al di fuori» del sistema accessibile agli utenti e, in generale, lontano da tutti. Ha anche un'interfaccia grafica, quindi intendiamo utilizzare lo stesso portafoglio sui nostri
laptop. Per ora useremo Electrum con server pubblici, e più tardi installeremo ElectrumX, in modo da non essere dipendenti da nessuno.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

ancora 700 MB di software nella cella

electrum:/@[8:53] # adduser

Nome utente: wallet
Nome completo: 
Uid (Lascia vuoto per predefinito): 
Gruppo di accesso [wallet]: 
Il gruppo di accesso è wallet. Vuoi invitare wallet in altri gruppi? []: 
Classe di accesso [default]: 
Shell (sh csh tcsh nologin) [sh]: tcsh
Directory home [/home/wallet]: 
Permessi della directory home (Lascia vuoto per predefinito): 
Utilizzare l'autenticazione basata su password? [yes]: no
Bloccare l'account dopo la creazione? [no]: 
Nome utente   : wallet
Password   : 
Nome completo  : 
Uid        : 1001
Classe      : 
Gruppi     : wallet 
Home       : /home/wallet
Home Mode  : 
Shell      : /bin/tcsh
Bloccato     : no
OK? (yes/no): yes
adduser: INFO: Aggiunto con successo (wallet) al database utenti.
Aggiungere un altro utente? (yes/no): no
Arrivederci!
electrum:/@[8:53] # su wallet

electrum:/@[8:53] # su wallet

wallet@electrum:/ % electrum-3.6 create

{
    "msg": "Ti preghiamo di tenere il tuo seed in un luogo sicuro; se lo perdi, non sarai in grado di ripristinare il tuo 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 wallet.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

Per il nostro on-chain wallet potrà essere collegato solo a un numero limitato di persone. Per non aprire l'accesso esterno a questa cella, le connessioni SSH avverranno tramite TOR (una versione decentralizzata del VPN). Avviamo SSH nella cella, ma non tocchiamo il nostro pf.conf dell'host.

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

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

Ora scollegheremo la cella con il portafoglio da Internet. Imposteremo un indirizzo IP da un altro spazio di sottorete che non verrà tradotto. Prima cambiamo /etc/pf.conf sull'host

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" cambiamo in JAIL_IP_POOL="192.168.0.0/25", in questo modo tutti gli indirizzi 192.168.0.126-255 non avranno accesso diretto a Internet. Una sorta di rete "air-gap" software. E la regola NAT rimane com'è

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

Riavviamo le regole

# pfctl -f /etc/pf.conf

Ora ci occupiamo della nostra cella

# cbsd jconfig jname=electrum

Bitcoin in gabbia?

Bitcoin in gabbia?

jset mode=quiet jname=electrum ip4_addr="192.168.0.200"
Rimuovi vecchio IP: /sbin/ifconfig em0 inet 192.168.0.6 -alias
Imposta nuovo IP: /sbin/ifconfig em0 inet 192.168.0.200 alias
ip4_addr: 192.168.0.200

Hmm, ma ora smetterà di funzionare anche il sistema stesso. Tuttavia, possiamo specificare un proxy di sistema. Ma c'è un problema: su TOR è un proxy SOCKS5, e per comodità avremmo bisogno anche di 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

Ecco, ora nel nostro sistema ci sono due server proxy, entrambi che portano attraverso TOR: socks5://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

Ecco, ora il shell funzionerà tramite proxy. Se vogliamo installare pacchetti, è consigliabile aggiungere in /usr/local/etc/pkg.conf sotto root cella

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

È ora di aggiungere il servizio nascosto TOR come indirizzo per il nostro servizio SSH nella cella 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

Ecco il nostro indirizzo per la connessione. Controlliamo dalla macchina 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

E dalla macchina Linux client

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

Connettiamoci (Per far funzionare questo è necessario un demone TOR locale che ascolti sulla porta 9050)

user@local ~$ ssh remotebtc

L'autenticità dell'host 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion (<nessun hostip per il comando proxy>)' non può essere stabilita.
La chiave fingerprint ECDSA è SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4.
Sei sicuro di voler continuare a connetterti (sì/no/[fingerprint])? sì
Attenzione: 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion' (ECDSA) è stato aggiunto in modo permanente all'elenco degli host conosciuti.
FreeBSD 12.1-RELEASE-p1 GENERIC 
Per salvare spazio su disco nella tua directory home, comprimi i file che usi raramente con "gzip nomefile".
        -- Dru <genesis@istar.ca>
wallet@electrum:~ % logout

Successo!

Per lavorare con pagamenti istantanei e micro-pagamenti abbiamo bisogno anche di un nodo Lightning Network, questo sarà il nostro principale strumento di lavoro con Bitcoin. A *c-lightning, che intendiamo utilizzare come demone, ha il plugin Sparko, che è un'interfaccia HTTP (REST) completa e consente di lavorare sia con transazioni off-chain che on-chain. c-lightning per funzionare ha bisogno di bitcoind un nodo.

*ci sono diverse implementazioni del protocollo Lightning Network in vari linguaggi di programmazione. Tra quelle che abbiamo testato, c-lightning (scritto in C) si è dimostrato il più stabile e efficiente in termini di risorse

# cbsd jsconstruct-tui

# cbsd jstart cln

# jexec cln

lightning:/@[10:23] # adduser

Nome utente: 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 si compilano e installano tutto il necessario, creiamo un utente RPC per lightningd in bitcoind

# jexec bitcoind

bitcoind:/@[10:36] # ee /usr/local/etc/bitcoin.conf

rpcbind=192.168.0.1
rpcuser=test
rpcpassword=test
# consenti solo a c-lightning
rpcallowip=192.168.0.7/32

bitcoind:/@[10:39] # service bitcoind restart

Il mio passaggio caotico tra le celle non sembra poi così caotico se si considera l'utilità tmux, che permette di creare molte sotto-sessioni di terminale all'interno di una singola sessione. Analogo: schermo

Bitcoin in gabbia?

D'accordo, non vogliamo esporre il vero IP del nostro nodo e vogliamo effettuare tutte le operazioni finanziarie tramite TOR. Quindi abbiamo bisogno di un altro .onion.

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

# plugin sparko
# 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
# per l'esempio sopra i log di inizializzazione (mescolati con i log di lightningd) dovrebbero stampare qualcosa come

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 ~

è necessario anche creare un file di configurazione per bitcoin-cli, l'utility che comunica con bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

verifichiamo

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

[
  "test"
]

avviamo lightningd

lightning@lightning:~ % lightningd --daemon

Io lightningd puoi gestire l'utilità lightning-cli, ad esempio:

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

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all inviare a indirizzo tutti i fondi del wallet (tutti gli indirizzi on-chain)

Ci sono anche comandi per operazioni off-chain lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay ecc.

Per comunicare con l'applicazione abbiamo una REST Api

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

Ricapitoliamo

# jls

   JID  Indirizzo IP      Nome Host                      Percorso
     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 gabbia?

Abbiamo un insieme di contenitori, ognuno con il proprio livello di accesso sia alla rete locale che ad essa.

# zfs list

NOME                    UTILIZZATO  DISPONIBILE  RIFERIMENTO  PUNTODIMONTAGGIO
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 si vede, bitcoind occupa tutti i 190 GB di spazio. E se avessimo bisogno di un'altra nodo per i test? Qui entra in gioco ZFS. cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com è possibile creare uno snapshot e collegare una nuova cella a questo snapshot. La nuova cella avrà completamente il proprio spazio, ma nella FS verrà considerata solo la differenza tra lo stato attuale e l'originale (risparmieremo almeno 190 GB).

Ogni cella è un proprio dataset ZFS separato, ed è estremamente comodo. ZFS consente anche fare altre cose interessanti, come inviare snapshot tramite SSH. Non ci dilungheremo su questo, ce n'è già abbastanza.

È importante anche sottolineare la necessità di monitorare il server da remoto; per questi scopi abbiamo Zabbix.

B — sicurezza

Per quanto riguarda la sicurezza, partiamo dai principi fondamentali nel contesto dell'infrastruttura:

Riservatezza — Gli strumenti standard dei sistemi basati su UNIX garantiscono l'implementazione di questo principio. Separiamo logicamente l'accesso a ciascun elemento del sistema — cella. L'accesso avviene tramite autenticazione utente standard con chiavi personali. Tutta la comunicazione tra e fino alle celle finali avviene in forma crittografata. Grazie alla crittografia dei dischi, possiamo stare tranquilli riguardo alla sicurezza dei dati durante la sostituzione di un disco o la migrazione a un altro server. L'unico accesso critico è l'accesso al sistema host, poiché tale accesso in generale consente l'accesso ai dati all'interno dei contenitori.

Integrità — L'attuazione di questo principio avviene su più livelli. In primo luogo, è importante notare che nel caso di hardware server, la memoria ECC e ZFS si prendono già cura dell'integrità dei dati a livello di bit. Le istantanee consentono di effettuare backup in qualsiasi momento in tempo reale. Strumenti di esportazione e importazione delle celle rendono semplice la replicazione di queste ultime.

Disponibilità — Qui è già facoltativa. Dipende dal grado di notorietà e dal fatto che si abbia qualcuno che non ci apprezza. Nel nostro esempio, abbiamo garantito l'accesso al portafoglio esclusivamente dalla rete TOR. Se necessario, si può bloccare tutto nel firewall e consentire l'accesso al server esclusivamente tramite tunnel (TOR o VPN sono un'altra questione). In questo modo, il server sarà isolato dal mondo esterno il più possibile, e la sua disponibilità potremo influenzarla solo noi stessi.

Impossibilità di rifiuto — Questo dipende dall'uso futuro e dal rispetto delle corrette politiche sui diritti degli utenti, accesso, ecc. Ma con l'approccio giusto, tutte le azioni degli utenti sono auditate e grazie a soluzioni crittografiche è possibile identificare in modo univoco chi e quando ha eseguito certe azioni.

Certo, la configurazione descritta non è un esempio assoluto di come debba sempre essere, è piuttosto uno dei modi in cui può essere, mantenendo molto elastiche possibilità di scalabilità e personalizzazione.

E per quanto riguarda la virtualizzazione completa?

Puoi leggere della virtualizzazione completa usando cbsd qui. Aggiungo solo che per funzionare bhyve è necessario attivare alcuni parametri del kernel.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Quindi se hai bisogno di usare Docker, alziamo un qualche Debian e via!

Bitcoin in gabbia?

E questo è tutto

Penso che sia tutto ciò che volevo condividere. Se ti è piaciuto l'articolo, puoi inviarmi dei bitcoin — bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Se vuoi provare le celle in azione e hai un po' di bitcoin, puoi visitare il mio pet-project.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster