Переменные среды в Python для “секретных данных”

Уже на первом этапе изучения языка python я думаю все, как и я, озадачиваются вопросом – как быть с секретными данными – логины, пароли, токены и т.п. Как и где их хранить? Ну не прописывать же их явно в тексте программы, а потом еще и на Гитхабе размещать. Особенно эта тема актуальна в сфере алготрейдинга, здесь думать о доступах и секретности паролей надо в первую очередь.

Информации в сети достаточно. Но я решил кратко законспектировать основные варианты, для быстрого понимания только начинающих изучать этот вопрос.

Конфигурационные файлы

Первое и самое простое, что можно сделать – использовать конфигурационные файлы.

Конфигурационные файлы в Python – это файлы, которые содержат параметры или настройки программы. Они могут использоваться для хранения информации, такой как пути к файлам, адреса серверов, ключи API или пароли.

создадим файл config.py

password = "1234567"

и создадим скрипт dostup_1.py. Импортируем из файла config password

from config import password


print(password) # 1234567

В представленном коде мы импортировали пароль и вывели его на печать. Для хранения паролей в конфигурационных файлах, рекомендуется использовать методы шифрования, чтобы сохранить конфиденциальность. В Python, для работы с конфигурационными файлами, существует несколько библиотек.

Естественно, что и в файле “.gitignore” необходимо сделать отдельную запись “config.py” для того, чтобы файл (config) с паролем не сохранялся на тот же Гитхаб и не стал достоянием общественности.

Файл .gitignore используется для указания файлов и директорий, которые не должны быть отслеживаемыми в системе контроля версий Git.

Это позволяет исключить файлы с конфиденциальными данными, временные файлы, зависимости из репозитория. Файлы и директории Вашего проекта, указанные в .gitignore, будут игнорироваться Git.

Переменные среды

“Переменные среды” и “переменные окружения” – это синонимы и используются взаимозаменяемо. Оба термина используются для обозначения переменных, которые определяют окружение, в котором выполняется программа или процесс.

В контексте программирования “переменные окружения” чаще используются в Unix-подобных операционных системах, в то время как “переменные среды” чаще используются в контексте Windows и других операционных систем. Однако, оба термина могут быть использованы в любой операционной системе в зависимости от предпочтений.

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

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

Хранение паролей в переменных среды обычно считается более безопасным по сравнению с хранением их в тех же файлах проекта по следующим причинам:

  • Изоляция данных: Переменные среды изолированы от процесса к процессу, что означает, что они не могут быть прочитаны напрямую другими процессами.
  • Минимизация риска утечки данных: Если пароли хранятся в файлах проекта, они могут быть случайно включены в систему контроля версий и стать доступными всем, кто имеет доступ к репозиторию.
  • Гибкость и масштабируемость: Переменные среды легко изменить и они могут быть разными для разных сред (например, разработка, тестирование, продакшн), что делает их более гибкими и масштабируемыми.
  • Безопасность: Некоторые платформы предлагают дополнительные меры безопасности для переменных среды, такие как шифрование.
    Тем не менее важно понимать, что хранение паролей даже в переменных среды не является абсолютно безопасным.

В Python получить доступ к переменным среды можно с помощью модуля os .

Переменная os.environ  – объект сопоставления, который представляет переменные среды окружения системы.

import os


# Получаем все переменные среды. Переменные среды — это пары ключ-значение, 
# которые определяют аспекты окружения, в котором работает программа.
spis = os.environ

# Итерируем по каждой паре ключ-значение
for key, value in spis.items():
    print(f"{key} = {value}")

Данная программа позволяет увидеть вообще все переменные среды и их значения, которые доступны нашей программе.

Предпочтительней использовать функцию os.getenv() , которая возвращает в виде str значение ключа key переменной среды, если оно существует, а если нет – значение по умолчанию

например:

import os


psw = os.getenv("MYPASSWORD", "00000000")
print(psw)

выведет значение “00000000”, т.к. ранее переменная среды “MYPASSWORD” не была определена.

Установка переменной среды на уровне Windows

теперь для наглядности зададим значение “MYPASSWORD” в переменные среды пользователя windows и системные переменные windows.

Идем в “Система – параметры – о программе – дополнительные параметры системы” – и далее по схеме

Везде нажимаем ОК и закрываем окна и обязательно надо перезагрузить редактор кода, я использую VScode.

снова запустим наш последний код и теперь уже будет выведено не заданное значение по умолчанию “00000000”, а “user – 1234567”.

Давайте снова откроем окна и удалим переменную “MYPASSWORD” из среды пользователя, перезагрузим редактор кода и снова запустим наш код. Теперь уже будет выведено значение “1234567”. Таким образом ранее переменная “MYPASSWORD” среды пользователя перебивала системную переменную “MYPASSWORD”.

Установка переменной среды на уровне терминала

Теперь давайте в терминале VScode перебьём системное значение “MYPASSWORD”, для этого выполним команду: set MYPASSWORD=121212

Снова запустим нашу программу – значение поменялось на “121212”. Удалим терминал и выполним программу в новом – значение вновь “1234567”.

Конечно этот способ не очень удобен, т.к. он актуален, пока жив текущий терминал.

Установка переменной среды на уровне VScode

откройте файл настроек VScode

и в нем задайте значение Вашей переменной:

"terminal.integrated.env.windows": {
        "MYPASSWORD": "secret1234567"
    },

обязательно удалите терминал с предыдущим значением переменной “MYPASSWORD” и вновь запускаем нашу программу – получаем установленное значение “secret1234567”.

Установка переменной среды на уровне linux

У нас теперь есть понимание того как можно безопасно хранить пароли, токены и т.п. при запуске программы под Windows. Однако можно предположить, что аналогичная задача может возникнуть например при запуске торгового робота на сервере под Linux. На текущий момент на практике этот вопрос я не тестировал, однако опираясь на теорию можно описать возможный алгоритм:

На сервере Linux установить переменные среды можно, используя команду export. Вот пример того, как вы можете установить переменную среды MYPASSWORDexport MYPASSWORD=your_password

Эта команда устанавливает значение your_password для переменной среды MYPASSWORD. Обратите внимание, что это установит переменную среды только для текущей сессии. Если вы закроете сессию или перезагрузите сервер, значение переменной среды будет потеряно.

Если вы хотите, чтобы переменная среды сохранялась между сессиями, вы можете добавить команду export в файл .bashrc или .bash_profile в вашем домашнем каталоге. Теперь переменная среды MYPASSWORD будет установлена каждый раз, когда вы открываете новую сессию оболочки.

Установка переменной среды в Yandex Cloud Functions

Яндекс облако великолепно с первого взгляда, хотя как и во всем есть определенные минусы, но скорее это ограничения. Именно читая про переменные среды я и узнал о Яндекс облаке. Хочу поделиться скриншотами самых первых тестов. В Яндекс облаке есть много разного функционала и Cloud Functions (функции), как мне кажется, отлично подходят для многих задач алготрейдинга. Python скрипты можно запускать в облаке без какой либо настройки и что самое приятное – здесь можно задавать переменные среды.

запускаем тестирование нашей функции и получаем ожидаемый результат “999999999”

Установка переменной среды с помощью библиотеки python-dotenv

Это популярная библиотека Python, которая позволяет управлять переменными среды в приложениях. Python-dotenv читает пары ключ-значение из файла .env и может установить их в качестве переменных среды.

Создадим в корневом каталоге проекта файл .env и запишем в нем:  MYPASSWORD2 = ‘12345_54321’

import os
from dotenv import load_dotenv


load_dotenv()
mypassword = os.getenv("MYPASSWORD2")
print(mypassword)

Результатом работы данной программы будет значение ‘12345_54321’.

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

И в заключении хочется сказать, что технически в  Python многое из “секретного” можно шифровать и дешифровывать, в т.ч. и переменные среды. Тема шифрования крайне интересная, но требует дополнительного изучения.

Оцените статью
Репост в TG и VK
Алготрейдинг шаг за шагом. Создай торгового робота на Python с нуля по нашим урокам. Автоматизируй торговлю на бирже по собственной стратегии.