Del machine-id en relación al clonado de discos

22 de marzo de 2021 • fjbalon

¿Qué es el machine-id? Desde las páginas de man se define como un identificador exclusivo de la máquina. «Este debe considerarse confidencial y no debe exponerse en entornos que no sean de confianza» se encuentra escrito en la documentación, lo que de primeras nos presenta algunos problemas que he desarrollado más adelante.

Lo primero que hay que entender es que éste se genera en el momento de la instalación del sistema operativo sobre el hardware concreto. Cuando, como administradores de sistemas nos dedicamos a clonar discos, es común que éstos mantengan el mismo identificador, generado aleatoriamente durante la instalación del primer elemento de la clonación. Esto puede provocar conflicto a posteriori, por ejemplo, cuando generamos una interfaz de red bridge, que generará la MAC a partir del machine-id, y podría ocasionar conflicto en la red por simultaneidad.

Lo segundo, quizá, es su uso. El uso que da systemd al machine-id parece ambiguo, sirviendo a:

Aunque probablemente tenga más usos obtusos que no serán conocidos hasta estudiar profundamente el código.

El fichero que almacena dicho machine-id es /etc/machine-id. Observará que este valor también se almacena en /var/lib/dbus/machine-id y que existe un enlace simbólico entre los dos. Cualquier cambio en un archivo, se reflejará en el otro.

cat /etc/machine-id
35f7f8a5f915453782892638656ad9fd
cat /var/lib/dbus/machine-id
35f7f8a5f915453782892638656ad9fd
ls -l /var/lib/dbus/machine-id
lrwxrwxrwx 1 root root 15 nov 11  2021 /var/lib/dbus/machine-id -> /etc/machine-id

Como decíamos, el machine-id se genera aleatoriamente en la instalación del sistema utilizando la utilidad systemd-machine-id-setup, que llama a su vez a dbus-uuidgen. Cambiarlo manualmente es muy sencillo y puede hacerse desde cualquiera de las utilidades citadas:

sudo rm /etc/machine-id
sudo systemd-machine-id-setup

sudo rm /etc/machine-id
sudo dbus-uuidgen --ensure=/etc/machine-id

Pero, ¿qué tiene que decir dicho identificador en cuanto a la privacidad? En un esfuerzo por asegurar la privacidad, tener un identificador único e inmutable vinculado directamente al dispositivo no parece un enfoque adecuado.

Recordamos además que el propio manual indica que el contenido es confidencial y no debe ser compartido. Sin embargo, no existe mecanismo ni inconveniente en que cualquier software tenga acceso a estos ficheros, permitiendo leer y almacenar el machine-id para el uso que fuera, sea accidental o malintencionado. Es cierto que también es accesible /sys, que contiene información sobre cada dispositivo conectado al sistema -inclusive las series de dispositivos USB únicas-. Por lo que si se requiere protección de confianza contra aplicaciones locales, se requerirá una solución de espacio aislado. Aun así, mantener o asegurar la no-integridad -de cara a terceros- del identificador parece algo deseable.

De nada sirve que nos indiquen que debe guardarse confidencialmente, cuando los permisos son de lectura para todos:

ls -hal /etc/machine-id
-r--r--r-- 1 root root 33 jul 11 14:28 /etc/machine-id
cat /etc/machine-id
9f00b9e6f49f45299a05a5ff8fd697df

Su exclusión o eliminación en un sistema basado en systemd tampoco parece ser una acción conveniente, pues este identificador se utiliza para identificar máquinas en journalctl, así como para identificar máquinas en comunicaciones D-Bus. ¿Quizá podamos ponerlo a 0? Tampoco, espera una cadena de 32 caracteres.

Sabiendo entonces la facilidad que hay para cambiarlo, ¿por qué no automatizar un cronjob para que se cambie cada cierto tiempo? Por poner un modo paranoico, se podría hacer para que cambie cada minuto:

sudo crontab -e

*/1 * * * * rm /etc/machine-id && dbus-uuidgen --ensure=/etc/machine-id

Dicha automatización presentaría una solución a los problemas de privacidad que surgen de mantener un identificador accesible a todos. Sin embargo, ¿es seguro hacer algo así?. Aparentemente, parece que generar nuevas identificaciones en caliente pueden presentar inconvenientes. Tal y como indica la documentación:

«Si intenta cambiar un id de máquina existente en un sistema en ejecución, es probable que sucedan cosas inconvenientes. No intente cambiar este archivo. Además, no lo haga igual en dos sistemas diferentes; debe ser diferente cada vez que haya dos núcleos diferentes en ejecución.»

dbus-uuidgen

No parece entonces, muy conveniente, automatizar la actualización del machine-id dentro de la misma ejecución temporal: podría causar problemas. Puede generar, por ejemplo, discrepancias en su identificador por parte de los servidores DHCP, que identifican a la máquina a raíz última del machine-id; especialmente en configuraciones de red que utilicen bridges.

Por otro lado, es llamativo saber que Whonix OS no genera un nuevo machine-id tras cada reinicio, sin embargo, mantiene el mismo para todos los usuarios. Algo que sí hace Tails. Quizá, una mejor opción para garantizar de alguna forma la privacidad es la de generar un nuevo identificador en cada inicio, tal y como hace Tails:

sudo crontab -e

@reboot rm /etc/machine-id && dbus-uuidgen --ensure=/etc/machine-id

De tal forma que durante la sesión temporal que dura el uptime el sistema sea identificado de una manera, pero al iniciar de nuevo el sistema sea identificado de otra. Aunque si la privacidad relacionada con el machine-id preocupa, quizá, la mejor forma de solventar el riesgo es utilizar un sistema sin systemd.