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

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

Ключ

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

Оглавление



Информация
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 сценария.



Информация

В данной статье предполагается, что комплект ключей для подписи ПО уже получен. В ином случае требуется запросить такой комплект (см. Как получить ключи для подписи СПО).
Также в данной статье предполагается, что:

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

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

Раскрыть

Файл со сценарием для загрузки: 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 file', action='store_true')
parser.add_argument('-w', '--show-info', help='describe signature information', action='store_true')
args = parser.parse_args()

name = args.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()
    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' + 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
chmod +x signdll

Для нормальной работы сценария необходимо установить набор пакетов и библиотек (в Astra Linux Special Edition x.7 требуется подключение базового репозитория, в более ранних обновлениях Astra Linux Special Edition требуется подключение репозитория со средствами разработки, ). Команда для установки пакетов:

Command

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

После установки пакетов установить библиотеки Python:

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

    Command

    pip3 install cffi


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

    Command

    pip3 install xattr


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

Command
gpg --import --pinentry-mode=loopback --passphrase-file=<имя_файла_с_паролем_ключа> <имя_файла_с_ключом>

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

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