MAC 주소를 UUID로 교체

MAC 주소를 UUID로 교체

클라이언트 MAC 주소를 사용하여 클라이언트에 데이터를 제공하기 전에 로그 파일에 나타날 때마다 클라이언트 MAC 주소를 마스킹하는 방법을 찾고 있습니다(GDPR 규칙).

정규식을 사용하여 MAC 문자열을 식별할 수 있지만 MD5가 거의 투명하기 때문에 더 이상 사용되지 않는 것 같기 때문에 이를 마스크하는 가장 좋은 방법이 무엇인지 잘 모르겠습니다!

MAC은 서로 다른 시간에 들어오고 시스템을 통과할 때 지정된 MAC를 추적해야 하기 때문에 항상 동일한 마스크/uuid를 반환하려면 지정된 MAC이 필요합니다.

사용된 정규 표현식은 다음과 같습니다. (?<=clientMac":\s")[A-Z0-9]{12}

이상적으로는 교체를 위해 간단한 것을 사용하고 싶지만 sed이것이 불가능할 수도 있다는 점을 인정합니다.

답변1

의견에서 요청한 대로 다음은 를 사용하여 이러한 교체를 수행하는 방법에 대한 예입니다 sed. /linux 레이블을 사용했으므로 GNU sed및 해당 e플래그를 명령으로 사용하는 s것이 안전합니다 .

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

설명하다:

  • h명령은 해당 라인을 예약된 공간에 저장하므로 라인을 망친 후에 복원할 수 있습니다(-;
  • s/.*clientMac":\s"([A-Z0-9]{12}).*/echo secretKey\1|md5sum/e전체 라인을 일치시켜 실제 MAC를 ()교체에 재사용합니다. 대체는 실행할 명령을 구성합니다. echo"salt"와 함께 MCA를 사용하고 에 파이프합니다 md5sum. 이 e플래그를 사용하면 sed이 명령이 셸에서 실행되고 결과가 다시 버퍼에 저장됩니다.
  • T대체 항목이 없으면 스크립트 끝으로 분기합니다. 수정되지 않은 MAC을 인쇄하는 줄입니다. 다음 줄은 교체할 때만 실행됩니다.
  • G추가는 버퍼의 원래 줄을 유지하므로 이제 md5sum버퍼에 출력, 개행 및 원래 줄이 있습니다.
  • s/(.*)\s*-\n(.*clientMac":\s")[A-Z0-9]{12}(.*)/\2\1\3/첫 번째 쌍의 MD5 (), 두 번째 쌍의 MAC 앞 라인, 세 번째 쌍의 MAC 뒤의 나머지 라인을 캡처하여 \2\1\3MAC를 MD5로 대체합니다.

답변2

다음 perl스크립트는 Digest::MD5또는Digest::SHA모듈은 비밀 솔트를 사용하여 MAC 주소를 해시 값으로 변환합니다. 모듈에 대한 자세한 내용은 해당 모듈의 매뉴얼 페이지를 참조하십시오. Digest::SHA에는 선택할 수 있는 다양한 알고리즘이 있다는 점은 주목할 가치가 있습니다.

코드는 다양한 해싱 알고리즘 중에서 쉽게 선택할 수 있도록 작성되었습니다. 하나의 알고리즘에 대한 주석 처리를 제거하고 다른 알고리즘에 대한 주석 처리를 수행하여 가장 적합한 알고리즘을 선택하십시오. 그런데 함수 버전의 출력은 _base64함수보다 약간 짧지 _hex만 라인 노이즈에 더 가깝습니다.

귀하가 제공한 정규식을 단순화했습니다(룩백이 필요하지 않음). 입력 데이터를 처리하려면 약간 조정해야 할 수도 있습니다. 예제를 제공하지 않았으므로 추측일 뿐입니다.

#!/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;
};

답변3

대안으로 때로는 난독화된 값으로 간단한 줄 번호를 사용합니다. 이렇게 하면 출력이 더 간결해지고 읽기 쉬워집니다.

또한 더 나은 난독화 알고리즘을 awk 사용하여 텍스트 파일에 대해 "스마트" 작업을 수행해야 할 때 훌륭한 도구입니다 sed. 적은 수의 MAC 주소를 참조하는 수천 개의 행이 있는 경우 작업 속도가 크게 향상될 수 있습니다.

실제로는 한 줄에 나타날 수 있는 여러 MAC 주소를 처리하고 각 항목을 식별 및 대체한 다음 끝에 매핑 테이블을 인쇄하는 다음 스크립트를 고려하십시오.

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

추가 편집 단계를 통해 전체 블록을 삭제하거나 단순히 인수의 명령 문자열을 -v table=출력을 파일로 리디렉션함으로써(예 : .-v table='sort -k 1,1n | column -t > table'END{ … }

변형으로 실제 암호화 엔진을 사용하여 난독화된 값을 계산하므로 끝에 매핑 테이블이 없습니다.

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

openssl여기에서는 이를 암호화 엔진 으로 사용하고 해당 aes-256-cbc암호(텍스트 친화적인 Base64 인코딩 출력도 포함)를 선택한 다음 이라는 파일에서 암호화 비밀을 읽도록 합니다 mypassfile.

대칭 암호(예: )를 사용하여 암호화된 문자열은 사용된 비밀( 자신에게만 보관하려는 aes-256-cbc내용)을 알고 해독할 수 있으므로 되돌릴 수 있습니다. mypassfile또한 openssl기본적으로 무작위 솔트가 사용되므로 각 실행은 동일한 입력에 대해 서로 다른 값을 생성합니다. 솔트(옵션 -nosalt) 를 사용하지 않으면 openssl실행할 때마다 동일한 값이 생성되므로 보안 수준이 떨어지지만, 암호화된 상태에서 더 짧은 텍스트가 생성됩니다.

선택한 외부 명령이 stdin의 입력을 받아들이고 출력을 stdout으로 인쇄할 수 있는 한, 인수의 명령을 awk바꾸는 대신 동일한 스크립트를 다른 외부 명령과 함께 사용할 수 있습니다 .openssl-v crypter=awk

MD5 또는 SHA와 같은 알고리즘을 사용하여 해시된 문자열은 단방향(즉, 되돌릴 수 없음)이며 항상 동일한 입력에 대해 동일한 값을 생성하므로 계산된 값이 생성된 출력이 단순히 문자열이 될 수 없도록 "소금"해야 합니다. 가능한 모든 MAC 주소를 검색했습니다. 약간 수정된 다음 스크립트에 표시된 대로 임의의 "소금"을 추가할 수 있습니다.

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

후자의 스크립트는 16바이트 길이의 (의사) 무작위 값을 "소금"으로 사용하여 동일한 데이터에 대해 실행될 때마다 다른 해시를 생성합니다.

관련 정보