Le Bitcoin en cage ?

Il se trouve que je suis administrateur de systĂšmes et de rĂ©seaux informatiques (en abrĂ©gĂ© : sysadmin), et j'ai eu l'opportunitĂ© de travailler pendant un peu plus de 10 ans dans diverses systĂšmes, y compris ceux nĂ©cessitant des mesures de sĂ©curitĂ© [po|za]vyschennykh. Et aussi, il s'est avĂ©rĂ© qu'il y a quelque temps, j'ai trouvĂ© intĂ©ressant bitcoin, et je n'ai pas seulement utilisĂ© cette technologie, mais j'ai Ă©galement lancĂ© plusieurs microservices afin d'apprendre Ă  travailler moi-mĂȘme avec le rĂ©seau Bitcoin (qui est en fait p2p) du point de vue d'un dĂ©veloppeur (je suis bien sĂ»r un dĂ©veloppeur modeste dev, juste un passant). 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 l'un ne peut pas vraiment fonctionner sans l'autre, mais pas pour longtemps. C'est pourquoi je souhaite partager mon expĂ©rience et une sĂ©rie d'outils que j'utilise, qui incluent Ă  la fois fintech, et via infosec, et qui peuvent Ă©galement ĂȘtre utilisĂ©s dans un but plus large ou complĂštement diffĂ©rent. Dans cet article, je ne parlerai pas tant de Bitcoin que du modĂšle d'infrastructure pour le dĂ©veloppement et l'exploitation de services financiers (et pas seulement) — en d'autres termes, des services oĂč le « B » a de l'importance. Cela s'applique aussi bien Ă  une bourse de Bitcoin qu'Ă  un typique zoo corporate de services d'une petite entreprise non liĂ©e au Bitcoin.

Je tiens à souligner que je soutiens les principes de « keep it stupid simple » et « less is more », donc l'article ainsi que ce qui y est décrit auront les caractéristiques de ces principes.

ScĂ©nario imaginaire : Prenons l'exemple d'un Ă©change de bitcoins. Nous avons dĂ©cidĂ© de lancer un Ă©change de roubles, dollars, euros contre des bitcoins et vice versa, et nous avons dĂ©jĂ  une solution opĂ©rationnelle, mais pour d'autres monnaies numĂ©riques comme Qiwi et WebMoney, c'est-Ă -dire que toutes les questions juridiques sont rĂ©glĂ©es, nous avons une application prĂȘte qui fait office de passerelle de paiement pour les roubles, dollars et euros ainsi que pour d'autres systĂšmes de paiement. Elle est liĂ©e Ă  nos comptes bancaires et dispose d'une API pour nos applications finales. Nous avons Ă©galement une application web qui sert d'Ă©change pour les utilisateurs, semblable Ă  un cabinet typique de Qiwi ou WebMoney — crĂ©ez un compte, ajoutez une carte, etc. Elle communique avec notre application passerelle, via REST API en local. Nous avons donc dĂ©cidĂ© d'intĂ©grer les bitcoins et de mettre Ă  niveau l'infrastructure, car initialement tout a Ă©tĂ© rapidement mis en place sur des VirtualBox dans le bureau sous la table
 le site est utilisĂ©, et nous nous soucions maintenant de la disponibilitĂ© et des performances.

Alors, commençons par l'essentiel — le choix du serveur. Puisque l'entreprise dans notre exemple est petite et que nous faisons confiance Ă  notre hĂ©bergeur (OVH), nous allons choisir une option Ă©conomique qui ne permet pas d'installer le systĂšme Ă  partir d'une image originale .iso, mais ce n'est pas grave, le dĂ©partement de la sĂ©curitĂ© informatique effectuera nĂ©cessairement une analyse de l'image installĂ©e. Et lorsque nous grandirons, nous louerons mĂȘme notre propre armoire sous clĂ© avec un accĂšs physique limitĂ©, ou peut-ĂȘtre construirons-nous notre propre centre de donnĂ©es. Dans tous les cas, il est important de se rappeler que lors de la location de matĂ©riel et de l'installation d'images prĂȘtes Ă  l'emploi, il y a une possibilitĂ© que votre systĂšme contienne un « cheval de Troie de l'hĂ©bergeur », qui dans la plupart des cas est destinĂ© non pas Ă  vous surveiller, mais Ă  vous proposer des outils de gestion de serveur plus pratiques.

Installation du serveur

Ici, c'est simple. Nous choisissons le matériel qui convient à nos besoins. Ensuite, nous choisissons une image FreeBSD. Ou bien nous nous connectons (dans le cas d'un autre hébergeur ou de notre propre matériel) via IPMI ou avec un moniteur et nous lançons l'image .iso de FreeBSD. Pour l'installation orchestrée, j'utilise Ansible et mfsbsd. La seule chose, dans notre cas avec Kimsufi, nous avons choisi l'installation personnalisée afin que les deux disques en miroir aient « ouverts » uniquement les partitions de démarrage et /home, le reste de l'espace disque sera chiffré, mais nous en reparlerons plus tard.

Le Bitcoin en cage ?

L'installation du systĂšme se fait de maniĂšre standard, je ne vais pas m'attarder lĂ -dessus, je tiens juste Ă  souligner qu'avant de commencer Ă  l'utiliser, il vaut mieux prĂȘter attention Ă  le renforcement des options proposĂ©es par bsdinstaller Ă  la fin de l'installation (si vous installez vous-mĂȘme le systĂšme) :

Le Bitcoin en cage ?

Oui un bon matériel sur ce sujet, que je vais résumer 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, il faut modifier le fichier de démarrage et activer les paramÚtres du noyau. *ee est un éditeur 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 est également important de s'assurer que vous disposez de la derniÚre version du systÚme et d'effectuer toutes les mises à jour et upgrades. Dans notre cas, par exemple, une mise à jour vers la derniÚre version est nécessaire, car les images préinstallées ont du retard de six mois à un an. Et là, nous changeons le port SSH pour un autre que par défaut, ajoutons l'authentification par clés et désactivons l'accÚs par mot de passe.

Ensuite, nous configurons aide, la surveillance de l'état des fichiers de configuration du systÚme. On peut lire plus en détail ici.

pkg install aide

et nous modifions 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

Nous activons audit systĂšme

sysrc auditd_enable=YES

# service auditd start

La maniÚre d'administrer cela est trÚs bien décrite dans guide.

Maintenant, nous redémarrons et commençons avec le logiciel sur le serveur. Chaque serveur est comme un hyperviseur pour des conteneurs ou des machines virtuelles complÚtes. Il est donc important que le processeur prenne en charge VT-x et EPT si nous prévoyons d'utiliser la virtualisation complÚte.

Pour la gestion des conteneurs et des machines virtuelles, j'utilise cbsd à partir de olevole, je souhaite à cet excellent utilitaire beaucoup de santé et de bienfaits !

Des conteneurs ? Encore docker ?

Eh bien non. FreeBSD Jails est un excellent outil pour la conteneurisation, et le mentionné cbsd est pour l'orchestration de ces conteneurs, qui s'appelle des cellules.

La cage est une solution extrĂȘmement efficace pour construire une infrastructure pour divers objectifs, oĂč Ă  la fin une isolation totale des services ou processus individuels est requise. En essence, c'est un clone du systĂšme hĂŽte, mais il ne nĂ©cessite pas de virtualisation complĂšte du matĂ©riel. Ainsi, les ressources ne sont pas gaspillĂ©es sur un « systĂšme d'exploitation invitĂ© », mais uniquement sur le travail exĂ©cutĂ©. Lorsque les cages sont utilisĂ©es pour des besoins internes, c'est une solution trĂšs pratique pour une utilisation optimale des ressources — plusieurs cages sur un mĂȘme serveur physique peuvent chacune utiliser l'ensemble des ressources du serveur si nĂ©cessaire. Étant donnĂ© que diffĂ©rents sous-services ont souvent besoin de ressources supplĂ©mentaires Ă  diffĂ©rents moments, il est possible d’extraire la performance maximale d’un serveur s’il est correctement planifiĂ© et Ă©quilibrĂ© entre les serveurs. En cas de besoin, des limites peuvent Ă©galement ĂȘtre imposĂ©es aux ressources utilisĂ©es par les cages.

Le Bitcoin en cage ?

Et qu'en est-il de la virtualisation complĂšte ?

À ma connaissance, cbsd supporte le fonctionnement des bhyve et des hyperviseurs XEN. Je n'ai jamais utilisĂ© le second, mais le premier est un hyperviseur relativement jeune de FreeBSD. Nous examinerons un exemple d'utilisation bhyve dans l'exemple suivant.

Installation et configuration de l'environnement hĂŽte

Nous utilisons le systĂšme de fichiers ZFS. C'est un outil extrĂȘmement puissant pour gĂ©rer l'espace sur le serveur. GrĂące Ă  ZFS, il est possible de crĂ©er directement Ă  partir de disques des ensembles de diverses configurations, d'augmenter l'espace de maniĂšre dynamique « Ă  chaud », de remplacer des disques dĂ©fectueux, de gĂ©rer des instantanĂ©s et bien d'autres choses que l'on pourrait dĂ©crire dans toute 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 cela ? C'est pour que le systĂšme se lance automatiquement et Ă©coute via SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

ajoutons une partition de disque dans l'espace restant

geli init /dev/ada0p4

entrons notre mot de passe de chiffrement

geli attach /dev/ada0p4

nous saisissons Ă  nouveau le mot de passe et nous obtenons le device /dev/ada0p4.eli — c'est notre espace chiffrĂ©. Ensuite, nous rĂ©pĂ©tons la mĂȘme opĂ©ration pour /dev/ada1 et pour les autres disques dans l'ensemble. Et crĂ©ons un nouveau pool ZFS.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli — voilĂ , nous avons un ensemble minimal opĂ©rationnel prĂȘt. Un ensemble de disques en miroir au cas oĂč l'un des trois tomberait en panne.

Créons un dataset sur un nouveau « pool »

zfs create vms/jails

pkg install cbsd — nous avons lancĂ© la commande et installons le gestionnaire pour nos cellules.

AprÚs que cbsd soit installé, il faut l'initialiser :

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

et nous répondons à une multitude de questions, principalement avec des réponses par défaut.

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

**Je n'utilise Ă©galement pas de NAT de cbsd, mais 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 pour les cellules
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC

## Redirection de port pour le réseau Bitcoin
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 Ă  part, donc je ne vais pas approfondir la configuration de la politique BLOCK ALL et les rĂ©glages des listes blanches, cela peut ĂȘtre fait en consultant la documentation officielle ou n'importe lequel des nombreux articles disponibles sur Google.

Eh bien
 nous avons installĂ© cbsd, il est temps de crĂ©er notre premier cheval de travail — le dĂ©mon Bitcoin dans une cellule !

cbsd jconstruct-tui

Le Bitcoin en cage ?

Ici, nous voyons le dialogue de création de cellule. Une fois que toutes les valeurs sont définies, créons !

Lors de la création de la premiÚre cellule, il convient de choisir ce que l'on utilise comme base pour les cellules. Je choisis la distribution du 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 (il est possible d'héberger des cellules de n'importe quelle version supérieure à celle de l'hÎte).

Une fois tout installé, lançons la cellule !

# cbsd jstart bitcoind

Mais nous devons installer le logiciel dans la cellule.

# 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 de la cellule

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

Bitcoin dans la cellule est lĂ , mais nous avons besoin d'anonymat, car nous voulons nous connecter Ă  certaines cellules via le rĂ©seau TOR. Et en gĂ©nĂ©ral, nous prĂ©voyons de faire tourner la plupart des cellules avec des logiciels suspects uniquement via un proxy. GrĂące Ă  pf Il est possible de dĂ©sactiver le NAT pour une plage d'adresses IP donnĂ©e dans le rĂ©seau local et d'autoriser le NAT uniquement pour notre nƓud TOR. Ainsi, mĂȘme si un malware pĂ©nĂštre dans la cellule, il ne sera probablement pas capable de communiquer avec le monde extĂ©rieur, et mĂȘme s'il le fait, il ne rĂ©vĂ©lera pas l'adresse IP de notre serveur. Nous crĂ©ons donc une cellule supplĂ©mentaire pour le « passage » des services en tant que service « .onion » et comme proxy pour la sortie vers Internet pour des cellules spĂ©cifiques.

# 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 configurons l'écoute sur l'adresse locale (accessible à toutes les cellules)

SOCKSPort 192.168.0.2:9050

Que nous manque-t-il encore pour un bonheur complet ? Oui, nous avons besoin d'un service pour notre web, peut-ĂȘtre mĂȘme plusieurs. Nous allons lancer nginx, qui agira comme un reverse-proxy et s'occupera de prolonger 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 voilà, 150 Mo de dépendances mises dans la cellule. Et l'hÎte reste toujours propre.

Nous reviendrons à la configuration de nginx plus tard, nous devons créer encore deux cellules pour notre passerelle de paiement sur nodejs et rust, et une application web, qui pour une raison ou une autre est sur apache et php, et pour ça elle a également besoin d'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 encore 380 Mo de paquets 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

450 Mo de paquets. dans la cellule.

Ici, nous donnons un accĂšs SSH aux dĂ©veloppeurs directement dans la cellule, ils feront tout eux-mĂȘmes :

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

Port 2267 — nous changeons le port SSH de la cellule Ă  n'importe quel port alĂ©atoire

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

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

Voilà, le service est lancé, il ne reste plus qu'à ajouter une rÚgle dans pf firewall

Voyons quelles sont les adresses IP de nos cellules et à quoi ressemble notre « local »

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

et puisque nous y sommes, ajoutons aussi une rĂšgle pour le reverse-proxy :

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

Et maintenant, un peu sur les bitcoins

Ce que nous avons — nous avons une application web qui est accessible de l'extĂ©rieur et elle communique localement avec notre passerelle de paiement. Maintenant, nous devons prĂ©parer un environnement de travail pour interagir avec le rĂ©seau bitcoin lui-mĂȘme — nƓud bitcoind C'est juste un dĂ©mon qui maintient une copie locale de la blockchain actuelle. Ce dĂ©mon a des fonctions RPC et de portefeuille, mais pour le dĂ©veloppement d'applications, il existe des « wrappers » plus pratiques. Pour commencer, nous avons dĂ©cidĂ© d'installer electrum — c'est un portefeuille CLI. Ce portefeuille sera utilisĂ© par nous comme « stockage Ă  froid » pour nos bitcoins — en gros, ces bitcoins qui doivent ĂȘtre conservĂ©s « en dehors » du systĂšme accessible aux utilisateurs et loin de tout le monde. Il possĂšde Ă©galement une interface graphique, donc nous prĂ©voyons d'utiliser le mĂȘme portefeuille sur nos
ordinateurs portables. Pour l'instant, nous allons utiliser Electrum avec des serveurs publics, et plus tard, nous créerons une autre cellule pour ne dépendre de personne. ElectrumX, pour ne dépendre de personne.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

encore 700 Mo de logiciels dans notre cellule

electrum: /@[8:53] # adduser

Nom d'utilisateur : wallet
Nom complet : 
Uid (laisser vide pour le défaut) : 
Groupe de connexion [wallet] : 
Le groupe de connexion est wallet. Inviter wallet dans d'autres groupes ? [] : 
Classe de connexion [default] : 
Shell (sh csh tcsh nologin) [sh] : tcsh
Répertoire personnel [ /home/wallet] : 
Permissions du répertoire personnel (laisser vide pour le défaut) : 
Utiliser l'authentification par mot de passe ? [yes] : non
Verrouiller le compte aprÚs création ? [non] : 
Nom d'utilisateur   : wallet
Mot de passe   : 
Nom complet  : 
Uid        : 1001
Classe      : 
Groupes     : wallet 
Domicile       : /home/wallet
Mode d'accueil  : 
Shell      : /bin/tcsh
Verrouillé     : non
OK ? (oui/non) : oui
adduser : INFO : Ajout réussi de (wallet) à la base de données des utilisateurs.
Ajouter un autre utilisateur ? (oui/non) : non
Au revoir !
electrum: /@[8:53] # su wallet

electrum: /@[8:53] # su wallet

wallet@electrum: / % electrum-3.6 create

{
    "msg": "Veuillez garder votre graine dans un endroit sûr ; si vous la perdez, vous ne pourrez pas restaurer votre portefeuille.",
    "path": "/usr/home/wallet/.electrum/wallets/default_wallet",
    "seed": "jealous win pig material ribbon young punch visual okay cactus random bird"
}

Voilà, nous avons maintenant créé un portefeuille.

wallet@electrum: / % electrum-3.6 listaddresses

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

wallet@electrum: / % electrum-3.6 help

Pour notre on-chain portefeuille, seuls un nombre limité de personnes pourront se connecter à l'avenir. Pour ne pas ouvrir l'accÚs externe à cette cellule, les connexions SSH seront faites via TOR (une sorte de version décentralisée de VPN). Nous lançons SSH dans la cellule, mais nous ne touchons pas à notre pf.conf sur l'hÎte.

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

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

Maintenant, nous allons désactiver la connexion Internet dans la cellule avec le portefeuille. Nous allons lui attribuer une adresse IP d'un autre espace de sous-réseau qui n'est pas NATé. D'abord, nous changerons /etc/pf.conf sur l'hÎte

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0/24" changer 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 inchangée

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

Nous rechargeons les rĂšgles

# pfctl -f /etc/pf.conf

Nous allons maintenant nous occuper de notre cellule

# cbsd jconfig jname=electrum

Le Bitcoin en cage ?

Le Bitcoin en cage ?

jset mode=quiet jname=electrum ip4_addr="192.168.0.200"
Supprimer l'ancienne IP: /sbin/ifconfig em0 inet 192.168.0.6 -alias
Configurer la nouvelle IP: /sbin/ifconfig em0 inet 192.168.0.200 alias
ip4_addr: 192.168.0.200

Hmm, mais maintenant, notre systÚme cessera également de fonctionner. Cependant, nous pouvons spécifier un proxy systÚme. Mais il y a un hic, sur TOR c'est un proxy SOCKS5, et pour plus de commodité, nous aurions également besoin d'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

VoilĂ , maintenant notre systĂšme a deux serveurs proxy, et les deux passent par TOR : socks5://192.168.0.2:9050 et http://192.168.0.6:8123

Nous pouvons maintenant configurer 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

Et bien, maintenant le shell fonctionnera sous proxy. Si nous voulons installer des paquets, nous devrions ajouter dans /usr/local/etc/pkg.conf sous le root de la cellule

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

Et maintenant vient le moment 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

Voici notre adresse de connexion. Vérifions cela depuis la machine locale. Mais d'abord, nous devons ajouter notre clé SSH :

wallet@electrum:/ % mkdir ~/ .ssh

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

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

Et depuis 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

Nous nous connectons (Pour que cela fonctionne, un démon TOR local écoutant sur 9050 est nécessaire)

user@local ~$ ssh remotebtc

L'authenticitĂ© de l'hĂŽte 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion ()' ne peut pas ĂȘtre Ă©tablie.
L'empreinte de la clé ECDSA est SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4.
Êtes-vous sĂ»r de vouloir continuer la connexion (yes/no/[fingerprint]) ? yes
Avertissement : 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion' (ECDSA) a été ajoutée de façon permanente à la liste des hÎtes connus.
FreeBSD 12.1-RELEASE-p1 GENERIC 
Pour économiser de l'espace disque dans votre répertoire personnel, compressez les fichiers que vous utilisez rarement avec "gzip filename".
        -- Dru 
wallet@electrum:~ % logout

SuccĂšs !

Pour travailler avec des paiements instantanĂ©s et micros, nous avons Ă©galement besoin d'un nƓud Lightning Network, en fait, cela sera notre principal outil de travail avec Bitcoin. Au *c-lightning, que nous allons utiliser comme dĂ©mon, a le plugin Sparko, qui est une vĂ©ritable interface HTTP (REST) et permet de travailler Ă  la fois avec des transactions off-chain et on-chain. c-lightning pour fonctionner nĂ©cessite bitcoind un nƓud.

*il existe diffĂ©rentes implĂ©mentations sur diffĂ©rents langages de programmation du protocole Lightning Network. Parmi celles que nous avons testĂ©es, c-lightning (Ă©crit en C) s'est avĂ©rĂ© ĂȘtre le plus stable et efficace en ressources.

# cbsd jsconstruct-tui

# cbsd jstart cln

# jexec cln

lightning:‍@[10:23] # adduser

Nom d'utilisateur : 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 se compile et s'installe, créons un 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
#autoriser uniquement c-lightning
rpcallowip=192.168.0.7/32

bitcoind:‍@[10:39] # service bitcoind restart

Mon passage chaotique entre les cellules ne semble pas si chaotique si l'on considÚre l'utilitaire tmux, qui permet de créer plusieurs sous-sessions de terminaux au sein d'une seule session. Analogue : screen

Le Bitcoin en cage ?

Alors, nous ne voulons pas exposer l'IP rĂ©elle de notre nƓud, et nous souhaitons effectuer toutes les opĂ©rations financiĂšres via TOR. C'est pourquoi nous avons besoin d'un autre .onion.

# jexec tor

tor:/@[9:59] # ee /usr/local/etc/tor/torrc

HiddenServiceDir /var/db/tor/cln/
HiddenServicePort 9735 192.168.0.7:9735

tor:‍@[10:01] # mkdir /var/db/tor/cln

tor:‍@[10:01] # chown -R _tor:_tor /var/db/tor/cln

tor:‍@[10:01] # chmod 700 /var/db/tor/cln

tor:/@[10:03] # service tor restart

tor:‍@[10:04] # cat /var/db/tor/cln/hostname

en5wbkavnytti334jc5uzaudkansypfs6aguv6kech4hbzpcz2ove3yd.onion

maintenant, créons la 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

# plugin sparko
# 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
# pour l'exemple ci-dessus, les journaux d'initialisation (mélangés avec les journaux de lightningd) devraient imprimer quelque chose comme

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 ~

Il faut aussi créer un fichier de configuration pour bitcoin-cli, l'outil qui communique avec bitcoind

lightning@lightning:~ % mkdir .bitcoin

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

rpcconnect=192.168.0.1
rpcuser=test
rpcpassword=test

vérifions

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

[
  "test"
]

lancez lightningd

lightning@lightning:~ % lightningd --daemon

Moi lightningd on peut gérer l'outil lightning-cli, par exemple :

lightning-cli newaddr obtenir une adresse pour un nouveau paiement entrant

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all envoyer tous les fonds du portefeuille (de toutes les adresses on-chain)

Voici également les commandes pour les opérations off-chain lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay etc.

Mais pour communiquer avec l'application, nous avons l'API REST

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

Pour résumer

# jls

   JID  Adresse IP      Nom d'hĂŽte                      Chemin
     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

Le Bitcoin en cage ?

Nous avons un ensemble de conteneurs, chacun avec son propre niveau d'accÚs tant vers qu'à partir du réseau local.

# zfs list

NOM                    UTILISÉ  DISPONIBLE  RÉFÉRENCED  POINT DE MONTAGE
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 on peut le voir, bitcoind occupe tout l'espace de 190 Go. Que faire si nous avons besoin d'une autre nƓud Ă  des fins de test ? C'est ici que ZFS entre en jeu. GrĂące Ă  cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com il est possible de crĂ©er un snapshot et d'associer une nouvelle cellule Ă  ce snapshot. La nouvelle cellule aura entiĂšrement son propre espace, mais seule la diffĂ©rence entre l'Ă©tat actuel et l'original sera prise en compte dans le FS (ce qui nous permettra d'Ă©conomiser au moins 190 Go)

Chaque cellule est son propre ensemble de donnĂ©es ZFS distinct, et c'est extrĂȘmement pratique. ZFS permet Ă©galement de faire d'autres choses intĂ©ressantes, comme l'envoi de snapshots via SSH. Nous ne dĂ©velopperons pas cela, il y a dĂ©jĂ  beaucoup Ă  dire.

Il convient également de noter la nécessité de surveiller le serveur à distance, nous avons pour cela Zabbix.

B — sĂ©curitĂ©

En ce qui concerne la sécurité, partons des principes clés dans le contexte de l'infrastructure :

ConfidentialitĂ© — Les outils standard des systĂšmes de type UNIX assurent l'application de ce principe. Nous sĂ©parons logiquement l'accĂšs Ă  chaque Ă©lĂ©ment distinct de la systĂšme — cellule. L'accĂšs se fait par le biais d'une authentification utilisateur standard par clĂ©s privĂ©es des utilisateurs. Toute communication entre et vers les cellules finales se fait de maniĂšre chiffrĂ©e. GrĂące au chiffrement des disques, 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 permet gĂ©nĂ©ralement d'accĂ©der aux donnĂ©es Ă  l'intĂ©rieur des conteneurs.

IntĂ©gritĂ© — L'application de ce principe se fait Ă  plusieurs niveaux diffĂ©rents. Tout d'abord, il est important de noter qu'en ce qui concerne le matĂ©riel serveur, la mĂ©moire ECC, ZFS s'occupe dĂ©jĂ  "par dĂ©faut" de l'intĂ©gritĂ© des donnĂ©es au niveau des bits d'information. Les snapshots instantanĂ©s permettent de faire des sauvegardes Ă  tout moment en temps rĂ©el. Des outils d'import-export pratiques pour les cellules rendent simple la rĂ©plication des cellules.

DisponibilitĂ© — Cela dĂ©pend ici dĂ©jĂ  de votre notoriĂ©tĂ© et du fait que vous ayez des dĂ©tracteurs. Dans notre exemple, nous avons assurĂ© l'accĂšs au portefeuille exclusivement Ă  partir du rĂ©seau TOR. Si nĂ©cessaire, il est possible de bloquer complĂštement l'accĂšs via le pare-feu et de ne permettre l'accĂšs au serveur que par des tunnels (le TOR ou le VPN est un autre sujet). Ainsi, le serveur sera isolĂ© du monde extĂ©rieur autant que possible, et nous serons les seuls Ă  pouvoir influencer son accessibilitĂ©.

ImpossibilitĂ© de refus — Cela dĂ©pend de l'exploitation ultĂ©rieure et du respect des politiques d'utilisation des droits, d'accĂšs, etc. Mais avec une approche appropriĂ©e, toutes les actions des utilisateurs sont auditĂ©es, et grĂące Ă  des solutions cryptographiques, il est possible d'identifier sans Ă©quivoque qui a effectuĂ© quelles actions et quand.

Bien sĂ»r, la configuration dĂ©crite n'est pas un exemple absolu de ce qu'elle doit toujours ĂȘtre, c'est plutĂŽt un des exemples de ce qu'elle pourrait ĂȘtre, tout en conservant une grande flexibilitĂ© en termes de scalabilitĂ© et de personnalisation.

Et qu'en est-il de la virtualisation complĂšte ?

Concernant la virtualisation complÚte avec cbsd, vous pouvez lire ici. Je voudrais juste ajouter que pour cela, bhyve il est nécessaire d'activer certains paramÚtres du noyau.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Donc, s'il y a un besoin de faire fonctionner Docker, nous lançons une Debian et c'est parti !

Le Bitcoin en cage ?

C'est tout.

C'est probablement tout ce que je voulais partager. Si vous avez apprĂ©ciĂ© l'article, vous pouvez me faire un don en bitcoins — bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Si vous souhaitez essayer des cellules en action et avez un peu de bitcoins, vous pouvez consulter mon pet-project.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster