Bitcoin im Käfig?

Es ist so gekommen, dass ich von Beruf Systemadministrator für Computer und Netzwerke bin (kurz: Sysadmin) und in meiner mehr als 10-jährigen beruflichen Laufbahn mit den unterschiedlichsten Systemen gearbeitet habe, einschließlich solcher, die [erhöhte|verstärkte] Sicherheitsmaßnahmen erfordern. Zudem habe ich vor einiger Zeit Interesse an Bitcoin, nicht nur als Nutzer, sondern auch als Betreiber mehrerer Mikro-Services entwickelt, um zu lernen, wie man selbstständig im Bitcoin-Netzwerk (es handelt sich schließlich um ein P2P-Netzwerk) aus der Sicht eines Entwicklers (ich bin natürlich nur ein NEBENBEI-Techniker) arbeitet. Aber ich rede nicht von der Entwicklung, sondern von einer sicheren und effektiven Umgebung für Anwendungen. dev, so bin ich vorbeigekommen). Aber ich spreche nicht über die Entwicklung, sondern über eine sichere und effiziente Umgebung für Anwendungen.

Finanztechnologien (Fintech) stehen in enger Verbindung mit Informationssicherheit (Infosec), und das erste kann ohne das zweite funktionieren, aber nicht lange. Deshalb möchte ich meine Erfahrungen und das Set an Werkzeugen teilen, die ich benutze, welches Folgendes umfasst: Fintech, als auch Infosec, wobei es gleichzeitig auch in breiterem oder völlig anderem Kontext verwendet werden kann. In diesem Artikel möchte ich nicht nur über Bitcoin sprechen, sondern über das Infrastrukturmodell zur Entwicklung und den Betrieb von Finanzdienstleistungen (und mehr) – in einem Wort über die Dienstleistungen, bei denen das „B“ von Bedeutung ist. Dies gilt sowohl für eine Bitcoin-Börse als auch für die typische Sammlung von Dienstleistungen eines kleinen Unternehmens, das keinerlei Verbindung zu Bitcoin hat.

Ich möchte betonen, dass ich die Prinzipien unterstütze „keep it stupid simple“ und „less is more“, daher werden sowohl der Artikel als auch das darin Beschriebene Eigenschaften besitzen, die diesen Prinzipien entsprechen.

Hypothetisches Szenario: Lassen Sie uns alles am Beispiel eines Bitcoin-Austauschdienstes erklären. Wir haben beschlossen, den Austausch von Rubel, US-Dollar und Euro zu Bitcoins und umgekehrt zu starten. Wir haben bereits eine funktionierende Lösung, allerdings für andere digitale Währungen wie Qiwi und Webmoney. Alle rechtlichen Aspekte sind geklärt, und wir haben eine Anwendung, die als Zahlungsgateway für Rubel, US-Dollar und Euro sowie andere Zahlungssysteme fungiert. Diese ist mit unseren Bankkonten verbunden und bietet eine API für unsere Endanwendungen. Außerdem haben wir eine Webanwendung, die als Wechselstube für die Nutzer dient – ähnlich wie ein typisches Qiwi- oder Webmoney-Konto. Sie können ein Konto eröffnen, eine Karte hinzufügen und so weiter. Diese kommuniziert mit unserem Gateway über REST API in unserem internen Netzwerk. Nun haben wir uns entschieden, Bitcoins hinzuzufügen und gleichzeitig die Infrastruktur zu verbessern, da ursprünglich alles hastig auf VirtualBox im Büro unter dem Tisch eingerichtet wurde. Die Benutzer haben die Website genutzt, und wir begannen, uns um die Verfügbarkeit und Leistung zu sorgen.

Beginnen wir also mit dem Wesentlichen – 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 In diesem Fall können Sie die ursprüngliche .iso-Datei nicht installieren, aber das ist kein Problem. Die IT-Sicherheitsabteilung wird eine Analyse des installierten Images durchführen. Wenn wir wachsen, mieten wir sogar einen eigenen, abgeschlossenen Schrank mit eingeschränktem physischem Zugang oder bauen vielleicht unser eigenes Rechenzentrum. In jedem Fall sollte man berücksichtigen, dass bei der Miete von Hardware und der Installation von fertigen Images die Gefahr besteht, dass ein "Trojaner vom Anbieter" in Ihrem System verbleibt. Dieser dient in den meisten Fällen nicht dazu, Sie auszuspionieren, sondern dazu, Ihnen bequemere Werkzeuge zur Verwaltung des Servers anzubieten.

Serverinstallation

Hier ist alles einfach. Wir wählen die Hardware aus, die unseren Bedürfnissen entspricht. Dann wählen wir das FreeBSD-Image aus. Alternativ können wir uns (im Fall eines anderen Anbieters und eigener Hardware) über IPMI oder ein Monitor anschließen und das .iso FreeBSD-Image starten. Für die orchestrierte Installation benutze ich Ansible und mfsbsd. Das einzige, was wir in unserem Fall mit kimsufi gewählt haben, ist eine benutzerdefinierte Installation , damit die beiden Festplatten im Mirror nur die Boot- und /home-Partitionen "offen" haben. Der restliche Speicherplatz der Festplatte wird verschlüsselt, aber dazu später mehr.

Bitcoin im Käfig?

Die Installation des Systems erfolgt auf standardisierte Weise. Ich werde nicht weiter darauf eingehen, möchte jedoch darauf hinweisen, dass Sie vor der Inbetriebnahme auf Folgendes achten sollten: Härtung die Optionen, die angeboten werden von bsdinstaller am Ende der Installation (wenn Sie das System selbst installieren):

Bitcoin im Käfig?

Es gibt gutes Material zu diesem Thema; kurz gesagt, ich wiederhole es hier.

Die zuvor genannten Parameter können auch auf einem bereits installierten System aktiviert werden. Dazu müssen Sie die Bootloader-Datei bearbeiten und die Kernel-Parameter aktivieren. *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 die neueste Version des Systems installiert ist und alle Updates und Upgrades durchgeführt werden. In unserem Fall beispielsweise ist ein Upgrade auf die neueste Version erforderlich, da die vorinstallierten Images um ein halbes bis ein Jahr veraltet sind. Außerdem ändern wir den SSH-Port auf einen anderen als den Standardport, fügen die Authentifizierung per Schlüssel hinzu und deaktivieren die Passwortauthentifizierung.

Dann konfigurieren wir aide, die Überwachung des Status der Systemkonfigurationsdateien. Ausführlichere Informationen können Sie lesen. 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 wir die Systemauditierung

sysrc auditd_enable=YES

# service auditd start

Wie man das hervorragend verwaltet, ist gut beschrieben in Handbuch..

Jetzt starten wir neu und kümmern uns um die Software auf dem Server. Jeder Server fungiert als Hypervisor für Container oder vollständige virtuelle Maschinen. Daher ist es wichtig, dass der Prozessor VT-x und EPT unterstützt, wenn wir vollständige Virtualisierung planen.

Für das Management von Containern und virtuellen Maschinen verwende ich cbsd ab olevole, ich wünsche ihm viel Gesundheit und Wohlstand für dieses wunderbare Tool!

Container? Schon wieder Docker?

Und weit gefehlt. FreeBSD Jails sind ein hervorragendes Werkzeug zur Containerisierung, während das erwähnte cbsd der Orchestrierung dieser Container dient, die den Namen - Zellen tragen.

Container sind eine äußerst effiziente Lösung zum Aufbau von Infrastruktur für vielfältige Zwecke, bei denen letztlich eine vollständige Isolation einzelner Dienste oder Prozesse erforderlich ist. Im Grunde genommen handelt es sich um einen Klon des Hosts, ohne dass eine vollständige Virtualisierung der Hardware erforderlich ist. Dadurch werden die Ressourcen nicht für ein "Gastbetriebssystem" verschwendet, sondern nur für die auszuführende Arbeit. Wenn Container für interne Zwecke verwendet werden, ist dies eine sehr praktische Lösung zur optimalen Ressourcennutzung – viele Container auf einem physischen Server können bei Bedarf jedes einzelne Serverressourcen nutzen. Angesichts dessen, dass unterschiedliche Subdienste oft zu verschiedenen Zeiten zusätzliche Ressourcen benötigen, kann man mit einer durchdachten Planung und Verteilung der Container zwischen Servern die maximale Leistung aus einem Server herausholen. Bei Bedarf können die Container auch hinsichtlich der genutzten Ressourcen beschränkt werden.

Bitcoin im Käfig?

Wie sieht es mit der vollständigen Virtualisierung aus?

Soweit ich informiert bin, cbsd unterstützt die Nutzung von bhyve und XEN Hypervisoren. Den zweiten habe ich niemals verwendet, aber der erste ist ein relativ neuer Hypervisor von FreeBSD.. Wir werden ein Beispiel für die Nutzung betrachten bhyve im folgenden Beispiel.

Installation und Konfiguration der Host-Umgebung

Wir verwenden FS ZFS. Es handelt sich um ein äußerst leistungsfähiges Werkzeug zur Verwaltung des Speicherplatzes auf dem Server. Mit ZFS können direkt aus Festplatten Arrays der unterschiedlichsten Konfigurationen erstellt, der Speicherplatz dynamisch „live“ erweitert, defekte Festplatten ausgetauscht, Snapshots verwaltet und noch vieles mehr gemacht 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 Speicherplatz für verschlüsselte Partitionen freigelassen. Warum das? Damit das System automatisch hochfährt und über SSH lauscht.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

Wir fügen eine Partition zum verbleibenden Speicherplatz hinzu

geli init /dev/ada0p4

geben unser Verschlüsselungs-Passwort ein

geli attach /dev/ada0p4

geben Passwort erneut ein und es erscheint das Gerät /dev/ada0p4.eli – das ist unser verschlüsselter Speicherplatz. Dann wiederholen wir dasselbe für /dev/ada1 und die restlichen Festplatten im Array. Und erstellen ein neues ZFS-Pool.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli — Nun, unser grundlegendes Toolkit ist bereit. Ein Spiegel-Array von Festplatten für den Fall, dass eine der drei ausfällt.

Wir erstellen ein Dataset auf dem neuen „Pool“

zfs create vms/jails

pkg install cbsd — Wir haben den Befehl ausgeführt und das Management für unsere Container 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 entschlüsselt haben (in unserem Beispiel erledigt das zabbix)

**Außerdem benutze ich 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 Einrichtung der Firewall-Richtlinien ist ebenfalls ein separates Thema, daher werde ich nicht ins Detail zur BLOCK ALL-Richtlinie und zur Konfiguration der Whitelists eingehen; das kann man lesen in offizielle Dokumentation oder in einem der vielen Artikel, die dafür verfügbar sind.

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

cbsd jconstruct-tui

Bitcoin im Käfig?

Hier sehen wir den Dialog zur Erstellung einer Jail. Nachdem wir alle Werte festgelegt haben, erstellen wir!

Bei der Erstellung der ersten Jail müssen wir wählen, was als Basis für die Jails verwendet werden soll. Ich wähle das Release aus dem FreeBSD-Repository mit dem Befehl repo. Diese Auswahl erfolgt nur bei der Erstellung der ersten Jail einer bestimmten Version (Jails älterer Versionen können gehostet werden, solange sie älter sind als die Host-Version).

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 auf die Konsole der Jail zuzugreifen

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

Der Bitcoin in der Jail ist da, aber wir benötigen Anonymität, da wir planen, uns mit einigen Jails über das TOR-Netzwerk zu verbinden. Und generell wollen wir die meisten Jails mit verdächtiger Software nur über Proxys betreiben. 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. So wird selbst wenn ein Schadprogramm in den Kasten gelangt, höchstwahrscheinlich der Kontakt zur Außenwelt unterbrochen, und falls es dennoch einen Kontakt herstellen kann, wird die IP unseres Servers nicht offengelegt. Daher erstellen wir einen weiteren Kasten, um Dienste wie .onion-Services und Proxy-Zugriffe ins Internet für separate Kästen zu ermöglichen.

# 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 setzen den Listenport auf die lokale Adresse (ist für alle Kästen zugänglich)

SOCKSPort 192.168.0.2:9050

Was fehlt uns noch zum vollsten Glück? Ja, wir brauchen einen Service für unser Web, vielleicht sogar mehrere. Wir starten nginx, der 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 so haben wir 150 MB Abhängigkeiten in den Kasten gepackt. Der Host bleibt jedoch sauber.

Wir kehren später zur nginx-Konfiguration zurück; wir müssen noch zwei Kästen für unser Zahlungsgateway auf nodejs und rust sowie eine Webanwendung, die aus unerklärlichen Gründen auf Apache und PHP basiert, aufbauen, und für diese letzte benötigen wir eine MySQL-Datenbank.

# 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

danach ziehen 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 in der Zelle.

hier geben wir dem Entwickler SSH-Zugang direkt in die Zelle, sie machen das selbst.

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

Port 2267 — wir ändern den SSH-Port der Zelle auf einen beliebigen anderen

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

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

Nun, der Dienst ist gestartet, es bleibt nur noch, eine Regel in den pf Firewall

Lass uns sehen, welche IPs unsere Zellen haben und wie unsere „lokale Umgebung“ 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

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 Bitcoins

Was haben wir — wir haben eine Webanwendung, die von außen zugänglich ist und lokal mit unserem Zahlungsgateway kommuniziert. Jetzt müssen wir die Arbeitsumgebung für die Interaktion mit dem Bitcoin-Netzwerk — Knoten vorbereiten bitcoind Dies ist nur ein Daemon, der eine lokale Kopie der aktuellen Blockchain unterstützt. Dieser Daemon verfügt über RPC und Wallet-Funktionalität, jedoch gibt es für die Anwendungsentwicklung bequemere „Wrapper“. Zunächst haben wir uns entschieden, electrum — eine CLI-Wallet. Diese Wallet wird bei uns als „Cold Storage“ für unsere Bitcoins verwendet — also für die Bitcoins, die „außerhalb“ des für Benutzer zugänglichen Systems und generell von allem entfernt aufbewahrt werden sollen. Sie verfügt auch über eine GUI, deshalb planen wir, eine ähnliche Wallet auf unseren
Laptops zu nutzen. Zunächst werden wir Electrum mit öffentlichen Servern verwenden, und später in einer weiteren Umgebung ElectrumX, um vollkommen unabhängig zu sein.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

noch 700 MB Software in unserer Umgebung

electrum:/@[8:53] # adduser

Benutzername: wallet
Vollständiger Name: 
Uid (Für Standard leer lassen): 
Anmeldgruppe [wallet]: 
Anmeldgruppe ist wallet. Wallet in andere Gruppen einladen? []: 
Anmeldklasse [default]: 
Shell (sh csh tcsh nologin) [sh]: tcsh
Home-Verzeichnis [/home/wallet]: 
Berechtigungen für das Home-Verzeichnis (Für Standard leer lassen): 
Passwortbasierte Authentifizierung verwenden? [yes]: no
Konto nach Erstellung sperren? [no]: 
Benutzername   : wallet
Passwort   : 
Vollständiger Name  : 
Uid        : 1001
Klasse      : 
Gruppen     : wallet 
Home       : /home/wallet
Home-Modus  : 
Shell      : /bin/tcsh
Gesperrt     : no
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 Ihre Wallet nicht wiederherstellen.",
    "path": "/usr/home/wallet/.electrum/wallets/default_wallet",
    "seed": "eifersüchtig win fleisch material bänder jung 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

Zu unserer on-chain Wallet haben künftig nur eine begrenzte Anzahl von Personen Zugang. Um den externen Zugang zu dieser Zelle nicht zu öffnen, erfolgt die Verbindung über SSH durch TOR (eine dezentrale VPN-Alternative). Wir starten in der Zelle SSH, lassen jedoch unser pf.conf auf dem Host unberührt.

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

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

Jetzt trennen wir die Wallet-Zelle vom Internet. Wir werden ihr eine IP-Adresse aus einem anderen Subnetz zuweisen, das nicht nat-ed wird. Zuerst ändern wir /etc/pf.conf auf dem Host

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" ändern wir auf JAIL_IP_POOL="192.168.0.0/25", sodass alle Adressen 192.168.0.126-255 keinen direkten Zugang zum Internet haben werden. Eine Art softwarebasierter "air-gap"-Netzwerk. Und die NAT-Regel bleibt wie gehabt

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

Regeln neu laden

# pfctl -f /etc/pf.conf

Nun kümmern wir uns um unsere Zelle

# 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

Hm, aber jetzt wird auch das System selbst nicht mehr funktionieren. Wir können jedoch einen Systemproxy angeben. Aber es gibt einen Haken, auf TOR ist dies ein SOCKS5-Proxy, und zur Bequemlichkeit bräuchten wir auch noch 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

Nun haben wir in unserem System zwei Proxy-Server, und beide leiten über TOR: 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, der Shell wird jetzt über den Proxy arbeiten. Wenn wir Pakete installieren möchten, sollten wir in /usr/local/etc/pkg.conf aus dem Root-Container

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-Container 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 für die Verbindung. Lassen Sie uns von der lokalen Maschine aus ü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 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

Wir verbinden uns (Um dies zum Laufen zu bringen, ist ein lokaler TOR-Dienst notwendig, der auf 9050 hört)

user@local ~$ ssh remotebtc

Die Echtheit des Hosts 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion (<kein Host-IP für den Proxy-Befehl>)' kann nicht festgestellt werden.
ECDSA-Schlüsselfingerabdruck ist SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4.
Sind Sie sicher, dass Sie die Verbindung fortsetzen möchten (ja/nein/[Fingerabdruck])? 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 <genesis@istar.ca>
wallet@electrum:~ % logout

Erfolg!

Um mit Instant- und Mikropayments zu arbeiten, benötigen wir ebenfalls einen Node. Lightning Network, dies wird unser Hauptarbeitswerkzeug mit Bitcoin sein. Unser *c-lightning, das wir als Daemon verwenden möchten, hat das Sparko-Plugin, das eine vollständige HTTP (REST)-Schnittstelle bietet und sowohl mit Off-Chain-Transaktionen als auch mit On-Chain-Transaktionen arbeitet. c-lightning für den Betrieb wird benötigt bitcoind ein Node.

*Es gibt verschiedene Implementierungen in verschiedenen Programmiersprachen des Lightning Network-Protokolls. Von den getesteten erschien c-lightning (in C geschrieben) als die 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 wir alles Notwendige kompilieren und installieren, 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 Wechseln zwischen den Zellen ist gar nicht so chaotisch, wenn man das Tool tmux, welches es ermöglicht, innerhalb eines einzelnen Sitzungsfensters mehrere Unter-Sitzungen zu erstellen. Ähnlich wie: screen

Bitcoin im Käfig?

Okay, wir wollen die echte IP unserer Node nicht preisgeben und möchten alle finanziellen Transaktionen über TOR abwickeln. Daher benötigen wir noch ein weiteres .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 die 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-Knoten
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) etwa so aussehen

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

überprüfen

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

[
  "test"
]

starten wir lightningd

lightning@lightning:~ % lightningd --daemon

Wine lightningd Die Dienstprogramme können verwaltet werden lightning-cli, zum Beispiel:

lightning-cli newaddr eine Adresse für eine neue eingehende Zahlung erhalten

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all alle Gelder des Wallets (von allen On-Chain-Adressen) auf die Adresse senden

Hier sind 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 eine REST-API

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

Fassen wir zusammen

# 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 verfügen über eine Reihe von Containern, jeder mit seinem eigenen Zugriffslevel sowohl in als auch aus dem lokalen Netzwerk.

# zfs list

NAME                    VERBRAUCHT  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 Speicher von 190 GB. Was ist, wenn wir eine weitere Node für Tests benötigen? Hier kommt ZFS ins Spiel. Mit Hilfe von cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com kann ein Snapshot erstellt werden, und die neue Zelle kann an diesem Snapshot angekoppelt werden. Die neue Zelle hat ihren eigenen Speicher, aber im Dateisystem werden nur die Unterschiede zwischen dem aktuellen Zustand und dem Original berücksichtigt (wir sparen mindestens 190 GB).

Jede Zelle ist ein eigenes, separates ZFS-Dataset, und das ist äußerst praktisch. ZFS ermöglicht auch verschiedene andere coole Dinge tun, wie das Versenden von Snapshots über SSH. Wir werden nicht weiter darauf eingehen, es ist bereits viel gesagt worden.

Es ist auch wichtig, die Notwendigkeit der Remote-Überwachung des Hosts zu erwähnen. Für diese Zwecke haben wir Zabbix.

B — Sicherheit

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

Vertraulichkeit — Standardwerkzeuge von UNIX-ähnlichen Systemen gewährleisten die Umsetzung dieses Prinzips. Wir teilen den Zugang logisch für jedes logisch separate Element des Systems — Zelle. Der Zugang erfolgt durch die standardmäßige Benutzerauthentifizierung mittels persönlicher Benutzer-Schlüssel. Alle Kommunikation zwischen und bis zu den Endzellen erfolgt verschlüsselt. Dank der Festplattverschlüsselung müssen wir uns keine Sorgen um den Schutz der Daten während des Festplattentauschs oder der Migration auf einen anderen Server machen. Der einzige kritische Zugang ist der Zugang zum Host-System, da dieser im Allgemeinen den 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 beachten, dass bei Serverhardware, ECC-RAM und ZFS bereits "out of the box" für die Datenintegrität auf Bit-Ebene gesorgt wird. Sofortige Snapshots ermöglichen eine jederzeitige Backup-Erstellung im laufenden Betrieb. Praktische Werkzeuge zum Exportieren und Importieren von Zellen erleichtern die Replikation von Zellen.

Verfügbarkeit — Dies ist bereits optional. Es hängt von Ihrem Bekanntheitsgrad und der Tatsache ab, ob Sie Feinde haben. In unserem Beispiel haben wir den Zugang zur Geldbörse ausschließlich aus dem TOR-Netzwerk bereitgestellt. Bei Bedarf kann man die Firewall so konfigurieren, dass alles blockiert wird und der Zugang zum Server ausschließlich über Tunnel (TOR oder VPN ist ein anderes Thema) erlaubt ist. Auf diese Weise wird der Server so gut wie möglich vom externen Umfeld abgeschnitten, und nur wir können die Verfügbarkeit beeinflussen.

Unabdingbarkeit — Das hängt von der weiteren Nutzung und der Beachtung der richtigen Richtlinien für Benutzerrechte, Zugriffsrechte usw. ab. Mit dem richtigen Ansatz werden alle Benutzeraktivitäten bei uns auditiert, und dank kryptografischer Lösungen kann eindeutig identifiziert werden, wer welche Aktionen wann durchgeführt hat.

Natürlich ist die beschriebene Konfiguration kein absoluter Beispiel dafür, wie es immer sein sollte. Es ist eher ein Beispiel dafür, wie es sein kann und gleichzeitig sehr flexible Möglichkeiten zur Skalierung und Anpassung bietet.

Und wie sieht es mit der vollständigen Virtualisierung aus?

Zur vollständigen Virtualisierung mit cbsd kann man hier lesen.Ich möchte nur hinzufügen, dass für die Funktionen bhyve einige Kernel-Parameter aktiviert werden müssen.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Wenn es also notwendig ist, Docker zu starten, verwenden wir ein Debian und legen los!

Bitcoin im Käfig?

Das ist alles.

Das ist wohl alles, was ich teilen wollte. Wenn Ihnen der Artikel gefallen hat, können Sie mir Bitcoin schicken — bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Wenn Sie die Zellen in Aktion ausprobieren möchten und ein wenig Bitcoin haben, können Sie mein Pet-Projekt besuchen..

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster