Где хранить секреты?

Разрабатывая приложение, мы используем данные, которые относятся к категории чувствительных. Компрометация происходит, если они попадают в третьи руки. Что можно отнести к чувствительным данным? Настройки к подключению базы данных, почтовому серверу, ключи к API сервисов. Компрометация происходит не только, когда злоумышленник получает доступ к ним, но и разработчик, временно приглашенный, для написания нового функционала.

Цель статьи, показать, направление, которое укажет, как защитить данные. Тема сложная и вызывает массу споров, но это не повод закрывать на нее глаза.

Технологии активно развиваются, и разработка ведется через репозитории, как правило это git.

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

Старый дедовский метод, это создание файла config.php, где и хранятся чувствительные данные. Классический пример, это wp-config.php, одной из популярных CMSWordPress.

Современные фреймворки пошли дальше. Всеми любимый фреймворк Yii, предлагает создать два конфигурационных файла, глобальный, в котором нет чувствительных данных, только настройки, которые будут одинаково работать во всех средах, девелопмент или продакшен, например main.php. И локальный, где хранятся чувствительные данные. Они могут отличаться в зависимости от того, где они используется, разработка или бой. Такой файл называют mail-local.php и он не попадает в репозиторий.

Файлы *-local.php автоматически генерируются при установке приложения из окружения фреймворка, расположенной в директории environments, командой:

Laravel и Symfony пошли еще дальше, они использую переменные среды из файла .env. Подход у каждого фреймворка свой. Я остановлюсь на Symfony.

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

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

Практика

Для наших целей воспользуемся пакетом «The Dotenv Component» из нашей библиотеки. Установим ее с помощью Composer.

Создадим файл index.php в директории public.

Подключим автозагрузчик классов.

Импортируем класс Dotenv.

Создадим экземпляр класса.

Парсим конфигурационные файл.

Теперь вы можете обращаться к переменным при помощи глобальных перерменных и встроенных функций в php, не зависимо от настроек php.ini.

Важно! Имена переменных окружения чувствительны к регистру. Если имя состоит из нескольких слов, они разделяются нижним подчеркиванием, например DB_PASSWORD и являются строкой.

Исходники: https://github.com/nvrsk-yii2/where-to-keep-secrets

Об авторе

Дмитрий Ли

Катаюсь на велосипеде, фотографирую. Люблю RESTful и Linux, пишу для web, в основном на PHP.

Просмотреть все сообщения

Оставить комментарий

avatar
  Подписаться  
Уведомление о