Zo gebeurde het dat ik van beroep beheerder ben van computersystemen en netwerken (kortweg: systeembeheerder), en ik heb iets meer dan 10 jaar de kans gehad om prof. te vertellen. de activiteiten van een grote verscheidenheid aan systemen, inclusief systemen die [extreme] beveiligingsmaatregelen vereisen. Het gebeurde ook dat ik het enige tijd geleden interessant vond dev
, dus ik kwam langs). Maar ik heb het niet over ontwikkeling, ik heb het over een veilige en efficiënte omgeving voor applicaties.
Financiële technologie (FinTech) ga naar informatiebeveiliging (infosec) en de eerste kan zonder de tweede werken, maar niet voor lang. Daarom wil ik mijn ervaring delen en de set tools die ik gebruik, die beide omvat FinTechEn infosec, en tegelijkertijd, en kan ook voor een breder of heel ander doel worden gebruikt. In dit artikel zal ik je niet zozeer over Bitcoin vertellen, maar over het infrastructuurmodel voor de ontwikkeling en exploitatie van financiële (en niet alleen) diensten - in één woord, die diensten waarbij "B" ertoe doet. Dit geldt zowel voor de Bitcoin-uitwisseling als voor de meest typische zakelijke dienstverlening van een klein bedrijf dat op geen enkele manier met Bitcoin verbonden is.
Ik wil hierbij opmerken dat ik een voorstander ben van de beginselen "houd het dom simpel" и "minder is meer"Daarom zullen zowel het artikel als wat erin wordt beschreven de eigenschappen hebben waar deze principes over gaan.
Denkbeeldig scenario: Laten we alles bekijken aan de hand van het voorbeeld van een bitcoin-wisselaar. We hebben besloten om de uitwisseling van roebels, dollars, euro’s voor bitcoins en terug te lanceren, en we hebben al een werkende oplossing, maar dan voor ander digitaal geld zoals qiwi en webmoney, d.w.z. We hebben alle juridische kwesties afgesloten, we hebben een kant-en-klare applicatie die dient als betalingsgateway voor roebels, dollars en euro's en andere betalingssystemen. Het is verbonden met onze bankrekeningen en heeft een soort API voor onze eindtoepassingen. We hebben ook een webapplicatie die fungeert als uitwisselaar voor gebruikers, nou ja, zoals een typisch Qiwi- of webmoney-account: maak een account aan, voeg een kaart toe, enzovoort. Het communiceert met onze gateway-applicatie, zij het via de REST API in de lokale omgeving. En dus besloten we om bitcoins te verbinden en tegelijkertijd de infrastructuur te upgraden, omdat... Aanvankelijk werd alles haastig op virtualboxen op kantoor onder de tafel gezet... de site begon in gebruik te worden genomen en we begonnen ons zorgen te maken over de uptime en prestaties.
Laten we dus beginnen met het belangrijkste: het kiezen van een server. Omdat het bedrijf in ons voorbeeld is klein en we vertrouwen op de hoster (OVH) die we zullen kiezen
Serverinstallatie
Alles is hier eenvoudig. We kiezen de hardware die bij onze behoeften past. Selecteer vervolgens de FreeBSD-image. Nou ja, of we verbinden (in het geval van een andere hoster en onze eigen hardware) via IPMI of met een monitor en voeren de .iso FreeBSD-image in de download in. Voor een orkestrale opstelling gebruik ik
De installatie van het systeem gebeurt op een standaardmanier, ik zal hier niet op ingaan, ik merk alleen op dat het de moeite waard is om aandacht te besteden voordat u met het gebruik begint verharding opties die het biedt bsdinstaller
aan het einde van de installatie (als u het systeem zelf installeert):
Er is
Het is ook mogelijk om bovengenoemde parameters in te schakelen op een reeds geïnstalleerd systeem. Om dit te doen, moet je het bootloaderbestand bewerken en kernelparameters inschakelen. *ee is zo'n editor 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
Zorg er ook voor dat u de nieuwste versie van het systeem hebt geïnstalleerd, en
Vervolgens configureren wij aide
, het bewaken van de status van systeemconfiguratiebestanden. U kunt meer in detail lezen
pkg install aide
en bewerk onze 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
We omvatten
sysrc auditd_enable=YES
# service auditd start
Hoe u deze zaak moet beheren, wordt perfect beschreven in
Nu starten we opnieuw op en gaan we verder met de software op de server. Elke server is een hypervisor voor containers of volledige virtuele machines. Daarom is het belangrijk dat de processor VT-x en EPT ondersteunt als we van plan zijn volledige virtualisatie te gebruiken.
Om containers en virtuele machines te beheren die ik gebruik
Containers? Docker weer of wat?
Maar nee. cbsd
om deze containers, die cellen worden genoemd, te orkestreren.
De kooi is een uiterst effectieve oplossing voor het bouwen van infrastructuur voor uiteenlopende doeleinden, waarbij uiteindelijk volledige isolatie van individuele diensten of processen vereist is. In wezen is het een kloon van het hostsysteem, maar er is geen volledige hardwarevirtualisatie voor nodig. En dankzij dit worden de middelen niet besteed aan het "gastbesturingssysteem", maar alleen aan het werk dat wordt uitgevoerd. Wanneer cellen worden gebruikt voor interne behoeften, is dit een zeer handige oplossing voor optimaal gebruik van bronnen: een aantal cellen op één hardwareserver kan indien nodig elk afzonderlijk de volledige serverbron gebruiken. Gezien het feit dat meestal verschillende subservices extra nodig hebben. bronnen op verschillende tijdstippen kunt u maximale prestaties uit één server halen als u de cellen tussen servers goed plant en verdeelt. Indien nodig kunnen cellen ook beperkingen krijgen op de gebruikte bron.
Hoe zit het met volledige virtualisatie?
Zoals ik weet, cbsd
ondersteunt het werk bhyve
en XEN-hypervisors. De tweede heb ik nog nooit gebruikt, maar de eerste is relatief nieuw bhyve
in het onderstaande voorbeeld.
De hostomgeving installeren en configureren
Wij gebruiken FS
gpart add -t freebsd-zfs /dev/ada0
/dev/ada0p4 added!
voeg een schijfpartitie toe aan de resterende ruimte
geli init /dev/ada0p4
voer ons coderingswachtwoord in
geli attach /dev/ada0p4
We voeren het wachtwoord opnieuw in en we hebben een apparaat /dev/ada0p4.eli - dit is onze gecodeerde ruimte. Vervolgens herhalen we hetzelfde voor /dev/ada1 en de rest van de schijven in de array. En we creëren een nieuwe
zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli
- Nou, we hebben de minimale gevechtsuitrusting klaar. Een gespiegelde reeks schijven voor het geval een van de drie defect raakt.
Een dataset maken op een nieuwe “pool”
zfs create vms/jails
pkg install cbsd
— we hebben een team gelanceerd en het management voor onze cellen opgezet.
Na cbsd
geïnstalleerd, moet het worden geïnitialiseerd:
# env workdir="/vms/jails" /usr/local/cbsd/sudoexec/initenv
Welnu, we beantwoorden een aantal vragen, meestal met standaardantwoorden.
*Als u encryptie gebruikt, is het belangrijk dat de daemon cbsdd
startte pas automatisch als je de schijven handmatig of automatisch decodeerde (in ons voorbeeld wordt dit gedaan door zabbix)
**Ik gebruik ook geen NAT van cbsd
, en ik configureer het zelf 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 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
Het instellen van firewallbeleid is ook een apart onderwerp, dus ik zal niet diep ingaan op het instellen van het BLOCK ALL-beleid en het instellen van witte lijsten, dat kun je doen door te lezen
Nou... we hebben cbsd geïnstalleerd, het is tijd om ons eerste werkpaard te creëren: de gekooide Bitcoin-demon!
cbsd jconstruct-tui
Hier zien we het dialoogvenster voor het maken van cellen. Nadat alle waarden zijn ingesteld, gaan we creëren!
Wanneer u uw eerste cel maakt, moet u kiezen wat u als basis voor de cellen wilt gebruiken. Ik selecteer een distributie uit de FreeBSD-repository met het commando repo
. Deze keuze wordt alleen gemaakt bij het maken van de eerste cel van een specifieke versie (u kunt cellen hosten van elke versie die ouder is dan de hostversie).
Nadat alles is geïnstalleerd, lanceren we de kooi!
# cbsd jstart bitcoind
Maar we moeten software in de kooi installeren.
# jls
JID IP Address Hostname Path
1 192.168.0.1 bitcoind.space.com /zroot/jails/jails/bitcoind
jexec bitcoind
om in de celconsole te komen
en al in de cel installeren we de software met zijn afhankelijkheden (ons hostsysteem blijft schoon)
bitcoind:/@[15:25] # pkg install bitcoin-daemon bitcoin-utils
bitcoind:/@[15:30] # sysrc bitcoind_enable=YES
bitcoind:/@[15:30] # service bitcoind start
Er zit Bitcoin in de kooi, maar we hebben anonimiteit nodig omdat we via het TOP-netwerk verbinding willen maken met sommige kooien. Over het algemeen zijn we van plan de meeste cellen met verdachte software alleen via een proxy te laten werken. Dankzij pf
U kunt NAT uitschakelen voor een bepaald bereik aan IP-adressen op het lokale netwerk, en NAT alleen toestaan voor ons TOR-knooppunt. Dus zelfs als malware de cel binnendringt, zal deze hoogstwaarschijnlijk niet communiceren met de buitenwereld, en als dat wel het geval is, zal het het IP-adres van onze server niet onthullen. Daarom creëren we een andere cel om services te ‘doorsturen’ als een ‘.onion’-service en als proxy voor toegang tot internet naar individuele cellen.
# 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
Instellen om te luisteren op een lokaal adres (beschikbaar voor alle cellen)
SOCKSPort 192.168.0.2:9050
Wat hebben we nog meer nodig voor volledig geluk? Ja, we hebben een service nodig voor ons web, misschien meer dan één. Laten we nginx lanceren, die zal fungeren als een reverse-proxy en zorgt voor het vernieuwen van Let's Encrypt-certificaten
# cbsd jsconstruct-tui
# cbsd jstart nginx-rev
# jexec nginx-rev
nginx-rev:/@[15:47] # pkg install nginx py36-certbot
En dus plaatsten we 150 MB aan afhankelijkheden in een kooi. En de gastheer is nog steeds schoon.
Laten we later terugkomen op het instellen van nginx, we moeten nog twee cellen verhogen voor onze betalingsgateway op nodejs en rust en een webapplicatie, die om de een of andere reden in Apache en PHP staat, en voor de laatste is ook een MySQL-database vereist.
# 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
...en nog eens 380 MB aan pakketten geïsoleerd
Vervolgens downloaden we onze applicatie met git en starten deze.
# cbsd jsconstruct-tui
# cbsd jstart webapp
# jexec webapp
webapp:/@[16:02] # pkg install mariadb104-server apache24 php74 mod_php74 php74-pdo_mysql
450 MB-pakketten. in een kooi.
hier geven we de ontwikkelaar via SSH rechtstreeks toegang tot de cel, ze zullen daar alles zelf doen:
webapp:/@[16:02] # ee /etc/ssh/sshd_config
Port 2267
- verander de SSH-poort van de cel in een willekeurige poort
webapp:/@[16:02] # sysrc sshd_enable=YES
webapp:/@[16:02] # service sshd start
Welnu, de service draait, het enige dat overblijft is het toevoegen van de regel pf
firewall
Laten we eens kijken welke IP's onze cellen hebben en hoe onze “lokale omgeving” er in het algemeen uitziet.
# 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
en voeg een regel toe
# ee /etc/pf.conf
## SSH for web-Devs
IP_JAIL="192.168.0.5"
PORT_JAIL="{ 2267 }"
rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL
Nu we er toch zijn, laten we ook een regel voor reverse-proxy toevoegen:
## 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
Nou, nu een beetje over bitcoins
Wat we hebben is dat we een webapplicatie hebben die extern wordt blootgesteld en die lokaal met onze betalingsgateway praat. Nu moeten we een werkomgeving voorbereiden voor interactie met het Bitcoin-netwerk zelf: het knooppunt bitcoind
het is slechts een daemon die de lokale kopie van de blockchain up-to-date houdt. Deze daemon heeft RPC- en portemonnee-functionaliteit, maar er zijn handigere “wrappers” voor applicatie-ontwikkeling. Om te beginnen hebben we besloten om te zetten electrum
is een CLI-portemonnee.
laptops. Voorlopig zullen we Electrum gebruiken met openbare servers, en later zullen we het in een andere cel verhogen
# cbsd jsconstruct-tui
# cbsd jstart electrum
# jexec electrum
electrum:/@[8:45] # pkg install py36-electrum
nog eens 700 MB software in onze kooi
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"
}
Nu hebben we een portemonnee gemaakt.
wallet@electrum:/ % electrum-3.6 listaddresses
[
"18WEhbjvMLGRMfwudzUrUd25U5C7uZYkzE",
"14XHSejhxsZNDRtk4eFbqAX3L8rftzwQQU",
"1KQXaN8RXiCN1ne9iYngUWAr6KJ6d4pPas",
...
"1KeVcAwEYhk29qEyAfPwcBgF5mMMoy4qjw",
"18VaUuSeBr6T2GwpSHYF3XyNgLyLCt1SWk"
]
wallet@electrum:/ % electrum-3.6 help
Naar onze on-chain Slechts een beperkt aantal mensen kan voortaan verbinding maken met de portemonnee. Om de toegang tot deze cel niet van buitenaf te openen, zullen verbindingen via SSH plaatsvinden via TOP (een gedecentraliseerde versie van VPN). We starten SSH in de cel, maar raken onze pf.conf op de host niet aan.
electrum:/@[9:00] # sysrc sshd_enable=YES
electrum:/@[9:00] # service sshd start
Laten we nu de cel uitschakelen met de internettoegang van de portemonnee. Laten we het een IP-adres geven van een andere subnetruimte die niet NATed is. Laten we eerst veranderen /etc/pf.conf
op de gastheer
# ee /etc/pf.conf
JAIL_IP_POOL="192.168.0.0/24"
laten we het veranderen in JAIL_IP_POOL="192.168.0.0/25"
, dus alle adressen 192.168.0.126-255 hebben geen directe toegang tot internet. Een soort softwarematig ‘air-gap’-netwerk. En de NAT-regel blijft zoals hij was
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC
Overbelasting van de regels
# pfctl -f /etc/pf.conf
Laten we nu onze cel aanpakken
# 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, maar nu werkt het systeem zelf niet meer voor ons. We kunnen echter een systeemproxy opgeven. Maar er is één ding: op TOR is het een SOCKS5-proxy, en voor het gemak zouden we ook graag een HTTP-proxy willen.
# 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
Welnu, nu zijn er twee proxyservers in ons systeem, en beide worden uitgevoerd via TOR: sokken5://192.168.0.2:9050 en
Nu kunnen we onze portemonnee-omgeving configureren
# 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
Welnu, nu zal de shell werken onder een proxy. Als we pakketten willen installeren, moeten we toevoegen aan /usr/local/etc/pkg.conf
van onder de wortel van de kooi
pkg_env: {
http_proxy: "http://my_proxy_ip:8123",
}
Welnu, nu is het tijd om de verborgen TOR-service toe te voegen als het adres van onze SSH-service in de portemonneecel.
# 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
Dit is ons verbindingsadres. Laten we het controleren vanaf de lokale machine. Maar eerst moeten we onze SSH-sleutel toevoegen:
wallet@electrum:/ % mkdir ~/.ssh
wallet@electrum:/ % ee ~/.ssh/authorized_keys
ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAG9Fk2Lqi4GQ8EXZrsH3EgSrVIQPQaAlS38MmJLBabihv9KHIDGXH7r018hxqLNNGbaJWO/wrWk7sG4T0yLHAbdQAFsMYof9kjoyuG56z0XZ8qaD/X/AjrhLMsIoBbUNj0AzxjKNlPJL4NbHsFwbmxGulKS0PdAD5oLcTQi/VnNdU7iFw== user@local
Nou ja, vanaf een Linux-clientmachine
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
Laten we verbinding maken (Om dit te laten werken, heb je een lokale TOR-daemon nodig die luistert op 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
Succes!
Om met instant- en microbetalingen te kunnen werken, hebben we ook een knooppunt nodig c-lightning
nodig voor het functioneren bitcoind
maar ja.
*Er zijn verschillende implementaties van het Lightning Network-protocol in verschillende talen. Van degenen die we hebben getest, leek c-lightning (geschreven in C) het meest stabiel en hulpbronnenefficiënt
# 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
Terwijl al het noodzakelijke is gecompileerd en geïnstalleerd, gaan we een RPC-gebruiker voor maken 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
Mijn chaotische schakelen tussen cellen blijkt niet zo chaotisch te zijn als je het nut opmerkt tmux
, waarmee u binnen één sessie meerdere terminal-subsessies kunt maken. Analoog: screen
We willen dus het echte IP-adres van ons knooppunt niet onthullen en we willen alle financiële transacties via TOP uitvoeren. Er is dus geen extra ui nodig.
# 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
Laten we nu een configuratie voor c-lightning maken
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 ~
je moet ook een configuratiebestand maken voor bitcoin-cli, een hulpprogramma waarmee je kunt communiceren bitcoind
lightning@lightning:~ % mkdir .bitcoin
lightning@lightning:~ % ee .bitcoin/bitcoin.conf
rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test
controleren
lightning@lightning:~ % bitcoin-cli echo "test"
[
"test"
]
launch lightningd
lightning@lightning:~ % lightningd --daemon
Zichzelf lightningd
u kunt het hulpprogramma beheren lightning-cli
, bijvoorbeeld:
lightning-cli newaddr
het adres opvragen voor een nieuwe inkomende betaling
{
"address": "bc1q2n2ffq3lplhme8jufcxahfrnfhruwjgx3c78pv",
"bech32": "bc1q2n2ffq3lplhme8jufcxahfrnfhruwjgx3c78pv"
}
lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all
stuur al het geld in de portemonnee naar het adres (alle adressen in de keten)
Ook opdrachten voor operaties buiten de keten lightning-cli invoice
, lightning-cli listinvoices
, lightning-cli pay
enz.
Welnu, voor communicatie met de applicatie hebben we een REST Api
curl -k https://192.168.0.7:9737/rpc -d '{"method": "pay", "params": ["lnbc..."]}' -H 'X-Access masterkey'
Opsommen
# 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
We beschikken over een set containers, elk met een eigen toegangsniveau, zowel van als naar het lokale netwerk.
# 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
Zoals u kunt zien, neemt BitcoinD alle 190 GB aan ruimte in beslag. Wat als we een ander knooppunt nodig hebben om te testen? Dit is waar ZFS van pas komt. Met hulp cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com
u kunt een momentopname maken en een nieuwe cel aan deze momentopname koppelen. De nieuwe cel krijgt zijn eigen ruimte, maar in het bestandssysteem wordt alleen rekening gehouden met het verschil tussen de huidige staat en het origineel (we besparen minimaal 190 GB)
Elke cel is zijn eigen afzonderlijke ZFS-dataset, en dit is uiterst handig.
Het is ook vermeldenswaard dat er behoefte is aan monitoring op afstand van de host, voor deze doeleinden hebben we
B - veiligheid
Laten we wat betreft beveiliging uitgaan van de belangrijkste principes in de context van infrastructuur:
Privacy - Standaardtools van UNIX-achtige systemen zorgen voor de implementatie van dit principe. We scheiden logisch de toegang tot elk logisch gescheiden element van het systeem: een cel. Toegang wordt verleend via standaard gebruikersauthenticatie met behulp van de persoonlijke sleutels van de gebruiker. Alle communicatie tussen en naar de eindcellen vindt plaats in gecodeerde vorm. Dankzij schijfversleuteling hoeven we ons geen zorgen te maken over de veiligheid van gegevens bij het vervangen van een schijf of het migreren naar een andere server. De enige kritische toegang is toegang tot het hostsysteem, aangezien dergelijke toegang doorgaans toegang biedt tot gegevens in containers.
integriteit “De implementatie van dit principe vindt plaats op verschillende niveaus. Ten eerste is het belangrijk op te merken dat in het geval van serverhardware, ECC-geheugen, ZFS al “out of the box” zorgt voor de data-integriteit op het niveau van informatiebits. Met instant snapshots kunt u op elk gewenst moment back-ups maken. Handige tools voor het exporteren/importeren van cellen maken celreplicatie eenvoudig.
Beschikbaarheid - Dit is al optioneel. Hangt af van de mate van je bekendheid en het feit dat je haters hebt. In ons voorbeeld hebben we ervoor gezorgd dat de portemonnee uitsluitend toegankelijk was vanuit het TOP-netwerk. Indien nodig kunt u alles op de firewall blokkeren en uitsluitend via tunnels toegang tot de server toestaan (TOR of VPN is een andere zaak). Zo wordt de server zoveel mogelijk afgesloten van de buitenwereld en kunnen alleen wijzelf de beschikbaarheid ervan beïnvloeden.
Onmogelijkheid van weigering - En dit is afhankelijk van de verdere werking en naleving van het juiste beleid voor gebruikersrechten, toegang etc. Maar met de juiste aanpak worden alle gebruikersacties geaudit en is het dankzij cryptografische oplossingen mogelijk om ondubbelzinnig te identificeren wie bepaalde acties wanneer heeft uitgevoerd.
Uiteraard is de beschreven configuratie geen absoluut voorbeeld van hoe het altijd zou moeten zijn, het is eerder een voorbeeld van hoe het kan zijn, met behoud van zeer flexibele schaal- en aanpassingsmogelijkheden.
Hoe zit het met volledige virtualisatie?
Over volledige virtualisatie met cbsd kunt u dat doen bhyve
U moet enkele kernelopties inschakelen.
# cat /etc/rc.conf
...
kld_list="vmm if_tap if_bridge nmdm"
...
# cat /boot/loader.conf
...
vmm_load="YES"
...
Dus als je plotseling een docker moet starten, installeer dan wat debian en ga aan de slag!
Dat is alles
Ik denk dat dat alles is wat ik wilde delen. Als je het artikel leuk vond, kun je mij wat bitcoins sturen -
Bron: www.habr.com