
¿Es posible generar una identificación única que no cambie con el tiempo a menos que haya cambios de hardware? El hardware debe generarse con programa ac.
Eso también sería fantástico si fuera resistente a la suplantación de identidad, como la suplantación de direcciones MAC o números de serie del disco duro. Pero ese no es un requisito absoluto.
Necesito dicha identificación para recopilar datos de software para estadísticas de muchas computadoras diferentes.
Ya he leído muchas publicaciones similares, como esta: generar una ID única de máquina consistente; pero no se adaptan a mis necesidades.
Necesito que este programa se ejecute como usuario normal, por lo que no puedo usar comandos como "dmidecode" y demás. Incluso si no tengo otra solución que usar direcciones MAC, no quiero que el UUID cambie si el usuario cambia de Wifi a Ethernet, por lo que simplemente tomar la primera dirección mac puede ser problemático. Además de eso, el UUID debe permanecer idéntico incluso si instalan VMware o VPN. Entonces, tomar todas las direcciones mac no es una opción porque esas herramientas anteriores generan más interfaces de red y, por lo tanto, más direcciones mac, cambiando así el UUID.
También quiero que funcione en una máquina virtual, el uuid invitado generado debe ser diferente al del host.
Ni siquiera sé si existe tal solución para este problema. Pero lo que pensé sería tomar solo las direcciones mac de todas las interfaces de hardware físicas existentes leyendo en sys/class/net/*/addresses. Luego agregue todas las direcciones mac y haga un hash con sha1 para generar el UUID. Pero, ¿cómo puedo filtrar los repertorios para seleccionar solo intercambiando uno? ¿Y puedo estar seguro de que su orden no se intercambiará, cambiando así la cadena adjunta y, por tanto, el UUID?
De lo contrario, ¿puedo recuperar el número de serie del disco duro sin privilegios de root ni herramientas de terceros? (Si puedo encontrar la fuente del software de terceros, está bien)
Cualquier otra solución también sería bienvenida.
PD: Tiene que ser compatible con cualquier versión de Linux con kernel 2.6 o superior.
Respuesta1
Respuesta corta
De todas mis investigaciones e intentos, diría que no es posible crear un programa que genere una identificación única respetando las siguientes restricciones.
- La identificación debe ser la misma cada vez si se genera en la misma computadora.
- La identificación debe ser diferente si se genera en diferentes computadoras.
- El programa debe ejecutarse como usuario.
- El programa debe ser compatible con cualquier distribución de Linux con una versión de kernel 2.6 o superior.
- El ID puede ser diferente si se modifica la computadora (por ejemplo: reemplazo de hardware)
- El programa no debe depender de herramientas de terceros que deban instalarse en la computadora.
Respuesta larga
Aquí presentaré mi intento con las direcciones mac.
El objetivo aquí era encontrar una manera de recuperar las direcciones de todas las interfaces de red físicas. Como usuario normal, vi que la forma más sencilla de encontrar direcciones Mac sería leer los archivos del sistema en el directorio "/sys". Esos archivos están disponibles desde Linux 2.6, así que es perfecto.
Mi investigación me llevó a esos conjuntos de reglas: https://www.kernel.org/doc/Documentation/sysfs-rules.txt
El uso de la biblioteca udev como se recomienda en esas reglas no es posible porque debe agregarse externamente. Así que me sumergí en la fuente que se puede encontrar aquí:http://cgit.freedesktop.org/systemd/systemd/tree/src/libudev
Lo que aprendí de esto es que para recuperar las direcciones mac debe buscar "sys/subsystem", si está presente, busque un directorio "net" dentro de él y encontrará directorios con cada interfaz de red. Si no hay una carpeta "subsystem", debe buscar en las carpetas "sys/class", "sys/bus" y "sys/block" el directorio "net". De hecho, siempre los encontré en "clase", pero las reglas decían que no se debía esperar.
Arriba dije que en la carpeta "net" encontrarás los directorios de red, eso no es del todo cierto. En Linux 2.6 (usé RHEL 4), son directorios y dentro encontrará, entre otros, el archivo de "dirección" que contiene la dirección mac y un enlace simbólico dirigido a un directorio en "sys/devices". Si está en una versión superior de Linux, será directamente un enlace simbólico a un directorio en "/sys/devices", en el que encontrará el archivo de "dirección". (Probé en RHEL 6, Debian 7, Debian 8, Ubuntu 15 y Ubuntu 15 con el kernel actualizado a Linux 4.3)
Nunca vi el directorio "/sys/subsystem" ni siquiera en la nueva versión de Linux (4.3).
Nuevo diseño de sysfs( >= linux 3): Para distinguir la interfaz física de la virtual, quería mirar la ruta de desarrollo del dispositivo. El enlace simbólico que tengo en "/sys/class/net" apunta a estos directorios:
- "/sys/devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/eth0"
- "/sys/dispositivos/virtual/net/eth1"
El eth1 era una NIC virtual ficticia que creé siguiendo este tema:¿Cómo puedo crear una interfaz Ethernet virtual en una máquina sin un adaptador físico?
Entonces puedes ver que los virtuales están en una carpeta "virtual", así que esa sería la forma de diferenciarlos.
Diseño antiguo de sysfs(Linux 2.6):
La interfaz de red virtual no tiene un enlace simbólico de "dispositivo" en sus directorios.
Encontrará "/sys/class/net/eth0/device -> /sys/devices..." Pero si hubiera un eth1 virtual, no habrá tal enlace simbólico en "/sys/class/net/eth1" .
Considerándolo todo, usando "opendir", "readdir", "access('...',F_OK)", "fopen"... podría recuperar las direcciones mac solo de las interfaces físicas.
Luego simplemente ordénelos, para estar seguro de que vendrán en el mismo orden, luego agregue todos en un búfer y use un SHA1 de openssl, analice un poco para que parezca un UUID y listo.
Pero la cuestión es que no quería confiar en el hecho de que habrá una carpeta "virtual" en cualquier lugar de la ruta devpath a un dispositivo de red. En las reglas, vinculadas anteriormente, nunca se dice que este será siempre el caso. Entonces el problema no se puede responder de esta manera.
Espero que todas mis investigaciones ayuden a alguien.