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 , 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 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 et . 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.

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) :

Oui 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=1Il est également important de s'assurer que vous disposez de la derniÚre version du systÚme et . 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 .
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/$MYFILENAMENous activons
sysrc auditd_enable=YES
# service auditd start
La maniÚre d'administrer cela est trÚs bien décrite dans .
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 à partir de , je souhaite à cet excellent utilitaire beaucoup de santé et de bienfaits !
Des conteneurs ? Encore docker ?
Eh bien non. 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.

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

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/bitcoindjexec 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/webappet 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. 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. , 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 walletelectrum: /@[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


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.200Hmm, 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 = socks5polipo:/@[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
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:8123Et 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:22tor:/@[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.onionVoici 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@localEt 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 , en fait, cela sera notre principal outil de travail avec Bitcoin. Au *, que nous allons utiliser comme dĂ©mon, a , 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/32bitcoind:â@[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

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:9735tor:â@[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.onionmaintenant, 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 commelightning@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=testvé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
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-dataComme 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. 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 .
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 . 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 !

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 â . Si vous souhaitez essayer des cellules en action et avez un peu de bitcoins, vous pouvez consulter mon .
Source : habr.com
