Шлюзи Intel для інтернету речей: підписуємо і встановлюємо RPM-пакети

Якщо на вашому IoT-шлюзі встановлена операційна система з підтримкою SRM, кожен RPM-пакет, перед інсталяцією, потрібно підписувати, навіть якщо IMA-безпека не використовується. З цього матеріалу ви дізнаєтеся про те, як підписувати і встановлювати RPM-пакети в операційних системах шлюзів з включеним і з виключеним SRM.


Те, про що ми тут розповімо, застосовне до IoT-шлюзів Intel, заснованим на процесорах Intel Atom, Intel Core Intel Quark. Освоївши це керівництво, ви навчитеся працювати з RPM-пакетами. А саме, підписувати їх, встановлювати, деінсталювати. Так само ми розглянемо збірку ОС для шлюзів і роботу з ключами.

Очікується, що читач цього матеріалу володіє наступними знаннями та навичками:

  • Виконання команд Linux.
  • Створення, редагування, виконання скриптів.
  • Установка і настройка програмного забезпечення для Linux
  • Використання емулятора термінала, на зразок Putty, при наявності з'єднання між комп'ютерами по послідовному інтерфейсу.
Тут, під терміном «шлюз» ми будемо розуміти «Шлюз Intel для Інтернету речей» («Intel IoT Gateway»). «Комп'ютер» – це Linux-система (переважно – з Ubuntu 14.0.4 Base), яка використовується для розробки додатків, призначених для шлюзів.

Так будуть виділені команди, назви API, параметри, імена звичайних і виконуваних файлів, шляхи до файлової системи.

Жирний шрифт застосовується для виділення згадок елементів користувальницького інтерфейсу, екранних кнопок і назв клавіш на клавіатурі.

Блоки тексту, виділені таким шрифтом – це команди, які вам потрібно буде ввести з клавіатури або додати у файл скрипту.

А так виділені блоки тексту, що демонструють реакцію системи на виконання скрипту або виконання команди, введеної з клавіатури.

Для того, щоб випробувати на практиці те, про що піде мова, у вас повинен бути підготовлений до роботи шлюз. На комп'ютері повинна бути розгорнута середовище розробки Wind River.

SRM в операційній системі шлюзу
Розглянемо, як зібрати і встановити на шлюзі операційну систему з включеною функцією безпеки (SRM). Коли безпека включена, перед установкою RPM-пакетів на шлюз їх потрібно підписувати. Для початку модифікуємо скрипт конфігурації операційної системи шлюзу.

  1. При установці середовища розробки на комп'ютер був створений скрипт config.sh, який розташований в теці $HOME/Project. Відредагуйте цей скрипт наступним чином:

    Включіть в нього це:

    --with-layer=wr-ima-appraise
    --without-layer=wr-mcafee

    Знайдіть і видаліть наступне:

    wr-ima-appraise з виразу --without-layer=.
    wr-mcafee з виразу --with-layer=.

  2. Збережіть і закрийте файл config.sh

  3. Запустіть config.sh
Тепер зберемо операційну систему шлюзу. Для цього в теці $HOME/Projects потрібно виконати таку команду:

make fs

Зверніть увагу на те, що на виконання команди, яка збирає образ операційної системи для установки на шлюз, може знадобитися кілька годин. Все залежить від потужності комп'ютера, який застосовується для розробки.

Переносимо образу ОС на флеш-диск
Скопіюємо зібраний образ на завантажувальний флеш-диск. Його ємність повинна бути, як мінімум, 4 Гб. При цьому враховуйте, що при запису образу ОС всі дані з диска будуть видалені.

  1. Виведіть список накопичувачів комп'ютера:

    ls /dev/sd?

  2. Підключіть USB-диск до комп'ютера.

  3. Знову виконайте команду з кроку №1 і порівняти її результати з тими, що були отримані до підключення диска. Потрібно це для того, щоб визначити, як у системі з'являється новий флеш-диск:

    ls /dev/sd?

    Ось, як виглядає виконання вищеописаної послідовністю дій.


    Висновок список пристроїв зберігання даних, підключених до комп'ютера

    На наступному кроці вам знадобиться знати ім'я USB-диска в системі. У нашому випадку це /dev/sdb.

  4. виберіть папку $HOME/Project:

    cd $HOME/Project

  5. Розкрийте образ ОС шлюзу на USB-диску. Скомпільований файл операційної системи має ім'я, відповідне типу процесора шлюзу. Використовуйте команду, відповідну для того шлюзу, на який планується встановити ОС, при цьому замініть ??? на ім'я флеш-диска, з'ясований вище. Запис образу займає близько 15 хвилин.

    Команда для шлюзів з процесором 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
    

  6. Якщо буде потрібно, введіть пароль і натисніть OK. Коли ви побачите повідомлення DONE!, це буде означати, що завантажувальний USB-диск створений.

  7. Вимкніть диск від комп'ютера і підключіть його знову. Він, після монтування, буде виглядати як два розділи, один з яких доступний за адресою

    /media/<username>/wr_usb_boot
    

  8. Скопіюйте файл образу операційної системи шлюзу на флеш-диск за допомогою відповідної команди. При цьому, замініть username на ім'я користувача, під яким працюєте в Linux.
    Команда для шлюзів з процесором Intel Atom:

    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
    

  9. Вимкніть флеш-диск від комп'ютера
Встановлюємо ОС на шлюз
Тепер встановимо операційну систему на шлюз. Зверніть увагу на те, що перед завантаженням шлюзу з флеш-диска потрібно внести відповідні зміни в BIOS. Тут, в розділі «Appendix: Setup BIOS Boot from USB», можна знайти подробиці про це. Коли шлюз буде готовий до завантаження з зовнішнього носія, виконайте наступні кроки:

  1. Відключіть живлення шлюзу, підключіть до нього USB-диск і увімкніть живлення. Увійдіть у систему з ім'ям користувача root і таким же паролем.

  2. Виберіть операційну систему на шлюз з допомогою відповідної команди:

    Команда для шлюзів з процесором 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 для того, щоб з'ясувати, чи є першим завантажувальним пристроєм зовнішній накопичувач.

  3. Повідомлення DONE! означатиме, що установка ОС завершена. Вимкніть шлюз такою командою:

    poweroff
    

  4. Відключіть USB-накопичувач від шлюзу і увімкніть живлення пристрою.
    Якщо на даному етапі ви зіткнетеся з повідомленням про помилку, наприклад, з таким: Reboot and select proper boot device, перевірте налаштування BIOS шлюзу. А саме, потрібно, щоб на першому місці в списку завантаження був вбудований накопичувач.

  5. Увійдіть у систему, використавши в якості імені користувача і пароля, root.
Збираємо незахищений RPM-пакет
Створимо проект, який включає в себе незахищений RPM-пакет. Назвемо його hello. Так як в цьому пакеті безпека (SRM) відключена, його можна використовувати для того, щоб поекспериментувати з підписами.

Такі дії потрібно виконати на комп'ютері.

  1. Створіть директорію для проекту:

    mkdir -p $HOME/project_nosrm
    cd $HOME/project_nosrm
    


  2. Виберіть відповідну команду шлюзу, якими користуєтеся, і, скопіювавши її командного рядка Linux, виконаєте. Це налаштує середовище розробки на складання навчального пакета без SRM.

    Команда для шлюзів з процесором 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
    


  3. Зберіть пакет hello:

    make -C build hello
    

    Пакет буде зібрано та збережено.

  4. Точне ім'я папки і файлу пакету буде відрізнятися в залежності від шлюзу, для якого цей пакет готувався. З'ясуйте ім'я і розташування пакету, зробити це можна так:

    cd $HOME/project_nosrm/bitbake_build/
    find . -name hello*.rpm
    

    Запишіть те, що вдалося дізнатися. Ці відомості знадобляться нам в наступному розділі. Там ми скопіюємо пакет hello в три папки та розберемося з тим, як правильно підписувати пакети.
Копії пакета і правильний ключ
Створимо три папки, які потрібно буде скопіювати пакет hello. В одну з них помістимо ключі, які потрібні для того, щоб підписати пакет. Ми, в навчальних цілях, розглянемо не тільки правильний спосіб підписування і встановлення пакетів, але і неправильний.

Такі дії потрібно виконати на комп'ютері.

  1. Створіть директорії, які будуть використовуватися для експериментів з підписаним, підписаним і неправильно підписаним пакетом. У них, відповідно, будуть такі імена: goodkeys, notsigned, badkeys. А розташовуватися вони будуть в папці rpmtest.

    cd $HOME/project_nosrm/
    mkdir rpmtest
    mkdir rpmtest/notsigned
    mkdir rpmtest/badkeys
    mkdir rpmtest/goodkeys
    

  2. Скопіюйте непідписаний пакет hello в кожну з папок. Вводячи команди, замініть [RPM directory] і [hello file] на відповідні імена папки і файлу пакета з вашого проекту:

    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
    

  3. В результаті виконання операцій, описаних у розділі «SRM в операційній системі шлюзу», ви, крім іншого, створили правильні ключі (сертифікати), які підходять для того, щоб підписувати ними пакети. Скопіюйте ці ключі в папку goodkeys.

    cp $HOME/Project/layers/wr-idp/wr-srm/files/keys/*.pem rpmtest/goodkeys
    

  4. Перевірте, чи дійсно файли з ключами були скопійовані в папку. А саме, там повинно бути п'ять необхідних для подальшої роботи файлів: RPM-файл пакета, два ключа (сертифіката) власника (owner keys) та два ключа постачальника (vendor keys). Виконайте таку команду:

    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. І, хоча ці ключі є цілком нормальними, вони не підходять для підписання пакету, тому ми вважаємо їх «неправильними». Мета створення цих ключів полягає в тому, щоб ви побачили, що станеться, якщо скористатися невідповідними ключами для підписання пакету.

Такі дії потрібно виконати на комп'ютері.

  1. Засіб для роботи з ключами знаходиться в папці проекту $HOME/Project, в якому використовується SRM. В папці проекту, в якому SRM не застосовується, створити символічне посилання на засіб для роботи з ключами:

    cd $HOME/project_nonsrm/rpmtest
    ln -s $HOME/Project/SST SST
    

  2. Створіть ключ власника і помістіть його в папку $HOME/project_nonsrm/rpmtest/badkeys. Цей цілком робочий ключ, але він не підходить для підписування RPM-пакету.

    ./SST create-key --role=owner --name=badowner --output-dir=./badkeys/
    

  3. Створіть ключ постачальника і помістіть його в ту ж папку:

    ./SST create-key --role=vendor --issuer=badowner --name=badvendor --output-dir=./
    badkeys
    

  4. Перевірте, чи містить папка $HOME/project_nonsrm/rpmtest/badkeys всі необхідні файли:
    ls -1 ./badkeys
    Якщо все зроблено правильно, команда видасть наступний список:

    badowner-cert.pem
    badowner-private.pem
    badvendor-cert.pem
    badvendor-private.pem
    [hello file].rpm


    Ось, що тепер у нас є:

    — Пакет hello і ключі, відповідні для його підписання в папці goodkeys.
    — Пакет hello і невідповідні ключі в папці badkeys.
    — Пакет hello в папці notsigned без будь-яких ключів.

    Наш пакет все ще не підписаний, займемося цим у наступному розділі.


Підписуємо RPM-пакет
Пакети підписують закритим ключем постачальника, і, коли пакет встановлюють на шлюз, разом з ними встановлюється і ключ vendor-cert.pem. Він використовується для перевірки підпису. Зараз ми, з допомогою команди SST sign-rpm, підпишемо пакети, розташовані в папках з невідповідними і відповідними ключами.

  1. виберіть папку, яка містить пакет і невідповідні ключі:

    cd $HOME/project_nosrm/rpmtest/badkeys
    

  2. Підпишіть пакет hello, який знаходиться в цій папці, з допомогою невідповідного ключа, замінивши в команді, наведеній нижче, [hello file] ім'я файлу пакету:

    ../SST sign-rpm --mode=rpm --priv-key=badvendor-private.pem ./[hello file].rpm
    

  3. Перейдіть в папку з відповідними ключами:

    cd $HOME/project_nosrm/rpmtest/goodkeys
    

  4. Підпишіть з їх допомогою пакет, що знаходиться в тій же папці:

    ../SST sign-rpm --mode=rpm --priv-key=badvendor-private.pem ./[hello file].rpm
    

  5. Так як символьне посилання на засіб для роботи з ключами більше не потрібна, видаліть її.

    cd $HOME/project_nosrm/rpmtest
    rm SST
    

  6. Підключіть до комп'ютера USB-диск.

  7. На даному етапі є наступні файли і папки:

    — Пакет 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
    

  8. Размонтіруйте USB-диск, відключіть його від комп'ютера і підключіть до USB-порту шлюзу.

  9. Скопіюйте файл rpmtest.tar.gz на накопичувач шлюзу і розпакуйте архів в тій же директорії, куди скопіювали його. В даному прикладі USB-диск змонтований як /media/sdb1, змініть команду так, щоб вона відповідала станом вашого шлюзу:

    cd root
    cp /media/sdb1/rpmtest.tar.gz /root
    tar xzvf rpmtest.tar.gz
    

  10. Перевірте MD5-сигнатури пакетів:

    cd rpmtest
    find . -name hello* -exec md5sum {} \;
    

    Те, що вийде у вас, буде схоже на висновок, що показаний нижче, але сигнатури будуть іншими. Найголовніше – перевірте, щоб всі вони були різними.

    2430f938a6f96a0eeff2459ccb7b4ee8 ./badkeys/[hello file].rpm
    0f631d629b8a7aa4c8e86ee13bdb9cfb ./notsigned/[hello file].rpm
    a83507c6f5b1eeec49b034a2aae44968 ./goodkeys[hello file].rpm


Встановлюємо пакети
Розглянемо установку пакетів на шлюз. Нагадаємо, що в навчальних цілях ми намагаємося встановити наступні пакети:

  • Непідписаний пакет.
  • Пакет, підписаний неправильним ключем.
  • Пакет, підписаний правильним ключем.
Ці дії потрібно виконувати на шлюзі.

  1. Спробуйте встановити непідписаний пакет, замінивши [hello file], на те ім'я, яке дано вашого файлу:

    cd /root/rpmtest/notsigned
    rpm -ivh [hello file].rpm
    

    В результаті виконання цієї команди буде виведено повідомлення про помилку:
    RPM [hello file].rpm is not signed with extend openssl signature

  2. Спробуйте інсталювати пакет, який підписаний невірним ключем. Так само, як і в першому пункті, використовуйте в команді ім'я .rpm-файлу:

    cd /root/rpmtest/badkeys
    rpm -ivh [hello file].rpm
    

    На виході знову отримуємо повідомлення про помилку, але вже іншого змісту:

    MD5 Code:e91148db3dd3a5e0bdb76ea5a8fa8e34
    Can not find the right certificate for RPM [hello file].rpm


  3. Тепер встановіть правильно підписаний пакет.

    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


  4. Протестуйте встановлений пакет:
    hello
    Якщо програма була успішно виконана, ось що вона виведе:
    Hello World


Деинсталлируем пакети
Вище ми успішно встановили правильно підписаний пакет. Тепер видалимо його.

  1. Перевіримо, чи інстальовано пакет hello. У попередньому розділі ми перевіряли це, запускаючи програму, тут вчинимо інакше:

    rpm -qa | grep hello
    

    Ця команда виведе ім'я пакета, що вказує на те, що він встановлений.

  2. Видалимо пакет:

    rpm -e hello
    

  3. Перевіримо, чи дійсно пакет вилучений:

    rpm -qa | grep hello
    hello
    

    Як і слід було очікувати, з'явилося повідомлення про помилку:
    -sh: hello: command not found
Сертифікати: отримуємо відомості, видаляємо і встановлюємо
Розглянемо методи роботи з сертифікатами на шлюзі.

  1. Виконайте команду, яка виведе список сертифікатів:

    imtools --listcert
    

    Вона повідомить сертифікаті, який був скопійований в папку $HOME/project_nosrm/rpmtest/goodkeys у розділі «Копії пакета і правильний ключ».
    vendor-cert.pem

  2. Видаліть сертифікат:
    imtools --removecert vendor-cert.pem
    

    На виході буде таке повідомлення:
    Remove certificate vendor-cert.pem successfully

  3. Знову виведіть список сертифікатів для того, щоб перевірити, чи дійсно сертифікат був вилучений:

    imtools –listcert
    

    Так як сертифікат видалений, у результаті виконання команди нічого не буде виведено.

  4. Перевірте, чи можна встановити сертифікат з папки $HOME/project_nosrm/rpmtest/goodkeys. Якщо це так, встановіть його.

    cd /root/rpmtest/goodkeys 
    imtools --verifycert vendor-cert.pem
    

    Ця пара команд виведе повідомлення про успішну перевірку та встановлення сертифіката:

    Certificate vendor-cert.pem is verified successfully
    Certificate vendor-cert.pem is installed successfully
Підсумки
Ось, що ви дізналися, вивчивши цей матеріал:

  • Як включати підтримку SRM на шлюзі.
  • Як створювати проект для підготовки RPM-пакету з відключеним SRM для цілей тестування.
  • Як створити підписаний, непідписаний і підписаний неправильно пакети для того, щоб перевірити реакцію ОС шлюзу на установку таких пактів.
  • Як інсталювати і деінсталювати пакети на шлюз.
  • Як переглядати, додавати та видаляти сертифікати на шлюзі.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.