Como instalar un servidor ssh (dropbear) en android

Tengo dos tablets (de BQ) con android, una con Ice cream sandwich (4.0) y otra Jelly Bean (4.1) que ya no uso, una por obsoleta y otra por no funcionar el touch de la pantalla, a si que he decidido reconvertirlas en simples maquinas con linux para poder aprovecharlas en otras cosas. Lo primero que necesitaba era poder acceder a la terminal desde ssh para poder trabajar con comodidad.

Para instalar ssh y utilizar la terminal no es estrictamente necesario tener root, ademas, hay apps que te crean un servidor ssh sin tanto lío, pero a mí me gusta hacer las cosas de la manera difícil.

Siguiendo los pasos que indica un articulo en megaleecher, voy a contaros lo que he tenido que hacer yo, porque me han surgido un par de problemas

1. Instalar un gestor de paquetes.

Lo primero que vamos a hacer es instalar opkg. Ya había utilizado este gestor de paquetes con open-wrt antes, pero no se me había ocurrido que podía haber un repo para android. Las instrucciones para instalar dicho gestor están aquí.

  • Asegúrate de que tienes busybox en el dispositivo, si no descargatelo(¿no sabes cual descargar? en la terminal de tu dispositivo ejecuta cat /proc/cpuinfo y fíjate en la linea “Processor”, debe poner algo como ARMv7 [descarga busybox-armv71] o ARMv5 [descarga busybox-armv51]…)
  • Obtener acceso a la terminal del dispositivo android. Puedes instalarte un emulador en el dispositivo, o con la shell de adb a través del cable usb. Yo lo haré con adb
  • Descargar opkg.tar.gz al dispositivo, en mi caso primero lo descargo al ordenador
  • Mover opkg.tar.gz a /data/local/ (necesitamos root para esto)
    adb push opkg.tar.gz /data/local/

    Si lo estás haciendo desde el emulador de terminal en android, tendrás que copiarlo desde descargas

    cp /sdcard/Downloads/opkg.tar.gz /data/local/

    Tendrás que averiguar exactamente la ruta donde lo has descargado.

  • Descomprimir opkg.tar.gz (ejecuta el comando en el dispositivo)
    cd /data/local/
     tar zxvf opkg.tar.gz

    Y si no te funciona prueba con

    busybox tar zxvf opkg.tar.gz

    Y si eso tampoco te funciona, y te has descargado antes busybox

     /sdcard/Downloads/busbybox-armv71 tar zxvf opkg.tar.gz
  • Ahora vamos a añadir las rutas de donde se van a instalar los paquetes que bajemos por opkg al PATH. Ejecutamos:
    export PATH=$PATH:/data/local/bin
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/lib
    

    Estos cambios son temporales, a si que para que se hagan permanentes habría que añadirlos al .profile de nuestro usuario root. Pero lo mas probable es que no puedas escribir en el home de root, porque es parte del initramfs y modificar eso requiere recompilar parte del firmware. Mas adelante os explico como lo he solucionado

  • Ahora ya deberíamos poder ejecutar opkg
    opkg update # actualiza la información del repo
    opkg install opkg # se instala a sí mismo xD
    opkg list # para ver los paquetes disponibles, no son muchos pero hay alguno muy útil.
    

    Si al ejecutar opkg te da algún error de librerías, prueba a ir al directorio /data/local/lib/ y hacer un par de symlinks a las librerías que le faltan

    cd /data/local/lib
    ln -s libcurl.so.5.2.0 libcurl.so.5
    ln -s libopkg.so.1.0.0 libopkg.so.1
    

    No se por que, ayer lo hice en una tablet, y hoy en otra, en la primera tuve que hacer los symlinks, en la segunda no ¬¬

2. Instalar el servidor de ssh

Solo hay que ejecutar el siguiente comando, no debería haber ningún problema

opkg install dropbear openssh

3. Generar el par de claves publico-privado

El servidor dropbear que está empaquetado para android no permite ningún tipo de autenticación mas que a través de clave publica-privada, a si que nos tendremos que crear un par de claves, si no los tenemos ya. En linux y en mac podéis ejecuta:

ssh-keygen -b 4096

Nos pedirá donde guardar el archivo, podemos dejarlo en blanco si estamos seguros de que no tenemos ninguna otra clave, ya que de lo contrario sobrescribirá la que tengamos en ~/.ssh/id_rsa y ~/.ssh/id_rsa.pub.

Después nos pedirá una “passphrase”, algo así como una contraseña para usar el certificado. Este si hay que dejarlo en blanco si o sí, a menos que sepáis lo que hacéis.

Si no queréis usar el comando anterior, o estáis haciendo esto con un windows, en el articulo original (en inglés) explican como hacerlo con PuTTy de manera gráfica.

4. Configurar el servidor ssh

Para la configuración del servidor, yo me he fijado en la documentación oficial, mas que en el articulo que menciono al principio, porque, a parte de que se ve mejor todo lo que hace, da un par de pistas para posibles fallos que puede dar a la hora de intentar acceder después de haberlo configurado correctamente.

Ahora se trata de recrear el directorio home del usuario root (el único que puede acceder a través de ssh). Como hemos dicho antes, no podemos escribir en /root por que es parte del initramfs, a si que quien hizo el dropbear, o el paquete, tuvo en cuenta esto y a efectos del servidor ssh, el home de root es /data/root, a si que nos toca ejecutar:

busybox mkdir /data/root # ojo! que puede que el directorio ya lo haya creado opkg al instalar dropbear, o lo tuvieramos de antes.
busybox mkdir /data/root/.ssh
busybox chmod 700 /data/root
busybox chmod 700 /data/root/.ssh

Ahora hay que copiar la clave PÚBLICA que hemos generado antes, (el archivo “.pub”, por lo general id_rsa.pub). Lo mejor, para evitar errores con el copy&paste, en vez de eso, copiaros el archivo .pub creado antes al dispositivo (mediante adb push, a través del correo o como os de en gana…). Yo me lo he copiado con adb push a /sdcard/Downloads. Al final lo importante es tener la clave pública en el directorio .ssh creado antes, con el nombre “authorized_keys” y los permisos 0600 (solo lectura/escritura para root)

busybox cp /sdcard/Download/id_rsa.pub /data/root/.ssh/authorized_keys
busybox chmod 0600 /data/root/.ssh/authorized_keys

5. ¡A correr!

Ahora ya podemos ejecutar el servidor ssh e iniciar sesión en nuestro dispositivo de manera remota.

/data/local/bin/dropbear # o simplemente "dropbear" si tenemos bien el path,

Automáticamente se va al fondo, y no dice nada, a si que para saber si está corriendo podemos ejecutar un “ps” y buscar “dropbear”
Ahora podemos conectarnos desde otra maquina:

ssh root@192.168.1.123

Si cuando generaste la clave ssh le pusiste otro nombre y no es “id_rsa”, ahora debes especificarlo para iniciar sesión, como?

# pasamos la ruta del archivo que NO tiene el .pub al final
ssh root@192.168.1.123 -i ~/.ssh/mi_clave_privad

Para conocer la IP de nuestro dispositivo, lo podemos ver en ajustes -> wifi, o con un comando:

busybox ifconfig -a 

6. Problemas

  • Si cuando intentas conectarte cono ssh te devuelve
    Permission denied (publickey)

    Lo primero que debes hacer es revisar toda la configuración, muy importante los permisos, que ssh es muy quisquilloso con eso. Si sigues sin poder conectarte, prueba a ejecutar ssh con el argumento “-v” para que te de mas información. Con dropbear podemos hacer lo mismo, al ejecutarlo, podemos poner “-F” para que no se vaya al fondo y muestre por pantalla el log. Investiga los errores que veas… Si se te queda corto, además del -F puedes ponerl -v y entonces, prepárate para ver un montón de mensajes de log de bajo nivel.

  • Sin activar las opciones de depuración del cliente y el servidor ssh, a mi me daba el error anterior, pero la causa era otra. Asegúrate antes de que tienes un archivo /system/xbin/ash, si no lo tienes, crea un symlink a tu shell. En mi caso es un port de mksh.
    # asegurate de que puedes escribir en /system, si el comando falla, investiga cual debe ser en tu caso.
    mount -o rw,remount /system 
    echo $SHELL # nos dirá la ruta de nuestra shell
    ln -s /system/xbin/mksh /system/xbin/ash
    
  • Cuando cierres la terminal en la que estés tendrás que volver a establecer, el path, no es estrictamente necesario, pero te será cómodo si sigues trabajando con la consola, para ello, hay que buscar un archivo que todas las shell ejecutan al iniciarse. Como no podemos escribir en el home de root, vamos a buscar en /etc un archivo, profile, bashrc o en mi caso, mkrc. Dependiendo de la shell se llamará de una manera u otra, a si que eso te toca investigarlo. Una vez encontrado será tan sencillo como añadir estas líneas al archivo.
    export PATH=$PATH:/data/local/bin
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/local/lib
    

    Así podrás ejecutar opkg después sin ningún problema.

7. Hacer que el servidor ssh arranque automáticamente

Próximamente… 😀 ojo! no lo pongais en el bashrc, profile o mksh porque se va a ejecutar siempre que harbáis una terminal, y no es plan.