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 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
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
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) :
Il est
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
Ensuite, nous avons mis en place aide
, surveillant l'état des fichiers de configuration du système. Vous pouvez lire plus en détail
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
sysrc auditd_enable=YES
# service auditd start
La manière de gérer cette affaire est parfaitement décrite dans
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
Des conteneurs ? Encore Docker ou quoi ?
Et pas ici. 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.
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 bhyve
dans l'exemple ci-dessous.
Installation et configuration de l'environnement hôte
Nous utilisons FS
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
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
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
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.
ordinateurs portables. Pour l'instant, nous utiliserons Electrum avec des serveurs publics, et plus tard nous l'augmenterons dans une autre cellule
# 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
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
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 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
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
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.
Il convient également de noter la nécessité d'une surveillance à distance de l'hôte, à ces fins nous avons
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 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 !
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 -
Source: habr.com