Résolu le 27-08-24 identification unique d'un PC

Postez ici vos scripts Bash, Python, etc.
Répondre
Avatar du membre
tioker
modérateur
Messages : 976
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

identification unique d'un PC

Message par tioker »

Bonjour,

Dans le cadre d'un projet de sécurité écrit en python, je dois identifier de manière unique chaque PC.
Je connais les méthodes par l'adresse mac des PC et le n° de série du processeur.
Je ne veux pas utiliser l'identifiant de disque car il peut changer dans le temps.

Pour l'adresse mac pas de soucis. La commande

Code : Tout sélectionner

cat /sys/class/net/$(ip route show default | awk '/default/ {print $5}')/address
fournit l'adresse mac de la carte réseau ... active. Et donc, si on change de réseau (de filaire à wifi ou l'inverse) on est marron. Ah oui, je ne veux mettre le nom de la carte réseau en dur (faut que mon programme soit portable).

Pour le n° de série c'est mieux. la commande

Code : Tout sélectionner

dmidecode | grep -w UUID | sed "s/^.UUID\: //g
fournit le n° de série unique ... sauf qu'il faut avoir des droits d'administrateur, et je ne veux pas élever cette commande aux compte non privilégiés comme on le fait de cette manière

Code : Tout sélectionner

sudo chmod +s /usr/sbin/dmidecode
Donc je me dis que je vais revenir à l'adresse mac et je vais prendre non pas l'interface active mais la première opérationnelle de la liste par la commande

Code : Tout sélectionner

ip address | awk '/link\/ether/ {print $2}' >> tmp.log && head -n 1 tmp.log && rm tmp.log
Mais suis-je sûr de ne pas prendre la lien LOOPBACK ? À priori non puisque j'ai mis "link/ether" mais......

À vos plus belles plumes !

PS: chez moi un ip address

Code : Tout sélectionner

ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: eno1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether c8:5a:cf:a6:26:22 brd ff:ff:ff:ff:ff:ff
    altname enp2s0
3: wlo1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 14:13:33:82:81:9d brd ff:ff:ff:ff:ff:ff
    altname wlp3s0
    inet 192.168.1.80/24 brd 192.168.1.255 scope global dynamic noprefixroute wlo1
       valid_lft 43041sec preferred_lft 43041sec
    inet6 2a01:e0a:13a:8aa0:ca22:1b0a:77cd:7739/64 scope global temporary dynamic 
       valid_lft 86230sec preferred_lft 85181sec
    inet6 2a01:e0a:13a:8aa0:9347:4291:d27f:838a/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 86230sec preferred_lft 86230sec
    inet6 fe80::e198:3a53:4ed:5b54/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
Distrib : Linux Mint 22 Desktop : X-Cinnamon
Kernel : 6.8.0-39-generic CPU : AMD Ryzen 5 5600H with Radeon Graphics RAM : 14Gi
CG : NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q] (rev a1)
Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series / Radeon Vega Mobile Series] (rev c6)

Avatar du membre
cyrille
Administrateur du site
Messages : 12995
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: identification unique d'un PC

Message par cyrille »

Bonjour Tioker

Désolé très en vitesse ;)

1/ Pourquoi ne pas lancer le script python en root, cela éviterait de modifier les droits de dmidecode

2/ Mais perso j'utiliserais les fonctions de python pour définir l'adresse mac, notamment le module

Code : Tout sélectionner

apt show  python3-getmac
Package: python3-getmac
Version: 0.9.5-1
Priority: optional
.....
Description: Get MAC addresses of remote hosts and local interfaces in Python
 This pure-Python package retrieves the MAC address of network interfaces and
 hosts on the local network. It supports various platforms, providing a
 consistent interface to fetch MAC addresses by interface name, IPv4/IPv6
 address, or hostname. The primary function is `get_mac_address()`.
 .
 Features:
  - Platform-independent and pure-Python implementation.
  - Fetch MAC addresses of system network interfaces.
  - Retrieve MAC addresses of remote hosts on the local network.
 .
 Usage examples include fetching MAC addresses for different interfaces,
 IP addresses, and hostnames. The package also includes a command-line tool
 for quick usage.

Code : Tout sélectionner

python3 -m getmac -i 'enp0s31f6'
e4:b9:7a:55:f5:f2
ou en script

Code : Tout sélectionner

$ python3
Python 3.12.5 (main, Aug  7 2024, 13:49:14) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import getmac
>>> print(get
getattr(  getmac    
>>> print(getmac.get_mac_address(interface="enp0s31f6"))
e4:b9:7a:55:f5:f2
bien sûr faudra alors précéder le get_mac_address d'un scan préalables pour trouver l'dentifiant de la carte ( cf pe https://stackoverflow.com/questions/570 ... ith-python )

Désolé comme j'ai dit très en vitesse. J'aurais plus de temps demain ;)

Aussi le module uuid de python à explorer https://www.geeksforgeeks.org/extractin ... ng-python/


++
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12995
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: identification unique d'un PC

Message par cyrille »

J'y pense, faudra penser à gérer le cas ou il y a plusieurs interface ethernet (plusieurs cartes réseau). J'ai un serveur DELL avec 4 interfaces eth, voir laquelle tu prends ;)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
tioker
modérateur
Messages : 976
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

Re: identification unique d'un PC

Message par tioker »

cyrille a écrit :
sam. 10 août 2024 08:10
J'y pense, faudra penser à gérer le cas ou il y a plusieurs interface ethernet (plusieurs cartes réseau). J'ai un serveur DELL avec 4 interfaces eth, voir laquelle tu prends ;)
Oui, j'avais bien vu qu'il peut y avoir plusieurs interfaces (1) mais je ne veux pas le nommer dans mon script/programme car il a vocation à tourner sur plusieurs machines. Je préfère utiliser la première interface trouvée... même si elle n'est pas active.

Pour la fonction getMac j'ai trouvé aussi.

Donc ma question est bien la suivante: ma méthode de sélection par "link/ether" est-elle fiable pour trouver une interface qui possède une adresse mac ? Je pense que OUI car l'interface Loopback est une interface logique et non physique mais je veux être sûr. Pour information, ma dernière méthode fonctionne sur Mint et PiOS.

(1)un raspberry en possède bien deux .. ;)
Distrib : Linux Mint 22 Desktop : X-Cinnamon
Kernel : 6.8.0-39-generic CPU : AMD Ryzen 5 5600H with Radeon Graphics RAM : 14Gi
CG : NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q] (rev a1)
Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series / Radeon Vega Mobile Series] (rev c6)

Avatar du membre
tioker
modérateur
Messages : 976
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

Re: identification unique d'un PC

Message par tioker »

Bonjour,
Je pense avoir trouvé une solution.
Soient les modules python socket (standard) et getmac (à installer).
Avec socket on récupère les interfaces réseau avec leur ordre.
Avec getmac on récupère les adresses mac.
On boucle et on sort à la première adresse différente de 00 (dans l'exemple je ne sors pas pour montrer toute la boucle).
Programme (en mode terminal avec résultats)

Code : Tout sélectionner

import socket, getmac
i=0
s=socket.if_nameindex()
for e in s:
    interf=socket.if_nameindex()[i][1]
    print(getmac.get_mac_address(interface=interf))
    i+=1
00:00:00:00:00:00
c8:5a:cf:a6:26:22
14:13:33:82:81:9d
print(s)
[(1, 'lo'), (2, 'eno1'), (3, 'wlo1')]
Vos avis ?
Distrib : Linux Mint 22 Desktop : X-Cinnamon
Kernel : 6.8.0-39-generic CPU : AMD Ryzen 5 5600H with Radeon Graphics RAM : 14Gi
CG : NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q] (rev a1)
Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series / Radeon Vega Mobile Series] (rev c6)

Avatar du membre
tioker
modérateur
Messages : 976
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

Re: identification unique d'un PC

Message par tioker »

Bonjour,

Je vais m'absenter quelques temps: ainsi je clos de post pour éviter qu'il ne reste ouvert.
Et en fait j'ai arrêté ma solution:
crypter une phrase (attention, une phrase, pas un fichier) à l'aide de l'adresse mac du premier interface réseau physique trouvé sur la machine.
Ça m'évite d'utiliser un compte privilégié (root). Je n'ai plus aucun appel à des commandes de l'OS (genre ls /sys/class/net).

Je testerai sur un $W à mon retour et j'en ferai un .deb sous Github; je vous tiens au courant.

Voilà. À une autre fois...
Distrib : Linux Mint 22 Desktop : X-Cinnamon
Kernel : 6.8.0-39-generic CPU : AMD Ryzen 5 5600H with Radeon Graphics RAM : 14Gi
CG : NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q] (rev a1)
Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series / Radeon Vega Mobile Series] (rev c6)

Avatar du membre
cyrille
Administrateur du site
Messages : 12995
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: identification unique d'un PC

Message par cyrille »

OK je suis intéressé par la procédure ;)
Bon repos / vacances ;)
++
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Répondre