GNU/Linux >> Tutoriels Linux >  >> Linux

Remplacer l'adresse MAC par UUID

Le perl suivant le script utilise soit le Digest::MD5 ou Digest::SHA module pour transformer une adresse MAC en un hachage, en utilisant un sel secret. Voir les pages de manuel des modules pour plus de détails à leur sujet. Il convient de noter que Digest::SHA propose plusieurs autres algorithmes parmi lesquels choisir.

Le code est écrit pour faciliter le choix d'un algorithme de hachage différent - décommentez-en un et commentez les autres pour choisir celui qui vous convient le mieux. BTW, la sortie du _base64 versions des fonctions est un peu plus courte que le _hex fonctions mais ressemblent plus à du bruit de ligne.

J'ai simplifié votre regex fourni (je n'ai pas vu la nécessité d'un regard en arrière). Vous devrez peut-être modifier un peu cela pour travailler avec vos données d'entrée .... vous n'avez fourni aucun échantillon, alors j'ai juste deviné.

#!/usr/bin/perl

# choose one of the following digest modules:
use Digest::MD5 qw(md5_hex md5_base64);
#use Digest::SHA qw(sha256_hex sha256_base64);

use strict;

my $salt='secret salt phrase';

# store seen MAC addresses in a hash so we only have to calculate the digest
# for them once.  This speed optimisation is only useful if the input file
# is large AND any given MAC address may be seen many times.
my %macs=();

while(<>) {
  if (m/clientMac:\s*([A-Z0-9]{12})/i) {
    my $mac = $1;

    if (!defined($macs{$mac})) {
      # choose one of the following digest conversions:

      #my $uuid = sha256_hex($mac . $salt);
      #my $uuid = sha256_base64($mac . $salt);
      my $uuid = md5_hex($mac . $salt);
      #my $uuid = md5_base64($mac . $salt);

      $macs{$mac} = $uuid;
    };

    s/(clientMac:\s*)$mac/$1$macs{$mac}/gio;
  };
  print;
};

Comme demandé dans le commentaire, voici un exemple comment effectuer une telle substitution avec sed . Vous avez utilisé la balise /linux, il devrait donc être sûr d'utiliser GNU sed avec son e drapeau pour le s commande :

sed -E 'h;s/.*clientMac":\s"([A-Z0-9]{12}).*/echo secretKey\1|md5sum/e;T
  G;s/(.*)\s*-\n(.*clientMac":\s")[A-Z0-9]{12}(.*)/\2\1\3/' logfile

Explication :

  • Le h La commande enregistre la ligne dans l'espace de maintien, afin que nous puissions la restaurer après avoir gâché la ligne (- ;
  • s/.*clientMac":\s"([A-Z0-9]{12}).*/echo secretKey\1|md5sum/e correspond à toute la ligne, en mettant le MAC réel dans () à réutiliser dans le remplacement. Le remplacement forme la commande à exécuter :echo ing le MCA avec le "sel" et le canaliser dans md5sum . Le e le drapeau fait sed exécutez ceci dans le shell et remettez le résultat dans le tampon
  • T branches à la fin du script si aucun remplacement n'a été effectué. Il s'agit d'imprimer des lignes sans MAC non modifié. Les lignes suivantes ne sont exécutées que si un remplacement a été effectué
  • G ajoute la ligne d'origine du tampon de maintien, nous avons donc maintenant le md5sum sortie, une nouvelle ligne et la ligne d'origine dans le tampon
  • s/(.*)\s*-\n(.*clientMac":\s")[A-Z0-9]{12}(.*)/\2\1\3/ capture le MD5 dans la première paire de () , la ligne avant le MAC dans le second et le reste de la ligne après le MAC dans le troisième, donc \2\1\3 remplace le MAC par le MD5

Comme approche alternative, j'ai parfois utilisé des numéros de ligne simples comme valeur d'obscurcissement. Cela rend la sortie plus compacte et plus lisible.

Aussi, awk est un bon outil quand on a besoin d'effectuer des opérations "intelligentes" sur un fichier texte, ayant un langage plus lisible que sed . L'opération "intelligente" à effectuer dans ce cas est d'éviter de ré-exécuter l'algorithme d'obscurcissement lorsqu'une même adresse MAC est rencontrée plus d'une fois. Cela peut considérablement accélérer les opérations si vous avez des milliers de lignes faisant référence à un petit nombre d'adresses MAC.

En pratique, considérez le script suivant, qui gère également les multiples adresses MAC possibles apparaissant sur une même ligne, identifiant et remplaçant chaque occurrence, puis imprime une table de mappage à la fin :

awk -v pat='clientMac"\\s*"[[:xdigit:]]{12}' -v table='sort -k 1,1n | column -t' -- '
$0 ~ pat {
    for (i=1; i <= NF; i++)
        if (match($i, pat)) {
            if (!($i in cache))
                cache[$i]=NR "." i
            $i = "MAC:" cache[$i]
        }
}
1
END {
    print "---Table: "FILENAME"\nnum MAC" | table
    for (mac in cache)
        print cache[mac], mac | table
}
' file.log

Le tableau à la fin peut être facilement séparé de la sortie principale par une étape d'édition supplémentaire, ou en faisant simplement la chaîne de commande dans le -v table= l'argument redirige sa sortie vers un fichier, comme dans -v table='sort -k 1,1n | column -t > table' . Il peut également être supprimé complètement en supprimant simplement l'intégralité du END{ … } bloquer.

En variante, utiliser un vrai moteur de chiffrement pour calculer les valeurs d'obfuscation et donc sans table de mapping à la fin :

awk -v pat='clientMac"\\s*"[[:xdigit:]]{12}' -v crypter='openssl enc -aes-256-cbc -a -pass file:mypassfile' -- '
$0 ~ pat {
    for (i=1; i <= NF; i++)
        if (match($i, pat)) {
            addr = cache[$i]
            if (addr == "") {
                "echo '\''" $i "'\'' | " crypter | getline addr
                cache[$i] = addr
            }
            $i = "MAC:" addr
        }
}
1
' file.log

Ici, j'ai utilisé openssl comme moteur de chiffrement en sélectionnant son aes-256-cbc cipher (avec également une sortie encodée en base64 afin d'être compatible avec le texte), et en lui faisant lire le secret de chiffrement à partir d'un fichier nommé mypassfile .

Chaînes chiffrées avec un chiffrement symétrique (comme aes-256-cbc ) peut être déchiffré en connaissant le secret utilisé (le contenu de mypassfile , que vous souhaitez garder pour vous), elles peuvent donc être inversées. Aussi, depuis openssl utilise un sel aléatoire par défaut, chaque exécution produit des valeurs différentes pour la même entrée. Ne pas utiliser de sel (option -nosalt ) ferait openssl produirait la même valeur à chaque exécution, donc moins sécurisé, mais produirait en revanche des textes plus courts tout en étant cryptés.

Le même awk le script fonctionnerait pour d'autres commandes externes au lieu de openssl en remplaçant simplement la commande dans le -v crypter= argument de awk , tant que la commande externe que vous choisissez peut accepter l'entrée de stdin et imprimer la sortie sur stdout.

Les chaînes hachées avec des algorithmes comme MD5 ou SHA sont à sens unique (c'est-à-dire qu'elles ne peuvent pas être inversées) et produisent toujours la même valeur pour la même entrée, donc vous voudriez les "saler" pour que les valeurs calculées produit en sortie ne peut pas simplement être recherché sur toutes les adresses MAC possibles. Vous pouvez ajouter un "sel" aléatoire comme dans le script légèrement modifié suivant :

awk -v pat='clientMac"\\s*"[[:xdigit:]]{12}' -v crypter='sha256sum' -- '
$0 ~ pat {
    for (i=1; i <= NF; i++)
        if (match($i, pat)) {
            addr = cache[$i]
            if (addr == "") {
                "(dd if=/dev/random bs=16 count=1 2>/dev/null; echo '\''" $i "'\'') | " crypter | getline addr
                cache[$i] = addr
            }
            $i = "MAC:" addr
        }
}
1
' file.log

Ce dernier script utilise une valeur (pseudo-)aléatoire de 16 octets de long comme "sel", produisant ainsi une valeur de hachage différente à chaque exécution sur les mêmes données.


Linux
  1. Comment remplacer sed comme texte par python?

  2. Comment remplacer un fichier en jar par une ligne de commande sous Linux ?

  3. Imprimer l'adresse mac dans le fichier

  4. Remplacez chaque caractère d'espace blanc à la fin de chaque ligne par '_'

  5. comment générer une adresse MAC aléatoire à partir de la ligne de commande Linux

Remplacer du par de la poussière sous Linux

Commande IP Linux avec exemples d'utilisation

Comment remplacer Docker par Podman sur un Mac, revisité

Comment remplacer Docker par Podman sur un Mac

Comment changer l'adresse MAC du réseau sous Linux

Comment changer l'adresse MAC sous Linux