Bitcoin en cage ?

Il se trouve que de profession je suis administrateur de systèmes et réseaux informatiques (en bref : administrateur système), et j'ai eu l'occasion d'en parler à prof pendant un peu plus de 10 ans. les activités d’une grande variété de systèmes, y compris ceux qui nécessitent des mesures de sécurité [extrêmes]. Il m'est aussi arrivé qu'il y a quelque temps, je trouvais ça intéressant Bitcoin, et non seulement l'a utilisé, mais a également lancé plusieurs micro-services afin d'apprendre à travailler de manière indépendante avec le réseau Bitcoin (alias p2p après tout) du point de vue d'un développeur (je fais bien sûr partie de ceux dev, donc je passais par là). Mais je ne parle pas de développement, je parle d'un environnement sûr et efficace pour les applications.

Technologie financière (FinTech) allez à côté de la sécurité de l'information (infosec) et le premier peut fonctionner sans le second, mais pas pour longtemps. C'est pourquoi je souhaite partager mon expérience et l'ensemble des outils que j'utilise, qui comprennent à la fois FinTechEt infosec, et en même temps, et peut également être utilisé dans un but plus large ou complètement différent. Dans cet article, je ne vous parlerai pas tant de Bitcoin, mais du modèle d'infrastructure pour le développement et l'exploitation des services financiers (et pas seulement) - en un mot, des services pour lesquels « B » compte. Cela s'applique à la fois à l'échange Bitcoin et au zoo d'entreprise le plus typique de services d'une petite entreprise qui n'est en aucun cas liée au Bitcoin.

Je tiens à souligner que je suis partisan des principes "reste stupide et simple" и "moins est plus", par conséquent, l'article et ce qui y est décrit auront les propriétés sur lesquelles portent ces principes.

Scénario imaginaire : Regardons tout en utilisant l'exemple d'un échangeur Bitcoin. Nous avons décidé de lancer l'échange de roubles, de dollars, d'euros contre des bitcoins et inversement, et nous avons déjà une solution qui fonctionne, mais pour d'autres monnaies numériques comme le qiwi et le webmoney, c'est-à-dire Nous avons résolu tous les problèmes juridiques, nous disposons d'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 connecté à nos comptes bancaires et dispose d’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 qiwi ou webmoney typique - créez un compte, ajoutez une carte, etc. Il communique avec notre application de passerelle, mais via l'API REST au niveau local. Nous avons donc décidé de connecter les bitcoins et en même temps de mettre à niveau l'infrastructure, car... Au départ, tout a été installé à la hâte sur des boîtes virtuelles au bureau, sous la table... le site a commencé à être utilisé et nous avons commencé à nous inquiéter de la disponibilité et des performances.

Commençons donc par l'essentiel : choisir un serveur. Parce que l'entreprise dans notre exemple est petite et nous faisons confiance à l'hébergeur (OVH) que nous choisirons une option budgétaire dans lequel il est impossible d'installer le système à partir de l'image .iso d'origine, mais ce n'est pas grave, le service de sécurité informatique analysera certainement l'image installée. Et quand nous serons grands, nous louerons notre propre placard fermé à clé avec un accès physique limité, et peut-être que nous construirons notre propre DC. Dans tous les cas, il convient de rappeler que lors de la location de matériel et de l'installation d'images prêtes à l'emploi, il est possible que vous ayez un « cheval de Troie de l'hébergeur » accroché à votre système, qui dans la plupart des cas n'est pas destiné à vous espionner. mais pour offrir des outils de gestion serveur plus pratiques.

Installation du serveur

Tout est simple ici. Nous choisissons le matériel qui correspond à 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 introduisons l'image .iso FreeBSD dans le téléchargement. Pour une configuration orchestrale, j'utilise Ansible и mfsbsd. La seule chose, dans notre cas avec Kimsufi, nous avons choisi installation personnalisée pour que les deux disques dans le miroir n'aient que les partitions de démarrage et /home « ​​ouvertes », le reste de l'espace disque sera chiffré, mais nous y reviendrons plus tard.

Bitcoin en cage ?

L'installation du système s'effectue de manière standard, je ne m'attarderai pas là-dessus, je noterai seulement qu'avant de commencer l'opération, il convient de prêter attention à durcissement options qu'il offre bsdinstaller à la fin de l'installation (si vous installez le système vous-même) :

Bitcoin en cage ?

Il est bon matériel sur ce sujet, je le répéterai brièvement ici.

Il est également possible d'activer les paramètres mentionnés ci-dessus sur un système déjà installé. Pour ce faire, vous devez modifier le fichier du chargeur de démarrage et activer 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

Vous devez également vous assurer que la dernière version du système est installée et effectuer toutes les mises à jour et mises à niveau. Dans notre cas, par exemple, une mise à niveau vers la dernière version est nécessaire, car... les images de pré-installation sont en retard de six mois à un an. Eh bien, là, nous changeons le port SSH en quelque chose de différent de celui par défaut, ajoutons l'authentification par clé et désactivons l'authentification par mot de passe.

Ensuite, nous avons mis en place aide, surveillant l'état des fichiers de configuration du système. Vous pouvez lire plus en détail 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

Allumez audit du système

sysrc auditd_enable=YES

# service auditd start

La manière de gérer cette affaire est parfaitement décrite dans guide.

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

Pour gérer les conteneurs et les machines virtuelles que j'utilise CBD à partir de olévole, je lui souhaite plus de santé et de bénédictions pour ce merveilleux utilitaire !

Des conteneurs ? Encore Docker ou quoi ?

Et pas ici. Prises FreeBSD est un excellent outil pour la conteneurisation, mais celui mentionné cbsd pour orchestrer ces conteneurs, appelés cellules.

La cage est une solution extrêmement efficace pour construire des infrastructures à des fins diverses, où une isolation complète des services ou des processus individuels est finalement requise. Il s’agit essentiellement d’un clone du système hôte, mais il ne nécessite pas de virtualisation matérielle complète. Et grâce à cela, les ressources ne sont pas dépensées pour le « système d'exploitation invité », mais uniquement pour le travail en cours. Lorsque les cellules sont utilisées pour des besoins internes, il s'agit d'une solution très pratique pour une utilisation optimale des ressources : un groupe de cellules sur un serveur matériel peut chacune utiliser individuellement la totalité des ressources du serveur si nécessaire. Considérant que généralement différents sous-services nécessitent des services supplémentaires. ressources à différents moments, vous pouvez extraire des performances maximales d'un serveur si vous planifiez et équilibrez correctement les cellules entre les serveurs. Si nécessaire, les cellules peuvent également se voir attribuer des restrictions sur la ressource utilisée.

Bitcoin en cage ?

Qu’en est-il de la virtualisation complète ?

Pour autant que je sache, cbsd soutient le travail bhyve et hyperviseurs XEN. Je n'ai jamais utilisé le deuxième, mais le premier est relativement récent hyperviseur de FreeBSD. Nous allons voir un exemple d'utilisation bhyve dans l'exemple ci-dessous.

Installation et configuration de 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 diverses configurations à partir de disques, étendre dynamiquement l'espace « à chaud », modifier les disques morts, gérer les instantanés et bien plus encore, qui peuvent être décrits dans toute une série d'articles. Revenons à notre serveur et à ses disques. Au début de l'installation, nous avons laissé de l'espace libre sur les disques pour les partitions chiffrées. Pourquoi donc? Ceci afin que le système se réveille automatiquement et écoute via SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

ajouter une partition de disque à l'espace restant

geli init /dev/ada0p4

entrez notre mot de passe de cryptage

geli attach /dev/ada0p4

Nous saisissons à nouveau le mot de passe et nous avons un appareil /dev/ada0p4.eli - c'est notre espace crypté. Ensuite, nous répétons la même chose pour /dev/ada1 et le reste des disques de la matrice. Et nous en créons un nouveau Pool ZFS.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - Eh bien, nous avons le kit de combat minimum prêt. Une matrice de disques en miroir en cas de panne de l'un des trois.

Créer un jeu de données sur un nouveau « pool »

zfs create vms/jails

pkg install cbsd — nous avons constitué une équipe et mis en place la gestion de nos cellules.

Après 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 avec des réponses par défaut.

*Si vous utilisez le chiffrement, il est important que le démon cbsdd n'a pas démarré automatiquement tant que vous n'avez pas déchiffré les disques manuellement ou automatiquement (dans notre exemple, cela est fait par zabbix)

**Je n'utilise pas non plus NAT depuis cbsd, et je le configure moi-même dans 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, je n'entrerai donc pas dans les détails de la configuration de la politique BLOQUER TOUT et de la configuration des listes blanches, vous pouvez le faire en lisant 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 bourreau de travail : le démon Bitcoin en cage !

cbsd jconstruct-tui

Bitcoin en cage ?

Ici, nous voyons la boîte de dialogue de création de cellule. Une fois toutes les valeurs définies, créons !

Lors de la création de votre première cellule, vous devez choisir quoi utiliser comme base pour les cellules. Je sélectionne une distribution dans le dépôt 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 n'importe quelle version antérieure à la version hôte).

Une fois que tout est installé, on lance la cage !

# 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 accéder à 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 cage, mais nous avons besoin d'anonymat car nous souhaitons nous connecter à certaines cages via le réseau TOP. En général, nous prévoyons d'exécuter la plupart des cellules contenant des logiciels suspects uniquement via un proxy. Grâce à pf Vous pouvez désactiver NAT pour une certaine plage 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 communiquera probablement pas avec le monde extérieur et, s’il le fait, il ne révélera pas l’adresse IP de notre serveur. Par conséquent, nous créons une autre cellule pour « transférer » les services en tant que service « .onion » et en tant que proxy pour accéder à Internet vers 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

Configurer pour écouter à une adresse locale (disponible pour toutes les cellules)

SOCKSPort 192.168.0.2:9050

De quoi d’autre avons-nous besoin pour être pleinement heureux ? Oui, nous avons besoin d'un service pour notre Web, peut-être de plusieurs. Lançons nginx, qui fera office de proxy inverse et se chargera du renouvellement des certificats Let's Encrypt

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

Nous avons donc placé 150 Mo de dépendances dans une cage. Et l'hôte est toujours propre.

Revenons plus tard à la configuration de nginx, nous devons créer deux cellules supplémentaires pour notre passerelle de paiement sur nodejs et rust et une application Web qui, pour une raison quelconque, est en Apache et PHP, et cette dernière nécessite également une base de données MySQL.

# 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 supplémentaires de packages isolés

Ensuite, nous téléchargeons notre application avec git et la lançons.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

Forfaits de 450 Mo. dans une cage.

ici nous donnons au développeur un accès via SSH directement à la cellule, il y fera tout lui-même :

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

Port 2267 — changez le port SSH de la cellule en un port arbitraire

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

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

Voilà, le service est lancé, il ne reste plus qu'à ajouter la règle à pf pare-feu

Voyons quelle adresse IP possèdent nos cellules et à quoi ressemble généralement notre « zone locale ».

# 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 ajoutez 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 y sommes, ajoutons également une règle pour 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, parlons maintenant un peu des bitcoins

Ce que nous avons, c'est que nous avons une application Web qui est exposée en externe et qui communique localement avec notre passerelle de paiement. Nous devons maintenant préparer un environnement de travail pour interagir avec le réseau Bitcoin lui-même - le nœud bitcoind c'est juste un démon qui maintient à jour la copie locale de la blockchain. Ce démon possède des fonctionnalités RPC et de portefeuille, mais il existe des « wrappers » plus pratiques pour le développement d'applications. Pour commencer, nous avons décidé de mettre electrum est un portefeuille CLI. Ce portefeuille nous l'utiliserons comme « stockage froid » pour nos bitcoins - en général, ces bitcoins qui devront être stockés « en dehors » du système accessible aux utilisateurs et généralement loin de tout le monde. Il dispose également d'une interface graphique, nous allons donc utiliser le même portefeuille sur notre
ordinateurs portables. Pour l'instant, nous utiliserons Electrum avec des serveurs publics, et plus tard nous l'augmenterons dans une autre cellule ElectrumXpour ne dépendre 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"
}

Nous avons maintenant créé un portefeuille.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

À notre sur la chaîne Seul un nombre limité de personnes pourront désormais se connecter au portefeuille. Afin de ne pas ouvrir l'accès à cette cellule de l'extérieur, les connexions via SSH se feront via TOP (une version décentralisée du VPN). On lance SSH dans la cellule, mais on ne touche pas à notre pf.conf sur l'hôte.

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

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

Éteignons maintenant le portable avec l'accès Internet du portefeuille. Donnons-lui une adresse IP d'un autre espace de sous-réseau qui n'est pas NAT. Changeons d'abord /etc/pf.conf sur l'hôte

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" changeons-le en JAIL_IP_POOL="192.168.0.0/25", ainsi 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 quelle

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

Surcharger les règles

# pfctl -f /etc/pf.conf

Maintenant, prenons notre portable

# cbsd jconfig jname=electrum

Bitcoin en cage ?

Bitcoin en cage ?

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, sur TOR c'est un proxy SOCKS5, et pour plus de commodité nous aimerions aussi 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, il y a maintenant deux serveurs proxy dans notre système, et tous deux sortent via TOR : chaussettes5://192.168.0.2:9050 et http://192.168.0.6:8123

Nous pouvons maintenant configurer notre environnement de 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 nous voulons installer des packages, nous devons ajouter à /usr/local/etc/pkg.conf sous la racine de la cage

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

Il s'agit de notre adresse de connexion. Vérifions depuis la machine locale. Mais nous devons 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, depuis une machine client Linux

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

Connecter (Pour que cela fonctionne, vous avez besoin d'un démon TOR local qui écoute sur 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 <[email protected]>
wallet@electrum:~ % logout

Succès!

Pour travailler avec les paiements instantanés et les micro-paiements, nous avons également besoin d'un nœud Réseau Lightning, en fait, ce sera notre principal outil de travail avec Bitcoin. U*c-foudreque nous allons utiliser comme démon est Plugin Sparko, qui est une interface HTTP (REST) ​​​​à part entière et vous permet de travailler avec des transactions hors chaîne et en chaîne. c-lightning nécessaire au fonctionnement bitcoind mais oui.

*Il existe différentes implémentations du protocole Lightning Network dans différents langages. Parmi ceux que nous avons testés, c-lightning (écrit en C) nous a semblé 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

Pendant que tout le nécessaire est compilé et installé, créons un utilisateur RPC pour 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

Ma commutation chaotique entre les cellules s'avère pas si chaotique si vous notez l'utilité tmux, qui vous permet de créer plusieurs sous-sessions de terminal au sein d'une même session. Analogue: screen

Bitcoin en cage ?

Nous ne voulons donc pas révéler la véritable adresse IP de notre nœud et nous souhaitons effectuer toutes les transactions financières via TOP. Par conséquent, un autre .onion n’est pas nécessaire.

# 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éons maintenant une configuration 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"
]

lancement lightningd

lightning@lightning:~ % lightningd --daemon

Lui-même lightningd vous pouvez contrôler l'utilitaire lightning-cli, Par exemple:

lightning-cli newaddr obtenir l'adresse pour un nouveau paiement entrant

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

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

Également des commandes pour les opérations hors chaîne lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay et ainsi de suite.

Eh bien, pour communiquer avec l'application, nous avons une API REST

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

Récapituler

# jls

   JID  IP Address      Hostname                      Path
     1  192.168.0.1     bitcoind.space.com            /zroot/jails/jails/bitcoind
     2  192.168.0.2     tor.space.com                 /zroot/jails/jails/tor
     3  192.168.0.3     nginx-rev.space.com           /zroot/jails/jails/nginx-rev
     4  192.168.0.4     paygw.space.com               /zroot/jails/jails/paygw
     5  192.168.0.5     webapp.my.domain              /zroot/jails/jails/webapp
     7  192.168.0.200   electrum.space.com            /zroot/jails/jails/electrum
     8  192.168.0.6     polipo.space.com              /zroot/jails/jails/polipo
     9  192.168.0.7     lightning.space.com           /zroot/jails/jails/cln

Bitcoin en cage ?

Nous disposons d'un ensemble de conteneurs, chacun avec son propre niveau d'accès depuis et vers le réseau local.

# 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

Comme vous pouvez le constater, Bitcoind occupe les 190 Go d’espace. Et si nous avons besoin d’un autre nœud pour les tests ? C'est là que ZFS s'avère utile. Avec de l'aide cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com vous pouvez créer un instantané et attacher une nouvelle cellule à cet instantané. La nouvelle cellule aura son propre espace, mais seule la différence entre l'état actuel et l'original sera prise en compte dans le système de fichiers (nous économiserons au moins 190 Go)

Chaque cellule constitue son propre ensemble de données ZFS distinct, ce qui est extrêmement pratique. ZFS permet également faites diverses autres choses intéressantes, comme envoyer des instantanés via SSH. Nous ne le décrirons pas, il y en a déjà beaucoup.

Il convient également de noter la nécessité d'une surveillance à distance de l'hôte, à ces fins nous avons Zabbix.

B-sécurité

Concernant la sécurité, partons des principes clés dans le contexte des infrastructures :

Конфиденциальность - Les outils standards des systèmes de type UNIX assurent la mise en œuvre de ce principe. Nous séparons logiquement l'accès à chaque élément logiquement séparé du système - une cellule. L'accès est fourni via une authentification utilisateur standard à l'aide des clés personnelles des utilisateurs. Toutes les communications entre et vers les cellules finales se font sous forme cryptée. Grâce au cryptage du disque, nous n'avons pas à nous soucier de la sécurité des données lors du remplacement d'un disque ou de la migration vers un autre serveur. Le seul accès critique est l’accès au système hôte, car cet accès donne généralement accès aux données contenues dans des conteneurs.

Intégrité « La mise en œuvre de ce principe se produit à plusieurs niveaux différents. Tout d'abord, il est important de noter que dans le cas du matériel serveur, de la mémoire ECC, ZFS déjà « prêt à l'emploi » prend en charge l'intégrité des données au niveau des bits d'information. Les instantanés instantanés vous permettent d'effectuer des sauvegardes à tout moment et à la volée. Des outils pratiques d’exportation/importation de cellules simplifient la réplication cellulaire.

Disponibilité - C'est déjà facultatif. Cela dépend de votre degré de renommée et du fait que vous avez des haineux. Dans notre exemple, nous nous sommes assurés que le portefeuille était accessible exclusivement depuis le réseau TOP. Si nécessaire, vous pouvez tout bloquer sur le pare-feu et autoriser l'accès au serveur exclusivement via des tunnels (TOR ou VPN est une autre affaire). Ainsi, le serveur sera coupé autant que possible du monde extérieur, et nous seuls pourrons influencer sa disponibilité.

Impossibilité de refus - Et cela dépend de la poursuite du fonctionnement et du respect des politiques correctes en matière de droits d'utilisateur, d'accès, etc. Mais avec la bonne approche, toutes les actions des utilisateurs sont auditées et grâce aux solutions cryptographiques, il est possible d'identifier sans ambiguïté qui a effectué certaines actions et quand.

Bien entendu, la configuration décrite n’est pas un exemple absolu de ce qu’elle devrait toujours être, c’est plutôt un exemple de ce qu’elle peut être, tout en conservant des capacités de mise à l’échelle et de personnalisation très flexibles.

Qu’en est-il de la virtualisation complète ?

À propos de la virtualisation complète à l'aide de CBSD, vous pouvez lire ici. Je vais juste ajouter ça pour le travail bhyve Vous devez activer certaines options du noyau.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Donc, si vous avez soudainement besoin de démarrer un docker, installez Debian et c'est parti !

Bitcoin en cage ?

C'est tout

Je suppose que c'est tout ce que je voulais partager. Si vous avez aimé l'article, vous pouvez m'envoyer des bitcoins - bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Si vous voulez essayer des cellules en action et avoir des bitcoins, vous pouvez aller sur mon projet pour animaux de compagnie.

Source: habr.com