Как специалист по исследованию данных, я ежедневно использую Python для создания приложений, работа которых зависит от учетных данных и параметров конфиденциальности.
Вот несколько примеров навскидку:
- API-ключи для доступа к сторонним сервисам;
- пароли и учетные данные;
- адреса электронной почты или личные данные (имя, возраст, номер социального страхования и т.д.);
- флаги отладки;
- Хосты, URL, URI и многое другое.
Некоторые из этих параметров являются приватными по своей сути. Другие же можно назвать конфиденциальными, поскольку они часто фигурируют в разговорах о кибер-атаках или иных сетевых угрозах.
️️️️️⚠️️️ Хотя это само собой разумеется, но давайте все равно проговорим еще раз: такие данные никогда не следует жестко кодировать в файлах python. Вы должны найти способ сохранить их в надежном месте и никогда не делиться ими с Интернет-сообществом (особенно с аудиторией Github).
В этой небольшой статье я расскажу вам, как решить эту проблему с помощью переменных среды и специального файла под названием .env.
Мы также узнаем, как взаимодействовать с этим файлом, используя модуль python-dotenv, и скрывать конфиденциальные данные от посторонних.
Что такое переменная среды?
Переменная среды — это переменная, хранящая такие данные, которые вам не следует жестко кодировать в своих программах. Такие переменные абстрагированы и вынесены за рамки кода. Их значения находятся внутри вашей операционной системы; они могут быть либо встроенными, либо заданными с помощью пользовательских приложений.
Некоторые встроенные переменные среды
Переменные среды состоят из пар “ключ/значение”. Вы можете использовать их для хранения различных типов данных:
- имен доменов;
- режимов выполнения (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 в качестве переменной среды? Как быть тогда? В этом случае можно воспользоваться одним из двух распространенных способов:
- Через терминал. Введите следующее:
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
.
Вот перечень некоторых полезных ресурсов:
- документация по
python-dotenv
; - https://betterprogramming.pub/getting-rid-of-hardcoded-python-variables-with-the-dotenv-module-d0aff8ce0c80
- https://dev.to/jakewitcher/using-env-files-for-environment-variables-in-python-applications-55a1
- https://www.askpython.com/python/python-dotenv-module
- https://www.youtube.com/watch?v=YdgIWTYQ69A&ab_channel=JonathanSoma
- https://www.youtube.com/watch?v=rKiLd40HIjc&ab_channel=CodingEntrepreneurs
- удобный веб-сайт для создания файлов .gitignore: https://www.toptal.com/developers/gitignore
Читайте также:
- Пять отличных Python-библиотек для data science
- Шесть рекомендаций для начинающих специалистов по Data Science
- Обзор библиотеки Datatable в Python
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Ahmed Besbes: Stop Hardcoding Sensitive Data in Your Python Applications