Новое в Symfony 4.4: Шифрование секретных параметров

Хранение конфиденциальной информации приложения (пароли, токены, сертификаты и т. д.) является сложной задачей. Вы не можете полагаться на традиционные файлы конфигурации и не можете полагаться ни на переменные среды. Вот почему в 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, чтобы заменить существующие ключи новыми и повторно зашифровать все секреты автоматически и т. д.