Bitcoin dans une cage?

Il se trouve que je suis un administrateur professionnel de systèmes informatiques et de réseaux (en bref: sysadmin), et il m'est arrivé de dire au prof. l'activité d'une grande variété de systèmes, y compris ceux qui nécessitent [en raison de] les mesures de sécurité ci-dessus. Et il s'est avéré qu'il y a quelque temps, j'ai trouvé le Bitcoin intéressant pour moi, et non seulement l'ai utilisé, mais j'ai également lancé plusieurs microservices afin d'apprendre à travailler de manière indépendante avec le réseau Bitcoin (c'est du p2p après tout) du point de vue du développement. (Je suis, bien sûr, un tel développeur, donc, passé). Mais je ne parle pas de développement, je parle d'un environnement sûr et efficace pour les applications.


Les technologies financières ( fintech ) vont de pair avec la sécurité de l'information ( infosec ) et les premières peuvent fonctionner sans les secondes, mais pas pour longtemps. C'est pourquoi je veux partager mon expérience et l'ensemble d'outils que j'utilise, qui comprend à la fois la fintech et infosec , et en même temps, il peut également être utilisé dans un but plus large ou complètement différent. Dans cet article, je ne vous dirai pas tant sur Bitcoin, mais sur le modèle d'infrastructure pour le développement et le fonctionnement des services financiers (et pas seulement) - en un mot, les services où «B» compte. Cela s'applique à la fois à l'échange Bitcoin et au zoo d'entreprise le plus typique des services d'une petite entreprise sans aucun bitcoin.


Je tiens à noter que je suis un partisan des principes de «garder les choses stupides simples» et «moins c'est plus» , de sorte que l'article et celui qui y est décrit auront les propriétés sur lesquelles reposent ces principes.


Scénario imaginaire: examinons un exemple d'échangeur de bitcoins. Nous avons décidé de commencer à échanger des roubles, des dollars, des euros contre des bitcoins et vice versa, et nous avons déjà une solution de travail, mais pour d'autres monnaies numériques comme le kiwi et le webmoney, c'est-à-dire nous avons fermé tous les problèmes juridiques, il existe une application prête à l'emploi qui sert de passerelle de paiement pour les roubles, les dollars et les euros et d'autres systèmes de paiement. Il est lié à nos comptes bancaires et possède une sorte d'API pour nos applications finales. Nous avons également une application Web qui agit comme un échangeur pour les utilisateurs, comme un compte kiwi ou webmoney typique - créez un compte, ajoutez une carte, etc. Il communique avec notre application de passerelle, bien qu'en utilisant l'API REST en LAN. Et nous avons donc décidé de connecter des bitcoins et en même temps de mettre à niveau l'infrastructure, car au début, tout était précipité sur des boîtes virtuelles dans le bureau sous la table ... ils ont commencé à utiliser le site, et nous avons commencé à nous soucier de la disponibilité et des performances.


Commençons donc par la sélection principale - un serveur. Parce que l'entreprise dans notre exemple est petite et nous faisons confiance à l'hébergeur (OVH), nous choisirons une option budgétaire dans laquelle vous ne pouvez pas installer le système à partir de l'image .iso d'origine, mais cela n'a pas d'importance, le service de sécurité informatique analysera certainement l'image installée. Et quand nous serons grands, nous louerons généralement notre placard sous clé avec un accès physique limité, ou peut-être nous construirons notre propre DC. Dans tous les cas, il convient de se rappeler que lors de la location de fer et de l'installation d'images prêtes à l'emploi, il est possible que votre système ait un «cheval de Troie de l'hôte», qui dans la plupart des cas n'est pas destiné à vous suivre, mais à offrir des outils de gestion plus pratiques. serveur.


Installation du serveur


Ici, tout est simple. Nous choisissons du fer adapté à nos besoins. Sélectionnez ensuite l'image FreeBSD. Eh bien, soit nous nous connectons (dans le cas d'un autre hébergeur et de notre propre matériel) via IPMI ou avec un moniteur et alimentons l'image .iso FreeBSD au téléchargement. Pour les installations orchestrales, j'utilise Ansible et mfsbsd . La seule chose, dans notre cas avec kimsufi, nous avons choisi une installation personnalisée pour que les deux disques dans le miroir n'aient que des partitions «boot» et / home «ouvertes», le reste de l'espace disque sera crypté, mais plus à ce sujet plus tard.



Le système est installé de manière standard, je ne m'arrêterai pas là, je note juste qu'avant de commencer l'opération, faites attention aux options de durcissement , que bsdinstaller propose à la fin de l'installation (si vous installez le système vous-même):



Il y a du bon matériel sur ce sujet, bref je vais le répéter ici.


Il est possible d'activer les paramètres ci-dessus de la même manière sur un système déjà installé. Pour ce faire, modifiez le fichier du chargeur de démarrage et activez les paramètres du noyau. * ee est un éditeur comme celui-ci dans 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 

Il convient également de vous assurer que la dernière version du système est installée et d' effectuer toutes les mises à jour et mises à niveau . Dans notre cas, par exemple, une mise à niveau vers la dernière version est requise, car les images de pré-installation accusent un retard de six mois à un an. Eh bien, nous changeons le port SSH par un autre par défaut, ajoutons l'authentification par clé et désactivons-le avec un mot de passe.


Ensuite, nous configurons l' aide , en surveillant l'état des fichiers de configuration du système. Plus mâché peut être lu ici .


pkg install aide


et éditez notre 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 

Activer l' audit du système


sysrc auditd_enable=YES


# service auditd start


La façon d'administrer cette entreprise est bien décrite dans le manuel .


Maintenant, nous redémarrons et continuons avec le logiciel sur le serveur. Chaque serveur est un hyperviseur pour les conteneurs ou les machines virtuelles complètes. Par conséquent, il est important que le processeur prenne en charge VT-x et EPT si nous prévoyons d'utiliser la virtualisation complète.


En tant que gestionnaire de conteneurs et de machines virtuelles, j'utilise clevd de olevole , je lui souhaite plus de santé et d'avantages pour ce merveilleux utilitaire!


Des conteneurs? Encore une fois docker ou quoi?


Mais non. FreeBSD Jails est un excellent outil de conteneurisation, mais le cbsd mentionné cbsd pour orchestrer ces conteneurs, dont le nom est des cellules.


Une cellule est une solution extrêmement efficace pour construire une infrastructure à des fins diverses, ce qui nécessite en fin de compte l'isolement complet des services ou des processus individuels. Il s'agit essentiellement d'un clone du système hôte, mais il ne nécessite pas de virtualisation complète du matériel. Et les ressources dues à cela ne sont pas dépensées sur un "OS invité", mais uniquement sur le travail effectué. Lorsque les cellules sont utilisées pour des besoins internes, il s'agit d'une solution très pratique pour une utilisation optimale de la ressource - un groupe de cellules sur un serveur de fer peut utiliser individuellement chacune des ressources du serveur si nécessaire. Étant donné que des sous-services généralement différents nécessitent des frais supplémentaires. à différents moments, vous pouvez extraire les performances maximales d'un serveur, si vous planifiez et déséquilibrez correctement les cellules entre les serveurs. Si nécessaire, les cellules peuvent également définir des limites sur la ressource utilisée.


image


Et la virtualisation complète?


Pour autant que je sache, cbsd prend en charge le travail des hyperviseurs bhyve et XEN. Je n'ai jamais utilisé le second, mais le premier est un hyperviseur relativement jeune de FreeBSD . Nous allons voir un exemple d'utilisation de bhyve dans l'exemple ci-dessous.


Installer et configurer l'environnement hôte


Nous utilisons FS ZFS . Il s'agit d'un outil extrêmement puissant pour gérer l'espace serveur. Grâce à ZFS, vous pouvez créer directement des tableaux de différentes configurations directement à partir de disques, étendre dynamiquement l'espace «à chaud», changer les disques morts, gérer les instantanés et bien plus encore qui peuvent être décrits dans une série d'articles. Revenons à notre serveur et à ses disques. Au début de l'installation sur les disques, nous avons laissé de l'espace libre pour les partitions chiffrées. Pourquoi C'est ainsi que le système augmenterait automatiquement et écouterait sur SSH.


gpart add -t freebsd-zfs /dev/ada0


/dev/ada0p4 added!


ajoutez la partition de disque à l'espace restant


geli init /dev/ada0p4


conduire notre mot de passe de cryptage


geli attach /dev/ada0p4


entrez à nouveau le mot de passe et nous avons l'appareil /dev/ada0p4.eli - c'est notre espace crypté. Ensuite, nous répétons la même chose pour / dev / ada1 et les autres disques du tableau. Et créez un nouveau pool ZFS .


zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - eh bien, nous avons maintenant le jeu de combat minimum prêt. Une matrice de disques en miroir en cas de défaillance de l'un des trois.


Créer un jeu de données sur le nouveau "pool"


zfs create vms/jails


pkg install cbsd - exécutez la commande et installez la gestion de nos cellules.


Une fois cbsd installé, il doit être initialisé:


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


Eh bien, nous répondons à un tas de questions, principalement des réponses par défaut.


* Si vous utilisez le chiffrement, il est important que le démon cbsdd démarre pas automatiquement tant que vous ne déchiffrez pas les disques manuellement ou automatiquement (dans notre exemple, zabbix le fait)


** De plus, je n'utilise pas NAT de cbsd , mais le configure moi-même en 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


La configuration des politiques de pare-feu est également un sujet distinct, donc je ne vais pas approfondir la configuration de BLOCER TOUTES les politiques et définir des listes blanches; vous pouvez le faire en lisant la documentation officielle ou l'un des nombreux articles disponibles sur Google.


Eh bien ... nous avons installé cbsd, il est temps de créer notre premier cheval de bataille - un démon bitcoin dans une cage!


cbsd jconstruct-tui



Ici, nous voyons le dialogue de création de cellules. Une fois toutes les valeurs définies, créez!


Lors de la création de la première cellule, vous devez choisir quoi utiliser comme base pour les cellules. Je sélectionne le kit de distribution dans le référentiel FreeBSD avec la commande repo . Ce choix est effectué uniquement lors de la création de la première cellule d'une version spécifique (vous pouvez héberger des cellules de toutes les versions antérieures à la version hôte).


Une fois que tout est installé - exécutez la cellule!


# cbsd jstart bitcoind


Mais nous devons installer un logiciel dans la cage.


# jls


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

jexec bitcoind pour entrer dans la console cellulaire


et déjà à l'intérieur de la cellule nous installons le logiciel avec ses dépendances (notre système hôte reste propre)


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


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


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


Il y a du bitcoin dans la cellule, mais nous avons besoin d'anonymat, car nous voulons nous connecter à certaines cellules via le réseau TOP. En général, nous prévoyons de transformer la plupart des cellules contenant des logiciels suspects uniquement via un proxy. Grâce à pf vous pouvez désactiver NAT pour une plage spécifique d'adresses IP sur le réseau local, et autoriser NAT uniquement pour notre nœud TOR. Ainsi, même si un logiciel malveillant pénètre dans la cellule, il ne contactera probablement pas le monde extérieur et s'il le fait, il ne révélera pas l'IP de notre serveur. par conséquent, nous créons une cellule de plus, pour les services de "transfert" en tant que service ".onion" et en tant que proxy pour accéder à Internet à des cellules individuelles.


# 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


Nous mettons l'écoute sur l'adresse locale (disponible pour toutes les cellules)


SOCKSPort 192.168.0.2:9050


Qu'est-ce qui nous manque encore pour un bonheur complet. Oui, nous avons besoin d'un service pour notre site Web, peut-être pas un. Exécutez nginx, qui agira comme proxy inverse et se chargera de renouveler les certificats Let's Encrypt


# cbsd jsconstruct-tui


# cbsd jstart nginx-rev


# jexec nginx-rev


nginx-rev:/@[15:47] # pkg install nginx py36-certbot


Et maintenant, nous mettons 150 Mo de dépendances dans une cage. Et l'hôte est toujours propre.


Revenons à la configuration de nginx plus tard, nous devons augmenter deux cellules supplémentaires pour notre passerelle de paiement vers nodejs et rust et une application Web, qui pour une raison quelconque est sur apache et pkhp, et la base de données MySQL est également nécessaire pour ce dernier.


# 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


... et 380 Mo de packages en plus


Ensuite, nous pompons notre application avec git et l'exécutons.


# cbsd jsconstruct-tui


# cbsd jstart webapp


# jexec webapp


webapp:/@[16:02] # pkg install mariadb104-server apache24 php74 mod_php74 php74-pdo_mysql


Packages de 450 Mo. dans la cage.


ici, nous donnons au développeur un accès via SSH directement à la cellule, ils feront tout eux-mêmes là-bas:


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


Port 2267 - changez le port de la cellule SSH en n'importe quel arbitraire


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


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


Eh bien, le service est en cours d'exécution, il reste à ajouter une règle dans le pare-feu pf


Voyons quelle IP nous avons dans les cellules et à quoi ressemble notre "lokalka"


# 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 

et ajouter une règle


# 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 

Eh bien, puisque nous sommes ici, nous ajouterons la même règle sur le proxy inverse:


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


Eh bien, maintenant un peu sur les bitcoins


Ce que nous avons - nous avons une application web accessible de l'extérieur et qui communique localement avec notre passerelle de paiement. Nous devons maintenant préparer un environnement de travail pour l'interaction avec le réseau bitcoin lui-même - le nœud bitcoind n'est qu'un démon qui prend en charge une copie locale de la blockchain actuelle. Ce démon a des fonctionnalités RPC et de portefeuille, mais il existe des «wrappers» plus pratiques pour développer des applications. Pour commencer, nous avons décidé de mettre electrum - c'est un portefeuille CLI. Nous utiliserons ce portefeuille comme un "stockage à froid" pour nos bitcoins - en général, ces bitcoins qui devront être stockés "en dehors" du système accessibles aux utilisateurs et généralement loin de tout le monde. Il a également une interface graphique, nous allons donc utiliser le même portefeuille sur notre
ordinateurs portables. Alors que nous utiliserons l'électrum avec des serveurs publics, et plus tard dans une autre cellule, nous élèverons ElectrumX , afin qu'il ne dépende de personne du tout.


# cbsd jsconstruct-tui


# cbsd jstart electrum


# jexec electrum


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


encore 700 Mo de logiciels dans notre cage


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

Maintenant, nous avons créé un portefeuille.


wallet@electrum:/ % electrum-3.6 listaddresses


 [ "18WEhbjvMLGRMfwudzUrUd25U5C7uZYkzE", "14XHSejhxsZNDRtk4eFbqAX3L8rftzwQQU", "1KQXaN8RXiCN1ne9iYngUWAr6KJ6d4pPas", ... "1KeVcAwEYhk29qEyAfPwcBgF5mMMoy4qjw", "18VaUuSeBr6T2GwpSHYF3XyNgLyLCt1SWk" ] 

wallet@electrum:/ % electrum-3.6 help


Désormais, seul un cercle restreint de personnes pourra se connecter à notre portefeuille en chaîne . Afin de ne pas ouvrir l'accès de l'extérieur à cette cellule, les connexions SSH se feront via TOR (une telle version décentralisée de VPN). Nous démarrons SSH dans la cellule, mais ne touchons pas notre pf.conf sur l'hôte.


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


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


Désactivez maintenant l'accès Internet à la cellule avec le portefeuille. Nous lui donnerons une adresse IP d'un autre espace de sous-réseau qui n'est pas basé sur NAT. Tout d'abord, changez /etc/pf.conf sur l'hôte


# ee /etc/pf.conf


JAIL_IP_POOL="192.168.0.0/24" JAIL_IP_POOL="192.168.0.0/25" par JAIL_IP_POOL="192.168.0.0/25" , de sorte que toutes les adresses 192.168.0.126-255 n'auront pas d'accès direct à Internet. Une sorte de réseau "air-gap" logiciel. Et la règle NAT reste telle qu'elle était


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


Surcharger les règles


# pfctl -f /etc/pf.conf


Maintenant, prends notre cage


# 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, mais maintenant le système lui-même cessera de fonctionner pour nous. Cependant, nous pouvons spécifier un proxy système. Mais il y a une chose mais, sur TOR, c'est un proxy SOCKS5, et pour plus de commodité, nous aurions également un proxy HTTP.


# 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


Eh bien, maintenant dans notre système, il y a deux proxys, et les deux sortent via TOR: socks5: //192.168.0.2: 9050 et http://192.168.0.6:8123


Vous pouvez maintenant personnaliser l'environnement de notre portefeuille


# 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 

Eh bien, maintenant le shell fonctionnera sous un proxy. Si vous souhaitez installer des packages, il convient d'ajouter à /usr/local/etc/pkg.conf sous la racine de la cellule


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

Eh bien, il est maintenant temps d'ajouter le service caché TOR comme adresse de notre service SSH dans la cellule du portefeuille.


# 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 

Ici, c'est notre adresse de connexion. Vérifions à partir de la machine locale. Mais vous devez d'abord ajouter notre clé SSH:


wallet@electrum:/ % mkdir ~/.ssh


wallet@electrum:/ % ee ~/.ssh/authorized_keys


 ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAG9Fk2Lqi4GQ8EXZrsH3EgSrVIQPQaAlS38MmJLBabihv9KHIDGXH7r018hxqLNNGbaJWO/wrWk7sG4T0yLHAbdQAFsMYof9kjoyuG56z0XZ8qaD/X/AjrhLMsIoBbUNj0AzxjKNlPJL4NbHsFwbmxGulKS0PdAD5oLcTQi/VnNdU7iFw== user@local 

Eh bien, à partir de la machine Linux cliente


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 

Se connecter (pour que cela fonctionne, vous avez besoin d'un démon TOR local qui écoute sur le 9050)


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 

Succès!


Pour travailler avec des micro-paiements instantanés, nous avons également besoin du nœud Lightning Network , en fait, ce sera notre principal outil de travail avec le bitcoin. * C-lightning , que nous allons utiliser comme démon, a un plugin Sparko , qui est une interface HTTP (REST) ​​à part entière et permet de travailler à la fois avec les transactions hors chaîne et les transactions en chaîne. c-lightning nécessite un nœud bitcoind pour fonctionner.


* Il existe différentes implémentations sur différents PL du protocole Lightning Network. Parmi ceux que nous avons testés, c-lightning (écrit en C) semble être le plus stable et le plus économe en ressources


# 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


Alors que tout ce dont vous avez besoin est compilé et installé, créez l'utilisateur RPC pour lightningd dans 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


Ma commutation chaotique entre les cellules n'est pas si chaotique si vous notez l'utilitaire tmux , qui vous permet de créer de nombreuses sous-sessions de terminaux au sein d'une session. Analogique: screen



Teckels, nous ne voulons pas faire briller la véritable IP de notre nœud, et nous voulons effectuer toutes les transactions financières via le TOP. Par conséquent, vous avez besoin d'un .onion de plus.


# 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 

créez maintenant une config pour 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 ~


vous devez également créer un fichier de configuration pour bitcoin-cli, un utilitaire qui communique avec bitcoind


lightning@lightning:~ % mkdir .bitcoin


lightning@lightning:~ % ee .bitcoin/bitcoin.conf


 rpcconnect=192.168.0.1 rpcuser=test rpcpassword=test 

vérifier


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


 [ "test" ] 

exécuter lightningd


lightning@lightning:~ % lightningd --daemon


lightning-cli lui-même peut être contrôlé par l' lightning-cli , par exemple:


lightning-cli newaddr obtient l'adresse pour le nouveau paiement entrant


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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all envoyer à l'adresse tout l'argent du portefeuille (toutes les adresses en chaîne)


En outre, les commandes pour les opérations hors chaîne de la lightning-cli invoice lightning-cli listinvoices lightning-cli pay etc.


Eh bien, pour la communication avec l'application, nous avons REST Api


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


Pour résumer


# 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/fr477124/


All Articles