Данная статья предназначена в первую очередь для разработчиков, чьи программные продукты должны работать на компьютерах под управлением ОС Astra Linux Special Edition в условиях применения Замкнутой Программной Среды (ЗПС). Для того, чтобы ЗПС позволила запуск добавляемых разработчиками файлов (исполняемых файлов и библиотек), эти файлы должны быть подписаны. Далее описывается процедура подписывания файлов.

См. также статью Инструменты для выполнения подписания файлов DLL и проверки подписи.


Данная статья применима к:

  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)

  • Astra Linux Special Edition РУСБ.10015-16 исп. 1 и исп. 2

  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.5)
  • Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)

  • Astra Linux Common Edition 2.12

Подготовительные действия

Все действия осуществляются от имени непривилегированного пользователя, если не указано иное.

Далее в статье:

  • Название организации принято за ORG;
  • Предполагается, что подписываемый файл test_elf находится в том же каталоге, что и ключи, используемые для подписания.
  • Ознакомиться с разделом 16. ОГРАНИЧЕНИЕ ПРОГРАММНОЙ СРЕДЫ документации "Руководство по КСЗ. Часть 1 РУСБ.10015-01 97 01-1";
  • Изучить программную документацию:
    • man bsign;
    • man gpg.
  • Изучить дополнительные информационные материалы

  • Убедиться в наличии и доступности комплекта ключей. Ключи могут быть:
    • Получены от ООО "РусБИТех-Астра" (далее - изготовитель) по запросу. Это ключи, подписанные ключами изготовителя. См. статью Как получить ключи для подписи СПО.
      • Эти ключи могут использоваться для проверки всех типов подписей.
    • Созданы самостоятельно (самоподписанные ключи).
      • Эти ключи не могут использоваться для проверки встраиваемых подписей.
      • Эти ключи могут использоваться для проверки подписей в расширенных атрибутах и, в обновлениях начиная с Astra Linux Special Edition 1.8, отсоединенных подписей.
      • Наличие подписи изготовителя в этих ключах не проверяется.

Импорт ключей, полученных от изготовителя

  • Если комплект ключей получен в виде ISO-образа - примонтировать этот образ. Если комплект ключей получен в виде архива — распаковать архив.

    При работе с ключами соблюдать меры безопасности для предотвращения несанкционированного доступа к секретному ключу и паролю и предотвращению утери секретного ключа.

    Модуль gpg и модуль digsig_verif - абсолютно не связаны и независимы. Список импортированных ключей в gpg никак не влияет на проверку исполняемых файлов при включении режима замкнутой программной среды (ЗПС).

  • Импортировать в таблицу ключей пользователя секретный ключ.

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

    Для импорта ключей:

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

      gpg --import /etc/digsig/primary_key_2018.gpg
      gpg --import /etc/digsig/partners_rbt_root_key_2018.gpg

    • Перейти в каталог с полученными ключами и импортировать ключи из полученного комплекта ключей. Для выполнения операции импорта понадобится указать пароль. В Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.5) запрос пароля не производится. Пароль находится в этом же каталоге в файле ORG_password.txt. Будьте аккуратны при копировании в буфер обмена — символ перевода строки будет распознан соответственно. Во избежание ошибок при вводе пароля рекомендуется указать файл с паролем с помощью опции при выполнении команды импорта:

      gpg --import --pinentry-mode=loopback --passphrase-file=ORG_password.txt ORG_secret.gpg

      В примере выше опция --passphrase-file позволяет не запрашивать пароль, а прочитать его  из файла, указанного в этой опции.
    • Проверить список импортированных ключей и запомнить идентификатор ключа ORG_secret_key_id:

      gpg --list-secret-keys
      Идентификатор ключа в выводе команды представлен строкой из сорока шестнадцатиричных цифр (строкой из 8 символов и указывается через обратную косую черту ("слэш") после алгоритма в Astra Linux Special Edition 1.5).

Создание и регистрация самоподписанного ключа

  1. Для создания самоподписанных ключей:
    1. Создать файл с параметрами ключей, например:
      Key-Type:GOST_R34.10-2012
      %no-protection
      Name-Real:<название_организации>
      Name-Comment: No comments
      Name-Email: <адрес_электронной_почты>
    2. Выполнить генерацию ключей:
      gpg --gen-key --batch <имя_файла_с_параметрами>
      При генерации будет создана пара из закрытого и открытого ключей. Закрытый ключ не подлежит распространению и используется для подписывания файлов. Копии открытого ключа распространяется для для проверки подписей, сделанных парным закрытым ключом.
  2. Регистрация самоподписанного ключа требуется на тех машинах, на которых будут проверяться подписи, сделанные этим ключом Для регистрации самоподписанного ключа:
    1. Экспортировать открытый ключ, сохранив его в файле:
      gpg --export "<название_организации>" > <название_организации>.gpg
    2. Опционально: передать открытый ключ изготовителю для подписания и получить подписанный ключ.
    3. На всех машинах, на которых будет выполняться проверка подписи:
      1. Разместить копии файла с экспортированным (подписанным) ключом:
        1. Если ключ подписан изготовителем, то в каталоге /etc/digsug/keys. Такой ключ может применяться для проверки всех типов подписей.
        2. Если ключ не подписан изготовителем, то в каталоге /etc/digsig/xattr_keys. Такой ключ не может применяться для проверки встраиваемых подписей, и может применяться для проверки подписей в расширенных атрибутах и, в обновлениях начиная с Astra Linux Special Edition 1.8, отсоединенных подписей.
      2. Если ЗПС была включена до размещения ключей, то:
        1. Зарегистрировать ключи в ядре:
          sudo update-initramfs --uk all
        2. Перезагрузить ОС.

Подписывание файлов

Для успешного запуска программ при включенной ЗПС подписаны должны быть не только исполняемые файлы приложений, но и используемые этими приложениями динамические библиотеки (файлы .so).
После выполнения подписывания следует в обязательном порядке тестировать работоспособность ПО. В случае выявления нарушения работы ПО (возможно для файлов с нестандартной структурой) использовать вместо встроенных подписей отсоединенные.

Доступные инструменты для подписывания файлов:

  • начиная с обновления Astra Linux Special Edition 1.8 — инструмент bsign-integrator;
  • инструмент bsign, применение которого описано далее;
  • инструменты bsign-dll и bsign-dot-net.

Доступные методы подписания файлов зависят от наличия ключей:

  • При наличии ключей подписанных изготовителем можно использовать все типы подписей.
  • При наличии только самоподписанных ключей можно использовать подписи в расширенных атрибутах и, начиная с обновления Astra Linux Special Edition 1.8, отсоединенные подписи.
    • При применении самоподписанных ключей для создания встраиваемой подписи подписание и проверка подписи командами bsign (bsign-integrator) выполняются без ошибок, однако в ЗПС такая не может быть проверена и работать не будет. Для создания встраиваемых подписей следует использовать только ключи, подписанные изготовителем.
    • Если инструменты подписывания отказываются подписывать файлы или подписывают файлы с ошибками, то для таких файлов следует использовать отсоединенную подпись. Такая ситуация возможна для файлов с нарушениями стандартов формата ELF.
      Одним из возможных симптомов некорректного подписания файла является уменьшение его размера в результате добавления подписи.

Для подписания файлов:

  • Архивы и пакеты (deb-файлы) необходимо предварительно распаковать для анализа содержащихся в них файлов.
  • Убедиться в пригодности файла для подписания, проверив его тип. Проверить тип файла можно с помощью команды file. Например, для файла /bin/bash:

    file /bin/bash

    /bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=30bada4dfa11f45a96a5993d4c2fd41a27a61663, stripped

    Для файла формата PE:
    file SampleRes.dll

    SampleRes.dll: PE32 executable (DLL) (console) Intel 80386, for MS Windows

    Если тип файла не ELF, то:

    • в Astra Linux Special Edition 1.8 для 
    • в Аstra Linux c установленным актуальным оперативным обновлением для подписания файлов формата PE можно использовать bsign, явно задавая тип подписи;
    • в более ранних обновлениях bsign может не поддерживать подписи для формата файлов PE, и в таких случаях следует использовать процедуру создания встраиваемой подписи из статьи Инструменты для выполнения подписания файлов DLL и проверки подписи;

    • для подписания файлов иных форматов следует использовать подписи в расширенных атрибутах и отсоединенные подписи.
  • Подписание тестового ELF-файла test_elf с помощью команды bsign:

    bsign -s test_elf
    Если тип подписи не указан явно (см. далее), то начиная с версии bsign 1.4.1 по умолчанию используется встраиваемая подпись (-E). В версиях 1.2.1 — 1.4.1 тип подписи автоматически определяется в зависимости от формата файла (ELF или PE). В более ранних обновлениях используется встраиваемая подпись и, в некоторых версиях, подпись в расширенных атрибутах.

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

    bsign -s --pgoptions="--default-key=ORG_secret_key_id" test_elf
    Для подписания файлов форматов отличных от ELF следует дополнительно указать опцию, определяющую тип подписи. См. ЗПС: инструмент bsign и ЗПС: инструмент bsign-integrator.

    При работе из командной строки без использования графической оболочки (например, при подключении через ssh или при работе в консоли), требуется использовать дополнительные опции, т.к. в этом случае не может быть выдан графический запрос на ввод пароля, и операция завершится ошибкой (сообщением о неверно введенном пароле). В таком случае можно:

    1. Сохранить пароль в файле (в примере ниже - в файле ORG_password.txt.
    2. Использовать команду bsign со следующими опциями:

      bsign -N -s --pgoptions="--batch --pinentry-mode=loopback --passphrase-file=ORG_password.txt --default-key=ORG_secret_key_id" test_elf
      где опция -N запрещает запрос пароля командой bsign, а значение опции --pgoptions предписывает использовать пароль, сохраненный в файле, без интерактивного запроса.

     

После того, как файл подписан, можно проверить подпись:

bsign -w test_elf
Для удобства подписания deb-пакетов, можно воспользоваться данной инструкцией.

Особенности создания отсоединенной подписи

Для создания отсоединенной опции с помощью команды bsign используется опция -D (–detached) этой команды:

bsign -s -D <имя_файла>

По умолчанию подпись создается в каталоге /etc/digsig/external_sig. Имя файла с подписью формируется как полный путь к подписываемому файлу в котором символы косая черта ("/") заменены символами коммерческое at ("@") и добавлено расширение ,sign. Например, для файла /home/user/detached_example полный путь к файлу будет /etc/digsig/external_sig/@home@user@detached_example.sign. Каталог /etc/digsig/external_sig по умолчанию недоступен непривилегированным пользователям. Чтобы разрешить в него запись можно использовать ACL, например:

sudo setfacl -m u:<имя_пользователя>:rwx /etc/digsig/external_sig
Несмотря на то, что название файла с отсоединенной подписью содержит полный путь к подписываемому файлу в момент создания подписи, результат проверки отсоединенной подписи не зависит от положения файла в момент проверки подписи.

Более удобным может быть использование явного указания каталога, в котором должна сохраняться создаваемая отсоединенная подпись, с помощью опции -T команды bsign. Например, для сохранения отсоединенных подписей в текущем каталоге:

bsign -s -D -T . <имя_файла>

Для того, чтобы отсоединенная подпись могла проверяться необходимо:

  1. Скопировать подпись в каталог /etc/digsig/external_sig/ на машине, на которой будет выполняться проверка.
  2. Загрузить подпись в ядро на машине, на которой будет выполняться проверка и перезагрузить ОС. Подробнее см. Ограничения программной среды в Astra Linux Special Edition x.8.

Запуск подписанных файлов на клиентских машинах

Далее под клиентской машиной подразумевается машина, на которой:

  1. Включен ЗПС.
  2. Используются подписанные файлы.

Машина, на которой выполняется подписывание файлов, в подавляющем большинстве случаев не является клиентской машиной. 

Для того, чтобы подписанные файлы могли использоваться на клиентских машинах при включенной ЗПС:

  • на клиентскую машину должны быть скопированы:
    • ключи для проверки подписей;
    • отсоединенные подписи, если они используются.
  • скопированные ключи и подписи загружены в ядро ОС клиентской машины.

Подробную информацию о настройке ЗПС на клиентских машинах см. в статье Ограничения программной среды в Astra Linux Special Edition x.8.