Нет жесткому кодированию конфиденциальных данных в приложениях Python!

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

Вот несколько примеров навскидку:

  • API-ключи для доступа к сторонним сервисам;
  • пароли и учетные данные;
  • адреса электронной почты или личные данные (имя, возраст, номер социального страхования и т.д.);
  • флаги отладки;
  • Хосты, URL, URI и многое другое.

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

️️️️️⚠️️️ Хотя это само собой разумеется, но давайте все равно проговорим еще раз: такие данные никогда не следует жестко кодировать в файлах python. Вы должны найти способ сохранить их в надежном месте и никогда не делиться ими с Интернет-сообществом (особенно с аудиторией Github).

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

Мы также узнаем, как взаимодействовать с этим файлом, используя модуль python-dotenv, и скрывать конфиденциальные данные от посторонних.

Что такое переменная среды?

Переменная среды — это переменная, хранящая такие данные, которые вам не следует жестко кодировать в своих программах. Такие переменные абстрагированы и вынесены за рамки кода. Их значения находятся внутри вашей операционной системы; они могут быть либо встроенными, либо заданными с помощью пользовательских приложений.

Некоторые встроенные переменные среды

Переменная среды “PATH” — скриншот автора
Переменная среды “SHELL” — скриншот автора

Переменные среды состоят из пар “ключ/значение”. Вы можете использовать их для хранения различных типов данных:

  • имен доменов;
  • режимов выполнения (prod, dev, staging);
  • учетных данных, таких как ключи аутентификации, логины или пароли;
  • адресов электронной почты и т. д.

Как получить доступ к переменным среды с помощью Python?

Чтобы получить доступ к переменным среды, необходимо использовать модуль os, который предоставляет утилиты для чтения и записи этих значений.

import os

# возвращает словарь переменных среды
os.environ

# Для доступа к определенной переменной среды используйте
os.environ["HOME"]

# Или можете использовать метод getenv (он позволяет установить значение по умолчанию, если переменная среды не найдена)
os.getenv("HOME", "/home/")

# Вы также можете установить новую переменную среды, добавив пару “ключ/значение”
os.environ["foo"] = "bar"

Довольно удобный способ скрыть конфиденциальные данные от посторонних глаз, не так ли?

Представьте себе, что вам нужно использовать ключ API в коде, не разглашая его значение. Все, что вам нужно сделать, это загрузить его из переменных среды:

api_key = os.gentenv("SECRET_API_KEY")

А если я не помню, задавал ли я свой ключ API в качестве переменной среды? Как быть тогда? В этом случае можно воспользоваться одним из двух распространенных способов:

  1. Через терминал. Введите следующее:
export SECRET_API_KEY=XXXXXXXXXXXX

2. Или добавьте ту же строку в .zshrc , .bashrc или .bash_profile и запустите поиск.

Если вам нужны переменные среды, которые будут использоваться только в каком-то конкретном проекте, я не рекомендую применять эти методы по двум причинам:

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

Файлы .envмогут решить эту проблему.

Файлы .env как способ установки переменных среды в локальной области

Файлы .env— это, прежде всего, текстовые файлы, содержащие пары “ключ/значение” всех переменных среды, необходимых вашему приложению. Они позволяют использовать переменные среды, не загрязняя глобальное пространство имен среды. Фактически, каждый отдельный проект может иметь свой собственный файл .env.

Пример:

PROJECT_ID=my-awesome-project
API_KEY=path/to/key
STORAGE_BUCKET=my-awesome-bucket

Файлы .envобычно помещаются в корень проекта. Чтобы получить доступ к перечисленным в них значениям, необходимо установить библиотеку python-dotenv.

pip install python-dotenv

Затем вам нужно добавить только две строки кода:

  • одну для импорта библиотеки:
from dotenv import load_dotenv
  • другую — для поиска файла .env и загрузки из него переменных среды:
load_dotenv()

👉 При обработке этих двух строк кода переменные среды вводятся во время выполнения проекта. Когда проект завершается, они исключаются из работы и не будут добавлены в глобальное пространство имен в произвольный момент времени.

import os
from dotenv import load_dotenv

# load_dotenv будет искать файл .env, и, если он его найдет,
# из него будут загружены переменные среды

load_dotenv()

PROJECT_ID = os.getenv("PROJECT_ID")
API_KEY = os.getenv("API_KEY")
STORAGE_BUCKET= os.getenv("STORAGE_BUCKET")

Доступ к файлам .envиз python

🔴 Нельзя коммитить файлы .env и размещать их на Git

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

Простой способ избежать этой нежелательной ситуации — добавить .envв ваш файл .gitignore

.env

Давайте подытожим

Приложения Python — это не просто последовательность команд и кода. Они связаны с данными и настройками конфигурации. Чаще всего эти данные конфигурации являются конфиденциальными и требуют ограниченного доступа.

Переменные среды и файлы .envпомогут справиться с этой ситуацией.

Чтобы начать работу с файлами .env, выполните следующие шаги:

  • установите модуль python-dotenvс помощью pip;
  • создайте файл .envс соответствующей конфигурацией вашего проекта;
  • добавьте его в файл .gitignore, чтобы git не закоммитил его;
  • загрузите конфигурацию в файлы Python с помощью модуля python-dotenv.

Ресурсы

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

Вот перечень некоторых полезных ресурсов:

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Ahmed Besbes: Stop Hardcoding Sensitive Data in Your Python Applications

Предыдущая статьяReact SPA SEO с Prerender.io
Следующая статьяЧем отличается C++ от C#?