Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Информация
titleДанная статья применима к:
  • Astra Linux Special Edition РУСБ.10015-01 и РУСБ.10015-10 (очередное обновление 1.7)
  • Astra Linux Special Edition РУСБ.10152-02 (очередное обновление 4.7)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
  • Astra Linux Special Edition РУСБ.10015-16 исп. 1 и исп. 2
  • Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)
  • Astra Linux Common Edition 2.12



Информация

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

Это способ подписания может также применяться к файлам формата elf (исполняемые файлы и библиотеки Astra Linux). Для подписания таких файлов следует использовать опцию -R сценария.


Пакет bsign-aliens

Начиная с обновлений БЮЛЛЕТЕНЬ № 2023-0426SE17 (оперативное обновление 1.7.4) и БЮЛЛЕТЕНЬ № 2023-0727SE47 (оперативное обновление 4.7.4) в составе базового репозитория доступен пакет bsign-aliens.

Пакет предоставляет инструменты командной строки bsign-dll и bsign-dot-net, выполняющие подписание файлов .dll и .net соответственно.

Инструмент bsign-dll

Синтаксис команды для подписания dll файлов:

Command
bsign-dll [-h] [-p  <параметры>] [-R] [-w] <имя_файла_dll>.dll

Параметры команды:

  • -h, --help — показать подсказку по командам;
  • -p <параметры>, --pgoptions <параметры> — передать следующие параметры программе bsign;
  • -R, --replace —

Синтаксис вызова сценария:

Параметры вызова сценария:

  • -p, --pgoptions передать следующие параметры программе безопасности;
  • -R --replace -
    • заменить оригинальный DLL не изменяя его имя;
    • -w, --show-info — показать информацию о подписи;
    • -h - вывод краткой подсказки

    Инструмент bsign-dot-net


    Информация

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

    1. Перенести публичные ключи в каталог /etc/digsig/keys.
    2. Выполнить команду:

      Command
      sudo update-initramfs -u -k all


    3. Перезагрузить компьютер.

    Синтаксис команды для подписания dot-net файлов:

    Command
    bsign-dot-net [-h] [-p  <параметры>] <имя_файла>

    Параметры команды bsign-dot-net:

    • -h, --help — показать подсказку по командам;
    • -p, --pgoptions — передать следующие параметры программе bsign;

    Сценарий для выполнения подписания файлов DLL и проверки подписи

    Информация

    Далее предполагается, что:

    • Комплект ключей для подписи ПО уже получен. В ином случае требуется запросить такой комплект (см. Как получить ключи для подписи СПО).
    • Текст сценария скопирован в файл signdll.
    • ЗПС выключена, так как используемые сценарием  библиотеки Python ciffi и xattr устанавливаются из стороннего репозитория и не подписаны.
    • Для установки библиотек Python cffi и xattr настроен доступ в Интернет.

    Сценарий применим в обновлениях Astra Linux, не включающих в свой состав пакет bsigh-aliens (обновления, выпущенных до оперативных обновлений 1.7.4/4.7.4). Для применения сценария:

    1. В Astra Linux Special Edition x.7 подключить базовый репозиторий. В более ранних обновлениях Astra Linux Special Edition подключить репозиторий со средствами разработки.
    2. Установить набор пакетов и библиотек. Команда для установки пакетов:

      Command
      sudo apt install python3 python3-pip python3-dev python-dev build-essential libssl-dev libxml2-dev libffi-dev libxslt1-dev zlib1g-dev


    3. Для обновлений Astra Linux Special Edition более ранних чем обновление x.7  установить библиотеку cffi:

      Command
      pip3 install cffi


    4. Установить библиотеку xattr:

      Command
      pip3 install xattr


    5. Установить библиотеку pyelftools:

      Command
      pip3 install pyelftools


    6. Перед выполнением подписания импортировать секретный ключ (предполагается, что он уже получен):

      Command

      gpg --import --pinentry-mode=loopback --passphrase-file=org_password.txt org_secret.gpg


    Исходный код сценария

    Раскрыть

    Файл со сценарием для загрузки: signdll.

    Блок кода
    languagepy
    #!/usr/bin/python3
    import sys
    import shutil
    import subprocess
    import argparse
    import xattr
    import tempfile
    
    DIGSIG_ELF_SIG_SIZE = 512
    
    parser = argparse.ArgumentParser()
    parser.add_argument('dll', metavar='filename.dll', help='path to dll to sign')
    parser.add_argument('-p', '--pgoptions', help='pass options to the privacy guard program')
    parser.add_argument('-R', '--replace', help='replace original
    dll
     file', action='store_true')
    parser.add_argument('-w', '--show-info', help='describe signature information', action='store_true')
    args = parser.parse_args()
    
    
    if
    name 
    not
    = args.dll
    .endswith('.dll'):
    
    
    def show_info():
        f = tempfile.NamedTemporaryFile()
        shutil.copyfile(args.dll, f.name)
        f.seek(-DIGSIG_ELF_SIG_SIZE, 2)
        sig = f.read(DIGSIG_ELF_SIG_SIZE)
        f.seek(-DIGSIG_ELF_SIG_SIZE, 2)
        f.write(b'\x00' * DIGSIG_ELF_SIG_SIZE)
        f.flush()
        
    print("[Error] Must have filename.dll as an argument") sys.exit(1) name = args.dll try:
    xattr.setxattr(f.name, 'user.sig', sig)
        bsign_args = ['bsign', '-w', f.name]
        bsign = subprocess.run(bsign_args, stdout=subprocess.PIPE)
        print(bsign.stdout.decode()
            .replace("xattr ", "dll ")
            .replace(f.name, args.dll))
        return bsign.returncode
    
    try:
        if args.show_info:
            sys.exit(show_info())
    
        if args.replace:
            new_name = name
        else:
            if not name.endswith(('.dll', '.exe')):
                print("[Error] Must have filename.dll as an argument")
                sys.exit(1)
            new_name = name[:-4] + '_signed
    .dll'
    ' + name[-4:]
            shutil.copyfile(name, new_name)
    
        with open(new_name, mode='ab') as f:
            f.write(b'\x00' * DIGSIG_ELF_SIG_SIZE)
    
        bsign_args = ['bsign', '--sign', '--xattr', new_name]
        if args.pgoptions is not None:
            if '--batch' in args.pgoptions:
                bsign_args.append('--nopass')
            bsign_args.extend(['-p', args.pgoptions])
    
        if subprocess.call(bsign_args):
            print("[Error] Calling bsign failure")
            sys.exit(1)
    
    
        sig = xattr.getxattr(new_name, 'user.sig')
        xattr.removexattr(new_name, 'user.sig')
    
        with open(new_name, mode='r+b') as f:
            f.seek(-DIGSIG_ELF_SIG_SIZE, 2)
            f.write(sig)
    
    except Exception as e:
        print(str(e))
        sys.exit(1)



    Синтаксис вызова сценария

    Command

    signdll [-h] [-p PGOPTIONS] [-R] <имя_файла>

    Параметры вызова сценария:

    • -p, — pgoptions передать следующие параметры программе bsign;
    • -R — replace - заменить оригинальный DLL не изменяя его имя. Позволяет также подписывать файлы формата elf;
    • -w — проверка подписи;
    • -h — вывод краткой подсказки.

    Примеры вызова сценария

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

    Пример вызова для подписания файла test.dll (предполагается, что сценарий и подписываемый файл находятся в одном каталоге):

    Command
    ./signdll test.dll

    После вызова сценария ввести пароль из файла org_password.txt.

    При успешном подписывании в  текущем каталоге будет создан файл test_signed.dll.

    Для подписания пакета файлов

    Получить шестнадцатеричный идентификатор ключа командой:

    Command
    gpg -k

    Подписание всех файлов в текущем каталоге:

    Command
    find . -name "*.dll" -exec  ./signdll -R --pgoptions="--batch --pinentry-mode=loopback --passphrase-file=org_password.txt --default-key=1234...CDEF" {} \;

    где default-key - шестнадцатеричный идентификатор ключа. В данном примере использован ключ -R, который позволяет встроить подпись в подписываемый файл не создавая его копию.

    Для проверки подписи файла

    Пример проверки подписи файла test.dll:

    Command
    ./signdll -w test.dll
    Информация
    titleДанная статья применима к:
  • ОС СН Смоленск 1.6
  • ОС СН Ленинград 8.1