- PVSM.RU - https://www.pvsm.ru -
Если на вашем IoT-шлюзе установлена операционная система с поддержкой SRM, каждый RPM-пакет, перед инсталляцией, нужно подписывать, даже если IMA-безопасность не используется. Из этого материала вы узнаете о том, как подписывать и устанавливать RPM-пакеты в операционных системах шлюзов с включенным и выключенным SRM.

То, о чём мы здесь расскажем, применимо к IoT-шлюзам Intel, основанным на процессорах Intel Atom, Intel Core и Intel Quark. Освоив это руководство, вы научитесь работать с RPM-пакетами. А именно, подписывать их, устанавливать, деинсталлировать. Так же мы рассмотрим сборку ОС для шлюзов и работу с ключами.
Ожидается, что читатель этого материала обладает следующими знаниями и навыками:
Здесь, под термином «шлюз» мы будем понимать «Шлюз Intel для Интернета вещей» («Intel IoT Gateway»). «Компьютер» – это Linux-система (предпочтительно – с Ubuntu 14.0.4 Base), которая используется для разработки приложений, предназначенных для шлюзов.
Так будут выделены команды, названия API, параметры, имена обычных и исполняемых файлов, пути в файловой системе.
Полужирный шрифт применяется для выделения упоминаний элементов пользовательского интерфейса, экранных кнопок и названий клавиш на клавиатуре.
Блоки текста, выделенные таким шрифтом – это команды, которые вам нужно будет ввести с клавиатуры или добавить в файл скрипта.
А так выделены блоки текста, демонстрирующие реакцию системы на выполнение скрипта или исполнение команды, введённой с клавиатуры.
Для того, чтобы испытать на практике то, о чём пойдёт речь, у вас должен быть подготовленный к работе шлюз [1]. На компьютере должна быть развёрнута среда разработки Wind River [2].
Рассмотрим, как собрать и установить на шлюзе операционную систему с включенной функцией безопасности (SRM). Когда безопасность включена, перед установкой RPM-пакетов на шлюз их нужно подписывать. Для начала модифицируем скрипт конфигурации операционной системы шлюза.
Включите в него это:
--with-layer=wr-ima-appraise
--without-layer=wr-mcafee
Найдите и удалите следующее:
wr-ima-appraise из выражения --without-layer=.
wr-mcafee из выражения --with-layer=.
Теперь соберём операционную систему шлюза. Для этого в папке $HOME/Projects нужно выполнить такую команду:
make fs
Обратите внимание на то, что на выполнение команды, которая собирает образ операционной системы для установки на шлюз, может потребоваться несколько часов. Всё зависит от мощности компьютера, который применяется для разработки.
Скопируем собранный образ на загрузочный флэш-диск. Его ёмкость должна быть, как минимум, 4 Гб. При этом учитывайте, что при записи образа ОС все данные с диска будут удалены.
ls /dev/sd?
ls /dev/sd?
Вот, как выглядит выполнение вышеописанной последовательности действий.

Вывод списка устройств хранения данных, подключённых к компьютеру
На следующем шаге вам понадобится знать имя USB-диска в системе. В нашем случае это — /dev/sdb.
cd $HOME/Project
Команда для шлюзов с процессором Intel Atom:
sudo ./deploy.sh -u -f export/intel-baytrail-64-idp-idp-dist.tar.bz2 -d /dev/??? -y; sync
Команда для шлюзов с процессором Intel Core:
sudo ./deploy.sh -u -f export/intel-haswell-64-idp-idp-dist.tar.bz2 -d /dev/??? -y; sync
Команда для шлюзов с процессором Intel Quark:
sudo ./deploy.sh -u -f export/intel-quark-idp-idp-dist.tar.bz2 -d /dev/??? -y -u -b cross-hill; sync
/media/<username>/wr_usb_boot
sudo cp export/intel-baytrail-64-idp-idp-dist.tar.bz2 /media/<username>/wr_usb_boot/opt/; sync
Команда для шлюзов с процессором Intel Core:
sudo cp export/intel-haswell-64-idp-idp-dist.tar.bz2 /media/<username>/wr_usb_boot/opt/; sync
Команда для шлюзов с процессором Intel Quark:
sudo cp export/intel-quark-idp-idp-dist.tar.bz2 /media/<username>/wr_usb_boot/opt/; sync
Теперь установим операционную систему на шлюз. Обратите внимание на то, что перед загрузкой шлюза с флэш-диска нужно внести соответствующие изменения в BIOS. Здесь [1], в разделе «Appendix: Setup BIOS Boot from USB», можно найти подробности об этом. Когда шлюз будет готов к загрузке с внешнего носителя, выполните следующие шаги:
Команда для шлюзов с процессором Intel Atom и Intel Core:
tgt=/dev/sda /sbin/reset_media
Команда для шлюзов с процессором Intel Quark:
/sbin/reset_media
На вопрос Restore the boot media to its factory defaults ответьте yes. Установка может занять около 20 минут.
Если вы столкнётесь с сообщением об ошибке следующего содержания: ERROR: Unmount /dev/sda1 failed!, это означает, что шлюз не смог загрузиться с флэш-диска. Проверьте порядок загрузки и параметры UEFI для того, чтобы выяснить, является ли первым загрузочным устройством внешний накопитель.
poweroff
Создадим проект, который включает в себя незащищённый RPM-пакет. Назовём его hello. Так как в этом пакете безопасность (SRM) отключена, его можно использовать для того, чтобы поэкспериментировать с подписями.
Следующие действия нужно выполнить на компьютере.
mkdir -p $HOME/project_nosrm
cd $HOME/project_nosrm
Команда для шлюзов с процессором Intel Atom:
$HOME/WindRiver/wrlinux-7/wrlinux/configure --enable-addons=wr-idp --enableboard=intel-baytrail-64 --enable-kernel=idp --enable-rootfs=idp --with-layer=wriot,wr-wks-oneagent-oma-dm-ia --with-template=feature/recovery,feature/openjdkbin,feature/realtek --without-layer=wr-srm
Команда для шлюзов с процессором Intel Core:
$HOME/WindRiver/wrlinux-7/wrlinux/configure --enable-addons=wr-idp --enableboard=intel-haswell-64 --enable-kernel=idp --enable-rootfs=idp --with-layer=wriot,wr-wks-oneagent-oma-dm-ia --with-template=feature/recovery,feature/openjdkbin,feature/realtek --without-layer=wr-srm
Команда для шлюзов с процессором Intel Quark:
$HOME/WindRiver/wrlinux-7/wrlinux/configure --enable-addons=wr-idp --enableboard=intel-quark --enable-kernel=idp --enable-rootfs=idp --with-layer=wr-iot,wrwks-oneagent-oma-dm-ia --with-template=feature/recovery,feature/openjdkbin,feature/realtek --without-layer=wr-srm
make -C build hello
Пакет будет собран и сохранён.
cd $HOME/project_nosrm/bitbake_build/
find . -name hello*.rpm
Запишите то, что удалось узнать. Эти сведения понадобятся нам в следующем разделе. Там мы скопируем пакет hello в три папки и разберёмся с тем, как правильно подписывать пакеты.
Создадим три папки, в которые нужно будет скопировать пакет hello. В одну из них поместим ключи, которые нужны для того, чтобы подписать пакет. Мы, в учебных целях, рассмотрим не только правильный способ подписывания и установки пакетов, но и неправильный.
Следующие действия нужно выполнить на компьютере.
cd $HOME/project_nosrm/
mkdir rpmtest
mkdir rpmtest/notsigned
mkdir rpmtest/badkeys
mkdir rpmtest/goodkeys
cp $HOME/Project/bitbake_build/tmp/deploy/[RMP directory]/[hello file].rpm rpmtest/notsigned
cp $HOME/Project/bitbake_build/tmp/deploy/[RMP directory]/[hello file].rpm rpmtest/badkeys
cp $HOME/Project/bitbake_build/tmp/deploy/[RMP directory]/[hello file].rpm rpmtest/goodkeys
cp $HOME/Project/layers/wr-idp/wr-srm/files/keys/*.pem rpmtest/goodkeys
ls -1 rpmtest/goodkeys
Если всё сделано так, как нужно, она должна выдать следующий список файлов:
[hello file].rpm
owner-cert.pem
owner-private.pem
vendor-cert.pem
vendor-private.pem
В итоге, на данном этапе у вас должно получиться следующее:
— Папки notsigned и badkeys содержат пакет hello, но файлов с ключами в них нет.
— Папка goodkeys содержит пакет hello и правильные файлы ключей. При этом пакет пока не подписан.
В разделе «SRM в операционной системе шлюза» были созданы ключи, которые подходят для подписывания RPM-пакетов. В предыдущем разделе мы скопировали эти ключи и пакет hello в папку $HOME/project_nonsrm/rpmtest/goodkeys.
Сейчас создадим собственный набор ключей, которые поместим в папку badkeys. И, хотя эти ключи являются вполне нормальными, они не подходят для подписывания пакета, поэтому мы считаем их «неправильными». Цель создания этих ключей заключается в том, чтобы вы увидели, что произойдёт, если воспользоваться неподходящими ключами для подписывания пакета.
Следующие действия нужно выполнить на компьютере.
cd $HOME/project_nonsrm/rpmtest
ln -s $HOME/Project/SST SST
./SST create-key --role=owner --name=badowner --output-dir=./badkeys/
./SST create-key --role=vendor --issuer=badowner --name=badvendor --output-dir=./
badkeys
badowner-cert.pem
badowner-private.pem
badvendor-cert.pem
badvendor-private.pem
[hello file].rpm
Вот, что теперь у нас есть:
— Пакет hello и ключи, подходящие для его подписывания в папке goodkeys.
— Пакет hello и неподходящие ключи в папке badkeys.
— Пакет hello в папке notsigned без каких-либо ключей.
Наш пакет всё ещё не подписан, займёмся этим в следующем разделе.
Пакеты подписывают закрытым ключом поставщика, и, когда пакет устанавливают на шлюз, вместе с ними устанавливается и ключ vendor-cert.pem. Он используется для проверки подписи. Сейчас мы, с помощью команды SST sign-rpm, подпишем пакеты, расположенные в папках с неподходящими и подходящими ключами.
cd $HOME/project_nosrm/rpmtest/badkeys
../SST sign-rpm --mode=rpm --priv-key=badvendor-private.pem ./[hello file].rpm
cd $HOME/project_nosrm/rpmtest/goodkeys
../SST sign-rpm --mode=rpm --priv-key=badvendor-private.pem ./[hello file].rpm
cd $HOME/project_nosrm/rpmtest
rm SST
— Пакет hello, подписанный подходящим ключом в папке goodkeys.
— Пакет hello, подписанный неподходящим ключом в папке badkeys.
— Неподписанный пакет hello в папке notsigned.
Поместите все три папки в tar-архив и скопируйте его на USB-диск. В данном примере USB-диск смонтирован как /media/rpmflash. Отредактируйте команды, приведённые ниже, в соответствии с тем, как диск отображается в вашей системе.
cd $HOME/project_nosrm
tar czvf rpmtest.tar.gz rpmtest
cp rpmtest.tar.gz /media/rpmflash
cd root
cp /media/sdb1/rpmtest.tar.gz /root
tar xzvf rpmtest.tar.gz
cd rpmtest
find . -name hello* -exec md5sum {} ;
То, что получится у вас, будет похоже на вывод, показанный ниже, но сигнатуры будут другими. Самое главное – проверьте, чтобы все они были разными.
2430f938a6f96a0eeff2459ccb7b4ee8 ./badkeys/[hello file].rpm
0f631d629b8a7aa4c8e86ee13bdb9cfb ./notsigned/[hello file].rpm
a83507c6f5b1eeec49b034a2aae44968 ./goodkeys[hello file].rpm
Рассмотрим установку пакетов на шлюз. Напомним, что в учебных целях мы пытаемся установить следующие пакеты:
Эти действия нужно выполнять на шлюзе.
cd /root/rpmtest/notsigned
rpm -ivh [hello file].rpm
В результате выполнения этой команды будет выведено сообщение об ошибке:
RPM [hello file].rpm is not signed with extend openssl signature
cd /root/rpmtest/badkeys
rpm -ivh [hello file].rpm
На выходе снова получаем сообщение об ошибке, но уже другого содержания:
MD5 Code:e91148db3dd3a5e0bdb76ea5a8fa8e34
Can not find the right certificate for RPM [hello file].rpm
cd /root/rpmtest/goodkeys
rpm -ivh [hello file].rpm
В данном случае перед нами – сообщение об успешной установке.
MD5 Code:e91148db3dd3a5e0bdb76ea5a8fa8e34
Find right certificate: vendor-cert.pem
Certificate vendor-cert.pem is verified successfully
RPM package [hello file].rpm is verified successfully
Preparing… ########################################### [100%]
1:hello ########################################### [100%]
Import IMA signatures successfully Update IMA signatures successfully
Выше мы успешно установили правильно подписанный пакет. Теперь удалим его.
rpm -qa | grep hello
Эта команда выведет имя пакета, что указывает на то, что он установлен.
rpm -e hello
rpm -qa | grep hello
hello
Как и следовало ожидать, появилось сообщение об ошибке:
-sh: hello: command not found
Рассмотрим методы работы с сертификатами на шлюзе.
imtools --listcert
Она сообщит сертификате, который был скопирован в папку $HOME/project_nosrm/rpmtest/goodkeys в разделе «Копии пакета и правильный ключ».
vendor-cert.pem
imtools --removecert vendor-cert.pem
На выходе будет такое сообщение:
Remove certificate vendor-cert.pem successfully
imtools –listcert
Так как сертификат удалён, в результате выполнения команды ничего выведено не будет.
cd /root/rpmtest/goodkeys
imtools --verifycert vendor-cert.pem
Эта пара команд выведет сообщения об успешной проверке и установке сертификата:
Certificate vendor-cert.pem is verified successfully
Certificate vendor-cert.pem is installed successfully
Вот, что вы узнали, изучив этот материал:
Автор: Intel
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/blog-kompanii-intel/123222
Ссылки в тексте:
[1] подготовленный к работе шлюз: https://software.intel.com/en-us/SetupGateway-hardware
[2] среда разработки Wind River: https://software.intel.com/en-us/Setup-IDP-DevelopmentTools
[3] Источник: https://habrahabr.ru/post/301864/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.