Что делать, если у меня плохое (статическое, низкоэнтропийное )случайное -начальное число в systemd?

Использовать массив:

var2=( -name "*.avi" -o -name "*.mkv" )

readarray var1 < <(find "/path/to/dir" \( "${var2[@]}" \) | sort)

См. связанный с этим Как мы можем запустить команду, хранящуюся в переменной?

4
19.05.2021, 17:20
1 ответ

Плохая энтропия является распространенной проблемой для некоторых классов встраиваемых устройств. Это серьезная угроза безопасности. К сожалению, нет единого решения, которое работает для всех устройств.

Примечание :Я профессиональный архитектор безопасности встроенных устройств, но обычно работаю с устройствами, которые слишком малы для systemd или даже Linux. Я мало что знаю о systemd.

Зачем мне энтропия?

Безопасность во многом зависит от криптографии. Большая часть криптографии опирается на знание чего-то, чего не знают другие. Если у вас есть устройство, состояние которого полностью известно, например, недавно установленная система, на которой работает детерминированный процессор, все знают состояние вашего устройства, и поэтому у устройства нет возможности узнать что-то, чего не знал бы злоумышленник. Устройство должно либо с самого начала знать что-то, чего никто другой не знает, либо иметь способ генерировать какую-то информацию, которую никто другой не знает. Это энтропия.

Энтропия необходима, например, для того, чтобы гарантировать, что данные, которыми вы обмениваетесь с веб-сайтом, не могут быть перехвачены, что данные, которыми вы обмениваетесь с веб-сайтом, не могут быть подделаны, что ваш пароль WiFi не может быть перехвачен. на и т. д.

Как только энтропия доступна в системе, детерминированный генератор случайных чисел (, то есть программный алгоритм ), может производить неограниченное количество секретных данных, которые никому не известны. Но никакой детерминированный процесс не может произвести энтропию из ничего. В принципе, детерминированная случайная генерация — решаемая проблема (, хотя реализации могут содержать ошибки ).

Исследование 2012 года показало, что небольшая, но не -незначительная часть подключенных к Интернету -устройств была небезопасна из-за плохого генератора случайных чисел . Имейте в виду, что они только что протестировали несколько конкретных способов, которыми плохой генератор случайных чисел будет виден. В исследовании упущено много других причин, по которым плохой ГСЧ может вызвать проблемы, но, наоборот, некоторые проблемы с ГСЧ могли быть связаны с программными ошибками, а не с недостатком энтропии.

Как я могу получить энтропию?

Наиболее надежным решением является наличие специального -аппаратного компонента :аппаратного генератора случайных чисел аппаратного генератора случайных чисел(HRNG )¹. Большинство, если не все последние процессоры для ПК и смартфонов имеют один, некоторые встроенные платы имеют один (, насколько мне известно, все модели Raspberry Pi имеют один ), но они менее распространены на младших -конечных устройствах (. ] такие как домашние маршрутизаторы ). И даже когда у устройства есть HRNG, в Linux не всегда есть для него драйвер.

Без специального -аппаратного компонента можно генерировать энтропию из непредсказуемых событий. Проблема в том, что непредсказуемые события трудно поддаются количественной оценке и, как правило, редко встречаются на встроенных устройствах. Например, вращающиеся жесткие диски имеют некоторую непредсказуемость в точном времени отклика, но встроенные устройства обычно не имеют связующего жесткого диска. Сложные процессоры, предназначенные для высоких скоростей, как правило, имеют непредсказуемый джиттер тактовой частоты , но дешевые или маломощные устройства -не имеют большого джиттера.Время пользовательских событий, таких как нажатия клавиш, вносит некоторую непредсказуемость, но встроенные устройства, как правило, не имеют физического пользователя. Некоторые устройства, такие как датчики камер и микрофоны, хорошо производят энтропию из шума, по крайней мере, если условия окружающей среды подходящие, но не многие устройства не имеют подходящего датчика.

Другой способ обеспечить энтропию устройству, которое не может ее генерировать, — это ввести ее во время производства. Запустите HRNG на сборочной линии и вставьте отдельный файл со случайными данными на каждое устройство. Затем при каждой загрузке устройства оно должно обновлять эти случайные данные. Эти случайные данные являются случайным начальным числом, о котором вы спрашиваете.

Во всех системах Linux обычно используется случайное начальное число. Это абсолютно необходимо на устройствах, у которых нет другого источника энтропии, и приятно иметь даже на устройствах, у которых есть другой источник энтропии.

Случайное начальное число не должно использоваться совместно с каким-либо другим устройством, и оно не должно повторяться при перезагрузке устройства. Как это должно работать, так это то, что начальное значение либо вводится во время производства, либо генерируется из энтропии во время установки устройства, а затем каждый раз, когда устройство загружается, оно вычисляет и сохраняет новое начальное значение.

Что делать, если мое устройство было установлено без энтропии?

Если у вас есть доступ к командной строке системы Linux, вы можете внедрить энтропию, написав в /dev/urandom. Например, если у вас есть SSH-подключение с ПК к устройству:

head -c 99 /dev/urandom | ssh mydevice 'cat >/dev/urandom'

Обратите внимание, что существует проблема начальной загрузки :, поскольку устройство не имеет энтропии, оно не может безопасно сгенерировать ключ хоста SSH, а также уязвимо для повторных атак сетевых злоумышленников. Поэтому вы должны сделать это до того, как устройство подвергнется воздействию ненадежных соединений. И если у вас есть какие-либо ключи, сгенерированные с плохой энтропией, повторно -сгенерируйте их, как только станет доступна достаточная энтропия.

Создав дополнительную энтропию,обязательно обновите случайное семя в хранилище. Я думаю, что вы можете сделать это, перезапустив службу systemd-random-seed, но я не уверен в этом и считаю документацию systemd неясной.

Что делать, если на моем устройстве нет постоянного случайного начального числа?

Если на вашем устройстве есть HRNG, все в порядке. В противном случае вы в беде.

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

/var/lib/systemd/random-seedдолжен находиться в постоянном хранилище, иначе это не поможет. «Сохранение» случайного начального числа на tmpfs было бы бессмысленным.

Многие встроенные устройства имеют небольшой объем NVRAM. Сохранение случайного начального числа при каждой загрузке является хорошим использованием этой NVRAM, если это позволяет максимальное количество операций записи. Я не знаю, как настроить systemd для этого.

Если устройство подключено к проводной сети в физически защищенной среде, возможно получение энтропии с доверенной машины в том же физическом местоположении.

Если у вас есть секрет, уникальный для вашего устройства, но который нельзя перезаписывать при каждой загрузке, вы можете объединить этот секрет со временем во время загрузки. Но учтите, что это крайняя мера .

{ date +%s; cat /path/to/static/seed; } | sha256sum >/dev/urandom

Это дает приемлемое начальное число , если дата не повторяется . Но если ваше устройство теряет питание и забывает время, то есть если оно перезагружается, «мигает двенадцать», думая, что это 2000 -01 -01 в 00 :00 :00, это производит одно и то же семя снова и снова, который открывает ваше устройство для сетевых -атак, которые могут быть более или менее простыми в зависимости от того, что делает устройство.

¹ Заявление об отказе от ответственности :Хотя мой работодатель не производит такие устройства, он косвенно выиграет, если больше встроенных устройств будет оснащено HRNG.Но лично я бы порекомендовал HRNG, если бы основным бизнесом моего работодателя было консультирование, которое выиграет, помогая людям восстанавливаться после атак.

4
28.07.2021, 11:30

Теги

Похожие вопросы