Хранение конфиденциальной информации приложения (пароли, токены, сертификаты и т. д.) является сложной задачей. Вы не можете полагаться на традиционные файлы конфигурации и не можете полагаться ни на переменные среды. Вот почему в Symfony 4.4 добавили новую функцию шифрования для управления секретами.
Представьте, что вы хотите сохранить все содержимое DATABASE_URL
в секрете, чтобы избежать утечки учетных данных подключения к базе данных. Вот как вы можете это сделать:
1 Сгенерируйте ключи, используемые для шифрования/дешифрования секретов (эта функция основана на традиционной криптографии с открытым ключом и использует библиотеку libsodium):
php bin/console secrets:generate-keys
Эта команда генерирует пару ключей в config/secrets/dev/ (или config/secrets/prod/). Открытый ключ используется для шифрования секретов, и вы должны добавить его в репозиторий. Закрытый ключ не должен добавляться в репозиторий.
2 Загрузите закрытый ключ на удаленный сервер, используя SSH или любым другим безопасным способом, и сохраните его в том же каталоге config/secrets/<environment>/.
3 Создайте новый секрет для хранения содержимого DATABASE_URL
:
php bin/console secrets:set DATABASE_URL
Please type the secret value:
> **************
[OK] Secret "DATABASE_URL" encrypted in "config/secrets/dev/"; you can commit it.
Каждый секрет хранится в своем собственном файле в каталоге config/secrets/<environment>/. Вы можете добавить эти файлы в репозиторий, потому что их содержимое можно расшифровать только при помощи приватного ключа.
4 Обновите конфигурацию приложения, чтобы использовать этот новый секрет в качестве значения параметра DATABASE_URL
:
# config/packages/doctrine.yaml
doctrine:
dbal:
url: "%env(secret:DATABASE_URL)%"
# ...
Единственное необходимое изменение — добавить процессор secret:
env var, чтобы сообщить Symfony, что это зашифрованный секрет, который необходимо расшифровать перед его использованием.
Вот и все! Повторите шаги 3 и 4 для всех значений конфигурации, которые вы хотите превратить в секреты. Используйте другие команды, чтобы завершить весь процесс управления секретами: secrets:remove
, чтобы удалить секреты, secrets:list
, чтобы показать все секреты, управляемые приложением, generate-keys --rotate
, чтобы заменить существующие ключи новыми и повторно зашифровать все секреты автоматически и т. д.