SSH-Vault: Cifrar y descifrar un fichero usando la clave ssh

Suelo pedir a mis alumnos que generen un par de claves SSH para darles de alta en alguno de los servidores que usamos en la asignatura (añadiendo la parte pública en el fichero de claves autorizadas, authorized_keys). Lo siguiente suele ser crearles una base de datos y un usuario con acceso a la misma. Aquí, el usuario necesita una contraseña. Para pasarles esta contraseña y otros datos privados, solía pedirles a su vez que me enviaran su clave pública GPG. Realmente, este último paso no es necesario… si disponemos ya de una clave pública SSH podemos usarla para cifrar y descifrar ficheros, muy fácilmente. Una de las formas más sencillas es mediante una aplicación de la línea de comandos, ssh-vault.com.

Para cifrar, usaremos el siguiente comando:

echo -n "mensaje a cifrar" | ./ssh-vault -k /ruta/a/clave/publica/id_rsa.pub create vault

Para descifrar, el receptor usará este otro comando:

./ssh-vault -k /ruta/a/tu/fichero/.ssh/id_rsa view vault

También podríamos haber evitado el uso de una aplicación extra, usando los comando ssh-keygen y openssl que seguramente ya tengamos (la «pega» es que un usuario Windows no las tendrá…):

Convertimos la clave pública ssh a formato PEM:

ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8 > id_rsa.pem.pub

A continuación, ciframos el mensaje:

openssl rsautl -encrypt -pubin -inkey id_rsa.pem.pub -ssl -in myMessage.txt -out myEncryptedMessage.txt

El receptor usará también openssl para descifrar:

openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in myEncryptedMessage.txt -out myDecryptedMessage.txt

Fuente, cómo no, un hilo de discusión en SuperUser, una de las webs de la red StackExchange, la misma que alberga a StackOverflow.com

ngrok, o cómo resolver problemas a distancia

Llevaba unos cuantos días intentando resolver un problema de configuración de Apache a otra persona, por email. Me enviaba detalles del problema, pantallazos en algún caso y yo le respondía con posibles soluciones, comandos que debería ejecutar y ficheros de configuración que debería editar. Se trataba de una máquina local, detrás de un NAT. Tras muchas idas y venidas, no conseguíamos resolver y pensando en cómo solucionarlo, me encontré con una herramienta que me ha permitido hacerlo en 2 minutos, ngrok 🙂 Permite exponer puertos tras el NAT de forma muy sencilla, de tal forma que si expone por ejemplo el puerto 22, yo pueda conectarme de forma remota a administrar su máquina. Lógicamente debe haber confianza entre ambas partes, para evitar sustos de seguridad.

Para ello, la persona con el problema de configuración ha tenido que realizar los siguientes pasos:
Instalar openssh (si no lo tiene ya instalado):
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install openssh-server

Poner en marcha openssh:

$ sudo service ssh start

Instalar ngrok (la aplicación que expone puertos tras el NAT)

Tras instalar, debe darse de alta: https://ngrok.com/signup
Una vez realizado ese paso,  ngrok le devolverá el comando a ejecutar para identificarse en ngrok. Algo como:
./ngrok authtoken XXXXXXX

Abrir el puerto 22 (ssh) al exterior: (magia!)

$ ./ngrok tcp 22
(Este comando te dará como resultado una dirección ngrok, que es la que tiene que enviar a la persona que le ayuda. Algo como:  tcp://0.tcp.ngrok.io:13011 )
La persona que le ayuda, en este caso yo 🙂  podrá conectarse así:
$ ssh -l usuario 0.tcp.ngrok.io -p13011

Lógicamente, la persona con el problema antes debe haberle enviado al ayudante un nombre de usuario y contraseña para conectar por ssh.

Una vez conectado, el ayudante puede abrir otras sesiones para tunelizar más puertos. Por ejemplo:

$ ssh -l usuario 0.tcp.ngrok.io -p13011 -L 8080:localhost:80

Ese comando permite tunelizar el puerto 80 de la máquina remota para dejarlo accesible a través del puerto 8080 de la máquina local. Es decir, si el ayudante en su navegador teclea ahora: http://localhost:8080 en realidad se estará conectando a través del túnel ssh al puerto 80 de la máquina remota (tras el NAT). Muy, muy interesante para permitir la administración remota de equipos. Lo dicho, en dos minutos he podido resolver así un problema que se estaba estirando ya unos cuantos días por la incomodidad de analizar el problema vía email…

What’s the default password of root user in mariadb?

If you have just installed mariadb, you should run this command in order to set a password for the root user and secure your installation:

$ sudo mysql_secure_installation

Besides asking you to provide the new root password, this utility will help you to remove anonymous user (created by default, intended for testing), disallow root login remotely (root should only be allowed to connect from ‘localhost’), remove test database and privileges ad reloading the privilege table. All of it just pressing the Enter key a couple of times 🙂 Not bad!

If that process doesn’t work, try this other one:

(using sudo, don’t specify any password)

$ sudo mysql -u root

Create a new database:

CREATE DATABASE yourdb;

Grant privileges to a new user:

GRANT ALL ON yourdb.* TO yournewuser@localhost IDENTIFIED BY 'yourpassword';
FLUSH privileges;

 

How to download snapshots from DigitalOcean into local machines

There isn’t any direct option to download a snapshot from DigitalOcean to your local machine, but there certainly is a workaround:

If your intent is to backup a remote computer’s HDD A via SSH to a single file that’s on your local computer’s HDD, run this from your local computer:

$ ssh user@remote "dd if=/dev/vda1 | gzip -1 -" | dd of=image.gz

Source: https://www.digitalocean.com/community/questions/downloading-snapshots-into-local-machines

You should double check that your disk /dev name is /dev/vda1 (like the one in my example) using the df -h command first.