Bitcoin im Käfig?

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.


Bild


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 .

Source: https://habr.com/ru/post/de477124/


All Articles