Bitcoin en una jaula?

Dio la casualidad de que soy un administrador profesional de sistemas informáticos y redes (en resumen: sysadmin), y le dije al profesor. la actividad de una amplia variedad de sistemas, incluidos los que requieren [debido] a las medidas de seguridad mencionadas anteriormente. Y resultó que hace algún tiempo encontré a Bitcoin interesante para mí, y no solo lo usé, sino que también lancé varios microservicios para aprender a trabajar de forma independiente con la red de Bitcoin (después de todo, es p2p) desde el punto de vista del desarrollo (Yo, por supuesto, soy un gran desarrollador, así que pasé por alto). Pero no estoy hablando de desarrollo, estoy hablando de un entorno seguro y efectivo para las aplicaciones.


Las tecnologías financieras ( fintech ) van junto con la seguridad de la información ( infosec ) y la primera puede funcionar sin la segunda, pero no por mucho tiempo. Es por eso que quiero compartir mi experiencia y el conjunto de herramientas que uso, que incluye tanto fintech como infosec , y al mismo tiempo, también se puede usar para un propósito más amplio o completamente diferente. En este artículo, le contaré no tanto sobre Bitcoin, sino sobre el modelo de infraestructura para el desarrollo y operación de servicios financieros (y no solo), en una palabra, aquellos servicios en los que "B" es importante. Esto se aplica tanto al intercambio de Bitcoin como al zoológico corporativo más típico de los servicios de una pequeña empresa sin bitcoin de ninguna manera.


Quiero señalar que soy partidario de los principios de "mantenerlo estúpido simple" y "menos es más" , por lo que tanto el artículo como el descrito en él tendrán las propiedades sobre las cuales se basan estos principios.


Escenario imaginario: echemos un vistazo a un ejemplo de un intercambiador de bitcoin. Decidimos comenzar a intercambiar rublos, dólares, euros por bitcoins y viceversa, y ya tenemos una solución de trabajo, pero por otro dinero digital como kiwi y webmoney, es decir. Hemos cerrado todos los problemas legales, hay una aplicación preparada que actúa como una pasarela de pago para rublos, dólares y euros y otros sistemas de pago. Está vinculado a nuestras cuentas bancarias y tiene algún tipo de API para nuestras aplicaciones finales. También tenemos una aplicación web que actúa como un intercambiador para los usuarios, como una cuenta típica de kiwi o webmoney: abra una cuenta, agregue una tarjeta, etc. Se comunica con nuestra aplicación de puerta de enlace, aunque utiliza la API REST en LAN. Entonces decidimos conectar bitcoins y al mismo tiempo actualizar la infraestructura, porque inicialmente todo se apresuró en cajas virtuales en la oficina debajo de la mesa ... comenzaron a usar el sitio, y comenzamos a preocuparnos por el tiempo de actividad y el rendimiento.


Entonces, comencemos con el principal: la selección del servidor. Porque la empresa en nuestro ejemplo es pequeña y confiamos en el host (OVH), elegiremos una opción de presupuesto en la que sea imposible instalar el sistema desde la imagen .iso original, pero no importa, el departamento de seguridad de TI definitivamente analizará la imagen instalada. Y cuando crezcamos, generalmente alquilaremos nuestro armario con cerradura y llave con acceso físico limitado, o tal vez construiremos nuestro propio DC. En cualquier caso, vale la pena recordar que al alquilar hierro e instalar imágenes prefabricadas, existe la posibilidad de que su sistema tenga un "troyano del host", que en la mayoría de los casos no está diseñado para rastrearlo, sino para ofrecer herramientas de administración más convenientes servidor


Instalación del servidor


Todo es simple aquí. Elegimos hierro que se adapte a nuestras necesidades. Luego seleccione la imagen de FreeBSD. Bueno, o nos conectamos (en el caso de otro host y nuestro propio hardware) a través de IPMI o con un monitor y alimentamos la imagen .iso FreeBSD a la descarga. Para instalaciones orquestales, uso Ansible y mfsbsd . Lo único, en nuestro caso con kimsufi, elegimos una instalación personalizada para que los dos discos en el espejo solo tuvieran "inicio" y / particiones de inicio "abiertas", el resto del espacio en disco se cifrará, pero más sobre eso más adelante.



El sistema se instala de la manera estándar, no me detendré allí, solo noto que antes de comenzar la operación vale la pena prestar atención a las opciones de endurecimiento , que bsdinstaller ofrece al final de la instalación (si instala el sistema usted mismo):



Hay buen material sobre este tema, en breve lo repetiré aquí.


Es posible habilitar los parámetros anteriores de la misma manera en un sistema ya instalado. Para hacer esto, edite el archivo del gestor de arranque y habilite los parámetros del kernel. * ee es un editor como este en 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 

También vale la pena asegurarse de tener instalada la última versión del sistema y completar todas las actualizaciones . En nuestro caso, por ejemplo, se requiere una actualización a la última versión, porque las imágenes previas a la instalación tienen un retraso de seis meses a un año. Bueno, allí cambiamos el puerto SSH a uno diferente de forma predeterminada, agregamos la autenticación de clave y la deshabilitamos con una contraseña.


Luego configuramos el aide , monitoreando el estado de los archivos de configuración del sistema. Más masticado se puede leer aquí .


pkg install aide


y edite nuestro 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 

Active la auditoría del sistema


sysrc auditd_enable=YES


# service auditd start


La forma de administrar este negocio está bien descrita en el manual .


Ahora reiniciamos y procedemos con el software en el servidor. Cada servidor es un hipervisor para contenedores o máquinas virtuales completas. Por lo tanto, es importante que el procesador sea compatible con VT-x y EPT si planeamos usar la virtualización completa.


Como administrador de contenedores y máquinas virtuales, uso clevd de olevole , ¡le deseo más salud y beneficios para esta maravillosa utilidad!


Contenedores? ¿Otra vez docker o qué?


Pero no FreeBSD Jails es una gran herramienta de contenedorización, pero el cbsd mencionado cbsd para orquestar estos contenedores, cuyo nombre son celdas.


Una celda es una solución extremadamente efectiva para construir infraestructura para una variedad de propósitos, que en última instancia requiere el aislamiento completo de servicios o procesos individuales. Esto es esencialmente un clon del sistema host, pero no requiere la virtualización completa del hardware. Y los recursos debido a esto no se gastan en un "SO huésped", sino solo en el trabajo realizado. Cuando las celdas se usan para necesidades internas, esta es una solución muy conveniente para el uso óptimo del recurso: un grupo de celdas en un servidor de hierro puede usar individualmente todo el recurso del servidor si es necesario. Dado que generalmente los diferentes sub-servicios necesitan más. recursos en diferentes momentos, puede extraer el máximo rendimiento de un servidor, si planifica y desequilibra las celdas entre los servidores correctamente. Si es necesario, las celdas también pueden establecer límites en el recurso utilizado.


imagen


¿Qué pasa con la virtualización completa?


Hasta donde yo sé, cbsd soporta el trabajo de los hipervisores bhyve y XEN. Nunca usé el segundo, pero el primero es un hipervisor relativamente joven de FreeBSD . Veremos un ejemplo de uso de bhyve en el siguiente ejemplo.


Instalar y configurar el entorno host


Usamos FS ZFS . Esta es una herramienta extremadamente poderosa para administrar el espacio del servidor. Gracias a ZFS, puede construir directamente matrices de varias configuraciones directamente desde discos, expandir dinámicamente el espacio "activo", cambiar discos muertos, administrar instantáneas y mucho, mucho más que se puede describir en una serie de artículos. Volvamos a nuestro servidor y sus discos. Al comienzo de la instalación en discos, dejamos espacio libre para particiones encriptadas. Por qué Esto es para que el sistema se eleve automáticamente y escuche en SSH.


gpart add -t freebsd-zfs /dev/ada0


/dev/ada0p4 added!


agregue la partición del disco al espacio restante


geli init /dev/ada0p4


maneje nuestra contraseña de cifrado


geli attach /dev/ada0p4


nuevamente ingrese la contraseña y tenemos el dispositivo /dev/ada0p4.eli - este es nuestro espacio encriptado. Luego repetimos lo mismo para / dev / ada1 y otros discos en la matriz. Y cree un nuevo grupo de ZFS .


zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli - bueno, ahora tenemos listo el conjunto mínimo de combate. Una matriz de discos reflejada en caso de que uno de los tres falle.


Crear un conjunto de datos en el nuevo "grupo"


zfs create vms/jails


pkg install cbsd : ejecuta el comando e instala la administración de nuestras celdas.


Después de instalar cbsd , debe inicializarse:


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


Bueno, respondemos un montón de preguntas, en su mayoría respuestas por defecto.


* Si usa cifrado, es importante que el demonio cbsdd se inicie automáticamente hasta que descifre los discos de forma manual o automática (en nuestro ejemplo, zabbix hace esto)


** Además, no uso NAT de cbsd , sino que lo configuro yo mismo en pf .


# sysrc pf_enable=YES


# ee /etc/pf.conf


 IF_PUBLIC="em0" IP_PUBLIC="1.23.34.56" JAIL_IP_POOL="192.168.0.0/24" #WHITE_CL="{ 127.0.0.1 }" icmp_types="echoreq" set limit { states 20000, frags 20000, src-nodes 20000 } set skip on lo0 scrub in all #NAT for jails nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC ## Bitcoin network port forward IP_JAIL="192.168.0.1" PORT_JAIL="{8333}" rdr pass on $IF_PUBLIC proto tcp from any to $IP_PUBLIC port $PORT_JAIL -> $IP_JAIL 

# service pf start


# pfctl -f /etc/pf.conf


La configuración de las políticas de firewall también es un tema aparte, por lo que no profundizaré en la configuración de BLOQUEAR TODAS las políticas y establecer listas blancas; puede hacerlo leyendo la documentación oficial o cualquiera de la gran cantidad de artículos disponibles en Google.


Bueno ... tenemos instalado cbsd, es hora de crear nuestro primer caballo de batalla: ¡un demonio bitcoin en una jaula!


cbsd jconstruct-tui



Aquí vemos el diálogo de creación celular. Después de configurar todos los valores, ¡crea!


Al crear la primera celda, debe elegir qué usar como base para las celdas. Selecciono el kit de distribución del repositorio de FreeBSD con el comando repo . Esta elección se realiza solo cuando se crea la primera celda de una versión específica (puede alojar celdas de cualquier versión que sea anterior a la versión del host).


Después de que todo esté instalado, ¡ejecute la celda!


# cbsd jstart bitcoind


Pero necesitamos instalar software en la jaula.


# jls


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

jexec bitcoind para entrar en la consola celular


y ya dentro de la celda instalamos software con sus dependencias (nuestro sistema host permanece limpio)


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


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


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


Hay bitcoin en la celda, pero necesitamos el anonimato, porque queremos conectarnos a algunas celdas a través de la red TOP. En general, tenemos planes para convertir la mayoría de las celdas con software sospechoso solo a través de un proxy. Gracias a pf puede deshabilitar NAT para un rango específico de direcciones IP en la red local y permitir NAT solo para nuestro nodo TOR. Por lo tanto, incluso si el malware ingresa a la célula, lo más probable es que no se ponga en contacto con el mundo exterior, y si lo hace, no revelará la IP de nuestro servidor. por lo tanto, creamos una celda más, para servicios de "reenvío" como un servicio ".onion" y como un proxy para acceder a Internet a celdas individuales.


# 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


Ponemos escuchar en la dirección local (disponible para todas las celdas)


SOCKSPort 192.168.0.2:9050


Lo que todavía nos falta para la felicidad completa. Sí, necesitamos un servicio para nuestra web, quizás no uno. Ejecute nginx, que actuará como proxy inverso y se encargará de renovar los certificados Let's Encrypt


# cbsd jsconstruct-tui


# cbsd jstart nginx-rev


# jexec nginx-rev


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


Y ahora ponemos 150 MB de dependencias en una jaula. Y el anfitrión todavía está limpio.


Volvamos a configurar nginx más tarde, necesitamos elevar dos celdas más para nuestra pasarela de pago a nodejs and rust y una aplicación web, que por alguna razón está en apache y pkhp, y la base de datos MySQL también es necesaria para este último.


# 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


... y otros 380 MB de paquetes de forma aislada


Luego, bombeamos nuestra aplicación con git y la ejecutamos.


# cbsd jsconstruct-tui


# cbsd jstart webapp


# jexec webapp


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


Paquetes de 450 MB. en la jaula


aquí le damos acceso al desarrollador a través de SSH directamente a la celda, ellos harán todo por sí mismos allí:


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


Port 2267 : cambie el puerto de la celda SSH a cualquier arbitrario


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


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


Bueno, el servicio se está ejecutando, queda agregar una regla en el firewall pf


Veamos qué IP tenemos en las celdas y cómo se ve nuestro "lokalka"


# jls


  JID IP Address Hostname Path 1 192.168.0.1 bitcoind.space.com /zroot/jails/jails/bitcoind 2 192.168.0.2 tor.space.com /zroot/jails/jails/tor 3 192.168.0.3 nginx-rev.space.com /zroot/jails/jails/nginx-rev 4 192.168.0.4 paygw.space.com /zroot/jails/jails/paygw 5 192.168.0.5 webapp.my.domain /zroot/jails/jails/webapp 

y agrega una regla


# 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 

Bueno, ya que estamos aquí, agregaremos la misma regla en el proxy inverso:


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


Bueno, ahora un poco sobre bitcoins


Lo que tenemos: tenemos una aplicación web accesible desde el exterior y que se comunica localmente con nuestra pasarela de pago. Ahora necesitamos preparar un entorno de trabajo para la interacción con la red bitcoin en sí misma: el nodo bitcoind es solo un demonio que admite una copia local de la cadena de bloques actual. Este demonio tiene funcionalidad RPC y billetera, pero hay "envoltorios" más convenientes para desarrollar aplicaciones. Para empezar, decidimos poner electrum : esta es una billetera CLI. Utilizaremos esta billetera como un "almacenamiento en frío" para nuestros bitcoins, en general, esos bitcoins que deberán almacenarse "fuera" del sistema, accesibles para los usuarios y, en general, lejos de todos. Él también tiene una GUI, por lo que vamos a usar la misma billetera en nuestro
computadoras portátiles Si bien usaremos el electrum con servidores públicos, y luego en otra celda elevaremos ElectrumX , para que no dependa de nadie en absoluto.


# cbsd jsconstruct-tui


# cbsd jstart electrum


# jexec electrum


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


otros 700 MB de software en nuestra jaula


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

Ahora hemos creado una billetera.


wallet@electrum:/ % electrum-3.6 listaddresses


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

wallet@electrum:/ % electrum-3.6 help


De ahora en adelante, solo un círculo limitado de personas podrá conectarse a nuestra billetera en cadena . Para no abrir el acceso desde el exterior a esta celda, las conexiones SSH ocurrirán a través de TOR (una versión descentralizada de VPN). Iniciamos SSH en la celda, pero no tocamos nuestro pf.conf en el host.


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


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


Ahora apague el acceso a Internet a la celda con la billetera. Le daremos una dirección IP desde otro espacio de subred que no esté basado en NAT. Primero, cambie /etc/pf.conf en el host


# ee /etc/pf.conf


JAIL_IP_POOL="192.168.0.0/24" cambie a JAIL_IP_POOL="192.168.0.0/25" , por lo que todas las direcciones 192.168.0.126-255 no tendrán acceso directo a Internet. Una especie de red de software "entrehierro". Y la regla NAT permanece como estaba


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


Sobrecargando las reglas


# pfctl -f /etc/pf.conf


Ahora toma nuestra jaula


# 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, pero ahora el sistema mismo dejará de funcionar para nosotros. Sin embargo, podemos especificar un proxy del sistema. Pero hay una cosa, pero en TOR es un proxy SOCKS5, y por conveniencia también tendríamos 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


Bueno, ahora en nuestro sistema hay dos proxies, y ambos salen a través de TOR: socks5: //192.168.0.2: 9050 y http://192.168.0.6:8123


Ahora puedes personalizar el entorno de nuestra billetera


# 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 

Bueno, ahora el shell funcionará desde un proxy. Si desea instalar paquetes, entonces vale la pena agregarlos a /usr/local/etc/pkg.conf desde debajo de la raíz de la celda


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

Bueno, ahora es el momento de agregar el servicio oculto TOR como la dirección de nuestro servicio SSH en la celda de la billetera.


# 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 

Aquí está nuestra dirección de conexión. Vamos a ver desde la máquina local. Pero primero debe agregar nuestra clave SSH:


wallet@electrum:/ % mkdir ~/.ssh


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


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

Bueno, desde la máquina Linux del 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 

Conéctese (para que esto funcione, necesita un demonio TOR local que escuche en el 9050)


user@local ~$ ssh remotebtc


 The authenticity of host 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion (<no hostip for proxy command>)' can't be established. ECDSA key fingerprint is SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion' (ECDSA) to the list of known hosts. FreeBSD 12.1-RELEASE-p1 GENERIC To save disk space in your home directory, compress files you rarely use with "gzip filename". -- Dru <genesis@istar.ca> wallet@electrum:~ % logout 

Éxito!


Para trabajar con pagos instantáneos y micropagos, también necesitamos el nodo Lightning Network , de hecho, esta será nuestra principal herramienta de trabajo con bitcoin. * C-lightning , que vamos a utilizar como demonio, tiene un complemento Sparko , que es una interfaz HTTP (REST) ​​completa y permite trabajar con transacciones fuera de la cadena y transacciones dentro de la cadena. c-lightning requiere un nodo bitcoind para funcionar.


* Existen diferentes implementaciones en diferentes PL del protocolo Lightning Network. De los que probamos c-lightning (escrito en C) parecía ser el más estable y eficiente en recursos


# 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


Si bien todo lo que necesita está compilado e instalado, cree el usuario RPC para lightningd en 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


Mi cambio caótico entre celdas no es tan caótico si observa la utilidad tmux , que le permite crear muchas sub-sesiones de terminales dentro de una sesión. Analógico: screen



Dachshunds, no queremos que brille la IP real de nuestro nodo, y queremos realizar todas las transacciones financieras a través de TOP. Por lo tanto, necesita un .onion más.


# 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 

ahora crea una configuración para 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 ~


también necesita crear un archivo de configuración para bitcoin-cli, una utilidad que se comunica con bitcoind


lightning@lightning:~ % mkdir .bitcoin


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


 rpcconnect=192.168.0.1 rpcuser=test rpcpassword=test 

comprobar


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


 [ "test" ] 

corre lightningd


lightning@lightning:~ % lightningd --daemon


lightning-cli se puede controlar mediante la lightning-cli , por ejemplo:


lightning-cli newaddr obtener dirección para el nuevo pago entrante


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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all enviar a la dirección todo el dinero de la billetera (todas las direcciones en cadena)


Además, los comandos para operaciones fuera de la cadena de lightning-cli invoice lightning-cli listinvoices , las lightning-cli listinvoices lightning-cli pay etc.


Bueno, para la comunicación con la aplicación tenemos REST Api


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


Para resumir


# jls


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


, .


# zfs list


 NAME USED AVAIL REFER MOUNTPOINT zroot 279G 1.48T 88K /zroot zroot/ROOT 1.89G 1.48T 88K none zroot/ROOT/default 1.89G 17.6G 1.89G / zroot/home 88K 1.48T 88K /home zroot/jails 277G 1.48T 404M /zroot/jails zroot/jails/bitcoind 190G 1.48T 190G /zroot/jails/jails-data/bitcoind-data zroot/jails/cln 653M 1.48T 653M /zroot/jails/jails-data/cln-data zroot/jails/electrum 703M 1.48T 703M /zroot/jails/jails-data/electrum-data zroot/jails/nginx-rev 190M 1.48T 190M /zroot/jails/jails-data/nginx-rev-data zroot/jails/paygw 82.4G 1.48T 82.4G /zroot/jails/jails-data/paygw-data zroot/jails/polipo 57.6M 1.48T 57.6M /zroot/jails/jails-data/polipo-data zroot/jails/tor 81.5M 1.48T 81.5M /zroot/jails/jails-data/tor-data zroot/jails/webapp 360M 1.48T 360M /zroot/jails/jails-data/webapp-data 

, bitcoind 190 . ? ZFS . cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com . , ( 190 )


ZFS, . ZFS , SSH. , .


, Zabbix .



, :


— UNIX- . — . . . . -, .


— . - , ECC , ZFS " " . . - .


— . . . ( ). , .


— , . , .


, , , .


?


cbsd . , bhyve .


# cat /etc/rc.conf


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

# cat /boot/loader.conf


 ... vmm_load="YES" ... 

, - debian !




. — bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc . , pet-project .

Source: https://habr.com/ru/post/477124/


All Articles