Bitcoin im KĂ€fig?

Ich habe das GlĂŒck, als Administrator fĂŒr Computersysteme und Netzwerke (kurz: Sysadmin) zu arbeiten und kann auf etwas mehr als 10 Jahre professionelle Erfahrung mit den unterschiedlichsten Systemen zurĂŒckblicken, einschließlich solcher, die [sicherheits]technische Maßnahmen erfordern. Außerdem habe ich vor einiger Zeit fĂŒr mich selbst entdeckt, dass Bitcoin, und ich habe nicht nur damit gearbeitet, sondern auch mehrere Mikrodienste gestartet, um zu lernen, wie ich selbststĂ€ndig im Bitcoin-Netzwerk (es ist schließlich p2p) aus der Sicht eines Entwicklers arbeiten kann (ich bin zwar kein besonders erfahrener Entwickler, nur ein Gelegenheitsnutzer). Aber ich will ĂŒber die Entwicklung sprechen, nicht ĂŒber ein sicheres und effektives Umfeld fĂŒr Anwendungen. devFinanztechnologien (

fintech) stehen in engem Zusammenhang mit Informationssicherheit (infosec), und das erste kann ohne das zweite funktionieren, aber nicht lange. Daher möchte ich meine Erfahrungen und das Set an Werkzeugen, die ich benutze, teilen, welches sowohl fĂŒr, gleichzeitig, als auch in einem breiteren oder ganz anderen Kontext verwendet werden kann. In diesem Artikel werde ich nicht so sehr ĂŒber Bitcoin sprechen, sondern vielmehr ĂŒber die Infrastrukturmodelle fĂŒr die Entwicklung und den Betrieb von Finanzdiensten (und nicht nur) – mit einem Wort ĂŒber jene Dienste, bei denen „B“ von Bedeutung ist. Dies gilt sowohl fĂŒr eine Bitcoin-Börse als auch fĂŒr einen typischen Unternehmenszoo von Dienstleistungen eines kleinen Unternehmens, das mit Bitcoin nichts zu tun hat. ) stehen in engem Zusammenhang mit Informationssicherheit (, als auch ), und das erste kann ohne das zweite funktionieren, aber nicht lange. Daher möchte ich meine Erfahrungen und das Set an Werkzeugen, die ich benutze, teilen, welches sowohl fĂŒrIch möchte betonen, dass ich ein BefĂŒrworter der Prinzipien

„keep it stupid simple“ „less is more“ und , daher wird sowohl der Artikel als auch der darin beschriebene Inhalt die Eigenschaften aufweisen, die diese Prinzipien reflektieren.Fiktives Szenario:

Fiktives Szenario: Lassen Sie uns alles am Beispiel eines Bitcoin-Wechselkurses erklĂ€ren. Wir haben beschlossen, den Wechsel von Rubel, Dollar, Euro in Bitcoin und zurĂŒck zu starten, und wir haben bereits eine funktionierende Lösung, aber fĂŒr andere digitale WĂ€hrungen wie Qiwi und WebMoney. Das heißt, wir haben alle rechtlichen Fragen geklĂ€rt, haben eine fertige Anwendung, die als Zahlungsgateway fĂŒr Rubel, Dollar und Euro sowie andere Zahlungssysteme fungiert. Sie ist mit unseren Bankkonten verbunden und verfĂŒgt ĂŒber ein gewisses API fĂŒr unsere Endanwendungen. Außerdem haben wir eine Webanwendung, die als Wechselkurs fĂŒr Benutzer fungiert, Ă€hnlich wie ein typisches Qiwi- oder WebMoney-Konto — erstellen Sie ein Konto, fĂŒgen Sie eine Karte hinzu und so weiter. Sie kommuniziert mit unserer Gateway-Anwendung, lassen Sie es ĂŒber REST API in der lokalen Umgebung geschehen. Und jetzt haben wir beschlossen, Bitcoin zu integrieren und gleichzeitig die Infrastruktur aufzurĂŒsten, da anfangs alles hastig auf VirtualBoxen im BĂŒro unter dem Tisch eingerichtet wurde
 die Website wird genutzt, und wir haben uns um die Betriebszeit und Leistung gesorgt.

Also, fangen wir mit dem Wesentlichen an — der Wahl des Servers. Da das GeschĂ€ft in unserem Beispiel klein ist und wir dem Hosting-Anbieter (OVH) vertrauen, wĂ€hlen wir eine budgetfreundliche Option bei der man das System nicht aus dem Original-Image .iso installieren kann, aber das ist kein Problem, die IT-Sicherheitsabteilung wird das installierte Image auf jeden Fall analysieren. Wenn wir wachsen, mieten wir vielleicht sogar einen eigenen Schrank mit Sicherheitsschloss und eingeschrĂ€nktem physischem Zugang, vielleicht bauen wir sogar unser eigenes Rechenzentrum. In jedem Fall sollte man im Hinterkopf behalten, dass bei der Miete von Hardware und der Installation von fertigen Images die Gefahr besteht, dass ein „Trojaner vom Hosting-Anbieter“ in Ihrem System hĂ€ngen bleibt, der in den meisten FĂ€llen nicht dazu dient, Sie auszuspionieren, sondern um bequemere Serververwaltungswerkzeuge anzubieten.

Serverinstallation

Hier ist alles einfach. Wir wĂ€hlen die Hardware, die unseren BedĂŒrfnissen entspricht. Dann wĂ€hlen wir das FreeBSD-Image aus. Oder wir verbinden uns (im Falle eines anderen Hosters und unserer eigenen Hardware) ĂŒber IPMI oder mit einem Monitor und laden das .iso-Image von FreeBSD. FĂŒr die orchestrierte Installation benutze ich Ansible und mfsbsd. Das einzige ist, dass wir in unserem Fall mit kimsufi die benutzerdefinierte Installation ausgewĂ€hlt haben, damit die beiden Festplatten im Spiegel nur die Boot- und /home-Partitionen „offen“ haben, der Rest des Speicherplatzes wird verschlĂŒsselt, aber dazu spĂ€ter mehr.

Bitcoin im KĂ€fig?

Die Installation des Systems erfolgt auf die ĂŒbliche Weise, ich werde nicht weiter darauf eingehen, sondern lediglich darauf hinweisen, dass man vor der Nutzung auf folgende Punkte achten sollte: hardening Optionen, die angeboten werden von bsdinstaller am Ende der Installation (wenn Sie das System selbst installieren):

Bitcoin im KĂ€fig?

Ja gutes Material zu diesem Thema, ich werde es hier kurz wiederholen.

Die oben genannten Parameter können auch auf einem bereits installierten System aktiviert werden. Dazu muss die Bootloader-Datei bearbeitet und die Kernel-Parameter aktiviert werden. *ee – das ist ein 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

Es ist auch wichtig sicherzustellen, dass Sie die neueste Version des Systems installiert haben, und alle Updates und Upgrades auszufĂŒhren.In unserem Fall ist beispielsweise ein Upgrade auf die neueste Version erforderlich, da die vorinstallierten Images um sechs Monate bis ein Jahr hinterherhinken. Außerdem Ă€ndern wir den SSH-Port auf einen anderen als den Standardport, fĂŒgen die Authentifizierung ĂŒber SchlĂŒssel hinzu und deaktivieren die Passwortanmeldung.

Dann konfigurieren wir aide, die Überwachung des Zustands der Konfigurationsdateien des Systems. AusfĂŒhrlicheres kann man hier.

pkg install aide

und wir bearbeiten unseren 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

Aktivieren von systematische Auditierung

sysrc auditd_enable=YES

# service auditd start

Wie man das verwaltet, ist hervorragend beschrieben in Handbuch.

Jetzt starten wir neu und beginnen mit der Software auf dem Server. Jeder Server fungiert als Hypervisor fĂŒr Container oder vollstĂ€ndige virtuelle Maschinen. Deshalb ist es wichtig, dass der Prozessor VT-x und EPT unterstĂŒtzt, wenn wir vollstĂ€ndige Virtualisierung nutzen wollen.

Als Verwaltung fĂŒr Container und virtuelle Maschinen benutze ich cbsd ab olevole, ich wĂŒnsche ihm viel Gesundheit und Segen fĂŒr dieses hervorragende Tool!

Container? Ist das wieder Docker?

Aber nein. FreeBSD Jails sind ein hervorragendes Werkzeug zur Containerisierung, und das erwĂ€hnte cbsd zur Orchestrierung dieser Container, die Zellen heißen.

Ein Container ist eine Ă€ußerst effektive Lösung zum Aufbau einer Infrastruktur fĂŒr die unterschiedlichsten Zwecke, bei denen letztlich eine vollstĂ€ndige Isolation einzelner Dienste oder Prozesse erforderlich ist. Im Grunde genommen ist dies ein Klon des Host-Systems, jedoch ohne die Notwendigkeit vollstĂ€ndiger Virtualisierung der Hardware. Dadurch werden keine Ressourcen fĂŒr das 'Gastsystem' aufgewendet, sondern nur fĂŒr die tatsĂ€chlich geleistete Arbeit. Wenn Container fĂŒr interne Zwecke verwendet werden, ist es eine sehr bequeme Lösung fĂŒr eine optimale Ressourcennutzung – viele Container auf einem physischen Server können jeweils die gesamten Serverressourcen nach Bedarf nutzen. Da in der Regel verschiedene Subdienste zu unterschiedlichen Zeiten zusĂ€tzliche Ressourcen benötigen, kann man von einem Server die maximale Leistung herausziehen, wenn man die Container richtig plant und balanciert. Bei Bedarf können Container auch EinschrĂ€nkungen bezĂŒglich der genutzten Ressourcen erhalten.

Bitcoin im KĂ€fig?

Und wie steht es um die vollstÀndige Virtualisierung?

Soweit ich weiß, cbsd unterstĂŒtzt die Nutzung von bhyve und XEN Hypervisoren. Den zweiten habe ich nie verwendet, aber der erste ist ein relativ junger Hypervisor von FreeBSD. Wir werden ein Beispiel fĂŒr die Nutzung bhyve im folgenden Beispiel betrachten.

Installation und Konfiguration der Host-Umgebung

Wir verwenden das FS ZFS. Dies ist ein Ă€ußerst leistungsfĂ€higes Tool fĂŒr die Verwaltung des Speichers auf dem Server. Mit ZFS können aus den Festplatten Arrays in den unterschiedlichsten Konfigurationen erstellt, der Speicher dynamisch 'im laufenden Betrieb' erweitert, defekte Festplatten ausgetauscht, Snapshots verwaltet und vieles, vieles mehr umgesetzt werden, was in einer ganzen Reihe von Artikeln beschrieben werden könnte. Kehren wir zu unserem Server und seinen Festplatten zurĂŒck. Zu Beginn der Installation haben wir auf den Festplatten freien Speicher fĂŒr verschlĂŒsselte Partitionen gelassen. Warum? Damit das System automatisch hochfĂ€hrt und ĂŒber SSH lauscht.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

wir fĂŒgen die Partition des Festplattenspeichers zum verbleibenden Platz hinzu

geli init /dev/ada0p4

wir geben unser VerschlĂŒsselungskennwort ein

geli attach /dev/ada0p4

wir geben erneut das Kennwort ein und erhalten das GerĂ€t /dev/ada0p4.eli — das ist unser verschlĂŒsselter Speicher. Dann wiederholen wir das Gleiche fĂŒr /dev/ada1 und die restlichen Festplatten im Array. Und wir erstellen einen neuen ZFS Pool.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli — nun, unser minimales Einsatz-Setup ist bereit. Ein gespiegeltes Festplattenarray fĂŒr den Fall, dass eine der drei ausfĂ€llt.

Wir erstellen ein Dataset auf einem neuen „Pool“

zfs create vms/jails

pkg install cbsd — Wir haben den Befehl ausgefĂŒhrt und das Management fĂŒr unsere Jail-Umgebungen installiert.

Nachdem cbsd es installiert ist, muss es initialisiert werden:

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

und wir beantworten eine Menge Fragen, hauptsÀchlich mit den Standardantworten.

*Wenn Sie VerschlĂŒsselung verwenden, ist es wichtig, dass der Daemon cbsdd nicht automatisch startet, bis Sie die Festplatten manuell oder automatisch (in unserem Beispiel macht das zabbix) entschlĂŒsseln.

**Ich verwende auch kein NAT von cbsd, sondern konfiguriere es selbst 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 fĂŒr Jails
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC

## Bitcoin Netzwerk Portweiterleitung
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

Die Konfiguration der Firewall-Politiken ist ein eigenes Thema, deshalb werde ich nicht nĂ€her auf die Konfiguration der BLOCK ALL-Politik und der Whitelists eingehen, das kann man nachlesen offizielle Dokumentation oder in einem der zahlreichen Artikel, die bei Google verfĂŒgbar sind.

Nun, wir haben cbsd installiert, es ist Zeit, unser erstes Arbeitstier zu schaffen – den Bitcoin-Daemon in der Jail!

cbsd jconstruct-tui

Bitcoin im KĂ€fig?

Hier sehen wir einen Dialog zur Erstellung einer Jail. Nachdem wir alle Werte eingestellt haben, erstellen wir sie!

Bei der Erstellung der ersten Jail sollten wir wĂ€hlen, was als Grundlage fĂŒr die Jails verwendet werden soll. Ich wĂ€hle das Release aus dem FreeBSD-Repository mit dem Befehl repo. Diese Wahl wird nur bei der Erstellung der ersten Jail einer bestimmten Version getroffen (es können Jails aller Versionen, die Ă€lter sind als die Hostversion, gehostet werden).

Nachdem alles installiert ist – starten wir die Jail!

# cbsd jstart bitcoind

Aber wir mĂŒssen Software in die Jail installieren.

# jls

   JID  IP Adresse      Hostname                      Pfad
     1  192.168.0.1     bitcoind.space.com            /zroot/jails/jails/bitcoind

jexec bitcoind um in die Konsole der Jail zu gelangen

und bereits innerhalb der Jail installieren wir die Software mit ihren AbhÀngigkeiten (unseres Hostsystems bleibt sauber)

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

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

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

Die Bitcoin-Jail ist da, aber wir brauchen AnonymitĂ€t, da wir planen, uns mit einigen Jails ĂŒber das TOR-Netzwerk zu verbinden. Und generell haben wir vor, die meisten Jails mit verdĂ€chtiger Software nur ĂŒber einen Proxy laufen zu lassen. Dank pf Es ist möglich, NAT fĂŒr einen bestimmten IP-Bereich im lokalen Netzwerk zu deaktivieren und NAT nur fĂŒr unseren TOR-Knoten zuzulassen. Auf diese Weise wird selbst wenn ein schĂ€dlicher Akteur in den Kasten eindringt, er wahrscheinlich keine Verbindung zur Außenwelt herstellen, und selbst wenn er es tut, wird er die IP unseres Servers nicht offenbaren. Daher erstellen wir einen weiteren Kasten, um Dienste wie den '.onion'-Dienst und einen Proxy fĂŒr den Internetzugang fĂŒr separate KĂ€sten bereitzustellen.

# 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

Wir lassen auf der lokalen Adresse (fĂŒr alle KĂ€sten zugĂ€nglich) hören

SOCKSPort 192.168.0.2:9050

Was fehlt uns noch zum vollkommenen GlĂŒck? Ja, wir brauchen einen Dienst fĂŒr unser Web, vielleicht sogar mehrere. Lasst uns Nginx starten, das als Reverse-Proxy fungiert und sich um die VerlĂ€ngerung der Let's Encrypt-Zertifikate kĂŒmmert.

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

Und nun haben wir 150 MB AbhÀngigkeiten im Kasten untergebracht. Und der Host bleibt weiterhin sauber.

Wir werden die Nginx-Konfiguration spĂ€ter wieder aufgreifen. Zuerst mĂŒssen wir noch zwei KĂ€sten fĂŒr unser Zahlungsgateway auf Node.js und Rust sowie eine Webanwendung, die aus irgendeinem Grund auf Apache und PHP basiert, einrichten. Außerdem benötigen wir eine MySQL-Datenbank fĂŒr Letzteres.

# 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


 und zusÀtzlich 380 MB Pakete isoliert

Dann laden wir unsere Anwendung mit Git und starten sie.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

450 MB Pakete. Im Kasten.

Hier gewÀhren wir den Entwicklern direkten SSH-Zugang in den Kasten, sie werden dort alles selbst erledigen:

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

Port 2267 — wir Ă€ndern den SSH-Port des Kastens auf einen beliebigen willkĂŒrlichen

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

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

So, der Dienst lĂ€uft, wir mĂŒssen nur noch eine Regel in die pf Firewall hinzufĂŒgen

Schauen wir uns an, welche IPs unsere KĂ€sten haben und wie unser „lokales Netzwerk“ aussieht.

# jls

   JID  IP-Adresse      Hostname                      Pfad
     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

Und wir fĂŒgen eine Regel hinzu

# 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

Nun, da wir hier sind, fĂŒgen wir auch eine Regel fĂŒr den Reverse-Proxy hinzu:

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

Nun ein wenig ĂŒber Bitcoin

Was haben wir — wir haben eine Webanwendung, die von außen zugĂ€nglich ist, und die lokal mit unserem Zahlungsgateway kommuniziert. Jetzt mĂŒssen wir eine Arbeitsumgebung fĂŒr die Interaktion mit dem Bitcoin-Netzwerk selbst vorbereiten — einem Knoten. bitcoind Das ist nur ein DĂ€mon, der eine lokale Kopie der aktuellen Blockchain unterstĂŒtzt. Dieser DĂ€mon hat RPC und Wallet-FunktionalitĂ€t, jedoch gibt es fĂŒr die Anwendungsentwicklung bequemere "Wrapper". Zuerst haben wir uns entschieden, electrum — das ist eine CLI-Wallet. Diese Wallet wird als „Cold Storage“ fĂŒr unsere Bitcoins verwendet — das sind die Bitcoins, die „außerhalb“ des fĂŒr Benutzer zugĂ€nglichen Systems und allgemein weit entfernt von allen aufbewahrt werden mĂŒssen. Sie hat auch eine GUI, daher werden wir dieselbe Wallet auf unseren
Laptops verwenden. ZunÀchst werden wir Electrum mit öffentlichen Servern nutzen, und spÀter in einem weiteren Jail werden wir ElectrumX, um von niemandem abhÀngig zu sein.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

noch 700 MB Software haben wir in unserem Jail

electrum: /@[8:53] # adduser

Benutzername: wallet
VollstÀndiger Name: 
Uid (Leer lassen fĂŒr Standard): 
Login-Gruppe [wallet]: 
Login-Gruppe ist wallet. Wallet in andere Gruppen einladen? []: 
Login-Klasse [default]: 
Shell (sh csh tcsh nologin) [sh]: tcsh
Home-Verzeichnis [ /home/wallet]: 
Berechtigungen des Home-Verzeichnisses (Leer lassen fĂŒr Standard): 
Passwortbasierte Authentifizierung verwenden? [ja]: nein
Konto nach Erstellung sperren? [nein]: 
Benutzername   : wallet
Passwort   : 
VollstÀndiger Name  : 
Uid        : 1001
Klasse      : 
Gruppen     : wallet 
Home       : /home/wallet
Home-Modus  : 
Shell      : /bin/tcsh
Gesperrt     : nein
OK? (ja/nein): ja
adduser: INFO: Erfolgreich (wallet) zur Benutzerdatenbank hinzugefĂŒgt.
Einen weiteren Benutzer hinzufĂŒgen? (ja/nein): nein
Auf Wiedersehen!
electrum: /@[8:53] # su wallet

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

wallet@electrum: / % electrum-3.6 create

{
    "msg": "Bitte bewahren Sie Ihren Seed an einem sicheren Ort auf; wenn Sie ihn verlieren, können Sie Ihr Wallet nicht wiederherstellen.",
    "path": "/usr/home/wallet/.electrum/wallets/default_wallet",
    "seed": "eifersĂŒchtiger Schwein Material Band Junge Schlag visuell okay Kaktus zufĂ€llig Vogel"
}

Jetzt haben wir eine Wallet erstellt.

wallet@electrum: / % electrum-3.6 listaddresses

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

wallet@electrum: / % electrum-3.6 help

FĂŒr unsere on-chain Wallet kann in Zukunft nur eine begrenzte Anzahl von Personen eine Verbindung herstellen. Um den Zugriff von außen auf dieses Jail nicht zu öffnen, werden die Verbindungen ĂŒber SSH ĂŒber TOR (eine dezentrale VPN-Alternative) erfolgen. Wir starten SSH im Jail, aber berĂŒhren unsere pf.conf auf dem Host nicht.

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

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

Jetzt werden wir das Jail mit der Wallet vom Internet trennen. Wir vergeben ihm eine IP-Adresse aus einem anderen Subnetz, das nicht NAT wird. Zuerst Àndern wir /etc/pf.conf auf dem Host

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" Ă€ndern wir zu JAIL_IP_POOL="192.168.0.0/25", somit haben alle Adressen 192.168.0.126-255 keinen direkten Internetzugang. Eine Art softwarebasiertes „Air-Gap“-Netzwerk. Und die NAT-Regel bleibt wie sie war.

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

Wir laden die Regeln neu.

# pfctl -f /etc/pf.conf

Jetzt kĂŒmmern wir uns um unser KĂ€fig.

# cbsd jconfig jname=electrum

Bitcoin im KĂ€fig?

Bitcoin im KĂ€fig?

jset mode=quiet jname=electrum ip4_addr="192.168.0.200"
Alte IP entfernen: /sbin/ifconfig em0 inet 192.168.0.6 -alias
Neue IP einrichten: /sbin/ifconfig em0 inet 192.168.0.200 alias
ip4_addr: 192.168.0.200

Hmm, aber jetzt wird auch das System selbst nicht mehr funktionieren. Wir können jedoch einen systemweiten Proxy angeben. Es gibt jedoch ein Aber: Auf TOR ist das ein SOCKS5-Proxy und zu unserem Komfort brĂ€uchten wir außerdem einen HTTP-Proxy.

# 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

So, jetzt gibt es zwei Proxy-Server in unserem System, die beide ĂŒber TOR leiten: socks5://192.168.0.2:9050 und http://192.168.0.6:8123

Jetzt können wir die Umgebung unserer Wallet einrichten.

# 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

Nun, jetzt wird die Shell unter dem Proxy arbeiten. Wenn wir Pakete installieren möchten, sollten wir das in /usr/local/etc/pkg.conf unter dem Root-Konto des KÀfigs.

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

Jetzt ist es an der Zeit, den TOR-Hidden-Service als Adresse unseres SSH-Dienstes im Wallet-KĂ€fig hinzuzufĂŒgen.

# 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

Hier ist unsere Adresse zum Verbinden. Lass uns das von einem lokalen Rechner ĂŒberprĂŒfen. Aber zuerst mĂŒssen wir unseren SSH-SchlĂŒssel hinzufĂŒgen:

wallet@electrum:/ % mkdir ~/ .ssh

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

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

Und dann von der Client-Linux-Maschine.

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

Verbinden (Damit das funktioniert, ist ein lokaler TOR-Daemon erforderlich, der auf 9050 lauscht.)

user@local ~$ ssh remotebtc

Die AuthentizitÀt des Hosts 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion ()' kann nicht bestÀtigt werden.
Der ECDSA-Keystempel ist SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4.
Sind Sie sicher, dass Sie die Verbindung fortsetzen möchten (ja/nein/[Fingerprint])? ja
Warnung: 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion' (ECDSA) wurde dauerhaft zur Liste der bekannten Hosts hinzugefĂŒgt.
FreeBSD 12.1-RELEASE-p1 GENERIC 
Um Speicherplatz in Ihrem Home-Verzeichnis zu sparen, komprimieren Sie Dateien, die Sie selten verwenden, mit "gzip Dateiname".
        -- Dru 
wallet@electrum:~ % logout

Erfolg!

FĂŒr die Arbeit mit Instant- und Mikrozahlungen benötigen wir auch einen Node. Lightning Network, das wird unser hauptsĂ€chliches Arbeitsinstrument mit Bitcoin sein. Zu *c-lightning, das wir als Daemon verwenden werden, gibt es das Sparko-Plugin, das eine vollstĂ€ndige HTTP (REST) Schnittstelle bietet und sowohl mit Off-Chain- als auch mit On-Chain-Transaktionen arbeitet. c-lightning fĂŒr die FunktionalitĂ€t benötigt man bitcoind einen Node.

*Es gibt verschiedene Implementierungen des Lightning Network Protokolls in unterschiedlichen Programmiersprachen. Von denen, die wir getestet haben, erschien c-lightning (geschrieben in C) als das stabilste und ressourcenschonendste.

# cbsd jsconstruct-tui

# cbsd jstart cln

# jexec cln

lightning:‍@[10:23] # adduser

Benutzername: 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

WĂ€hrend alles Notwendige kompiliert und installiert wird, erstellen wir einen RPC-Benutzer fĂŒr lightningd in bitcoind

# jexec bitcoind

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

rpcbind=192.168.0.1
rpcuser=test
rpcpassword=test
#nur c-lightning erlauben
rpcallowip=192.168.0.7/32

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

Mein chaotisches Umschalten zwischen den Zellen ist gar nicht so chaotisch, wenn man das Dienstprogramm berĂŒcksichtigt tmux, das es ermöglicht, innerhalb einer Sitzung viele Unter-Sitzungen von Terminals zu erstellen. Analog: Nun bleibt nur noch, den Bot zu starten. Um Prozesse auf dem Server zu starten, benutze ich gerne

Bitcoin im KĂ€fig?

Okay, wir wollen die echte IP unseres Nodes nicht enthĂŒllen und möchten alle finanziellen Transaktionen ĂŒber TOR abwickeln. Deshalb benötigen wir noch ein .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

Jetzt erstellen wir eine Konfiguration fĂŒr c-lightning

lightning:/home/lightning/lightning@[10:31] # su lightning

lightning@lightning:~ % mkdir .lightning

lightning@lightning:~ % ee .lightning/config

alias=Mein-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
# fĂŒr das obige Beispiel sollten die Initialisierungsprotokolle (gemischt mit lightningd-Protokollen) etwas wie folgt ausgeben

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 ~

Es muss auch eine Konfigurationsdatei fĂŒr bitcoin-cli erstellt werden, ein Tool, das mit bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

wir ĂŒberprĂŒfen

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

[
  "test"
]

die lightningd

lightning@lightning:~ % lightningd --daemon

Wine lightningd man kann das Tool verwalten lightning-cli, zum Beispiel:

lightning-cli newaddr eine Adresse fĂŒr die neue eingehende Zahlung erhalten

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all alle Gelder aus der Brieftasche (alle On-Chain-Adressen) an die Adresse senden

Es gibt auch Befehle fĂŒr Off-Chain-Operationen lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay usw.

FĂŒr die Kommunikation mit der Anwendung haben wir ein REST-API

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

Lassen Sie uns die Ergebnisse zusammenfassen

# jls

   JID  IP-Adresse      Hostname                      Pfad
     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 im KĂ€fig?

Wir haben eine Reihe von Containern, jeder mit seinem eigenen Zugriffslevel, sowohl aus als auch in das lokale Netzwerk.

# zfs list

NAME                    VERWENDUNG  VERFÜGBAR  REFERENZ  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

Wie zu sehen ist, belegt bitcoind den gesamten Speicherplatz von 190 GB. Was ist, wenn wir einen weiteren Knoten fĂŒr Tests benötigen? Hier kommt ZFS gerade recht. Mit Hilfe von cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com Es ist möglich, einen Snapshot zu erstellen und eine neue Zelle mit diesem Snapshot zu verknĂŒpfen. Die neue Zelle hat ihren eigenen, vollstĂ€ndig separaten Raum, jedoch werden in der FS nur die Unterschiede zwischen dem aktuellen Zustand und dem Original berĂŒcksichtigt (wir sparen mindestens 190 GB).

Jede Zelle ist ein eigener separater ZFS-Datensatz, und das ist Ă€ußerst praktisch. ZFS ermöglicht es zudem viele andere coole Dinge zu tun, wie das Versenden von Snapshots ĂŒber SSH. Wir lassen das ausfĂŒhrlich sein, wir haben schon genug gesagt.

Es ist auch wichtig, die Notwendigkeit der Remote-Überwachung des Hosts zu erwĂ€hnen, wir haben dafĂŒr Zabbix.

B — Sicherheit

Was die Sicherheit betrifft, lassen Sie uns von den grundlegenden Prinzipien im Kontext der Infrastruktur ausgehen:

Vertraulichkeit — Die standardmĂ€ĂŸigen Werkzeuge von UNIX-Ă€hnlichen Systemen gewĂ€hrleisten die Umsetzung dieses Prinzips. Wir trennen den Zugriff auf jedes logisch separate Elemente des Systems — der Zelle. Der Zugriff erfolgt ĂŒber die standardmĂ€ĂŸige Benutzerauthentifizierung mit den persönlichen SchlĂŒsseln der Benutzer. Alle Kommunikation zwischen und zu den Endzellen erfolgt verschlĂŒsselt. Dank der VerschlĂŒsselung der Festplatten mĂŒssen wir uns wĂ€hrend des Austauschs von Festplatten oder der Migration auf einen anderen Server keine Sorgen um die Datensicherheit machen. Der einzige kritische Zugriff ist der Zugang zum Host-System, da dieser im Allgemeinen Zugang zu den Daten innerhalb der Container ermöglicht.

IntegritĂ€t — Die Umsetzung dieses Prinzips erfolgt auf mehreren verschiedenen Ebenen. ZunĂ€chst ist es wichtig zu erwĂ€hnen, dass bei Serverhardware, ECC-Speicher, ZFS bereits „out-of-the-box“ fĂŒr die IntegritĂ€t der Daten auf der Bit-Ebene sorgt. Sofortige Snapshots ermöglichen es, jederzeit im laufenden Betrieb Backups zu erstellen. Praktische Export-Import-Werkzeuge fĂŒr Zellen erleichtern die Replikation von Zellen.

VerfĂŒgbarkeit — Hier ist es bereits optional. Es hĂ€ngt von Ihrem Bekanntheitsgrad und der Tatsache ab, ob Sie Feinde haben oder nicht. In unserem Beispiel haben wir die VerfĂŒgbarkeit der Brieftasche ausschließlich aus dem TOR-Netzwerk ermöglicht. Bei Bedarf kann alles in der Firewall blockiert werden, und der Zugang zum Server kann ausschließlich ĂŒber Tunnel (TOR oder VPN ist eine andere Frage) erlaubt werden. Auf diese Weise wird der Server so weit wie möglich vom externen Umfeld abgeschnitten, und nur wir selbst können auf seine VerfĂŒgbarkeit Einfluss nehmen.

Unabweisbarkeit — Das hĂ€ngt von der weiteren Nutzung und der Einhaltung der richtigen Richtlinien fĂŒr Benutzerrechte, ZugĂ€nglichkeit usw. ab. Bei der richtigen Vorgehensweise werden alle Benutzeraktionen protokolliert, und dank kryptografischer Lösungen ist es möglich, eindeutig zu identifizieren, wer und wann bestimmte Handlungen durchgefĂŒhrt hat.

NatĂŒrlich ist die beschriebene Konfiguration kein absoluter Beispiel dafĂŒr, wie es immer sein sollte, sondern eher eines von vielen Beispielen, wie es sein kann, wĂ€hrend es sehr flexible Möglichkeiten zur Skalierung und Anpassung beibehĂ€lt.

Und was ist mit der vollstÀndigen Virtualisierung?

Über die vollstĂ€ndige Virtualisierung mit cbsd kann man hier lesen. Ich möchte nur hinzufĂŒgen, dass fĂŒr die Arbeiten bhyve einige Kernelparameter aktiviert werden mĂŒssen.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Falls es notwendig ist, Docker zu starten, können wir irgendein Debian aufsetzen und loslegen!

Bitcoin im KĂ€fig?

Das ist alles.

Das wĂ€re alles, was ich teilen wollte. Wenn Ihnen der Artikel gefallen hat, können Sie mir Bitcoins schicken — bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Wenn Sie die Zellen in Aktion ausprobieren möchten und ein wenig Bitcoin haben, können Sie mein pet-project.

Quelle: habr.com

60GB SSD 8Gb DDR4