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.

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