Django, MySQL и SSL-церты: строки вместо имен файлов?
Я пытаюсь настроить приложение Django для подключения к экземпляру MySQLDB с настроенным TLS.
Настройки DATABASES в Django документируют, как настроить параметры ssl
, например:
DATABASES = {
'default': {
'ENGINE': os.environ.get('DATABASE_ENGINE', 'django.db.backends.mysql'),
'HOST': os.environ.get('DATABASE_HOST'),
'PASSWORD': get_vault_secret('DATABASE_PASSWORD'),
...
'OPTIONS': {
'ssl': {
'ca': '/ca/server.cert.pem',
'cert': '/ca/client.cert.pem',
'key': '/ca/client.key.pem'
}
}
},
}
Наша проблема заключается в том, что значения, требуемые для ca
, cert
и key
, являются именами файлов. Наше приложение является контейнерным, и мы извлекаем все наши секреты из hashicorp Vault во время инициализации приложения с помощью вспомогательной функции (см. значение для PASSWORD).
Мы также храним клиентские сертификаты, ключи и т.д. в хранилище, и хотели бы предоставлять их Django напрямую - но MySQL требует строку, указывающую на файл.
Есть ли способ обернуть строки cert / ca / key, которые мы получаем из vault, в некий IOFile
/ BytesIO
esque контейнер для передачи от Django, к python mysqlclient, к mysql_ssl_set()
?
Из соображений безопасности фактическая запись этих значений в файл невозможна.
Вы можете использовать скрипт entrypoint.sh
для вашего контейнера, который может сначала получить файлы из вашего хранилища, а затем запустить процесс django. Обязательно добавьте set -e
в скрипт, чтобы контейнер перезапускался, если выборка не удалась. В противном случае вы просто получите ошибку unable to connect