tutarlı makine benzersiz kimliği oluşturma


20

Her bilgisayar için uuuidgen gibi benzersiz bir kimlik oluşturabilir miyiz, ancak donanım değişiklikleri olmadığı sürece asla değişmeyecek mi? CPUID ve MACADDR'yi birleştirmeyi ve tutarlı bir kimlik oluşturmak için onları hash etmeyi düşünüyordum, ancak bash komut dosyasını kullanarak bunları ayrıştırma konusunda hiçbir fikrim yok, bildiğim şey CPUID'i nasıl alabilirim

dmidecode -t 4 | grep ID

ve

ifconfig | grep ether

o zaman bu hex dizeleri birleştirmek ve sabit uzunlukta hex dize oluşturmak için sha1 veya md5 kullanarak onları karma gerekir.
Bu çıktıyı nasıl ayrıştırabilirim?


4
Bu yöntemi kullanarak çözmeye çalıştığınız sorun tam olarak nedir?
Darkhogg

1
Darkhogg ile birlikteyim. Günümüzde bu tür şeyleri yapmaya çalışmak genellikle kötü bir fikirdir. Sanallaştırma, yazılımın fiziksel donanıma bir tür anlamsızca bağlanmasını sağlamıştır. Gereksinimlerinizi yakından incelerseniz (Darkhogg'un itici gücü budur) genellikle daha iyi bir cevap vardır.
Calphool

4
Ben bir yazılımı bir makineye bağlamak için kullanmıyorum, binlerce teçhizat elle adlandırmak yerine, bulut kontrol ve izleme hizmetine kendini tanımlaması gereken linux madencilik teçhizatı, donanım kimliğini kullanarak onları benzersiz olarak tanımlamalıyım
uray

1
@ user77710: Durum buysa, donanımı gerçekten önemsiyor musunuz? Neden yoksa, makinede neden sadece bir UUID oluşturmuyorsunuz? Bu bir UUID'nin noktasıdır - evrensel olarak benzersizdirler (örtüşme olasılıkları astronomik olarak imkansızdır). serverfault.com/questions/103359/how-to-create-a-uuid-in-bash
Calphool

1
@JoeRounceville - Bunu demek istemedim SecureBoot kendisi çözüm oldu - bu destek kendinden imzalı sertifikalar yapar gerçi - ziyade ama onun yöntemini . Ancak, sistemin bellenimi tarafından sunulan bir API kullanır - ve herhangi bir UEFI sistemi, her bellenim değişkeni adına zaten kuruluma ihtiyaç duyabileceğiniz kadar çok UUID'ye sahip olacaktır - cevabımı görün. Ayrıca, size bashherhangi bir Linux üzerinde bir UUID oluşturmak için herhangi bir uygulamaya (veya -) ihtiyacınız yoktur . cat /proc/sys/kernel/random/uuid.
mikeserv

Yanıtlar:


21

Bu ikisine ne dersiniz:

$ sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g'
52060201FBFBEBBF
$ ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g'
0126c9da2c38

Daha sonra bunları birleştirip hash yapabilirsiniz:

$ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
       $(ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g') | sha256sum 
59603d5e9957c23e7099c80bf137db19144cbb24efeeadfbd090f89a5f64041f  -

Sondaki çizgiyi kaldırmak için bir boru daha ekleyin:

$ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
       $(ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g') | sha256sum |
  awk '{print $1}'
59603d5e9957c23e7099c80bf137db19144cbb24efeeadfbd090f89a5f64041f

@Mikeserv cevabında belirttiği gibi, arayüz adı botlar arasında değişebilir . Bu, bugün eth0 olanın yarın eth1 olabileceği anlamına gelir, bu nedenle eğer grep eth0yaparsanız farklı botlarda farklı bir MAC adresi alabilirsiniz. Sistemim bu şekilde davranmıyor, bu yüzden gerçekten test edemiyorum ama olası çözümler şunlardır:

  1. Grep için HWaddrçıkışında ifconfigama bunların hepsi, bir spesifik NIC karşılık gelen sadece bir tane tutun. Örneğin, benim sistemimde:

    $ ifconfig | grep HWaddr
    eth1      Link encap:Ethernet  HWaddr 00:24:a9:bd:2c:28  
    wlan0     Link encap:Ethernet  HWaddr c4:16:19:4f:ac:g5  

    Her iki MAC adresini de alıp ileterek sha256sum, hangi NIC'ye ne denirse verilsin, benzersiz ve istikrarlı bir ad elde edebilmelisiniz:

    $ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
         $(ifconfig | grep -oP 'HWaddr \K.*' | sed 's/://g') | sha256sum |
          awk '{print $1}'
    662f0036cba13c2ddcf11acebf087ebe1b5e4044603d534dab60d32813adc1a5    

    Her iki MAC adresini de döndürdüğüm ifconfigiçin , karma yukarıdaki değerlerden farklıdır sha256sum.

  2. Bunun yerine sabit sürücülerinizin UUID'lerini temel alan bir karma oluşturun:

    $ blkid | grep -oP 'UUID="\K[^"]+' | sha256sum | awk '{print $1}'
    162296a587c45fbf807bb7e43bda08f84c56651737243eb4a1a32ae974d6d7f4

güzel, ama sondaki çizgi kurtulmak nasıl '-'?
uray

@ user77710 güncellenmiş cevaba bakınız.
terdon

1
Sanırım cpuid daha kötü ... wikipedia.org/wiki/cpuid
mikeserv

@mikeserv ah, evet, gerçekten anlıyorum. Teşekkürler, cevap düzenlendi.
terdon

Aynı ana bilgisayardaki tüm konuk işletim sistemleri için aynı kimliği oluşturur.
Nitinkumar Ambekar

23

Öncelikle, CPUID'nin Intel Pentium III'ten sonraki herhangi bir sistem için kesinlikle yaygın olarak erişilebilen benzersiz bir tanımlayıcı işaret olmadığını lütfen unutmayın . MAC adresleri ile karıştırmak kesinlikle benzersiz işaretlere yol açabilir, ancak bu sadece MAC'lerin kendilerinin benzersiz niteliklerinden kaynaklanır ve bu durumda CPUID durumdan başka bir şey değildir. Dahası, ortaya çıkan hashın anakartın UUID'sinden daha benzersiz olması muhtemel değildir ve alınması çok daha kolaydır ve süreç hataya çok daha az eğilimlidir. Gönderen wikipedia.org/wiki/cpuid :

EAX = 3 : İşlemci Seri Numarası

Ayrıca bkz: Pentium III § Gizlilik sorunları hakkında tartışma

Bu işlemcinin seri numarasını döndürür. İşlemci seri numarası Intel Pentium III'te tanıtıldı, ancak gizlilik endişeleri nedeniyle bu özellik daha sonraki modellerde uygulanmıyor (PSN özellik biti her zaman temizlenir). Transmeta'nın Efficeon ve Crusoe işlemcileri de bu özelliği sağlar. Ancak AMD işlemciler bu özelliği hiçbir CPU modelinde uygulamamaktadır.

Ayrıştırılmış bir cpuid'i yaparak cat /proc/cpuinfoveya hatta sadece kendiniz görüntüleyebilirsiniz lscpu.

Bu, linux çekirdeği tarafından tanınan ağ arabirimleri için tüm MAC adreslerini alır, sanırım:

ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'

Rastgele oluşturulmuş MAC'lara sahip sanal nics içeriyorsa, bu listeye filtre uygulamak gerekebilir. Bunu ipdoğrudan çağrıdaki bayraklarla yapabilirsiniz . Bunun ip a helpnasıl yapılacağı hakkında bilgi için bkz .

Ayrıca, bu sorunun benzersiz olduğunu ipve kullanmanız durumunda ele alınması gerektiğini ifconfig, ancak ağ paketinin birip parçası olan ve aktif olarak bakımı yapılan - bir üye olan - daha güvenilir bir şekilde ele alınabileceğini unutmayın. ait paketin Linux ve son testere 2001 yılında bırakma . Çekirdeğin son sürümünden bu yana değişen özellikler nedeniyle, bazı ağ özelliği bayraklarını yanlış bildirdiği bilinmektedir ve mümkünse kullanımından kaçınılmalıdır.iproute2ifconfignet-toolsifconfig

Bununla birlikte, çekirdek arabirim adları ile filtrelemenin böyle eth[0-9]güvenilir bir yöntem olmadığını anlayın, çünkü bunlar udevönyükleme işlemi sırasında paralel algılama sırasına göre değişebilir . Bununla ilgili daha fazla bilgi için lütfen Öngörülebilir Ağ Adlarına bakın .

Çünkü dmidecodebenim sistemde yüklü değil ben ilk başta gibi oluşturulan sabit disk seri listesi karma düşündüm:

lsblk -nro SERIAL

Do lsblk --helpbu listeyi rafine bazı ipuçları - Disk tipine göre, derler. Ayrıca düşünün lspcive / veya lsusbbelki.

Bunları birleştirmek kolaydır:

{ ip a | sed ... ; lsblk ... ; } | #abbreviated... for brevity...
    tr -dc '[:alnum:]' | #deletes all chars not alphanumeric - including newlines
    sha256sum #gets your hash

Bana bildirdiğiniz gibi, kullanıcının kaynaklarını benzersiz kimliklerine girdiğinizde kilitliyorsunuz ve sabit disklerin varlığına güvenilemiyor, yapışmamı değiştirmeyi düşündüm.

Bu göz önüne alındığında, dosya sistemine tekrar baktım ve /sys/class/dmi/idklasörü buldum . Birkaç dosyayı kontrol ettim:

cat ./board_serial ./product_serial

###OUTPUT###
To be filled by O.E.M.
To be filled by O.E.M.

Ancak, bu oldukça iyi görünüyor, ancak çıktıyı yayınlamayacağım:

sudo cat /sys/class/dmi/id/product_uuid

dmidecodeZaten onun bilgilerinin çoğunu burada alıyor ve aslında öyle görünüyor . Buna göre man dmidecode, argümanı belirterek bu aracı kullanmanızı büyük ölçüde basitleştirebilirsiniz:

dmidecode -s system-uuid

Yine de daha basit, sadece dosyayı okuyabilirsiniz. Bu dosyanın özellikle bir anakartı tanımladığını unutmayın. İşte, 2007 yılında, bu ihracatları /sysfssanal dosya sistemine uygulayan çekirdek düzeltme ekinden bir alıntı :

+DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor,      0444, DMI_BIOS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_version,         0444, DMI_BIOS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_date,        0444, DMI_BIOS_DATE);
+DEFINE_DMI_ATTR_WITH_SHOW(sys_vendor,       0444, DMI_SYS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(product_name,         0444, DMI_PRODUCT_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(product_version,   0444, DMI_PRODUCT_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(product_serial,    0400, DMI_PRODUCT_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(product_uuid,         0400, DMI_PRODUCT_UUID);
+DEFINE_DMI_ATTR_WITH_SHOW(board_vendor,         0444, DMI_BOARD_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(board_name,       0444, DMI_BOARD_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(board_version,     0444, DMI_BOARD_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(board_serial,         0400, DMI_BOARD_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(board_asset_tag,   0444, DMI_BOARD_ASSET_TAG);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_vendor,    0444, DMI_CHASSIS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_type,         0444, DMI_CHASSIS_TYPE);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_version,   0444, DMI_CHASSIS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_serial,    0400, DMI_CHASSIS_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_asset_tag, 0444, DMI_CHASSIS_ASSET_TAG);

Anakart yeterliyse, bu verileri sistemi tanımlamak için tek başına kullanabilirsiniz. Ancak bu bilgileri, sabit disklerle yapabileceğinizi gösterdiğim gibi sistemin MAC'leriyle birleştirebilirsiniz:

sudo sh <<\CMD | tr -dc '[:alnum:]' | sha256sum
        ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
        cat /sys/class/dmi/id/product_uuid 
CMD

Linux çekirdeği ayrıca sizin için UUID'ler de oluşturabilir:

cat /proc/sys/kernel/random/uuid #new random uuid each time file is read

Veya:

cat /proc/sys/kernel/random/boot_id #randomly generated per boot

Verilmiş, rasgele oluşturulmuş ve sen tekrar düşünmek kimlik ataması zorunda kalacak, ancak alır gibi yaklaşık olarak kolay olsun en azından. Ve bunu anahtarlamak için bir yol bulabilirseniz oldukça sağlam olmalıdır.

Son olarak, her EFI sabit yazılım ortamı değişkeni kendi UUID'sini içerdiğinden, UEFI sistemlerinde bunu yapmak çok daha kolay hale gelir. Ortam değişkeni {Platform,}LangCodes-${UUID}her UEFI sisteminde bulunmalı, yeniden başlatmalara ve hatta çoğu ürün yazılımı yükseltmelerine ve değişikliklerine devam etmelidir ve efivarfsmodül yüklü herhangi bir Linux sistemi adlardan birini veya her ikisini aşağıdaki gibi basit bir şekilde listeleyebilir:

printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*

Eski form - LangCodes-${UUID}görünüşe göre artık kullanılmıyor ve daha yeni sistemlerde olmalı, PlatformLangCodes-${UUID}ancak spesifikasyonlara göre, her UEFI sisteminde bir veya diğeri mevcut olmalıdır. Biraz çaba harcamadan, kendi yeniden başlatma kalıcı değişkenlerinizi tanımlayabilir ve belki de çekirdeğin UUID üretecini bu şekilde daha fazla kullanabilirsiniz. Eğer ilgileniyorsanız, efitools'a bakın .


hatta ne olduğunu bilmiyorsanız, sabit disk veya herhangi bir disk, madencilik teçhizatı bile yok. diit.cz/sites/default/files/images/3988/… sanal makine tek başına 6 GPU çalıştıramaz anakart
uray

Neyse, makineyi sürekli olarak isimlendirme amacını
yediği için

@ user77710 - Lanet olsun dostum, bu şey harika. Bu bir makine mi? Muhtemelen haklısınız, ancak bazı dağıtılmış grafik öğeleri olan bazı XDMX ve Chromium kombinasyonuyla mümkün olabilir. Her neyse, önemli değil - geriye doğru aldım. Kim kendilerini paralarından yenmek ister ki? Bazı yazılım lisanslama şeylerini düşünüyordum - banka hesapları yapıyorsunuz.
mikeserv

Oraya getirdiğiniz bazı şık numaralar +1.
terdon

@terdon - iltifat çok takdir edilir, ancak çoğunlukla hile değildir. ip2ayrıştırılmak için özel olarak tasarlanmıştır ve bunu yeterince iyi yapmıyorum olabilir - aynı şeyin neredeyse onsuz yapılabileceğinden şüpheleniyorum grep/sed. Muhtemelen aynı şey kolayca yapılabilir udevadm. Ve her EFI ortam değişkeni adı, tam olarak bu tür durumlar için benzersiz olarak tanımlanacak şekilde tasarlanmıştır.
mikeserv

19

Birçok modern dağıtım /etc/machine-id, büyük olasılıkla benzersiz bir onaltılık 32 karakterlik dize içeren bir dosya gönderir. Bir kılavuzun daha fazla bilgiye sahip olduğu sistemd'den kaynaklanır ve amacınıza uygun olabilir.


+1, @XZS, URL'den alakalı bilgileri buraya da ekleyebilirsiniz.
Ramesh

1
Bu iyi ve benzer bilgiler buldum ve neredeyse kullandım ... ama zaten farklı bir rotaya bağlıydım. Yine de, bunun dbusbir işletim sistemi silindiğinde / yeniden yüklendiğinde özel olduğunu düşünüyorum.
mikeserv

Bu oldukça güzel.
GeneCode

5

Birçok Linux makinesinde, dosya /var/lib/dbus/machine-idher Linux dağıtımı için benzersiz bir kimlik içerir ve bir çağrı ile erişilebilir dbus_get_local_machine_id(). Bu muhtemelen /etc/machine-idyukarıda belirtilenle aynıdır . Sanal Linux kurulumlarında da çalışır. Mevcut Ubuntu, SuSE ve CentOS dağıtımlarında kontrol ettim.


1
Fedora 19 + 20'de bu dosya mevcut değil. İşte burada: /etc/machine-id.
slm

Belki yeterince açık değildim. Demek istediğim, bir yer bulamazsanız, diğerine bakın. Veya işlev çağrısını kullanarak kendi programınızı yazın.
rankeney

0

Donanım değiştiğinde değiştirmek için makine kimliğine ihtiyacınız var mı? Makine kimliği bir şeyi korumak için mi kullanılıyor? "Tutarlı" bir makine kimliğine sahip olmanın en iyi yolu, sistemde bir yerde rastgele bir dize depolamaktır ve bu şekilde herhangi bir donanım değişirse, makine kimliği de değişmez. Bu, donanım erişiminin kısıtlandığı ve MAC ID'nin 00: 00: 00: 00 olduğu sanallaştırılmış sistemler için de iyidir

Kimliği oluşturmak ve almak için bu sh komut dosyası gibi bir şey deneyin:

#!/bin/sh
FILE="/etc/machine-id"

if [ ! -f $FILE ]; then
    cat /dev/urandom|tr -dc A-Z0-9|head -c32 > $FILE;
fi

cat $FILE;

Senin bu yana /dev/urandomzaten Linux gösterir, sadece yapabileceği cat /proc/sys/kernel/random/uuid >$FILErastgele her okuma üzerinde düzgün şekilde biçimlendirilmiş UUID üretir. Yine de, disk tarafından uygulanan herhangi bir kalıcılık silinmeye tabidir ve kabul edilebilir ve sağlandığı dbustakdirde, muhtemelen @XZS'nin önerdiği gibi yapmalısınız.
mikeserv

0

Diğer yanıtlar, donanımdan kimlik çıkarmanın çeşitli yollarını verir. Tanımlayıcı olarak tek bir donanım veya birçok donanım kullanmaya karar verebilirsiniz. Donanım parçalarını keyfi olarak değiştirmeniz veya değiştirmeniz gerektiğinde bu sorunludur.

Bazı insanlar bunun yerine kimliği oluşturulan bir kimliği sabit sürücülerinde depolayabilir (veya UUID'yi kullanabilir) ancak sabit diskler klonlanabilir.

TPM modülleri ve güvenli önyükleme, anakartı ve diğer donanımları sabit sürücüye takmak için bir araç sağlayabilir.

Neyi başarmak istediğiniz hakkında daha fazla bilgi verirseniz, bu durumlarda her zaman biraz daha kolaydır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.