Информация |
---|
title | Данная статья применима к: |
---|
|
|
Информация |
---|
Данная статья предназначена в первую очередь для разработчиков, чьи программные продукты, разработанные в среде 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 — заменить оригинальный DLL не изменяя его имя;
- -w, --show-info
В данной инструкции предполагается, что комплект - — показать информацию о подписи;
- -h - вывод краткой подсказки
Инструмент bsign-dot-net
Информация |
---|
Для корректной работы подписанных файлов в замкнутой программной среде (ЗПС, необходимо: - Перенести публичные ключи в каталог /etc/digsig/keys.
Выполнить команду: Command |
---|
sudo update-initramfs -u -k all |
- Перезагрузить компьютер.
|
Синтаксис команды для подписания dot-net файлов:
Command |
---|
bsign-dot-net [-h] [-p <параметры>] <имя_файла> |
Параметры команды bsign-dot-net:
- -h, --help — показать подсказку по командам;
- -p, --pgoptions — передать следующие параметры программе bsign;
Сценарий для выполнения подписания файлов DLL и проверки подписи
Информация |
---|
Далее предполагается, что: - Комплект ключей для подписи ПО уже получен. В ином случае требуется запросить
|
его.Также в данной статье:Название организации принято за org;Текст сценария, приведённый в настоящей статье, - скопирован в файл signdll
|
;Подписываемый файл test.dll находится в том же каталоге, что и сценарий подписывания.Установка пакетов и настройка ключей
Файл с текстом сценария нужно сделать исполнимым:
- .
- ЗПС выключена, так как используемые сценарием библиотеки Python ciffi и xattr устанавливаются из стороннего репозитория и не подписаны.
- Для установки библиотек Python cffi и xattr настроен доступ в Интернет.
|
Сценарий применим в обновлениях Astra Linux, не включающих в свой состав пакет bsigh-aliens (обновления, выпущенных до оперативных обновлений 1.7.4/4.7.4). Для применения сценария:
- В 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 |
Для обновлений Astra Linux Special Edition более ранних чем обновление x.7 установить библиотеку cffi:
Установить библиотеку xattr:
Command |
---|
pip3 install xattr |
Для
Установить библиотеку pyelftools:
Command |
---|
pip3 install pyelftools |
Перед выполнением подписания
нужно колюч ключ (предполагается, что он уже получен):
Command |
---|
gpg --import --pinentry-mode=loopback --passphrase-file=org_password.txt org_secret.gpg |
Синтаксис вызова Command |
---|
signdll [-h] [-p PGOPTIONS] [-R] filename.dll |
Параметры вызова сценария:
- -p, --pgoptions передать следующие параметры программе bsign;
- -R --replace - заменить оригинальный DLL не изменяя его имя;
- -h - вывод краткой подсказки.
Текст сценария
Раскрыть |
---|
Файл со сценарием для загрузки: signdll. |
collapse | true | #!/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 |
|
dllfile', action='store_true')
parser.add_argument('-w', '--show-info', help='describe signature information', action='store_true')
args = parser.parse_args()
|
|
ifnot.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"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()
|
|
sys.exit(1)
name = args.dll
.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.
Информация |
---|
title | Данная статья применима к: |
---|
|
ОС СН Смоленск 1.6Для подписания пакета файлов
Получить шестнадцатеричный идентификатор ключа командой:
Подписание всех файлов в текущем каталоге:
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 |
ОС СН Ленинград 8.1