Как стать автором
Обновить
745.56
OTUS
Цифровые навыки от ведущих экспертов

Управление секретами в Symfony

Время на прочтение5 мин
Количество просмотров6K
Автор оригинала: Stefan Pöltl

Перевод статьи подготовлен в преддверии старта курса «Symfony Framework».





Не надоело ли вам хранить файл с секретами вашего приложения в менеджере паролей и копировать его в свою среду CI/CD каждый раз, когда вы изменяете его для развертывания приложения в соответствии с требованиями безопасности?


Запускаем Symfony


Создайте docker-compose.yml в корневом каталоге вашего проекта и добавьте следующее:


(См. знакомство с PHP Docker разработкой с XDEBUG здесь)


version: '3'
services:
  php:
    image: webdevops/php-nginx-dev:7.4
    working_dir: /app
    environment:
      - WEB_DOCUMENT_ROOT=/app/public
      - PHP_DISPLAY_ERRORS=1
      - PHP_MEMORY_LIMIT=2048M
      - PHP_MAX_EXECUTION_TIME=-1
      - XDEBUG_REMOTE_AUTOSTART=1
      - XDEBUG_REMOTE_PORT=9000
      - XDEBUG_PROFILER_ENABLE=0
      - XDEBUG_REMOTE_CONNECT_BACK=0
      - XDEBUG_REMOTE_HOST=docker.for.mac.localhost
      - php.xdebug.idekey=PHPSTORM
      - php.xdebug.remote_enable=1
      - php.xdebug.max_nesting_level=1000
    ports:
      - "8080:80"
    volumes:
      - ./:/app:rw,cached
    depends_on:
      - mysql

  mysql:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_USER: test
      MYSQL_PASSWORD: test

Запустите сервис с помощью docker-compose up и установите Symfony 5 для запуска приложения:


docker-compose exec php bash -c 'composer create-project symfony/website-skeleton project && mv project/* . && rm -rf project'

Теперь вы можете перейти на http://localhost:8080 и увидеть следующее:



Дефолтный экран Symfony


Храним секреты в хранилище


Начиная с Symfony 4.4, вы имеете доступ к встроенному управление секретами, которое позволяет хранить все секреты в хранилище (vault) в зашифрованном виде. Вы также имеете возможность расшифровывать свои секреты с помощью приватного ключа или ключевой фразы. С помощью этой команды мы можем безопасно сохранить нашу строку подключения к БД, которая в настоящее время находится в файле .env:


php bin/console secrets:set DATABASE_URL


Как мы видим, команда создала хранилище, пару ключей и сообщает вам, что не следует выполнять расшифровку ключа. Мы можем проверить файлы, которые были сгенерированы в config/secrets/dev:



Мы видим наш ключ, приватный (закрытый) ключ дешифрования и публичный (открытый) ключ шифрования, которые можно коммитить. Еще есть листинговый php-файл, который содержит следующее содержимое для перечисления всех зашифрованных ключей:



Он используется для секретов php bin/console:list и показывает следующее:



Как вы могли заметить, Symfony хранит секреты, разделенные по средам. Поэтому, чтобы не блокировать работу других разработчиков в вашей команде, просто закомментируйте dev-файлы и все готово.Вы не должны коммитить приватный ключ дешифрования для файлов производственного хранилища. Добавление секретов разработчиков на данный момент работает следующим образом:


git add config/secrets

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



config/packages/doctrine.yaml


Мы можем проверить, работает ли соединение:


php bin/console doctrine:query:sql "SHOW VARIABLES LIKE 'max_join_size'"

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


Производственное хранилище


Чтобы сохранить параметр DATABASE_URL в производственном хранилище (production vault), мы запускаем команду:


php bin/console secrets:set --env=prod DATABASE_URL

Она создает производственное хранилище со всеми необходимыми ключами и устанавливает DATABASE_URL с указанным значением. Нужно следить за тем, чтобы приватный ключ дешифрования не был добавлен систему контроля версий. Этот момент уже был учтен при установке Symfony с помощью composer, поэтому мы видим следующую строку в файле .gitignore:


/config/secrets/prod/prod.decrypt.private.php

Symfony такой умный!


Извлекаем секретные значения


Чтобы перечислить все значения, которые мы добавили в хранилище, нам нужно использовать команду secrets:list. Чтобы увидеть значение секретов, вы можете передать в команду опцию под названием — reveal:



Для производственных значений используйте:


php bin/console secrets:list --env=prod --reveal

Теперь у нас есть секреты в системе контроля версий для нескольких сред. Это довольно круто!


Развертывание приложения


У нас есть только одно конфиденциальное значение — приватный ключ дешифрования. Поэтому во время развертывания нам нужно добавить в проект приватный файл дешифровки или разворачивать с переменной среды с именем SYMFONY_DECRYPTION_SECRET.


Когда мы хотим использовать переменную SYMFONY_DECRYPTION_SECRET, нам нужно предоставлять значение приватного ключа дешифрования, закодированное с помощью base64, например, как здесь:


php -r "echo base64_encode(require 'config/secrets/prod/prod.decrypt.private.php');"

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



функция работы с секретными файлами Jenkins


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


php bin/console secrets:decrypt-to-local --force --env=prod

Эта команда генерирует .env.prod.local файл. Таким образом, ваше приложение Symfony будет использовать переменные env из этого файла, и не будет потери производительности из-за расшифровки секретов во время выполнения. Это великолепная возможность, которая не влияет на безопасность. Если кто-то имеет доступ к вашему серверу, он может скопировать приватный ключ дешифрования или просто файл .env.prod.local.


Локальное хранилище для переопределений во время разработки


Как переопределить секреты во время разработки? Вот локальное хранилище, которое мы можем использовать для переопределения DATABASE_URL для проверки чего-либо в другой БД. Добавьте локальное значение как здесь:


php bin/console secrets:set DATABASE_URL --local


Но что произойдет теперь? Локальные переопределения учетных данных хранятся в .env.dev.local! Так что не нужно никакого дополнительного хранилища и, конечно, Symfony уже не добавил строку в файл .gitignore, чтобы не дать вам ее закоммитить. Кроме того, записи в .env файле переопределяются, так что вы можете безопасно так делать. Единственный важный момент, который требует внимания, это то, что Symfony сначала ищет переменные env, а затем — секреты. Так что с переменными env вы всегда можете переопределить секретные значения.


Подытожим


  • Env переменные в первую очередь, а секреты во вторую
  • Команда secret:set автоматически разрешает обработку dev, local и prod env
  • Symfony предупреждает возможные проблемы с git с помощью записей в .gitignore



Узнать подробнее о курсе «Symfony Framework».



Теги:
Хабы:
+8
Комментарии7

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS