¿Bitcoin en una jaula?

Resulta que soy administrador de sistemas y redes informáticas (en abreviatura: sysadmin), y durante poco más de 10 años he trabajado con diversos sistemas, incluyendo aquellos que requieren [por|para] medidas de seguridad reforzadas. Además, me encontré hace un tiempo que me interesaba bitcoin, y no solo lo utilicé, sino que también lancé varios microservicios para aprender a trabajar de manera autónoma con la red bitcoin (que es p2p, después de todo) desde la perspectiva del desarrollador (aunque debo decir que soy un principiante en esto dev, solo pasé por allí). Pero no estoy aquí para hablar de desarrollo, sino de un entorno seguro y eficiente para aplicaciones.

Las tecnologías financieras (fintech) van de la mano con la seguridad de la información (infosec), y la primera puede funcionar sin la segunda, pero no por mucho tiempo. Por eso, quiero compartir mi experiencia y el conjunto de herramientas que utilizo, que incluye tanto fintech, como infosec, usándose simultáneamente, y también puede aplicarse en un contexto más amplio o completamente diferente. En este artículo hablaré no tanto sobre bitcoin, sino sobre el modelo de infraestructura para el desarrollo y operación de servicios financieros (y no solo) — es decir, aquellos servicios donde

Quiero señalar que soy un defensor de los principios «keep it stupid simple» y «less is more», por lo que tanto el artículo como lo que se describe en él tendrán las características de estos principios.

Escenario imaginado: Analicemos todo con el ejemplo de un intercambio de bitcoins. Hemos decidido lanzar un intercambio de rublos, dólares y euros por bitcoins y viceversa, y ya tenemos una solución operativa, pero para otras monedas digitales como QIWI y WebMoney, es decir, hemos resuelto todas las cuestiones legales, tenemos una aplicación lista que actúa como un gateway de pago para rublos, dólares y euros, así como otros sistemas de pago. Está vinculado a nuestras cuentas bancarias y cuenta con alguna API para nuestras aplicaciones finales. También tenemos una aplicación web que actúa como un intercambio para los usuarios, similar a un típico gabinete de QIWI o WebMoney: cree una cuenta, agregue una tarjeta, y así sucesivamente. Se comunica con nuestra aplicación de gateway, posiblemente a través de REST API en la red local. Y así decidimos integrar bitcoins y, de paso, actualizar la infraestructura, ya que inicialmente todo estaba apresuradamente levantado en VirtualBox en la oficina, debajo de la mesa... el sitio comenzó a usarse y empezamos a preocuparnos por el tiempo de actividad y el rendimiento.

Así que empecemos con lo básico: la elección del servidor. Dado que el negocio en nuestro ejemplo es pequeño y confiamos en el proveedor de hosting (OVH), elegiremos una opción económica en la que no se puede instalar un sistema a partir de la imagen original .iso, pero no hay problema, el departamento de seguridad IT realizará un análisis de la imagen instalada. Y cuando crezcamos, alquilaremos un armario privado con cerradura y acceso físico limitado, o incluso construiremos nuestro propio centro de datos. En cualquier caso, es importante recordar que al alquilar hardware y configurar imágenes predefinidas hay una posibilidad de que en su sistema esté presente un "troyano del proveedor de hosting", que en la mayoría de los casos no está diseñado para espiarlo, sino para ofrecer herramientas de gestión del servidor más cómodas.

Instalación del servidor

Aquí todo es simple. Elegimos el hardware que se adapta a nuestras necesidades. Luego elegimos la imagen de FreeBSD. O nos conectamos (en caso de otro proveedor de hosting y nuestro propio hardware) a través de IPMI o con un monitor y cargamos la imagen .iso de FreeBSD. Para la instalación orquestada uso Ansible y mfsbsd. Lo único es que, en nuestro caso con Kimsufi, elegimos instalación personalizada para que los dos discos en espejo tengan "abiertos" únicamente las particiones de arranque y /home, el resto del espacio del disco estará cifrado, pero de eso hablaremos más adelante.

¿Bitcoin en una jaula?

La instalación del sistema se realiza de manera estándar, no me detendré en esto, solo señalaré que antes de comenzar a usarlo, vale la pena prestar atención a endurecimiento las opciones que ofrece bsdinstaller al final de la instalación (si estás instalando el sistema tú mismo):

¿Bitcoin en una jaula?

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

Es posible habilitar los parámetros mencionados también en un sistema ya instalado. Para esto, es necesario editar el archivo de arranque e incluir los parámetros del núcleo. *ee es un editor 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 es importante asegurarse de que tienes la última versión del sistema, y realizar todas las actualizaciones y mejoras.En nuestro caso, por ejemplo, se requiere actualizar a la última versión, ya que las imágenes predeterminadas están desactualizadas por seis meses a un año. Y allí cambiamos el puerto SSH por uno diferente al predeterminado, agregamos autenticación por claves y desactivamos la autenticación por contraseña.

Luego configuramos aide, monitoreo del estado de los archivos de configuración del sistema. Se puede leer más detalladamente aquí.

pkg install aide

y editamos 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

Activamos la auditoría del sistema

sysrc auditd_enable=YES

# service auditd start

Cómo administrar esto está excelentemente descrito en guía.

Ahora reiniciamos y comenzamos con el software en el servidor. Cada servidor se convierte en un hipervisor para contenedores o máquinas virtuales completas. Por lo tanto, es importante que el procesador soporte VT-x y EPT si planeamos utilizar virtualización completa.

Como gestión de contenedores y máquinas virtuales utilizo cbsd desde olevole, le deseo mucha salud y bendiciones por esta maravillosa utilidad.

¿Contenedores? ¿Otra vez con Docker?

Y no. FreeBSD Jails son una herramienta excelente para la contenedorización, y el mencionado cbsd para la orquestación de estos contenedores, cuyo nombre es — células.

Una celda es una solución extremadamente eficaz para construir infraestructuras para diversos propósitos, donde en última instancia se requiere una completa aislamiento de servicios o procesos individuales. En esencia, es un clon del sistema anfitrión, pero no requiere virtualización completa del hardware. Y gracias a esto, los recursos no se desperdician en un 'sistema operativo huésped', sino solo en el trabajo que se realiza. Cuando las celdas se utilizan para necesidades internas, es una solución muy conveniente para el uso óptimo de recursos: un montón de celdas en un solo servidor físico pueden cada una usar todo el recurso del servidor según sea necesario. Dado que generalmente diferentes subsistemas necesitan recursos adicionales en diferentes momentos, se puede extraer la máxima rendimiento de un servidor si se planifica y balancea correctamente las celdas entre los servidores. Si es necesario, también se pueden imponer límites en los recursos utilizados por las celdas.

¿Bitcoin en una jaula?

¿Y qué hay de la virtualización completa?

Hasta donde sé, cbsd admite el funcionamiento de bhyve y los hipervisor XEN. Nunca he usado el segundo, pero el primero es un hipervisor relativamente joven de FreeBSD.Vamos a ver un ejemplo de uso bhyve en el siguiente ejemplo.

Instalación y configuración del entorno del host

Utilizamos el sistema de archivos ZFS. Esta es una herramienta extremadamente poderosa para gestionar el espacio en el servidor. Gracias a ZFS, se pueden construir directamente arreglos de discos de diversas configuraciones, aumentar el espacio dinámicamente 'en caliente', reemplazar discos que han fallado, gestionar instantáneas y muchas otras cosas que se pueden describir en una serie de artículos. Volvamos a nuestro servidor y a sus discos. Al principio de la instalación, dejamos espacio libre en los discos para las particiones cifradas. ¿Por qué? Esto es para que el sistema se inicie automáticamente y escuche por SSH.

gpart add -t freebsd-zfs /dev/ada0

/dev/ada0p4 added!

agregamos la partición del disco en el espacio restante

geli init /dev/ada0p4

introducimos nuestra contraseña de cifrado

geli attach /dev/ada0p4

nuevamente introducimos la contraseña y nos aparece el dispositivo /dev/ada0p4.eli — este es nuestro espacio cifrado. Luego repetimos lo mismo para /dev/ada1 y los demás discos en el arreglo. Y creamos un nuevo pool ZFS.

zpool create vms mirror /dev/ada0p4.eli /dev/ada1p4.eli /dev/ada3p4.eli — bueno, aquí tenemos nuestro conjunto de combate mínimo listo. Un arreglo espejo de discos en caso de que uno de los tres falle.

Creamos un dataset en un nuevo pool

zfs create vms/jails

pkg install cbsd — ejecutamos el comando y estamos instalando la gestión para nuestras celdas.

Después de que cbsd se instale, debe ser inicializado:

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

y respondemos a un montón de preguntas, principalmente con las respuestas predeterminadas.

*Si utilizas cifrado, es importante que el demonio cbsdd no se inicie automáticamente hasta que descifres los discos manual o automáticamente (en nuestro ejemplo, esto lo hace zabbix)

**Tampoco 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 para celdas
nat pass on $IF_PUBLIC from $JAIL_IP_POOL to any -> $IP_PUBLIC

## Red de Bitcoin puerto de reenvío
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 del cortafuegos es también un tema separado, por lo que no profundizaré en la configuración de la política BLOCK ALL y las configuraciones de listas blancas, se puede hacer leyendo la documentación oficial o cualquiera de la gran cantidad de artículos disponibles en Google.

Bueno, tenemos cbsd instalado, es hora de crear nuestro primer caballo de trabajo: el demonio de Bitcoin en una celda.

cbsd jconstruct-tui

¿Bitcoin en una jaula?

Aquí vemos el diálogo de creación de una celda. ¡Después de haber configurado todos los valores, creamos!

Al crear la primera celda, se debe elegir qué usar como base para las celdas. Elijo la distribución del repositorio de FreeBSD con el comando repo. Esta elección se hace solo al crear la primera celda de una versión específica (se pueden alojar celdas de cualquier versión que sea más nueva que la del host).

Una vez que todo está instalado, ¡iniciamos la celda!

# cbsd jstart bitcoind

Pero necesitamos instalar software en la celda.

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

y ya dentro de la celda instalamos el 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

Bitcoin en la celda está presente, pero necesitamos anonimato, porque queremos conectarnos a algunas celdas a través de la red TOR. Y en general, planeamos ejecutar la mayoría de las celdas con software sospechoso solo a través de un proxy. Gracias a pf se puede desactivar NAT para un cierto rango de direcciones IP en la red local y permitir NAT solo para nuestro nodo TOR. Así, incluso si un malware penetra en la celda, es probable que no logre comunicarse con el mundo exterior, y si lo hace, no revelará la IP de nuestro servidor. Por eso creamos otra celda para 'redirigir' servicios como 'servicio .onion' y como proxy para salir a Internet.

# 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

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

SOCKSPort 192.168.0.2:9050

¿Qué más nos falta para la felicidad completa? Sí, necesitamos un servicio para nuestra web, tal vez más de uno. Iniciaremos nginx, que actuará como reverse-proxy y se encargará de renovar los certificados de Let's Encrypt.

# cbsd jsconstruct-tui

# cbsd jstart nginx-rev

# jexec nginx-rev

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

Y aquí hemos colocado 150 MB de dependencias en la celda. Y el host sigue limpio.

Volveremos a la configuración de nginx más tarde, necesitamos levantar otras dos celdas para nuestra pasarela de pagos en nodejs y rust, y una aplicación web, que por alguna razón está en apache y php, y además para esta última necesitamos una base de datos 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

... y otros 380 MB de paquetes aislados

Luego descargamos nuestra aplicación con git y la iniciamos.

# cbsd jsconstruct-tui

# cbsd jstart webapp

# jexec webapp

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

450 MB de paquetes. en la celda.

Aquí damos acceso al desarrollador por SSH directamente a la celda, ellos mismos harán todo:

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

Port 2267 — cambiamos el puerto SSH de la celda a cualquier número aleatorio

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

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

Bueno, el servicio está en marcha, solo falta agregar una regla en pf firewall

Veamos cuáles son nuestras IP en las celdas y cómo se ve nuestra 'red local'

# jls

   JID  Dirección IP      Nombre de Host                      Ruta
     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 agregaremos 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

y ya que estamos aquí, también agregaremos una regla para el 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

Ahora un poco sobre bitcoin

Lo que tenemos es una aplicación web que es accesible desde afuera, y se comunica localmente con nuestra pasarela de pagos. Ahora necesitamos preparar el entorno de trabajo para interactuar con la red de bitcoin: un nodo bitcoind esto es solo un demonio que mantiene una copia local de la blockchain actual. Este demonio tiene RPC y funcionalidad de billetera, pero para el desarrollo de aplicaciones hay «envoltorios» más convenientes. Para comenzar, decidimos instalar electrum — es una billetera CLI. Esta billetera la utilizaremos como «almacenamiento en frío» para nuestros bitcoins, que en general son aquellos bitcoins que se necesitan guardar «fuera» del sistema accesible para los usuarios y, en general, lejos de todos. También tiene una GUI, por lo que planeamos usar la misma billetera en
nuestros portátiles. Por ahora, utilizaremos electrum con servidores públicos, y más tarde levantaremos ElectrumX, para no depender de nadie.

# cbsd jsconstruct-tui

# cbsd jstart electrum

# jexec electrum

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

otros 700 MB de software tenemos en la celda

electrum:/@[8:53] # adduser

Nombre de usuario: wallet
Nombre completo: 
Uid (Dejar vacío para predeterminado): 
Grupo de inicio [wallet]: 
El grupo de inicio es wallet. ¿Invitar a wallet a otros grupos? []: 
Clase de inicio [default]: 
Shell (sh csh tcsh nologin) [sh]: tcsh
Directorio home [\/home\/wallet]: 
Permisos del directorio home (Dejar vacío para predeterminado): 
¿Usar autenticación basada en contraseña? [yes]: no
¿Bloquear la cuenta después de la creación? [no]: 
Nombre de usuario   : wallet
Contraseña   : 
Nombre completo  : 
Uid        : 1001
Clase      : 
Grupos     : wallet 
Home       : \/home\/wallet
Modo de home  : 
Shell      : \/bin\/tcsh
Bloqueado     : no
OK? (yes\/no): yes
adduser: INFO: Añadido correctamente (wallet) a la base de datos de usuarios.
¿Añadir otro usuario? (yes\/no): no
¡Adiós!
electrum:/@[8:53] # su wallet

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

wallet@electrum:/ % electrum-3.6 create

{
    "msg": "Guarde su semilla en un lugar seguro; si la pierde, no podrá restaurar su billetera.",
    "path": "\/usr\/home\/wallet\/.electrum\/wallets\/default_wallet",
    "seed": "celoso cerdo material cinta joven puñetazo visual vale cactus pájaro aleatorio"
}

Ahora hemos creado una billetera.

wallet@electrum:/ % electrum-3.6 listaddresses

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

wallet@electrum:/ % electrum-3.6 help

Para nuestro on-chain billetera solo podrá conectarse un círculo limitado de personas. Para no abrir el acceso desde fuera en esta celda, las conexiones por SSH se realizarán a través de TOR (una versión descentralizada de VPN). Activamos en la celda SSH, pero no tocamos nuestro pf.conf en el host.

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

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

Ahora desconectaremos la celda con la billetera del acceso a Internet. Le asignaremos una dirección IP de otro espacio de subred que no esté NATeado. Primero cambiaremos /etc/pf.conf en el host

# ee /etc/pf.conf

JAIL_IP_POOL="192.168.0.0\/24" cambiaremos a JAIL_IP_POOL="192.168.0.0\/25", de esta manera, todas las direcciones 192.168.0.126-255 no tendrán acceso directo a Internet. Una especie de red de 'air-gap' por software. Y la regla NAT permanece igual.

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

Reiniciamos las reglas

# pfctl -f /etc/pf.conf

Ahora nos ocuparemos de nuestra celda

# cbsd jconfig jname=electrum

¿Bitcoin en una jaula?

¿Bitcoin en una jaula?

jset mode=quiet jname=electrum ip4_addr="192.168.0.200"
Eliminar IP antigua: /sbin/ifconfig em0 inet 192.168.0.6 -alias
Configurar nueva IP: /sbin/ifconfig em0 inet 192.168.0.200 alias
ip4_addr: 192.168.0.200

Hmm, pero ahora también dejará de funcionar el sistema. Sin embargo, podemos indicar un proxy del sistema. Pero hay un pero, en TOR este es un proxy SOCKS5, y para mayor comodidad, también necesitarí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

Bien, ahora tenemos dos servidores proxy en nuestro sistema, y ambos funcionan a través de TOR: socks5://192.168.0.2:9050 y http://192.168.0.6:8123

Ahora podemos configurar 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

Ahora el shell funcionará a través del proxy. Si queremos instalar paquetes, vale la pena añadir en /usr/local/etc/pkg.conf desde la raíz de la celda

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

Y ahora ha llegado el momento de añadir el servicio oculto de TOR como 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 para conectarnos. Vamos a verificar desde la máquina local. Pero primero tenemos que añadir nuestra clave SSH:

wallet@electrum:/ % mkdir ~/ .ssh

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

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

Y desde la máquina cliente con 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

Conectándose (Para que esto funcione, se necesita un demonio local de TOR, que escucha en el 9050)

user@local ~$ ssh remotebtc

La autenticidad del host 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion (no hay hostip para el comando proxy)' no puede ser establecida.
La huella digital de la clave ECDSA es SHA256:iW8FKjhVF4yyOZB1z4sBkzyvCM+evQ9cCL/EuWm0Du4.
¿Está seguro de que quiere continuar conectándose (sí/no/[huella digital])? sí
Advertencia: Se agregó permanentemente 'mdjus4gmduhofwcso57b3zl3ufoitguh2knitjco5cmgrokpreuxumad.onion' (ECDSA) a la lista de hosts conocidos.
FreeBSD 12.1-RELEASE-p1 GENERIC 
Para ahorrar espacio en disco en su directorio personal, comprima los archivos que rara vez usa con "gzip filename".
        -- Dru 
wallet@electrum:~ % logout

¡Éxito!

Para trabajar con pagos instantáneos y micropagos, también necesitamos un nodo Lightning Network, de hecho, esta será nuestra herramienta principal para trabajar con bitcoin. A *c-lightning, que vamos a utilizar como demonio, tiene el plugin Sparko, que es una interfaz HTTP (REST) completa y permite trabajar tanto con transacciones off-chain como on-chain. c-lightning para funcionar necesita bitcoind un nodo.

*hay diferentes implementaciones del protocolo Lightning Network en diferentes lenguajes de programación. De las que hemos probado, c-lightning (escrito en C) ha demostrado ser el más estable y eficiente en recursos.

# cbsd jsconstruct-tui

# cbsd jstart cln

# jexec cln

lightning:‍/@[10:23] # adduser

Nombre de usuario: 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

Mientras se compila e instala todo lo necesario, crearemos un 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
# permitir solo c-lightning
rpcallowip=192.168.0.7/32

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

Mi caótico cambio entre celdas no parece tan caótico si señalamos la utilidad tmux, que permite crear múltiples subsesiones de terminal dentro de una misma sesión. Análogo a: screen

¿Bitcoin en una jaula?

Bueno, no queremos exponer la IP real de nuestro nodo y queremos realizar todas las operaciones financieras a través de TOR. Por lo tanto, necesitamos otro .onion.

# jexec tor

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

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

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

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

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

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

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

en5wbkavnytti334jc5uzaudkansypfs6aguv6kech4hbzpcz2ove3yd.onion

ahora crearemos el config 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

# 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=miusuario:miclave

#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
# para el ejemplo anterior, los registros de inicialización (mezclados con los registros de lightningd) deberían imprimir algo como

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 necesitas crear un archivo de configuración para bitcoin-cli, la 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

verificando

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

[
  "test"
]

ejecutamos lightningd

lightning@lightning:~ % lightningd --daemon

El propio lightningd se puede gestionar la utilidad lightning-cli, por ejemplo:

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

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

lightning-cli withdraw bc1jufcxahfrnfhruwjgx3cq2n2ffq3lplhme878pv all enviar a la dirección todo el dinero del monedero (todas las direcciones on-chain)

También hay comandos para operaciones off-chain lightning-cli invoice, lightning-cli listinvoices, lightning-cli pay etc.

Y para comunicarse con la aplicación tenemos una API REST

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

Resumiendo

# jls

   JID  Dirección IP      Nombre de host                      Ruta
     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

¿Bitcoin en una jaula?

Contamos con un conjunto de contenedores, cada uno con su propio nivel de acceso tanto a la red local como al exterior.

# zfs list

NOMBRE                    USADO  DISPONIBLE  REFERIDO  PUNTO DE MONTAJE
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

Como se puede ver, bitcoind ocupa todo el espacio de 190 GB. ¿Y si necesitáramos otra nodo para pruebas? Aquí es donde ZFS entra en juego. Con la ayuda de cbsd jclone old=bitcoind new=bitcoind-clone host_hostname=clonedbtc.space.com Se puede crear un snapshot y vincular una nueva celda a este snapshot. La nueva celda tendrá su propio espacio, pero en el sistema de archivos solo se considerará la diferencia entre el estado actual y el original (ahorrará al menos 190 GB).

Cada celda es su propio conjunto de datos ZFS, y esto es extremadamente conveniente. ZFS también permite hacer otras cosas geniales, como enviar snapshots a través de SSH. No describiremos esto, ya hay suficiente información.

También es importante señalar la necesidad de monitoreo remoto del host, tenemos para estos fines Zabbix.

B — seguridad

En cuanto a la seguridad, partamos de principios clave en el contexto de la infraestructura:

Privacidad — Las herramientas estándar de sistemas similares a UNIX garantizan la ejecución de este principio. Separamos lógicamente el acceso a cada elemento del sistema — la celda. El acceso se realiza mediante la autenticación estándar de usuarios con claves personales. Toda la comunicación entre y hasta las celdas finales se produce de forma cifrada. Gracias al cifrado de los discos, no tenemos que preocuparnos por la seguridad de los datos durante el reemplazo del disco o la migración a otro servidor. El único acceso crítico es el acceso al sistema host, ya que dicho acceso generalmente proporciona acceso a los datos dentro de los contenedores.

Integridad — La ejecución de este principio se realiza en varios niveles diferentes. Primero, es importante señalar que en el caso del hardware del servidor, la memoria ECC y ZFS ya "de fábrica" se encargan de la integridad de los datos a nivel de bits. Los snapshots instantáneos permiten hacer copias de seguridad en cualquier momento en caliente. Herramientas convenientes de exportación-importación de celdas hacen que la replicación de celdas sea sencilla.

Disponibilidad — Esto es opcional. Depende de tu nivel de notoriedad y de la existencia de detractores. En nuestro ejemplo, aseguramos la disponibilidad de la billetera exclusivamente desde la red TOR. Si es necesario, se puede bloquear todo en el firewall y permitir el acceso al servidor exclusivamente a través de túneles (TOR o VPN, eso es otro tema). De esta manera, el servidor estará aislado del mundo exterior tanto como sea posible, y solo nosotros podremos influir en su disponibilidad.

Imposibilidad de renuncia — Y esto depende de la explotación futura y del cumplimiento de las políticas correctas de derechos de usuario, acceso, etc. Pero con el enfoque correcto, todas las acciones de los usuarios son auditadas, y gracias a soluciones criptográficas es posible identificar de manera inequívoca quién y cuándo realizó determinadas acciones.

Por supuesto, la configuración descrita no es un ejemplo absoluto de cómo debe ser siempre; es más bien uno de los ejemplos de cómo puede ser, manteniendo unas capacidades de escalabilidad y personalización muy elásticas.

¿Y qué hay de la virtualización completa?

Sobre la virtualización completa con cbsd se puede leer aquí. Solo añadiré que para trabajar bhyve es necesario habilitar ciertos parámetros del núcleo.

# cat /etc/rc.conf

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

# cat /boot/loader.conf

...
vmm_load="YES"
...

Así que si de repente hay necesidad de usar Docker, ¡levantamos algún Debian y adelante!

¿Bitcoin en una jaula?

Eso es todo

Probablemente eso es todo lo que quería compartir. Si te gustó el artículo, puedes enviarme bitcoins — bc1qu7lhf45xw83ddll5mnzte6ahju8ktkeu6qhttc. Si quieres probar las celdas en acción y tienes un poco de bitcoins, puedes visitar mi pet-project.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster