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

Вернуться на верх