Bitcoin im Käfig?

Zufälligerweise bin ich von Beruf Administrator von Computersystemen und Netzwerken (kurz: Systemadministrator) und hatte etwas mehr als 10 Jahre lang die Gelegenheit, es Prof. zu erzählen. die Aktivitäten einer Vielzahl von Systemen, einschließlich solcher, die [extreme] Sicherheitsmaßnahmen erfordern. Es kam auch vor, dass ich es vor einiger Zeit interessant fand Bitcoin, und habe es nicht nur genutzt, sondern auch mehrere Microservices gestartet, um zu lernen, wie man aus der Sicht eines Entwicklers (ich gehöre natürlich dazu) selbstständig mit dem Bitcoin-Netzwerk (immerhin auch P2P genannt) arbeitet dev, also bin ich vorbeigekommen). Aber ich spreche nicht von Entwicklung, sondern von einer sicheren und effizienten Umgebung für Anwendungen.

Finanztechnologie (FinTech) gehen Sie weiter zu Informationssicherheit (infosec) und das erste kann ohne das zweite funktionieren, aber nicht lange. Deshalb möchte ich meine Erfahrungen und die von mir verwendeten Tools, die beides umfassen, teilen FinTechUnd infosec, und kann gleichzeitig auch für einen umfassenderen oder ganz anderen Zweck verwendet werden. In diesem Artikel werde ich Ihnen nicht so viel über Bitcoin erzählen, sondern über das Infrastrukturmodell für die Entwicklung und den Betrieb von Finanzdienstleistungen (und nicht nur) – kurz gesagt, jenen Dienstleistungen, bei denen „B“ zählt. Dies gilt sowohl für die Bitcoin-Börse als auch für den typischsten Unternehmenszoo von Dienstleistungen eines kleinen Unternehmens, das in keiner Weise mit Bitcoin verbunden ist.

Ich möchte darauf hinweisen, dass ich ein Befürworter der Grundsätze bin „Halte es dumm und einfach“ и "weniger ist mehr"Daher werden sowohl der Artikel als auch das, was darin beschrieben wird, die Eigenschaften haben, um die es in diesen Grundsätzen geht.

Imaginäres Szenario: Schauen wir uns alles am Beispiel eines Bitcoin-Austauschers an. Wir haben beschlossen, den Umtausch von Rubel, Dollar, Euro in Bitcoins und zurück zu starten, und wir haben bereits eine funktionierende Lösung, aber für andere digitale Währungen wie Qiwi und Webmoney, d. h. Wir haben alle rechtlichen Fragen geklärt und verfügen über eine fertige Anwendung, die als Zahlungsgateway für Rubel, Dollar und Euro sowie andere Zahlungssysteme dient. Es ist mit unseren Bankkonten verbunden und verfügt über eine Art API für unsere Endanwendungen. Wir haben auch eine Webanwendung, die als Austausch für Benutzer fungiert, also wie ein typisches Qiwi- oder Webmoney-Konto – ein Konto erstellen, eine Karte hinzufügen und so weiter. Es kommuniziert mit unserer Gateway-Anwendung, allerdings über die REST-API im lokalen Bereich. Und so haben wir uns entschieden, Bitcoins zu verbinden und gleichzeitig die Infrastruktur zu verbessern, weil... Anfangs wurde alles in aller Eile auf virtuellen Boxen im Büro unter dem Tisch abgelegt... Die Seite begann genutzt zu werden und wir begannen uns Sorgen um Verfügbarkeit und Leistung zu machen.

Beginnen wir also mit der Hauptsache – der Auswahl eines Servers. Weil Das Unternehmen in unserem Beispiel ist klein und wir vertrauen dem Hoster (OVH), den wir auswählen werden Budgetoption in denen es unmöglich ist, das System vom ursprünglichen .iso-Image zu installieren, aber egal, die IT-Sicherheitsabteilung wird das installierte Image auf jeden Fall analysieren. Und wenn wir erwachsen sind, werden wir unseren eigenen verschlossenen Schrank mit eingeschränktem physischen Zugang mieten und vielleicht unser eigenes DC bauen. Bedenken Sie auf jeden Fall, dass bei der Anmietung von Hardware und der Installation vorgefertigter Images die Möglichkeit besteht, dass auf Ihrem System ein „Trojaner vom Hoster“ hängt, der in den meisten Fällen nicht dazu gedacht ist, Sie auszuspionieren sondern um komfortablere Verwaltungstools für den Server anzubieten.

Serverinstallation

Hier ist alles einfach. Wir wählen die Hardware aus, die unseren Bedürfnissen entspricht. Wählen Sie dann das FreeBSD-Image aus. Na ja, oder wir verbinden uns (im Falle eines anderen Hosters und unserer eigenen Hardware) über IPMI oder mit einem Monitor und füttern das .iso FreeBSD-Image in den Download. Für ein Orchester-Setup verwende ich Ansible и mfsbsd. Das Einzige, in unserem Fall Kimsufi, haben wir gewählt benutzerdefinierte Installation Damit auf den beiden Festplatten im Spiegel nur die Boot- und /home-Partitionen „offen“ sind, wird der Rest des Festplattenspeichers verschlüsselt, aber dazu später mehr.

Bitcoin im Käfig?

Die Installation des Systems erfolgt standardmäßig. Ich werde nicht weiter darauf eingehen. Ich möchte nur darauf hinweisen, dass es sich lohnt, darauf zu achten, bevor Sie mit dem Betrieb beginnen Härten Optionen, die es bietet bsdinstaller am Ende der Installation (wenn Sie das System selbst installieren):

Bitcoin im Käfig?

Es gibt gutes Material Zu diesem Thema werde ich es hier kurz wiederholen.

Es ist auch möglich, die oben genannten Parameter auf einem bereits installierten System zu aktivieren. Dazu müssen Sie die Bootloader-Datei bearbeiten und Kernel-Parameter aktivieren. *ee ist ein solcher 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

Sie sollten außerdem sicherstellen, dass Sie die neueste Version des Systems installiert haben Führen Sie alle Updates und Upgrades durch. In unserem Fall ist beispielsweise ein Upgrade auf die neueste Version erforderlich, weil... Die Images vor der Installation hinken zwischen sechs Monaten und einem Jahr hinterher. Nun, dort ändern wir den SSH-Port auf einen anderen als den Standardport, fügen eine Schlüsselauthentifizierung hinzu und deaktivieren die Passwortauthentifizierung.

Dann konfigurieren wir aide, Überwachung des Status der Systemkonfigurationsdateien. Sie können mehr im Detail lesen hier.

pkg install aide

und bearbeiten Sie unsere 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

Einschalten Systemprüfung

sysrc auditd_enable=YES

# service auditd start

Wie diese Angelegenheit verwaltet wird, ist in ausführlich beschrieben leiten.

Jetzt starten wir neu und fahren mit der Software auf dem Server fort. Jeder Server ist ein Hypervisor für Container oder vollständige virtuelle Maschinen. Daher ist es wichtig, dass der Prozessor VT-x und EPT unterstützt, wenn wir die vollständige Virtualisierung nutzen möchten.

Zur Verwaltung von Containern und virtuellen Maschinen verwende ich CBD aus olevoleIch wünsche ihm mehr Gesundheit und Segen für diesen wunderbaren Dienst!

Behälter? Schon wieder Docker oder was?

Und hier nicht. FreeBSD-Jails ist ein hervorragendes Werkzeug für die Containerisierung, aber das erwähnte cbsd um diese Container, die Zellen genannt werden, zu orchestrieren.

Der Käfig ist eine äußerst effektive Lösung für den Aufbau von Infrastruktur für verschiedene Zwecke, bei denen letztendlich eine vollständige Isolierung einzelner Dienste oder Prozesse erforderlich ist. Im Wesentlichen handelt es sich um einen Klon des Hostsystems, es ist jedoch keine vollständige Hardwarevirtualisierung erforderlich. Dadurch werden Ressourcen nicht für das „Gastbetriebssystem“ aufgewendet, sondern nur für die ausgeführte Arbeit. Wenn Zellen für interne Zwecke verwendet werden, ist dies eine sehr praktische Lösung für eine optimale Ressourcennutzung – ein Bündel von Zellen auf einem Hardware-Server kann bei Bedarf jeweils einzeln die gesamte Serverressource nutzen. In Anbetracht dessen, dass in der Regel verschiedene Unterdienste zusätzliche benötigen. Wenn Sie die Ressourcen zu unterschiedlichen Zeiten nutzen, können Sie die maximale Leistung aus einem Server herausholen, wenn Sie die Zellen zwischen den Servern richtig planen und ausbalancieren. Bei Bedarf können Zellen auch Einschränkungen hinsichtlich der genutzten Ressource erhalten.

Bitcoin im Käfig?

Wie wäre es mit vollständiger Virtualisierung?

Soweit ich weiß, cbsd unterstützt die Arbeit bhyve und XEN-Hypervisoren. Das zweite habe ich noch nie benutzt, aber das erste ist relativ neu Hypervisor von FreeBSD. Wir schauen uns ein Anwendungsbeispiel an bhyve im Beispiel unten.

Installieren und Konfigurieren der Host-Umgebung

Wir verwenden FS ZFS. Dies ist ein äußerst leistungsstarkes Tool zur Verwaltung des Serverraums. Dank ZFS können Sie Arrays verschiedener Konfigurationen direkt aus Festplatten erstellen, den Speicherplatz dynamisch „heiß“ erweitern, tote Festplatten ändern, Snapshots verwalten und vieles mehr, was in einer ganzen Reihe von Artikeln beschrieben werden kann. 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 gelassen. Warum so? Dadurch wird sichergestellt, dass das System automatisch aufwacht und über SSH lauscht.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

Fügen Sie dem verbleibenden Speicherplatz eine Festplattenpartition hinzu

geli init /dev/ada0p4

Geben Sie unser Verschlüsselungspasswort ein

geli attach /dev/ada0p4

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

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - Nun, wir haben die minimale Kampfausrüstung bereit. Ein gespiegeltes Array von Festplatten für den Fall, dass eine der drei Festplatten ausfällt.

Erstellen eines Datensatzes für einen neuen „Pool“

zfs create vms/jails

pkg install cbsd — Wir haben ein Team gegründet und ein Management für unsere Zellen eingerichtet.

Nach cbsd installiert ist, muss es initialisiert werden:

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

Nun, wir beantworten eine Menge Fragen, meist mit Standardantworten.

*Wenn Sie Verschlüsselung verwenden, ist es wichtig, dass der Daemon cbsdd wurde erst automatisch gestartet, wenn Sie die Datenträger manuell oder automatisch entschlüsseln (in unserem Beispiel erfolgt dies durch zabbix)

**Ich verwende auch kein NAT von cbsd, und ich konfiguriere es selbst darin 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

Das Einrichten von Firewall-Richtlinien ist ebenfalls ein separates Thema, daher werde ich nicht näher auf das Einrichten der BLOCK ALL-Richtlinie und das Einrichten von Whitelists eingehen. Sie können dies durch Lesen tun offizielle Dokumentation oder einer der zahlreichen Artikel, die auf Google verfügbar sind.

Nun... wir haben cbsd installiert, es ist Zeit, unser erstes Arbeitstier zu erschaffen – den eingesperrten Bitcoin-Dämon!

cbsd jconstruct-tui

Bitcoin im Käfig?

Hier sehen wir den Dialog zur Zellenerstellung. Nachdem alle Werte festgelegt wurden, geht es an die Erstellung!

Wenn Sie Ihre erste Zelle erstellen, sollten Sie auswählen, was als Basis für die Zellen dienen soll. Mit dem Befehl wähle ich eine Distribution aus dem FreeBSD-Repository aus repo. Diese Auswahl wird nur beim Erstellen der ersten Zelle einer bestimmten Version getroffen (Sie können Zellen jeder Version hosten, die älter als die Hostversion ist).

Nachdem alles installiert ist, starten wir den Käfig!

# cbsd jstart bitcoind

Aber wir müssen Software im Käfig installieren.

# jls

   JID  IP Address      Hostname                      Path
     1  192.168.0.1     bitcoind.space.com            /zroot/jails/jails/bitcoind

jexec bitcoind um in die Zellenkonsole zu gelangen

und bereits in der Zelle installieren wir die Software mit ihren Abhängigkeiten (unser Hostsystem bleibt sauber)

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

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

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

Es gibt Bitcoin im Käfig, aber wir brauchen Anonymität, weil wir uns über das TOP-Netzwerk mit einigen Käfigen verbinden wollen. Im Allgemeinen planen wir, die meisten Zellen mit verdächtiger Software nur über einen Proxy auszuführen. Dank an pf Sie können NAT für einen bestimmten Bereich von IP-Adressen im lokalen Netzwerk deaktivieren und NAT nur für unseren TOR-Knoten zulassen. Selbst wenn Schadsoftware in die Zelle eindringt, wird sie höchstwahrscheinlich nicht mit der Außenwelt kommunizieren und wenn doch, wird sie die IP unseres Servers nicht preisgeben. Daher erstellen wir eine weitere Zelle, um Dienste als „.onion“-Dienst und als Proxy für den Zugriff auf das Internet an einzelne Zellen „weiterzuleiten“.

# 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

Einstellen, dass eine lokale Adresse überwacht wird (für alle Zellen verfügbar)

SOCKSPort 192.168.0.2:9050

Was brauchen wir noch für vollkommenes Glück? Ja, wir brauchen einen Dienst für unser Web, vielleicht mehr als einen. Starten wir Nginx, das als Reverse-Proxy fungiert und sich um die Erneuerung 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 an Abhängigkeiten in einen Käfig gelegt. Und der Gastgeber ist immer noch sauber.

Kehren wir später zum Einrichten von Nginx zurück. Wir müssen zwei weitere Zellen für unser Zahlungsgateway auf NodeJS und Rust sowie eine Webanwendung erstellen, die aus irgendeinem Grund in Apache und PHP enthalten ist und für letzteres auch eine MySQL-Datenbank erforderlich ist.

# 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 weitere 380 MB isolierter Pakete

Als nächstes laden wir unsere Anwendung mit Git herunter 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 einem Käfig.

Hier geben wir dem Entwickler Zugriff per SSH direkt auf die Zelle, er wird dort alles selbst erledigen:

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

Port 2267 — Ändern Sie den SSH-Port der Zelle in einen beliebigen

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

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

Nun, der Dienst läuft, Sie müssen nur noch die Regel hinzufügen pf Firewall

Schauen wir mal, welche IP unsere Zellen haben und wie unser „lokaler Bereich“ im Allgemeinen aussieht.

# 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

und eine Regel hinzufügen

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

Wir haben eine Webanwendung, die extern verfügbar ist und lokal mit unserem Zahlungsgateway kommuniziert. Jetzt müssen wir eine Arbeitsumgebung für die Interaktion mit dem Bitcoin-Netzwerk selbst vorbereiten – dem Knoten bitcoind Es handelt sich lediglich um einen Daemon, der die lokale Kopie der Blockchain auf dem neuesten Stand hält. Dieser Daemon verfügt über RPC- und Wallet-Funktionalität, es gibt jedoch praktischere „Wrapper“ für die Anwendungsentwicklung. Zunächst haben wir uns entschieden, zu setzen electrum ist eine CLI-Wallet. Diese Brieftasche Wir werden es als „Kühlspeicher“ für unsere Bitcoins verwenden – im Allgemeinen für die Bitcoins, die „außerhalb“ des Systems gespeichert werden müssen, das für Benutzer zugänglich und im Allgemeinen für jedermann zugänglich ist. Es verfügt auch über eine grafische Benutzeroberfläche, sodass wir auf unserem dieselbe Brieftasche verwenden werden
Laptops. Vorerst werden wir Electrum mit öffentlichen Servern verwenden und es später in einer anderen Zelle aufbauen ElectrumXum überhaupt von niemandem abhängig zu sein.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

weitere 700 MB Software in unserem Käfig

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"
}

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 an der Kette Von nun an wird nur noch eine begrenzte Anzahl von Personen in der Lage sein, sich mit der Wallet zu verbinden. Um den Zugriff auf diese Zelle von außen nicht zu ermöglichen, werden Verbindungen über SSH über TOP (eine dezentrale Version von VPN) hergestellt. Wir starten SSH in der Zelle, berühren aber nicht unsere pf.conf auf dem Host.

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

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

Jetzt schalten wir die Zelle mit dem Internetzugang des Wallets aus. Geben wir ihm eine IP-Adresse aus einem anderen Subnetzraum, der nicht NAT-fähig ist. Zuerst ändern wir uns /etc/pf.conf auf dem Host

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" ändern wir es in JAIL_IP_POOL="192.168.0.0/25", daher haben alle Adressen 192.168.0.126-255 keinen direkten Zugriff auf das Internet. Eine Art Software-„Air-Gap“-Netzwerk. Und die NAT-Regel bleibt so wie sie war

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

Überladung der Regeln

# pfctl -f /etc/pf.conf

Nehmen wir nun unsere Zelle in Angriff

# cbsd jconfig jname=electrum

Bitcoin im Käfig?

Bitcoin im Käfig?

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, aber jetzt wird das System selbst für uns nicht mehr funktionieren. Wir können jedoch einen System-Proxy angeben. Aber es gibt eine Sache: Auf TOR handelt es sich um einen SOCKS5-Proxy, und der Einfachheit halber würden wir uns auch einen HTTP-Proxy wünschen.

# 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, jetzt gibt es in unserem System zwei Proxyserver, die beide über TOR ausgeben: sock5://192.168.0.2:9050 und http://192.168.0.6:8123

Jetzt können wir unsere Wallet-Umgebung konfigurieren

# 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 funktioniert die Shell unter einem Proxy. Wenn wir Pakete installieren möchten, sollten wir diese hinzufügen /usr/local/etc/pkg.conf unter der Wurzel des Käfigs hervor

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

Nun ist es an der Zeit, den versteckten TOR-Dienst 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

Dies ist unsere Verbindungsadresse. Lassen Sie uns dies vom lokalen Computer 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

Nun, von einem Linux-Client-Rechner

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

Lassen Sie uns verbinden (Damit dies funktioniert, benötigen Sie einen lokalen TOR-Daemon, der auf 9050 lauscht.)

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

Erfolg!

Um mit Sofort- und Mikrozahlungen arbeiten zu können, benötigen wir außerdem einen Knoten BlitznetzwerkTatsächlich wird dies unser wichtigstes Arbeitswerkzeug mit Bitcoin sein. U*c-Blitzwas wir als Daemon verwenden werden Sparko-Plugin, eine vollwertige HTTP (REST)-Schnittstelle, mit der Sie sowohl mit Off-Chain- als auch On-Chain-Transaktionen arbeiten können. c-lightning zum Funktionieren erforderlich bitcoind aber ja.

*Es gibt verschiedene Implementierungen des Lightning Network-Protokolls in verschiedenen Sprachen. Von den von uns getesteten Programmen schien c-lightning (in C geschrieben) das stabilste und ressourceneffizienteste zu sein

# 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

Während alles Notwendige kompiliert und installiert ist, erstellen wir einen RPC-Benutzer für 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

Mein chaotisches Wechseln zwischen Zellen erweist sich als nicht so chaotisch, wenn man den Nutzen beachtet tmux, wodurch Sie mehrere Terminal-Untersitzungen innerhalb einer Sitzung erstellen können. Analog: screen

Bitcoin im Käfig?

Daher möchten wir die tatsächliche IP unseres Knotens nicht preisgeben und alle Finanztransaktionen über TOP abwickeln. Daher ist keine weitere Zwiebel erforderlich.

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

Sie müssen außerdem eine Konfigurationsdatei für Bitcoin-CLI erstellen, ein Dienstprogramm, das mit kommuniziert 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"
]

Start lightningd

lightning@lightning:~ % lightningd --daemon

Selbst lightningd Sie können das Dienstprogramm steuern lightning-clizum Beispiel:

lightning-cli newaddr die Adresse für einen neuen Zahlungseingang erhalten

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all Senden Sie das gesamte Geld in der Brieftasche an die Adresse (alle Adressen in der Kette).

Auch Befehle für Off-Chain-Operationen lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay usw.

Nun, 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'

Summieren

# 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

Bitcoin im Käfig?

Wir verfügen über eine Reihe von Containern, von denen jeder eine eigene Zugriffsebene sowohl vom als auch zum lokalen Netzwerk hat.

# 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

Wie Sie sehen, belegt Bitcoind ganze 190 GB Speicherplatz. Was ist, wenn wir einen anderen Knoten zum Testen benötigen? Hier kommt ZFS zum Einsatz. Mittels cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com Sie können einen Snapshot erstellen und diesem Snapshot eine neue Zelle hinzufügen. Die neue Zelle wird ihren eigenen Speicherplatz haben, aber nur die Differenz zwischen dem aktuellen Zustand und dem Original wird im Dateisystem berücksichtigt (wir werden mindestens 190 GB sparen)

Jede Zelle ist ein eigener, separater ZFS-Datensatz, was äußerst praktisch ist. ZFS erlaubt es auch Machen Sie verschiedene andere coole Dinge, wie zum Beispiel das Senden von Snapshots über SSH. Wir werden es nicht beschreiben, es gibt schon viel.

Erwähnenswert ist auch die Notwendigkeit einer Fernüberwachung des Hosts, die wir für diese Zwecke haben Zabbix.

B – Sicherheit

Was die Sicherheit betrifft, beginnen wir mit den wichtigsten Prinzipien im Kontext der Infrastruktur:

Конфиденциальность - Standardtools UNIX-ähnlicher Systeme gewährleisten die Umsetzung dieses Prinzips. Wir trennen den Zugriff auf jedes logisch getrennte Element des Systems – eine Zelle – logisch. Der Zugriff erfolgt über eine standardmäßige Benutzerauthentifizierung mit den persönlichen Schlüsseln der Benutzer. Die gesamte Kommunikation zwischen und zu den Endzellen erfolgt in verschlüsselter Form. Dank der Festplattenverschlüsselung müssen wir uns keine Sorgen um die Sicherheit der Daten machen, wenn wir eine Festplatte austauschen oder auf einen anderen Server migrieren. Der einzige kritische Zugriff ist der Zugriff auf das Hostsystem, da ein solcher Zugriff im Allgemeinen den Zugriff auf Daten innerhalb von Containern ermöglicht.

Integrität „Die Umsetzung dieses Prinzips erfolgt auf mehreren Ebenen. Zunächst ist es wichtig zu beachten, dass ZFS im Fall von Serverhardware, ECC-Speicher, bereits „out of the box“ für die Datenintegrität auf der Ebene der Informationsbits sorgt. Mit sofortigen Schnappschüssen können Sie jederzeit unterwegs Backups erstellen. Praktische Tools zum Exportieren/Importieren von Zellen vereinfachen die Zellreplikation.

Verfügbarkeit - Dies ist bereits optional. Hängt vom Grad Ihres Ruhms und der Tatsache ab, dass Sie Hasser haben. In unserem Beispiel haben wir sichergestellt, dass das Wallet ausschließlich über das TOP-Netzwerk zugänglich ist. Bei Bedarf können Sie in der Firewall alles blockieren und den Zugriff auf den Server ausschließlich über Tunnel zulassen (TOR oder VPN ist eine andere Sache). Dadurch wird der Server weitestgehend von der Außenwelt abgeschnitten und nur wir selbst können seine Verfügbarkeit beeinflussen.

Unmöglichkeit der Ablehnung - Und dies hängt vom weiteren Betrieb und der Einhaltung der richtigen Richtlinien für Benutzerrechte, Zugriff usw. ab. Doch mit dem richtigen Ansatz werden alle Benutzeraktionen überwacht und dank kryptografischer Lösungen ist es möglich, eindeutig zu identifizieren, wer wann bestimmte Aktionen ausgeführt hat.

Natürlich ist die beschriebene Konfiguration kein absolutes Beispiel dafür, wie sie immer sein sollte, sondern eher ein Beispiel dafür, wie sie sein kann, wobei die sehr flexiblen Skalierungs- und Anpassungsmöglichkeiten erhalten bleiben.

Wie wäre es mit vollständiger Virtualisierung?

Informationen zur vollständigen Virtualisierung mit cbsd finden Sie hier hier lesen. Ich füge das nur für die Arbeit hinzu bhyve Sie müssen einige Kernel-Optionen aktivieren.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Wenn Sie also plötzlich einen Docker starten müssen, installieren Sie etwas Debian und los geht's!

Bitcoin im Käfig?

Das ist alles

Ich denke, das ist alles, was ich mitteilen wollte. Wenn Ihnen der Artikel gefallen hat, können Sie mir ein paar Bitcoins schicken - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Wenn Sie Zellen in Aktion ausprobieren und Bitcoins haben möchten, können Sie zu mir gehen Haustier Projekt.

Source: habr.com