Маскировка ввода пароля в cryptsetup
Форумчане, скажите, можно ли сделать в Crytpsetup затирание вывода консоли при вводе пароля на загрузку?
Как в TrueCrypt – фейковая ошибка, например "Invalid BOOT.INI file Booting from C:windows", таким образом ввести в заблуждение по поводу установленной системы и не реагировать на ввод неправильных паролей.
Спасибо
комментариев: 9796 документов: 488 редакций: 5664
Для вики-странички желательна хоть какая-то завершаемость, а для этого нужен хотя бы прототип инструкции. Инструкции нет. Тест пока что опирался на самодельный загрузчик — это плохо, но это просто эксперименты, нужные, чтобы достичь понимания принципов (cистему всегда надо строить от простого к сложному). В итоговом тексте 80% того поста было бы попросту ненужным информационным мусором. Наконец, у меня столько сырых недоведённых до ума страниц и идей, что я уже не рискую, не видя почти готового варианта, серьёзно браться за что-то новое.
Только без --use-random — оно к plain mode неприменимо (что вполне логично).
Кощеева смерть
Самостоятельно попроходил квест. Инсталлятор Debian'а понятен почти всюду, но в двух местах пришлось тыкать на угад. Первое уже забыл (что-то с разбиениями и конфигурацией дисков), а второе — conversion (uuid'ов?) перед самым finish install в районе записи загрузчика (взял lilo) на внешний носитель.
Извратился и сделал такую схему:
В Wheezy версия ядра 3.2. Надо хотя бы 3.5. Такого выбора нет, но есть jessie-β-2, там аж 3.16. Установка проходит штатно, но поддержка графики так и недостестировалась: после apt-get update и apt-get upgrade ядро так обновилось, что больше ОС не загрузилась. При старте системы на ранних стадиях загрузки ядро стабильно падает в панику, и ничего не помогает. Видимо, от идеи выполнять apt-get upgrade придётся отказаться на свой страх и риск до выхода 8.0. :-(
systemd выпиливался указанием опции к загрузчику инсталлятора, но насколько этот метод был успешным, судить не берусь. sysvinit вроде установился.
В jessie новый cryptsetup, там теперь можно так монтировать:
комментариев: 9796 документов: 488 редакций: 5664
Разбиение на диски и крипторазделы там всегда было отвратным. Там есть возможность выйти в консоль и сделать всё вручную, но раз в несколько лет плевался и как-то методом тыка добивался нужного от обычного инсталлятора.
Кстати, LILO может плохо понимать навороты с томами, он для минимализма в духе старых систем, безо всяких (крипто)томов. Конечно, всё решает рамдиск, но в него из grub.conf передаются какие-то UID'ы.
Оно нормальное, но недокументированное, до всего надо доходить самому, даже если понимаешь, как это всё внутри должно быть устроено. Общая схема такая: идёшь по пунктам:
/dev/sda
/dev/sda
Не уверен. Но если вы правы, то, по моим представляениям, это надо сделать до захода в меню detect disks. В частности, этим макаром добиваются того, что инсталлятор увидит /dev/mapper/NAME, который самый внешний и бессигнатурный, позволив уже его разбивать через LVM/LUKS и т.д.
Мне кажется, что он может не захотить распознавать ранее созданные LVM-тома в консоли.
Ещё заметка про софт: в конфигурирование пакетного менеджера зайти стоит, а в install software — нет, т.к. там даже если не выбирать ничего, он наставит всякого дерьма всё равно. Он говорит, что есть base system на CD, а ещё можно поставить «более полную» base system с сети. Так вот, более полную, похоже — это уловка, не надо поддаваться, т.к. там много сомнительного.
Можно попробовать с grub'ом сдеать. Он grub-1 не предлагает уже? В любом случае, тут важно одно: лишь бы работало. Загрузчик всё равно будет кастомный так или иначе, поскольку загрузку гипервизора ни один стандартный LiveCD не умеет. Следовательно, лучше не вытягивать самого себя за волосы из болота подстроек под типичный загрузчик, а подходить, как уже было предложено: нейтральным LiveCD/LiveUSB записывается загрузчик на носитель разово на одну загрузку; потом после загрузки загрузочный носитель затирается (см. пункты 5-8).
P.S. Кстати, миграция через mount union [п. 6] ненужна: initrd/initramfs достаточно умный (комнадная строка загрузчика), там все необходимые тулзы есть. Достаточно будет оттуда вручную подцепить блочное устройство, состоящее из скрытого места на диске, через dmsetup с его БД, и дальше загрузка пойдёт штатным образом.
Когда нужно сделать некоторое созданное блочное устройство LUKS-контейнером, вы выбираете его в общем списке и говорите use as physical volume for encryption. Он при этом спросит, как его шифровать и всё такое. После выхода из меню блочное устройство будет помечено справа в списке как not active. После этого нужно вверху окна выбрать configure encrypted volumes (ну, чтобы оно запросило пассфразу и сделало его active, после чего данное блочное устройство можно сувать дальше: сделать на нём ФС, разметить под LVM или ещё что). Однако, когда вы заходите в configure encrypted volumes, он вам предлагает на выбор два варианта: create encrypted volumes и finish. В чём логика? Казалось бы, да, вы хотите его создать, но не столько создать, сколько активировать уже созданный. Это путает. Короче, надо выбирать finish (абсолютно нелогично), и тогда на следующем шаге он запрашивает пассфразу для not active устройства. После оно будет помечено как active.
Если же выбрать create encrypted volumes, он запрашивает, какое из доступных блочных устройств шифровать. Можно снова выбрать то, которое not active в основном списке, но что будет дальше, я не пробовал.
Ещё одна нелогичность: после того, как загрузили компоненты с CD посредством соответствующего пункта меню и выбрали, что загружать, cryptsetup уже должен появиться в консоли. Однако, это не так. Надо ещё включить сеть и сконфигурировать её. Настройка сети ничего с сети не загружает, но после этого cryptsetup в консоли появляется, и туда можно лезть выполнять ручную работу. В чём логика, и что это за фазы Луны, я так и не понял.
Ставлю ОС в конфигурации как тут, на последней стадии возникают какие-то неисправимые траблы с установкой загрузчика на внешний носитель. Приходится всё прерывать и делать инсталляцию снова, а это опять ждать, пока установится base system (минут 15-20 занимает) и опять кучу ручной работы делать. Но ладно, я терпелив, проходим квест снова. Всё устанавливается, всё грузится, корневую ФС загрузчик не находит и, как положено, вываливается в шелл initramfs. Всё бы ничего, но cryptsetup'а там нет. Думаю, дай поставлю шифрованный своп, хотя не хотел — вроде по вышеприведённой инструкции это в обяз должно добавить туда cryptsetup. Заново всё делать не хочется, поэтому, казалось бы, достаточно загрузиться, всё подмонтировать, а потом выполнить только установку загрузчика. Но это тоже не так. Если install base system не выполняется, инсталлятор не видит носителя с /boot (а потому выбор grub-пункта в меню инсталлятора возвращает ошибку). Если зайти в консоль и сделать chroot /target, то видно, что никаких /dev/sdX-устройств там нет и в помине.
Что ж, значит снова делаем всю инсталляцию с начала и до конца. Сделали. Не грузится. Вообще никак. Чёрный экран, даже меню граба не вылазит. Руками при этом носитель монтируется, /boot там, всё ОК. Скопировал через dd на другой носитель, пробую. С него тоже не грузится. Блин, значит, надо сделать как-то grub-install снова, но как? Можно так же пройти заново всю инсталляцию, а загрузчик так и не начнёт работать, можно ли схитрить и сделать быстрее? ОК, похоже, можно сделать grub-install из-под другой системы.
Грузимся, но там новая засада: нам же надо сделать grub-install для новой системы с новым ядром и не в конвенциональное место записать /boot, да не испохабить ничего на последней работающей системе. Вроде это делается через chroot. Отлично, но после chroot /target ни одно из /dev/sdX устройств не видно. Как тогда он сделает update-grub? Надо бы ему объяснить... Опять лезем в гугл и находим инструкцию/скрипты с mount --bind, которые в чрут пробрасывают деревья /proc, /sys, /dev и т.п.
Сделали, grub-install выполнился. Грузимся снова, проверяем: о, чудо! Оно работает! Попадаем в initramfs-шелл, сейчас, думаю, наконец-то всё подключу, но... да ты ж ё*й ты н*уй!!! Нет там cryptsetup'а. Я уже в полном расстройстве. Как это так?!
Ладно, можно поискать, как принудительно заставить в initramfs включить cryptsetup. Поиск пестрит рецептами, один другого страшнее, от которых хочется выть: нечитаемые скрипты на много листингов и прочая машинерия. Наконец, находится (конечно же, не на официальной странице, где оно должно быть, а у кого-то любителя в заметке):
Чудесно, просто опупеть, как чудесно. Не трудно видеть, что в этой конфигурации, по такой логике, cryptsetup в initramfs ну вообще не нужен! Кто же такой умный? А там и пояснение в конце:
Судя по гуглу, grub-update/install не пересоздают initramfs, для этого надо то ли dpkg-reconfigure linux-image-... сделать, то ли update-initramfs -u -v перед собственно grub-install. Кстати, вместо извращений с распаковкой initrd для проверки, есть удобная тулза lsinitramfs. Можно пробовать. Я только одно не понял: почему в случае с lilo так нужный cryptsetup всё-таки попал в initramfs.
Продолжение следует.
Да, правы. Во всяком случае, меню инсталлятора всё показывает, хотя LVM- и LUKS-разделы были созданы ранее вручную. Правда, до конца не ясно, скажется ли это на чём-то, когда он захочет сгенерить initramfs [т.е. всё равно ли инсталлятору, как создавались разделы/устройства (в консоли или через меню) или нет, обращает ли он на это внимание при генерации содержимого /boot?].
Нет, всё не так. Собственно, эта страница по ссылке и есть данного автора — он только задекларировал имеющийся статус-кво, а вот кто его таким сделал — этот вопрос остаётся открытым.
Не помогает, как ни извращайся: ни 'y', ни y, ни Y. Пришлось похачить систему, явно её обманывая — указать, что своп шифруется якобы LUKS'ом, да ещё и статическим ключом: в /etc/crypttab вместо имеющегося
прописывается
После этого надо подключить этот «swap», чтобы в /dev/mapper появилось устройство — initramfs при создании лезет туда и проверяет, какие у него параметры и что (какие криптомодули) нужно положить к себе в initramfs.
Ещё бесит номенклатура: такое впечатление, что у загрузчика есть конечная глубина проверок, и имена конструируются в виде VolumeGroup-LogicalVolume_crypt, хотя можно адресовать напрямую (такое имя — симлинк). Соответственно, когда уровней вложенности много (LUKS в LVM в другом LUKS ещё в одном LVM), все эти чёрточки и подчёркивания перестают однозначно указывать на то, где искать нужное устройство, и из-за этого лезут глюки. Может быть, я всё неправильно понял, но впечатления таковы.
Короче, после этого всё взлетает и грузится, хотя сделано грязно, надо как-то иначе. Перед тем, как выпасть в шелл, initramfs очень долго шарится по дискам и опрашивает их, пытаясь найти устройство для root-ФС. Интересно, можно ли его проинструктировать не заниматься этим?
Теперь всё прошло нормально, даже Xen установился и гипревизор грузится, dom-0 работает.
С графикой что-то странное. xdm стартует прекрасно, но только на одном дисплее. Запустить два xdm'а не получается никак: если Xservers отредактировать, добавив ещё одну строку, не запускается ни один (хорошо, что хоть система при этом намертво не завешивается). Однако, если запускаем один xdm, он легко запускается на любом дисплее.
Тем не менее, несмотря на такие глюки, вручную через xinit с текстовой консоли дополнительные X-сервера на других дисплеях запускаются без проблем. Интересно, можно ли xdm так же принудительно запустить с консоли на других дисплеях? Как ни экспериментировал, не получилось. В старых ОС на точно таких же конфигах всё работает наура.
systemd тоже. ☺ Можно, наверно, его удалить, в других ссылках были инструкции на эту тему (смена загрузки с systemd на System V). Какая загрузка используется по умолчанию — непонятно. /etc/init.d/xdm start работает, /etc/rc?.d/ в системе тоже присутствуют.
Вспомнил, что на старой системе на таком же железе было так: с Xen'ом не запускалось никак, а без него запускалось только с nomodeset, передаваемом ядру. Думаю, дай проверю, как теперь тут, на новом ядре. Итоги: с nomodeset графика с Xen вообще не запускается; без Xen запускается, но больше одного xdm'а по-прежнему не запустить, и принудительный старт графики на иных дисплеях через xinit продолжает работать.
Можно, хак найден: дописать rootdelay=0 к опциям загрузки. Он тогда практически моментально выбрасывается в шелл, что нам и нужно (всё равно автоматикой там ничего толком не цепляется).
Хак грязный, хотелось бы почистить.
Для начала поэкспериментировал с указанием опции загрузчику на лету. Так, чтобы после указания всё начинало цепляться автоматически, не происходит. Однако, самый верхний уровень шифрования действительно можно сделать автоматикой — для этого дописываем
Это всё меня натолкнуло на мысли создать правильный crypttab — вдруг после этого всё заработает вообще автоматически? Структура, как выше сказано, такая:
plainOpen[LUKS{VG1( LV1,1( LUKS[VG2( LV2,1(root), LV2,2(usr), ... )] , ... ))}]
Зелёным помечено то, что, похоже, initramfs способен понять из коробки. Всё остальное — только через кастомные скрипты, если кто-то готов их писать. Казалось бы, если он готов раскручивать LVM, когда встречает его внутри «матрёшки», то всё должно отрабатывать, но этого почему-то не происходит, причины неизвестны. Тестировался вот такой crypttab:
Фиктивный swap убрал c /etc/fstab и даже убил соответствующее LUKS- и LV-устройство принудительно, однако, после
Кстати, до сих пор не пойму, почему Debian всегда якобы 2 разных ядра ставит, в /boot 2 разных initrd и т.д.
Хорошая новость в том, что тесты убедительно показывают: initramfs'у совершенно пофигу на то, в какие глубины матрёшки запрятана соответствующая VG с рутовой ФС. Пока вы до неё добираетесь, можно назначать любые имена LVM'ам и LUKS-устройствам, это ни на что не повлияет. Чтобы не бояться обновлений, проделал на этой основе способ создания бэкапа: создаём такую же точно структуру на другом диске, но внутренний LUKS, содержащий VG с системой, побайтово копируем туда через dd if=/dev/VG/LV of=/dev/VG2/LV2 (LV2 перед этим создаём точно такого же размера). И всё работает, грузится и взлетает. Можно было бы сделать и через копирование файловых систем, но не хочется разруливать конфликты с несовпадающими UUID'ами, именами volume groups, logical volumes и т.д.
С отсутствием cryptsetup'а в initramfs можно бороться на лету. Если хуки или критерии не срабатывают (сделали update-initramfs -k all -u), тут же редактируем всё снова — lsinitramfs /boot/initrd-... | grep cryptsetup показывает, попал он туда или нет.
Не знаю, кстати, были ли она там когда-то или нет, но в моей версии man initramfs.conf опции CRYPTSETUP не числится.
комментариев: 9796 документов: 488 редакций: 5664
Есть /etc/initramfs-tools. Там нужно в подкаталоги в соответствии с их структурой поместить всё, что нужно, поправить там конфиги. Разумеется, на изучение всего этого и на эксперименты нужно потратить достаточно времени, зато потом всё будет работать как часы и можно забыть этот напильник на многие годы.
Затем командой update-initramfs -u все обновления попадут в initrd. И так будет происходить при соответствующих апдейтах системы автоматически.
Может ещё где-то что-то нужно конфигурировать для поддержания initrd, сходу не помню.
Можно попросить туда положить загрузчик TrueCrypt?