Zufällig bin ich ein professioneller Administrator von Computersystemen und Netzwerken (kurz: Sysadmin) und habe Prof. die Aktivität einer Vielzahl von Systemen, einschließlich derer, die [wegen] der oben genannten Sicherheitsmaßnahmen erforderlich sind. Und es stellte sich heraus, dass ich Bitcoin vor einiger Zeit für mich selbst interessant fand und nicht nur nutzte, sondern auch mehrere Mikrodienste startete, um zu lernen, wie man aus Sicht der Entwicklung unabhängig mit dem Bitcoin-Netzwerk (es ist immerhin P2P) arbeitet (Ich bin natürlich so ein dev
, also bin ich vorbei dev
). Aber ich spreche nicht von Entwicklung, ich spreche von einer sicheren und effektiven Umgebung für Anwendungen.
Finanztechnologien ( Fintech ) gehen mit Informationssicherheit ( Infosec ) einher und die erste kann ohne die zweite funktionieren, aber nicht lange. Aus diesem Grund möchte ich meine Erfahrungen und die von mir verwendeten Tools, darunter Fintech und Infosec , weitergeben. Gleichzeitig kann es auch für einen breiteren 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 Finanzdiensten (und nicht nur) - mit einem Wort, die Dienste, bei denen "B" eine Rolle spielt. Dies gilt sowohl für die Bitcoin-Börse als auch für den typischsten Unternehmenszoo der Dienste eines kleinen Unternehmens, das in keiner Weise Bitcoin verwendet.
Ich möchte darauf hinweisen, dass ich die Prinzipien "halte es einfach dumm" und "weniger ist mehr" befürworte , so dass sowohl der Artikel als auch der darin beschriebene die Eigenschaften haben werden, um die es bei diesen Prinzipien geht.
Imaginäres Szenario: Schauen wir uns ein Beispiel für einen Bitcoin-Tauscher an. Wir haben beschlossen, Rubel, Dollar und Euro gegen Bitcoins und umgekehrt einzutauschen, und wir haben bereits eine funktionierende Lösung, aber für anderes digitales Geld wie Kiwi und Webgeld, d. H. Nachdem wir alle rechtlichen Fragen geklärt haben, gibt es eine fertige Anwendung, die als Zahlungsportal für Rubel, Dollar und Euro und andere Zahlungssysteme fungiert. Es ist an unsere Bankkonten gebunden und verfügt über eine Art API für unsere endgültigen Anwendungen. Wir haben auch eine Webanwendung, die als Austausch für Benutzer fungiert, wie ein typisches Kiwi- oder Webmoney-Konto - eröffnen Sie ein Konto, fügen Sie eine Karte hinzu und so weiter. Es kommuniziert mit unserer Gateway-Anwendung, obwohl es die REST-API im LAN verwendet. Deshalb haben wir uns entschlossen, Bitcoins zu verbinden und gleichzeitig die Infrastruktur zu verbessern, weil anfangs war alles auf virtuellen boxen im büro unter dem tisch verteilt ... sie begannen, die website zu nutzen, und wir machten uns Sorgen um die betriebszeit und die leistung.
Beginnen wir also mit der Hauptauswahl der Server. Weil Da das Geschäft in unserem Beispiel klein ist und wir dem Host (OVH) vertrauen, wählen wir eine Budgetoption, bei der es unmöglich ist, das System vom ursprünglichen .iso-Image zu installieren, aber es spielt keine Rolle, dass die IT-Sicherheitsabteilung das installierte Image definitiv analysiert. Und wenn wir erwachsen werden, vermieten wir unseren Schrank im Allgemeinen unter Verschluss und mit beschränktem physischem Zugang, oder wir bauen unseren eigenen DC. In jedem Fall sollte beachtet werden, dass beim Ausleihen von Eisen und Installieren von vorgefertigten Images die Möglichkeit besteht, dass auf Ihrem System ein "Trojaner vom Host" installiert wird, der in den meisten Fällen nicht dazu gedacht ist, Sie zu verfolgen, sondern bequemere Verwaltungstools bietet Server.
Server-Installation
Hier ist alles einfach. Wir wählen Eisen, das unseren Bedürfnissen entspricht. Wählen Sie dann das FreeBSD-Image aus. Nun, entweder verbinden wir uns (im Falle eines anderen Hosters und unserer eigenen Hardware) über IPMI oder über einen Monitor und speisen das .iso FreeBSD-Image in den Download ein. Für Orchesterinstallationen verwende ich Ansible und mfsbsd . Das Einzige, in unserem Fall mit kimsufi, war die benutzerdefinierte Installation, sodass auf den beiden Festplatten im Spiegel nur die Partitionen "boot" und / home "open" vorhanden waren. Der Rest des Festplattenspeichers wird verschlüsselt, aber dazu später mehr.

Das System wird wie bsdinstaller
installiert, ich werde hier nicht aufhören, ich bsdinstaller
nur fest, dass es sich lohnt, vor der Inbetriebnahme auf die Härtungsoptionen zu bsdinstaller
, die bsdinstaller
am Ende der Installation anbietet (wenn Sie das System selbst installieren):

Es gibt gutes Material zu diesem Thema, ich werde es hier kurz wiederholen.
Auf einem bereits installierten System können die oben genannten Parameter auf die gleiche Weise aktiviert werden. Bearbeiten Sie dazu die Bootloader-Datei und aktivieren Sie die Kernel-Parameter. * ee ist ein Editor wie dieser 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
Stellen Sie außerdem sicher, dass Sie die neueste Version des Systems installiert haben, und führen Sie alle Aktualisierungen und Upgrades durch . In unserem Fall ist beispielsweise ein Upgrade auf die neueste Version erforderlich, weil Vorinstallationsimages liegen sechs Monate bis ein Jahr zurück. Nun, dort ändern wir den SSH-Port standardmäßig auf einen anderen, fügen eine Schlüsselauthentifizierung hinzu und deaktivieren ihn mit einem Passwort.
Dann konfigurieren wir aide
und überwachen den Status der Systemkonfigurationsdateien. Mehr Gekautes kann hier nachgelesen werden .
pkg install aide
und bearbeite 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
Aktivieren Sie die Systemüberwachung
sysrc auditd_enable=YES
# service auditd start
Die Verwaltung dieses Geschäfts ist im Handbuch ausführlich beschrieben.
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 die vollständige Virtualisierung verwendet werden soll.
Als Management für Container und virtuelle Maschinen verwende ich clevd von olevole . Ich wünsche ihm mehr Gesundheit und Vorteile für dieses wundervolle Dienstprogramm!
Behälter? Wieder Docker oder was?
Aber nein FreeBSD Jails ist ein großartiges Container-Tool, aber das erwähnte cbsd
, diese Container zu orchestrieren, deren Name Zellen sind.
Eine Zelle ist eine äußerst effektive Lösung für den Aufbau einer Infrastruktur für eine Vielzahl von Zwecken, die letztendlich die vollständige Isolierung einzelner Dienste oder Prozesse erfordert. Dies ist im Wesentlichen ein Klon des Hostsystems, erfordert jedoch keine vollständige Virtualisierung der Hardware. Und die Ressourcen dafür werden nicht für ein "Gastbetriebssystem" ausgegeben, sondern nur für die geleistete Arbeit. Wenn Zellen für interne Zwecke verwendet werden, ist dies eine sehr bequeme Lösung für die optimale Nutzung der Ressource. Mehrere Zellen auf einem Eisenserver können bei Bedarf die gesamte Serverressource einzeln nutzen. Da in der Regel unterschiedliche Subservices extra benötigt werden. Ressourcen zu unterschiedlichen Zeiten können Sie die maximale Leistung von einem Server extrahieren, wenn Sie die Zellen zwischen den Servern richtig planen und aus dem Gleichgewicht bringen. Bei Bedarf können die Zellen auch Grenzen für die verwendete Ressource festlegen.

Was ist mit der vollständigen Virtualisierung?
cbsd
unterstützt cbsd
die Arbeit von bhyve
und XEN-Hypervisoren. Ich habe nie den zweiten verwendet, aber der erste ist ein relativ junger Hypervisor von FreeBSD . Im folgenden Beispiel sehen wir uns ein Beispiel mit bhyve
an.
Installieren und konfigurieren Sie die Host-Umgebung
Wir verwenden FS ZFS . Dies ist ein äußerst leistungsfähiges Tool zum Verwalten des Serverraums. Dank ZFS können Sie Arrays mit verschiedenen Konfigurationen direkt von Datenträgern erstellen, den Speicherplatz dynamisch erweitern, tote Datenträger austauschen, Snapshots verwalten und vieles mehr, was in einer Reihe von Artikeln beschrieben werden kann. Kehren wir zu unserem Server und seinen Festplatten zurück. Zu Beginn der Installation auf Datenträgern haben wir Speicherplatz für verschlüsselte Partitionen freigelassen. Warum so? Dies ist so, dass das System automatisch aufsteigt und SSH abhört.
gpart add -t freebsd-zfs /dev/ada0
/dev/ada0p4 added!
Fügen Sie die Festplattenpartition zum verbleibenden Speicherplatz hinzu
geli init /dev/ada0p4
Geben Sie unser Verschlüsselungspasswort ein
geli attach /dev/ada0p4
Geben Sie das Passwort erneut ein und wir haben das Gerät /dev/ada0p4.eli - dies ist unser verschlüsselter Speicherplatz. Dann wiederholen wir dasselbe für / dev / ada1 und andere Festplatten im Array. Und erstellen Sie einen neuen ZFS-Pool .
zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli
- nun haben wir das minimale zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli
fertig. Ein gespiegeltes Festplattenarray für den Fall, dass einer der drei ausfällt.
Erstellen Sie einen Datensatz für den neuen "Pool"
zfs create vms/jails
pkg install cbsd
- pkg install cbsd
den Befehl aus und installiere die Verwaltung für unsere Zellen.
Nach der cbsd
muss es initialisiert werden:
# env workdir="/vms/jails" /usr/local/cbsd/sudoexec/initenv
Nun, wir beantworten eine Reihe von Fragen, meistens standardmäßig.
* Wenn Sie die Verschlüsselung verwenden, ist es wichtig, dass der cbsdd
Daemon erst dann automatisch gestartet wird, wenn Sie die Festplatten manuell oder automatisch entschlüsseln (in unserem Beispiel tut dies zabbix).
** Außerdem verwende 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 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 Konfigurieren von Firewall-Richtlinien ist ebenfalls ein separates Thema, daher werde ich nicht näher auf das Konfigurieren von BLOCK ALL-Richtlinien und Whitelist-Einstellungen eingehen. Lesen Sie hierzu die offizielle Dokumentation oder einen der zahlreichen Artikel bei Google.
Nun ... wir haben cbsd installiert, es ist Zeit, unser erstes Arbeitstier zu erstellen - einen Bitcoin-Dämon in einem Käfig!
cbsd jconstruct-tui

Hier sehen wir den Dialog zur Zellenerstellung. Nachdem alle Werte festgelegt wurden, erstellen Sie!
Beim Erstellen der ersten Zelle sollten Sie auswählen, auf welcher Basis die Zellen erstellt werden sollen. Mit dem Befehl repo
wähle ich das Distribution Kit aus dem FreeBSD-Repository aus. Diese Auswahl wird nur beim Erstellen der ersten Zelle einer bestimmten Version getroffen (Sie können Zellen aller Versionen hosten, die älter als die Hostversion sind).
Nachdem alles installiert ist - starte die Zelle!
# cbsd jstart bitcoind
Wir müssen jedoch 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 jexec bitcoind
zu gelangen
und bereits in der Zelle installieren wir Software mit ihren Abhängigkeiten (unser Host-System 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 in der Zelle, aber wir brauchen Anonymität, weil wir über das TOP-Netzwerk eine Verbindung zu einigen Zellen herstellen möchten. Im Allgemeinen planen wir, die meisten Zellen mit verdächtiger Software nur über einen Proxy zu aktivieren. Dank pf
Sie NAT für einen bestimmten Bereich von IP-Adressen im lokalen Netzwerk deaktivieren und NAT nur für unseren TOR-Knoten zulassen. Selbst wenn Malware in die Zelle gelangt, wird sie höchstwahrscheinlich nicht mit der Außenwelt in Kontakt treten, und wenn dies der Fall ist, wird die IP unseres Servers nicht preisgegeben. Aus diesem Grund erstellen wir eine weitere Zelle, um Dienste als ".onion" -Dienst und als Proxy für den Zugriff auf das Internet auf 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
Wir hören auf die lokale Adresse (verfügbar für alle Zellen)
SOCKSPort 192.168.0.2:9050
Was fehlt uns noch zum völligen Glück. Ja, wir brauchen einen Dienst für unser Web, vielleicht keinen. Führen Sie nginx aus, das als Reverse-Proxy fungiert und für die Erneuerung der Let's Encrypt-Zertifikate sorgt
# cbsd jsconstruct-tui
# cbsd jstart nginx-rev
# jexec nginx-rev
nginx-rev:/@[15:47] # pkg install nginx py36-certbot
Und jetzt setzen wir 150 MB Abhängigkeiten in einen Käfig. Und der Gastgeber ist immer noch sauber.
Kehren wir später zur Konfiguration von Nginx zurück. Wir müssen zwei weitere Zellen für unser Zahlungs-Gateway auf NodeJS und Rust sowie eine Webanwendung, die aus irgendeinem Grund auf Apache und PkhP ausgeführt wird, und die MySQL-Datenbank für Letztere erhöhen.
# 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 Pakete für sich
Als nächstes pumpen wir unsere Anwendung mit git auf und führen sie aus.
# 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 Käfig.
Hier geben wir dem Entwickler Zugriff über SSH direkt auf die Zelle, er wird dort alles selbst machen:
webapp:/@[16:02] # ee /etc/ssh/sshd_config
Port 2267
- Ändern Sie den Port der SSH-Zelle in einen beliebigen
webapp:/@[16:02] # sysrc sshd_enable=YES
webapp:/@[16:02] # service sshd start
Nun, der Dienst läuft, es bleibt eine Regel in pf
Firewall hinzuzufügen
Mal sehen, welche IP wir in den Zellen haben und wie unsere "lokalka" 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 fügen Sie 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, werden wir die gleiche Regel für Reverse-Proxy hinzufügen:
## 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 bisschen über Bitcoins
Was wir haben - wir haben eine Webanwendung, auf die von außen zugegriffen werden kann und die lokal mit unserem Zahlungsgateway kommuniziert. Jetzt müssen wir eine Arbeitsumgebung für die Interaktion mit dem Bitcoin-Netzwerk selbst bitcoind
- der bitcoind
Knoten ist nur ein Daemon, der eine lokale Kopie der aktuellen Blockchain unterstützt. Dieser Daemon verfügt über RPC- und Wallet-Funktionen, es gibt jedoch bequemere "Wrapper" für die Entwicklung von Anwendungen. Zunächst haben wir beschlossen, electrum
- dies ist eine CLI-Brieftasche. Wir werden diese Brieftasche als "Kältespeicher" für unsere Bitcoins verwenden - im Allgemeinen die Bitcoins, die "außerhalb" des Systems aufbewahrt werden müssen, das für Benutzer zugänglich und im Allgemeinen für jedermann nicht zugänglich ist. Er hat auch eine GUI, also werden wir die gleiche Brieftasche für unsere verwenden
Laptops. Während wir das electrum mit öffentlichen Servern benutzen, und später in einer anderen Zelle, werden wir ElectrumX erhöhen, so dass es überhaupt von niemandem abhängt.
# 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 Brieftasche erstellt.
wallet@electrum:/ % electrum-3.6 listaddresses
[ "18WEhbjvMLGRMfwudzUrUd25U5C7uZYkzE", "14XHSejhxsZNDRtk4eFbqAX3L8rftzwQQU", "1KQXaN8RXiCN1ne9iYngUWAr6KJ6d4pPas", ... "1KeVcAwEYhk29qEyAfPwcBgF5mMMoy4qjw", "18VaUuSeBr6T2GwpSHYF3XyNgLyLCt1SWk" ]
wallet@electrum:/ % electrum-3.6 help
Ab sofort kann sich nur noch ein begrenzter Personenkreis mit unserer On-Chain- Brieftasche verbinden. Um den Zugriff von außen auf diese Zelle nicht zu öffnen, werden SSH-Verbindungen über TOR (eine solche 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
Schalten Sie jetzt den Internetzugang zur Zelle mit der Brieftasche aus. Wir geben ihm eine IP-Adresse aus einem anderen Subnetzbereich, der nicht NAT-basiert ist. Ändern Sie zunächst /etc/pf.conf
auf dem Host
# ee /etc/pf.conf
JAIL_IP_POOL="192.168.0.0/24"
wird in JAIL_IP_POOL="192.168.0.0/25"
, sodass alle Adressen 192.168.0.126-255 keinen direkten Zugriff auf das Internet haben. Eine Art Software "Luftspalt" -Netzwerk. Und die NAT-Regel bleibt unverändert
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC
Überlastung der Regeln
# pfctl -f /etc/pf.conf
Jetzt nimm unseren Käfig
# cbsd jconfig jname=electrum


jset mode=quiet jname=electrum ip4_addr="192.168.0.200" Remove old IP: /sbin/ifconfig em0 inet 192.168.0.6 -alias Setup new IP: /sbin/ifconfig em0 inet 192.168.0.200 alias ip4_addr: 192.168.0.200
Hmm, 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, aber bei TOR handelt es sich um einen SOCKS5-Proxy, und der Einfachheit halber hätten wir auch 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, jetzt gibt es in unserem System zwei Proxys, die beide über TOR ausgegeben werden: socks5: //192.168.0.2: 9050 und http://192.168.0.6:8123
Jetzt können Sie die Umgebung unserer Brieftasche anpassen
# 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 funktioniert die Shell unter einem Proxy. Wenn Sie Pakete installieren möchten, sollten Sie /usr/local/etc/pkg.conf
im Stammverzeichnis der Zelle hinzufügen
pkg_env: { http_proxy: "http://my_proxy_ip:8123", }
Nun ist es an der Zeit, den TOR-Hidden-Service als Adresse für unseren SSH-Service in die Brieftaschenzelle aufzunehmen.
# 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 Verbindungsadresse. Lassen Sie uns von der lokalen Maschine überprüfen. Aber zuerst müssen Sie 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 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 dies funktioniert, benötigen Sie einen lokalen TOR-Dämon, der auf dem 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 <genesis@istar.ca> wallet@electrum:~ % logout
Erfolg!
Um mit Sofort- und Mikrozahlungen arbeiten zu können, benötigen wir auch den Lightning-Netzwerkknoten. Tatsächlich wird dies unser Hauptwerkzeug für Bitcoin sein. * C-Lightning , das wir als Daemon verwenden werden, verfügt über ein Sparko-Plugin , das eine vollständige HTTP-Schnittstelle (REST) darstellt und das Arbeiten sowohl mit Transaktionen außerhalb der Kette als auch mit Transaktionen innerhalb der Kette ermöglicht. c-lightning
benötigt einen bitcoind
Knoten, um zu funktionieren.
* Es gibt verschiedene Implementierungen auf verschiedenen PLs des Lightning Network-Protokolls. Von denen, die wir getestet haben, schien c-lightning (geschrieben in C) am stabilsten und ressourceneffizientesten 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
Erstellen Sie den RPC-Benutzer für lightningd
in bitcoind
während alles kompiliert und installiert wird, was Sie benötigen
# 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 chaotischer Wechsel zwischen Zellen ist nicht so chaotisch, wenn Sie das Dienstprogramm tmux
beachten, mit dem Sie viele tmux
von Terminals in einer Sitzung erstellen können. Analog: screen

Dackel, wir wollen nicht die reale IP unseres Knotens leuchten lassen, und wir wollen alle Finanztransaktionen über die TOP abwickeln. Deshalb brauchen Sie noch eine .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 erstelle 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 auch eine Konfigurationsdatei für bitcoin-cli erstellen, ein Dienstprogramm, das mit bitcoind
kommuniziert
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" ]
lightningd
starten
lightning@lightning:~ % lightningd --daemon
lightning-cli
selbst kann mit dem lightning-cli
gesteuert werden. Beispiel:
lightning-cli newaddr
erhält Adresse für neuen Zahlungseingang
{ "address": "bc1q2n2ffq3lplhme8jufcxahfrnfhruwjgx3c78pv", "bech32": "bc1q2n2ffq3lplhme8jufcxahfrnfhruwjgx3c78pv" }
lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all
an die adresse senden lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all
geld (alle an der kette befindlichen lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all
)
Auch Befehle für Off-Chain-Operationen von lightning-cli invoice
, lightning-cli listinvoices
, lightning-cli pay
lightning-cli listinvoices
lightning-cli pay
usw.
Nun, für die Kommunikation mit der Anwendung haben wir REST Api
curl -k https://192.168.0.7:9737/rpc -d '{"method": "pay", "params": ["lnbc..."]}' -H 'X-Access masterkey'
Um es zusammenzufassen
# 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

, .
# 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
, bitcoind 190 . ? ZFS . cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com
. , ( 190 )
ZFS, . ZFS , SSH. , .
, Zabbix .
—
, :
— UNIX- . — . . . . -, .
— . - , ECC , ZFS " " . . - .
— . . . ( ). , .
— , . , .
, , , .
?
cbsd . , bhyve
.
# cat /etc/rc.conf
... kld_list="vmm if_tap if_bridge nmdm" ...
# cat /boot/loader.conf
... vmm_load="YES" ...
, - debian !

. — bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc . , pet-project .