Защита Python приложений

Защита Python приложений
Существует два возможных варианта защиты Python приложений:

Защита через шифрование данных (Sentinel Envelope с использованием Sentinel Data File Protection (DFP))
Экспорт модулей через Cython с последующей защитой через Sentinel Envelope



Первый вариант защищает Python приложения, комбинируя Sentinel Envelope с Sentinel Data File Protection (DFP). Таким образом, защищается непосредственно интерпретатор Python, которому на уровне защиты указывается, с какими файлами он должен работать как с защищенными (зашифрованными), следовательно, такие файлы интерпретатор будет предварительно автоматически расшифровывать и только затем выполнять. Незашифрованные файлы будут работать также, как и ранее. Сами *.py модули, требующие защиты шифруются с помощью инструмента Sentinel Data File Protection (DFP).

Второй вариант подразумевает защиту Python приложений, комбинируя Cython (https://cython.org/) с Sentinel Envelope. Сначала необходимо требующие защиты модули Python перевести в C-Code с помощью Cython и затем скомпилировать их в модули *.pyd / *.so, которые в последствие защищаются с помощью Sentinel Envelope.
Второй метод обеспечивает более высокий уровень безопасности, поскольку дополнительный этап компиляции снижает уровень абстракции кода и позволяет Sentinel Envelope защищать приложение как код, а не только как данные, что позволяет применять более сложные механизмы защиты. С другой стороны, второй метод немного сложнее в настройке, так как требует дополнительно “прослойки” в виде Cython и работающий C-компилятор.
Примечание: Оба метода не могут защитить стартовый скрипт приложения, а только его модули Python. Поэтому рекомендуется поместить фактическую точку входа вашего приложения в модуль Python и использовать только стартовый скрипт для вызова модуля.

Метод #1: защита через шифрование данных (Sentinel Data File Protection)

Защита приложения Python с помощью Sentinel Data File Protection состоит из трех этапов:
● Соберите ваше приложение в модули байт-кода *.pyc.
● Зашифруйте получившиеся файлы *.pyc с помощью утилиты Sentinel dfcrypt.
● Защитите интерпретатор Python, включив в настройках защиты опцию “Enable data file protection (Data Protection Utility) = Version 2” для работы защищённого интерпретатора с зашифрованными файлами данных. Защищенное приложение может распространяться путем упаковки защищенного с помощью Envelope интерпретатора вместе с зашифрованными *.pyc файлами (например, с использованием pyinstaller).

Примечание: Важно всегда защищать скомпилированный байт-код Python (*.pyc), а не простой исходный код Python (.py). Причина в том, что интерпретатор Python сначала переводит файлы *.py в файлы *.pyc, которые затем записываются на диск, чтобы ускорить последующее выполнение. При предоставлении защищенного файла *.py вместо файла *.pyc интерпретатор Python сгенерирует открытый текстовый файл *.pyc и запишет его на диск, где он будет доступен для анализа в открытом виде.

Примеры защиты

Для Windows

После установки Sentinel LDK пример, демонстрирующий защиту Python приложения для Windows с помощью Sentinel Data File Protection, можно найти в директории:

C:\Users\<username>\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \data_file_protection


Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории:

C:\Users\<username>\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \sample_app 

Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3. Директория data_file_protection содержит:

● build_dfp_protected_python2_app.bat
Этот сценарий защищает и упаковывает пример приложения для Python2 для Windows, с использованием: кода разработчика DEMOMA, Sentinel Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.

● envelope_python2.prjx
Файл проекта Sentinel Envelope, в котором указаны параметры Envelope для защиты интерпретатора Python2 (python27.dll) для приведенного выше сценария.

● build_dfp_protected_python3_app.bat
Этот сценарий защищает и упаковывает пример приложения для Python3 для Windows, с использованием: кода разработчика DEMOMA, Sentinel Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller

.● envelope_python3.prjx
Файл проекта Sentinel Envelope, в котором указаны параметры Envelope для защиты интерпретатора Python3 (python37.dll) для приведенного выше сценария.

Для Linux

Пример, демонстрирующий защиту Python приложения для Linux с использованием Sentinel Data File Protection, можно найти в директории:

<DVD_Root>/Linux/Samples/Envelope/Python/data_file_protection

Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории:

<DVD_Root>/Linux/Samples/Envelope/Python/sample_app

Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.Директория data_file_protection содержит:

● build_dfp_protected_python2_app.sh
Этот сценарий защищает и упаковывает пример приложения для Python2 для Linux с использованием: кода разработчика DEMOMA, Sentinel Linux Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.

● build_dfp_protected_python3_app.sh
Этот сценарий защищает и упаковывает пример приложения для Python3 для Linux с использованием: кода разработчика DEMOMA, Sentinel Linux Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.

Процесс защиты

Шаги для создания защищенного приложения с использованием Sentinel Data File Protection и Sentinel Envelope:

Сборка приложения и зависимостей в *.py модуль

Запустите pyinstaller с параметрами: "-d noarchive" для требующего защиты*.py модуля, например:

pyinstaller -d noarchive main.py

Этот шаг собирает зависимости вашего приложения и компилирует их в байт-код Python. «-d noarchive» инструктирует pyinstaller хранить скомпилированные модули Python как отдельные файлы, что является обязательным требованием для следующего шага шифрования.Результатом этого шага является автономная папка (dist/<application_name>), содержащая ваше приложение и все его зависимости.Примечание: Если установленный pyinstaller не поддерживает ключ "-d noarchive", он слишком стар и его необходимо обновить с помощью команды 

pip:pip install pyinstaller --upgrade

Шифрование *.py модулей

Используйте dfcrypt для шифрования чувствительных модулей байт-кода вашего приложения, например:

dfcrypt --encrypt --encver:2 "--key:A secret" --vcf:DEMOMA.hvc --fid:0 dist/<application_name>/moduleA.pyc encrypted/moduleA.pyc


dfcrypt --encrypt --encver:2 "--key:a secret" --vcf:DEMOMA.hvc --fid:0 dist/<application_name>/moduleB.pyc encrypted/moduleB.pyc


Хотя это и не является строго обязательным, рекомендуется использовать ключ «--key:» для указания общего ключа шифрования для всех модулей приложения. Это позволяет использовать логику кэширования, которая может существенно улучшить время запуска приложения, использующего большое количество защищенных модулей. Не указывая "--key:", команда dfcrypt выбирает случайный ключ для каждого файла.Когда закончите с шифрованием, замените исходные файлы их зашифрованным аналогом, например:

copy encrypted/moduleA.pyc dist/<application_name>/
copy encrypted/moduleB.pyc dist/<application_name>/

Защита интерпретатора Python

Защитите с помощью Envelope библиотеку интерпретатора Python (*.dll / *.so) с поддержкой возможности чтения зашифрованных файлов данных:

Например в Linux и Python2:

linuxenv --vcf:DEMOMA.hvc --fid:0 --dfp dist/<app_name>/libpython2.7.so.1.0 dist/<app_name>/libpython2.7.so.1.0



Ключ «--dfp» активирует Data File Protection, что позволяет защищенному интерпретатору Python выполнять зашифрованные модули Python.
В Windows используйте Sentinel Envelope и активируйте Data File Protection Version 2.
Скопируйте выходные файлы Envelope в директорию: 

dist/<application_name>

Чтобы развернуть защищенное приложение, просто скопируйте папку dist/<application_name> на целевой компьютер.Ваше защищенное приложение можно запустить, выполнив команду вида: 


dist/<application_name>/<application_name>.


Метод #2: экспорт модулей через Cython и защита с помощью Sentinel Envelope

Защита приложения Python с помощью Cython и Sentinel Envelope состоит из трех этапов:
  1. Переведите ваши модули Python (*.py) в C-Code, используя Cython.
  2. Скомпилируйте полученные C-файлы в модули расширения Python (*.pyd / *.so), используя C-компилятор для вашей платформы1.
  3. Защитите полученные модули расширения Python (*.pyd / *.so) с помощью Sentinel Envelope.
Защищенное приложение можно распространять, предоставляя защищенные модули расширения Python вместе со стартовым скриптом вашего приложения (например: pyinstaller).

Примеры защиты

Для Windows

После установки Sentinel LDK пример, демонстрирующий защиту приложения Python для Windows с использованием Cython и Sentinel Envelope, можно найти в директории:

C:\Users\<username>\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \cythonize_and_envelope


Скрипты демонстрирующие защиту простого приложения Python, которое можно найти в директории:
C:\Users\<username>\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \sample_app

Пример приложения представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.
Директория cythonize_and_envelope содержит:
● build_python2.bat Этот сценарий защищает и упаковывает пример приложения для Python2 под Windows, с использованием: кода разработчика DEMOMA, Cython, компилятора Microsoft Visual C ++ для Python 2.7, Sentinel Envelope и pyinstaller.
● envelope_cythonized_py2modules.prjx
Файл проекта Sentinel Envelope, который задает параметры Envelope для защиты расширений Python (moduleA.pyd, moduleB.pyd), которые были созданы с помощью приведенного выше сценария.
● build_python3.bat Этот сценарий защищает и упаковывает пример приложения для Python3 под Windows, с использованием: кода разработчика DEMOMA, Cython, Microsoft Build Tools для Visual Studio 2019, Sentinel Envelope и pyinstaller.
● envelope_cythonized_py3modules.prjx
Файл проекта Sentinel Envelope, который задает параметры Envelope для защиты расширений Python (moduleA.pyd, moduleB.pyd), которые были созданы с помощью приведенного выше сценария.

Для Linux

Пример защиты приложения Python для Linux с использованием Cython и Sentinel Envelope можно найти в директории:

<DVD_Root>/Linux/Samples/Envelope/Python/cythonize_and_envelope

Прилагаемые скрипты демонстрируют защиту простого приложения Python, которое можно найти в директории:

<DVD_Root>/Linux/Samples/Envelope/Python/sample_app

Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.
Директория cythonize_and_envelope содержит:
● build_python2.sh
Этот сценарий защищает и упаковывает приложение для Python2 под Linux с использованием: кода разработчика DEMOMA, Cython, GCC, Sentinel Envelope и pyinstaller.
● build_python3.sh
Этот сценарий защищает и упаковывает приложение для Python3 под Linux с использованием: кода разработчика DEMOMA, Cython, GCC, Sentinel Envelope и pyinstaller.

Процесс защиты

Шаги для создания защищенного приложения с использованием Cython и Sentinel Envelope:

Трансляция *.py модулей в C-Code с использованием Cython

Для защиты необходимо сначала изменить расширение вашего модуля Python с *.py на *.pyx, потому что это позволяет Cython генерировать код, который может быть лучше защищен с помощью Sentinel Envelope.Cython может быть установлен с использованием команды 

pip:pip install cython --upgrade

Запустите cython и укажите, должен ли он обрабатывать код как Python 2 или Python 3:

cython -2 --no-docstrings .\moduleA.pyx 
или
cython -3 --no-docstrings .\moduleA.pyx

Результатом является представление модуля Python в виде C-кода ( moduleA.c).

Сборка C-Файлов в нативное Python приложение (исполняемый файл)

Для Windows:Установите требуемый компилятор:

● Python2: Microsoft Visual C++ Compiler для Python 2.7

● Python3: Microsoft Build Tools для Visual Studio 2019 https://visualstudio.microsoft.com/ru/downloads/

Запустите консоль (cmd-shell) и выполните команду:

● Python2: C:\Users\<username>\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat" amd64

● Python3: C:\<vs_build_tools_install_dir>\VC\Auxiliary\Build\vcvarsall.bat" amd64

Выполните следующие команды в консоли, чтобы скомпилировать C-код:

● Python2: cl /nologo /c /MD /Ox /W3 /I C:\Python27\include moduleA.c link /nologo /dll -out:moduleA.pyd C:\Python27\libs\python27.lib moduleA.obj

● Python3: cl /nologo /c /MD /Ox /W3 /IC:\Python37\include moduleA.c link /nologo /dll -out:moduleA.pyd C:\Python37\libs\python37.lib moduleA.obj

В результате получите модуль расширения Python для Windows (moduleA.pyd).Для Linux:

Установите GCC-Compiler с помощью менеджера пакетов вашего дистрибутива Linux, например следующей командой в консоли:


apt install gcc


Установите пакет разработчика Python, используя менеджер пакетов вашего дистрибутива Linux, например:

apt install python2-dev

или

apt install python3-dev


Выполните следующие команды, чтобы скомпилировать C-код:

● Python2: gcc -fPIC -pthread -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -c moduleA.c gcc -pthread -shared moduleA.o -o moduleA.so

● Python3: gcc -fPIC -pthread -fwrapv -O2 -Wall -fno-strict-aliasing -I "/usr/include/python3.7" -c moduleA.c gcc -pthread -shared moduleA.o -o moduleA.so

В результате получите модуль расширения Python для Linux (moduleA.so).

Защита нативного Python приложения (исполняемого файла) с помощью утилиты Envelope

Пример команды для защиты для Linux:

linuxenv --vcf:DEMOMA.hvc --fid:0 plain/moduleA.so prot/moduleA.so


Для Windows используйте Sentinel Envelope точно так же, как при защитите обычного dll/exe файла.


Теги: python | sentinel