[PHP, Symfony] Управление секретами в Symfony (перевод)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Перевод статьи подготовлен в преддверии старта курса «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».
===========
Источник:
habr.com
===========
===========
Автор оригинала: Stefan Pöltl
===========Похожие новости:
- [Виртуализация, Настройка Linux] Сравниваем лучшее программное обеспечение для виртуализации в 2020 году: Hyper-V, KVM, vSphere и XenServer (перевод)
- [Cisco, Информационная безопасность, Сетевые технологии, Системное администрирование] StealthWatch: анализ и расследование инцидентов. Часть 3
- [*nix, Python, Разработка на Raspberry Pi, Разработка под Linux] Разработка zond-а для замера скорости интернета
- [] Выгорание сотрудников: основные принципы борьбы, если вы тимлид
- [IT-компании, PHP] Специалисты Microsoft не будут заниматься поддержкой PHP 8.0 для Windows
- Microsoft не станет заниматься поддержкой PHP 8.0 для Windows
- [Тестирование IT-систем, Тестирование веб-сервисов] Тестирование: назад к основам + [Puppeteer][Mocha] Совершенствуйте код с помощью тестового покрытия (перевод)
- [1С-Битрикс] Доверяй, но проверяй: контроль неотправленных писем в Битриксе с уведомлением админу
- [Open source, PHP, JavaScript] readable — еще один линтер для PHP
- [Python] В каких случаях не нужно использовать списки в Python (перевод)
Теги для поиска: #_php, #_symfony, #_symfony, #_php, #_otus, #_symfony_secrets_management, #_docker, #_security, #_programming, #_blog_kompanii_otus._onlajnobrazovanie (
Блог компании OTUS. Онлайн-образование
), #_php, #_symfony
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 00:01
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Перевод статьи подготовлен в преддверии старта курса «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 вы всегда можете переопределить секретные значения. Подытожим
Узнать подробнее о курсе «Symfony Framework». =========== Источник: habr.com =========== =========== Автор оригинала: Stefan Pöltl ===========Похожие новости:
Блог компании OTUS. Онлайн-образование ), #_php, #_symfony |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 00:01
Часовой пояс: UTC + 5