BitCanna: seguridad y gestión de claves Tendermint (TMKMS)
La gestión de las claves privadas de los validadores es sin duda el aspecto más crítico en la validación de las redes basadas en Tendermint. Estas claves son las responsables de firmar y validar cada bloque producido en la red, representando todo el stake delegado en el nodo. Si un atacante fuera capaz de acceder al servidor y robar las claves, podría utilizarlas para atacar la red, el stake y la reputación del validador.
Es necesario contar un sistema adecuado de gestión de claves de Tendermint para reducir los accidentes de doble firma, que conducen al temido slashing y a al fin del validador. Estos incidentes fatales se producen cuando un validador basado en Tendermint firma dos veces un bloque propuesto, lo que la red detecta como un ataque. Esto puede ser causado por la ejecución de dos validadores basados en Tendemint al mismo tiempo con las mismas claves privadas.
Introducción al Sistema de Gestión de Claves Tendermint (TMKMS)
TMKMS es la solución para la gestión de claves de validación en redes basadas en Tendermint. Fue desarrollado inicialmente por el equipo de Cosmos y actualmente es mantenido por Iqlusioninc.
Este sistema de gestión de claves separa el proceso de firma del validador, permitiendo realizar el proceso de firma en diferentes hosts. También proporciona protección contra la doble firma.
TMKMS es compatible con dos backends de firma:
- Soft-sign: la firma de software común con una clave privada simple. Las ventajas entre esto y no usar TMKMS son la protección de doble firma y tener las claves y el validador en servidores separados.
- Módulos de seguridad de hardware (HSM): estos módulos son proporcionados por dispositivos como Ledger Nano S y YubiHSM y firman sin exponer las claves privadas. Estos métodos son más seguros, pero es necesario tener acceso físico al servidor.
En este artículo, explicamos cómo configurar un servicio TMKMS para un validador BitCanna usando soft-sign en un host diferente.
Cómo configurar el TMKMS en los validadores de Bitcanna
Necesitamos dos servidores para configurar TMKMS en un validador basado en Tendermint:
- Servidor TMKMS
- Servidor del validador
El servidor TMKMS debe tener un firewall con todos los puertos cerrados excepto el puerto SSH. La recomendación es utilizar un puerto SSH diferente al puerto 22 por defecto, pero lo utilizaremos como ejemplo.
sudo ufw allow 22 ssh
sudo ufw enable
Lo mejor sería permitir las conexiones SSH tan solo desde las máquinas autorizadas, por lo que el comando se vería así:
sudo ufw allow from <remote host> to any port 22
Una vez configurado esto, procedemos a instalar Cargo y TMKMS:
sudo apt update
sudo apt install build-essential git
curl [https://sh.rustup.rs](https://sh.rustup.rs/) -sSf | sh
# Select the default instalation
git clone [https://github.com/iqlusioninc/tmkms.git](https://github.com/iqlusioninc/tmkms.git) && cd tmkms
En este ejemplo, vamos a configurarlo para utilizar la firma por software (Soft-sign) en un servidor en la nube. Si tenemos un servidor local, la solución más segura es utilizar la firma HSM de Yubikey.
cargo build --release --features=softsign
Una vez hecho esto, tenemos que volver al servidor del validador y comprobar la versión de Tendermint que se está ejecutando. Esto lo hacemos utilizando el siguiente comando:
bcnad tendermint version
Es importante comprobar la versión de Tendermint porque se configurará posteriormente en el servidor TMKMS.
El siguiente paso es permitir el acceso al puerto 26658 del validador solo con la IP del servidor TMKMS:
sudo ufw allow from <ip tmkms> to any port 26658
A continuación, edita la configuración del validador:
nano $HOME/.bcna/config/config.toml
priv_validator_laddr = "tcp://<validator ip>:26658"
Ten en cuenta que debemos colocar la IP del validador en lugar de la IP del TMKMS.
Como alternativa, podemos añadir el NodeID como prefijo:
priv_validator_laddr = "tcp://<nodeid>@<validator ip>:26658"
En el servidor TMKMS, podemos crear nuevas claves o importar claves ya existentes. En este ejemplo, vamos a utilizar las claves existentes de un validador de BitCanna. Gracias a ello, incluimos la seguridad de TMKMS en un validador ya existente.
Tomaremos el archivo de $HOME/.bcna/config/priv_validator_key.json y lo moveremos a la máquina TMKMS.
En el servidor TMKMS, inicia un nuevo servicio:
$HOME/tmkms/target/release/tmkms init $HOME/kms/bcna
Crea las carpetas $HOME/kms/bcna en el servidor TMKMS y copia allí el priv_validator_key.json. A continuación, ejecuta los siguientes comandos:
$HOME/tmkms/target/release/tmkms softsign import $HOME/kms/bcna/priv_validator_key.json $HOME/kms/bcna/secrets/cosmoshub-3-consensus.key
rm $HOME/kms/bcna/priv_validator_key.json
Después, edita el archivo de configuración de TMKMS Toml y coloca el chain-id correcto, la IP del validador y la versión de Tendermint:
nano $HOME/kms/bcna/tmkms.toml
id = "bitcanna-testnet-3"
chain_ids= ["bitcanna-testnet-3"]
chain_id= "bitcanna-testnet-3"
key_format = { type = "bech32", account_key_prefix = "bcnpub", consensus_key_prefix = "bcnvalconspub" }
addr = "tcp://Validator_IP:26658"
protocol_version = "v0.34"
Start the TMKMS service by pointing to the config file we have just edited:
$HOME/tmkms/target/release/tmkms start -c $HOME/kms/bcna/tmkms.toml
Inicia el validador de BitCanna. Si el validador y el proceso TMKMS no devuelven errores, podemos configurar TMKMS como un servicio:
sudo tee <<EOF >/dev/null /etc/systemd/system/tmkmsbcna.service
[Unit]
Description=tmkms bcna service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=10
User=XXXXX
ExecStart=$(echo $HOME)/tmkms/target/release/tmkms start -c $(echo $HOME)/kms/bcna/tmkms.toml
LimitNOFILE=1024
[Install]
WantedBy=multi-user.target
EOF
Activa el servicio:
sudo systemctl enable tmkmsbcna
Inicia el servicio:
sudo systemctl start tmkmsbcna
Comprueba los registros:
journalctl -u tmkmsbcna -f
¡Eso es todo! Gracias por leer este tutorial, esperamos que ayude a mejorar la seguridad general de la red BitCanna y otras cadenas Tendermint. Si tienes alguna pregunta, puedes contactarnos por correo electrónico o en Telegram.