Django-设置:敏感设置和不同的环境(开发,生产,暂存)。推荐的方法是什么

时间:2019-03-29 18:32:56

标签: django django-settings

我正在使用Django 2.1.7版本:

我已经阅读了很多文章和有关此问题。我发现人们使用各种方法。

Approches used in the general are:
1) setting environmental variables
2) multiple settings
3) load configuration variables from a file like using django-environ etc

Approach 1:我不会使用,因为我不想使用环境变量来存储变量。

Approach 3:使用3rd party库,有时可能不再维护它们。但是,如果有任何标准方法可以做到这一点,那么我很好。

Approach 2:在这里,我不确定如何分别存储敏感数据。

有人可以在这方面指导我。

1 个答案:

答案 0 :(得分:0)

我正在使用所有这些的组合:

  • 在systemd中将gunicorn作为服务启动时,可以使用.service.d目录中的conf文件来设置环境变量:
    [Service]
    Environment="DJANGO_SETTINGS_MODULE=myapp.settings.production"
    Environment="DATABASE_NAME=MYDB"
    Environment="DATABASE_USER=MYUSER"
    Environment="DATABASE_PASSWORD=MYPASSWORD" 
    ...
    
  • 启动实例时,该文件是从S3(已加密的文件)中获取的。我有一个使用aws-cli的启动脚本来完成该任务。
  • 为了能够运行管理命令,例如要在生产环境中迁移数据库,您还需要这些变量,因此,如果未设置环境变量,我将直接从此文件中获取它们。所以在我的设置中,我有这样的东西:

    def get_env_variable(var_name):
        try:
            return os.environ[var_name]
        except KeyError:
            env = fetch_env_from_gunicorn()
            return env[var_name]
    
    def fetch_env_from_gunicorn():
        gunicorn_conf_directory = '/etc/systemd/system/gunicorn.service.d'
        gunicorn_env_filepath = '%s/gunicorn.conf' % (gunicorn_conf_directory,)
        if not os.path.isfile(gunicorn_env_filepath):
            raise ImproperlyConfigured('No environment settings found in gunicorn configuration')
    
        key_value_reg_ex = re.compile(r'^Environment\s*=\s*\"(.+?)\s*=\s*(.+?)\"$')
        environment_vars = {}
        with open(gunicorn_env_filepath) as f:
            for line in f:
                match = key_value_reg_ex.search(line)
                if match:
                    environment_vars[match.group(1)] = match.group(2)
        return environment_vars
    
    ...
    
    DATABASES = {
        ...
        'PASSWORD': get_env_variable('DATABASE_PASSWORD'),
        ...}
    

    请注意,我在托管实例中运行的所有管理命令都需要显式传递--settings=myapp.settings.production,以便它知道要使用哪个设置文件。

  • 针对不同类型环境的不同设置。这是因为,DEBUG之类的内容以及邮件设置,身份验证设置等…在环境之间差异太大,无法使用一个单独的设置文件。 我在 settings 目录中具有 default.py 设置,其中包含所有常用设置,然后例如 production.py from .default import *开头并且仅覆盖需要覆盖的内容,例如DEBUG = False和其他DATABASES(使用上述机制),LOGGING等...

这样,您将面临以下安全风险:

  • 任何具有ssh访问权限和对systemd目录具有权限的人都可以读取机密。确保您的实例在VPN中,并限制ssh对特定IP地址的访问。另外,我只允许使用带有ssh密钥的ssh,而不允许使用用户名/密码,因此不存在窃取密码的风险。
  • 具有ssh访问django应用程序目录权限的任何人都可以运行Shell和from django.conf import settings来读取settings。与上述相同,仍然应加以限制。
  • 有权访问您的存储桶(例如S3)的任何人都可以读取该文件。同样,这很容易限制。