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 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
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
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):
Es gibt
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
Dann konfigurieren wir aide
, Überwachung des Status der Systemkonfigurationsdateien. Sie können mehr im Detail lesen
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
sysrc auditd_enable=YES
# service auditd start
Wie diese Angelegenheit verwaltet wird, ist in 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 wir die vollständige Virtualisierung nutzen möchten.
Zur Verwaltung von Containern und virtuellen Maschinen verwende ich
Behälter? Schon wieder Docker oder was?
Und hier nicht. 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.
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 bhyve
im Beispiel unten.
Installieren und Konfigurieren der Host-Umgebung
Wir verwenden FS
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
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
Nun... wir haben cbsd installiert, es ist Zeit, unser erstes Arbeitstier zu erschaffen – den eingesperrten Bitcoin-Dämon!
cbsd jconstruct-tui
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.
Laptops. Vorerst werden wir Electrum mit öffentlichen Servern verwenden und es später in einer anderen Zelle aufbauen
# 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
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
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 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
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-cli
zum 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
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.
Erwähnenswert ist auch die Notwendigkeit einer Fernüberwachung des Hosts, die wir für diese Zwecke haben
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 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!
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 -
Source: habr.com