Восстановление приватного ключа es(av-desk) сервера drwcsd.pri с умершего раздела (битой файловой системы)

Материал из wiki.drweb.com
Перейти к: навигация, поиск

обрушилась файловая система на es-сервере, оказался утерянным drwcsd.pri. генерировать новые ключи и ходить перенастраивать десятки агентов крайне не хотелось, поэтому решили попробовать найти содержимое drwcsd.pri в секторах.

для поиска нужен живой drwcsd.pub (который можно найти на любой агентской машине) фрагменты которого находятся в приватном ключе. затем по этим фрагментам будет производиться поиск на жестком диске, и из найденного сектора восстанавливаться файл. все операции производятся под linux при помощи утилит grep, hexdump и dd.

общим фрагментом для drwcsd.pub и drwcsd.pri является id сервера (первая некомментированная строчка):

Dr.Web (R) Public key file
Do not edit!

c002167b-5514-4a83-9b44-35581bb94c10

смотрим подробнее: (hexdump -C здесь нужен чтобы знать смещения)

  1. hexdump -C /opt/drwcs/Installer/drwcsd.pub

00000000 3b 20 44 72 2e 57 65 62 20 28 52 29 20 50 75 62 |; Dr.Web (R) Pub|
00000010 6c 69 63 20 6b 65 79 20 66 69 6c 65 0a 3b 20 44 |lic key file.; D|
00000020 6f 20 6e 6f 74 20 65 64 69 74 21 0a 63 30 30 32 |o not edit!.c002|
00000030 31 36 37 62 2d 35 35 31 34 2d 34 61 38 33 2d 39 |167b-5514-4a83-9|
00000040 62 34 34 2d 33 35 35 38 31 62 62 39 34 63 31 30 |b44-35581bb94c10|

собственно, строчку id и надо будет искать на устройстве. правильнее будет искать ее не всю целиком, тк форматирование вывода разные, а drwcsd.pri начинается с другого заголовка и по длине отличается на 1 символ), а ее центральный фрагмент (в данном случае 5514-4a83)

допустим, у нас обрушилась файловая система на /dev/sda6, пробуем найти остатки файла:

  1. hexdump -C /dev/sda6 | grep '5514-4a83'

видим вывод:

6d806030 32 31 36 37 62 2d 35 35 31 34 2d 34 61 38 33 2d |2167b-5514-4a83-|

судя по полному совпадению найденнной подстроки с содержимым id сервера, можно предположить что это и есть фрагмент нашего ключа. тк даннные пишутся с выравниванием, а смещение как раз 0x30, то разумно посмотреть на содержимое сектора по смещению 0x6d806000 (в данном случае)

тк для dd смещение надо указывать в блоках (по умолчанию блок == 512байт), то придется сделать необходимые вычисления(с помощью shell)

  1. dd if=/dev/sda6 skip=$(( 0x6d806000 / 512 )) count=1 |hexdump -C

1+0 records in
1+0 records out
512 bytes (512 B) copied, 3.0781e-05 seconds, 16.6 MB/s
00000000 3b 20 44 72 2e 57 65 62 20 28 52 29 20 50 72 69 |; Dr.Web (R) Pri|
00000010 76 61 74 65 20 6b 65 79 20 66 69 6c 65 0a 3b 20 |vate key file.; |
00000020 44 6f 20 6e 6f 74 20 65 64 69 74 21 0a 63 30 30 |Do not edit!.c00|
00000030 32 31 36 37 62 2d 35 35 31 34 2d 34 61 38 33 2d |2167b-5514-4a83-|
00000040 39 62 34 34 2d 33 35 35 38 31 62 62 39 34 63 31 |9b44-35581bb94c1|
00000050 30 0a 62 38 62 62 39 37 32 63 30 35 39 33 31 39 |0.b8bb972c059319|
00000060 34 61 39 35 34 33 39 62 62 64 31 36 63 64 37 63 |4a95439bbd16cd7c|
00000070 39 34 61 33 30 37 61 66 35 35 30 34 32 30 33 35 |94a307af55042035|
00000080 66 33 32 62 64 39 64 66 35 66 62 30 31 35 62 61 |f32bd9df5fb015ba|
00000090 32 30 0a 32 30 36 35 64 38 63 35 61 64 35 65 34 |20.2065d8c5ad5e4|
000000a0 62 38 31 37 39 65 33 62 35 64 39 62 38 35 30 65 |b8179e3b5d9b850e|
000000b0 38 31 31 63 32 62 34 64 64 36 35 61 35 37 38 30 |811c2b4dd65a5780|
000000c0 64 64 63 66 31 33 65 66 37 35 63 63 61 66 63 35 |ddcf13ef75ccafc5|
000000d0 65 64 32 0a 63 31 35 35 63 33 35 35 66 38 34 36 |ed2.c155c355f846|
000000e0 31 38 33 36 30 36 35 64 39 66 61 37 62 63 34 61 |1836065d9fa7bc4a|
000000f0 64 33 65 66 65 64 33 63 32 39 64 64 30 66 63 66 |d3efed3c29dd0fcf|
00000100 64 34 66 34 30 31 34 37 64 35 66 36 36 65 61 34 |d4f40147d5f66ea4|
00000110 37 32 38 38 0a 3b 20 2a 2a 2a 45 4f 46 2a 2a 2a |7288.; ***EOF***|
00000120 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|

видим что это и есть содержимое drwcsd.pri и заканчивается он на 121ом байте. остается только сохранить весь блок данных из сектора в файл:

  1. dd if=/dev/sda6 skip=$(( 0x6d806000 / 512 )) count=1 |head -c $((0x121)) > /tmp/newdrwcsd.pri

полученный файл /tmp/newdrwcsd.pri будет копией утерянного.

ЧаВо: Dr.Web® Enterprise Suite