Ошибка LUKS во время загрузки
alg: drbg: could not allocate DRNG handle for ...
Я вижу эту ошибку только на консоли во время процесса загрузки виртуальных машин, которые мы создаем. РЕДАКТИРОВАТЬ: 2/5/16 - я вижу это на некоторых голых металлических установок, тоже. (Он полностью загружается.) Я предполагаю, что это как-то связано с виртуализированным оборудованием и отсутствием (совместимого) генератора случайных чисел. Проблема в том, что я не могу оценить серьезность. Скомпрометирована ли сила шифрования? (Должен ли я вообще заботиться об этой ошибке?) Как я могу ее исправить?
Мы используем QEMU/KVM под CentOS 6.7. Я могу сделать virsh dumpxml
примера системы, если вы действительно думаете, что это поможет. Мы используем Anaconda по умолчанию размер шифра / ключа. (AES-XTS-plain64/512)
Это самая ранняя ссылка, которую я нашел в списке рассылки linux-crypto. К сожалению, это немного над моей головой.
http://www.mail-archive.com/linux-crypto%40vger.kernel.org/msg10398.html
2 ответа
Как я могу это исправить?
В базе знаний Red Hat вы должны добавить модуль ядра "ctr" в свой initrd. В их инструкциях также написано, что они должны включать 'ecb', хотя кажется, что проблема в том, что модуль 'ctr' не загружается.
dracut -f -v --add-drivers "ctr ecb"
Абоненты могут видеть полную информацию. Я не уверен, что мне разрешено переиздавать остальное здесь, поэтому я перефразировал полное решение.
https://access.redhat.com/solutions/2249181
Изменить 29.09.2016:
Вы также можете добавить эти драйверы в /etc/dracut.conf
так что они добавляются в новые initramfs при обновлении ядра. В противном случае ваши симптомы загадочным образом появятся много месяцев спустя.;)
add_drivers+="ctr ecb"
Я не думаю, что это влияет на силу вашего шифрования.
Я проверил исходный код и пока я правильно интерпретирую то, что вам нужно, вам не обязательно беспокоиться об этом.
Этот код принадлежит модулю 'stdrng'. По крайней мере, в Fedora 23 это встроено в ядро, а не экспортируется как модуль ядра.
Когда stdrng инициализируется в первый раз, происходят следующие вызовы.
В crypto / drbg.c инициализация начинается здесь.
1997 module_init(drbg_init);
Это регистрирует все drbgs, известные системе.
1985 for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
1986 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 1);
1987 for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
1988 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 0);
Затем он передает его вспомогательной функции, которая выполняет инициализацию:
1989 return crypto_register_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));
В crypto/rng.c
это просто перебирает каждый рнг, чтобы зарегистрировать его..
210 for (i = 0; i < count; i++) {
211 ret = crypto_register_rng(algs + i);
212 if (ret)
213 goto err;
214 }
Эта функция выполняет несколько шагов инициализации, а затем вызывает другую функцию для выделения.
196 return crypto_register_alg(base);
Что не так очевидно, так это то, что происходит во время регистрации.
Другой модуль называется tcrypt
Также встроенный в ядро получает уведомления о новых алгоритмах вставки. Как только он видит новый зарегистрированный алгоритм, он планирует его тестирование. Это то, что производит вывод, который вы видите на своем экране.
Когда тест завершен, алгоритм переходит в состояние TESTED. Если тест не пройден, я думаю (я не смог найти бит, который вызывает такое поведение), он не может быть выбран для поиска, если вы передадите правильные флаги.
Проходят ли тесты, определенно хранится внутри.
В дополнение к этому, вызов генератора псевдослучайных чисел приводит к тому, что список алгоритмов будет повторяться из prngs в порядке силы, как указано в этой заметке в crypto/drbg.c
107 /*
108 * The order of the DRBG definitions here matter: every DRBG is registered
109 * as stdrng. Each DRBG receives an increasing cra_priority values the later
110 * they are defined in this array (see drbg_fill_array).
111 *
Поскольку самый сильный не терпит неудачу (hmac sha256), маловероятно, что вы используете неудачные, даже если они могут быть выбраны.
Обобщить -
- Это происходит, когда
stdrng
Модуль требуется для чего-то. - Он загружает все свои известные алгоритмы.
- Все загруженные алгоритмы проходят проверку. Некоторые могут потерпеть неудачу (почему не рассматривается в этом ответе).
- Тестовые ошибочные алгоритмы не должны быть доступны для выбора позже.
- PRNGS упорядочены по силе, и сильные PRNGS, которые действительно проходят, пробуются первыми.
- Вещи, которые полагаются на
stdrng
надеюсь, не следует использовать эти алгоритмы в качестве основы для своего источника PRNG.
Вы можете увидеть, какие алгоритмы прошли успешно и прошли тесты, используя следующую команду:
grep -EC5 'selftest.*passed' /proc/crypto
Вы также можете увидеть приоритет выбора в поле "приоритет". Чем выше значение, тем сильнее PRNG, по словам автора модуля.
Итак, я рад, что ошибаюсь, поскольку я не считаю себя программистом ядра, но в заключение -
когда stdrng
загружает его, как представляется, для выбора других алгоритмов из списка допустимых алгоритмов, которые считаются более сильными, чем неисправные, плюс неисправные, скорее всего, не будут выбраны.
Таким образом, я считаю, что это не дополнительный риск для вас при использовании люков.