È 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 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
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
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):
C'è
È 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
Quindi configuriamo aide
, monitorando lo stato dei file di configurazione del sistema. Puoi leggere più in dettaglio
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
sysrc auditd_enable=YES
# service auditd start
Come amministrare questa materia è perfettamente descritto in
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
Contenitori? Di nuovo Docker o cosa?
E qui no. 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.
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 bhyve
nell'esempio seguente.
Installazione e configurazione dell'ambiente host
Usiamo FS
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
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
Bene... abbiamo installato CBD, è ora di creare il nostro primo cavallo di battaglia: il demone Bitcoin in gabbia!
cbsd jconstruct-tui
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.
computer portatili. Per ora utilizzeremo Electrum con server pubblici e in seguito lo solleveremo in un'altra cella
# 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
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
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 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
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
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.
Vale anche la pena notare la necessità del monitoraggio remoto dell'host, di cui disponiamo per questi scopi
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 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!
Tutto qui
Immagino che fosse tutto ciò che volevo condividere. Se ti è piaciuto l'articolo, puoi inviarmi dei bitcoin -
Fonte: habr.com