Поддержка как зашифрованной, так и незашифрованной конфигурации с Aumbry - PullRequest
0 голосов
/ 26 сентября 2018

У нас есть приложение на python, которое загружает config.yml с aumbry .Для производственных целей нам необходимо зашифровать эту конфигурацию с помощью fernet , который может загружаться без проблем.

Мы хотим иметь возможность загружать как незашифрованные, так и зашифрованные в прозрачномКстати, загрузить незашифрованную загрузку, если найдена, а если нет (производственная), загрузить зашифрованную.До сих пор мы реализовали это.

Шифрование

import cryptography.Fernet as fn
from os.path import split, splitext

def _encrypt_file(path, key):
    with open(path, 'rb') as infile:
        file_data = infile.read()
        nc_data= fn(key).encrypt(file_data)
        infile.close()

        base_path, filename = split(path)
        name, _ = splitext(filename)
        nc_name = "{}.{}".format(name, 'nc')
        with open(join(base_path, nc_name), 'wb') as outfile:
            outfile.write(nc_data)
            outfile.close()

Конфигурация Aumbry

from aumbry.errors import LoadError

def _get_configuration():
    return aumbry.load(
        aumbry.FILE,
        AppConfig,
        options={
            'CONFIG_FILE_PATH': "config.yml"            
        }
    )

def _get_encrypted_configuration():
    return aumbry.load(
        aumbry.FERNET,
        AppConfig,
        options={
            'CONFIG_FILE_PATH': "config.nc",
            'CONFIG_FILE_FERNET_KEY': 'bZhF6nN4A6fhVBPtru2dG1_6d7i0d_B2FxmsybjtE-g='
        }
    )
def load_config():
    """General method to load configuration"""
    try:
        return _get_configuration()
    except LoadError:
        try: 
            return _get_encrypted_configuration()
        except LoadError:
            return None
  • Есть ли более элегантный способ добиться такого поведения?

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Существует несколько решений:

a) Зашифрованные файлы используют разные имена файлов из своих незашифрованных аналогов.Например, незашифрованный файл с именем «config.yml» может быть переименован в «config_en.yml».Возможно, это не ваш вариант.

b) Я заметил, что в файле config.yml обычно содержится «версия: 2».Вам просто нужно использовать Python, чтобы проверить, является ли "version: in файл, если это так, он не зашифрован.

0 голосов
/ 07 октября 2018

В зависимости от среды, на которой построено ваше приложение на Python, обычно можно использовать какое-то глобальное значение «mode».

Например, Flask использует переменную окружения FLASK_ENV, которая можетбыть установлен на development или production.В приложении вы можете использовать

app.config['DEBUG']  # True if FLASK_ENV is "development"

, чтобы различать 2 режима.

В вашем случае загрузчик ambury может быть изменен на:

config_loader_cls = EncryptedConfigLoader if environment=='production' else PlainConfigLoader

Я бы пошел еще дальше и потерпел бы неудачу EncryptedConfigLoader, если конфигурация не зашифрована для дополнительной безопасности.

...