94

私の人生の間、私はこれをどこでも探していましたが、答えは見つかりませんでした。重複を投稿しないことを願っています。

一般的なsettings.pyとは別のファイルに秘密鍵を保管することをお勧めします。また、SECRET_KEY、AWS_SECRET_KEYなどのキーを含む「secret.py」ファイルをコミットしないでください。

私の質問は次のとおりです。本番サーバーでは、秘密鍵を参照する必要があります。つまり、「secret.py」設定ファイルはサーバーのどこかに存在する必要がありますか?もしそうなら、本番環境で秘密鍵をどのように保護しますか?

4

10 に答える 10

43

これに関する議論については、Django デプロイメントのドキュメントを参照してください。

制作の選択肢はかなりあります。私が行う方法は、機密データ変数を本番環境の環境変数として設定することです。次に、次のようにsettings.pyviaの変数を取得します。os.environ

import os
SECRET_KEY = os.environ['SECRET_KEY']

secret.py別の可能なオプションは、デプロイ スクリプトを介してファイルにコピーすることです。

さまざまな Web サーバー用の他の特定のオプションもあると確信しています。

于 2013-03-04T20:03:23.170 に答える
12

設定をモジュール方式で保存する必要があります。つまり、設定を複数のファイルに分散することを意味します。

たとえば、base_settings.pyすべての基本設定を保存する必要がある場合があります。dev_settings.py開発サーバーの設定用。最後prod_base_settings.pyに、すべてのプロダクション設定についてです。すべての非基本設定ファイルは、すべての基本設定をインポートし、必要なものだけを変更します:

# base_settings.py
...

# dev_settings.py
from base_settings import *
DEBUG = TRUE
...

# prod_base_settings.py
from base_settings import *
DEBUG = FALSE
...

このアプローチにより、さまざまなセットアップからさまざまな設定を行うことができます。これらすべてのファイルをコミットすることもできますが、本番サーバーでは、prod_settings.pyすべての機密設定を指定する実際の本番設定ファイルを作成できます。このファイルはどこにもコミットしないでください。その内容は安全に保たれます。

# prod_settings.py
from prod_base_settings import *
SECRET_KEY = 'foo'

ファイル名に関しては、適切と思われるファイル名を使用できます。個人的には、実際に設定用の Python パッケージを作成し、さまざまな設定をパッケージ内に保持します。

project/
  project/
    settings/
      __init__.py
      base.py
      dev.py
      ...
  app1/
    models.py
    ...
  app2/
    models.py
    ...
于 2013-03-04T20:07:55.320 に答える
6

かなり時間が経っていることは承知していますが、まだ存在しない場合に新しい秘密鍵を生成するために使用している小さな Django アプリをオープンソース化したところです。これはdjango-generate-secret-keyと呼ばれます。

pip install django-generate-secret-key

次に、Django プロジェクトを実行する新しいサーバーをプロビジョニング / デプロイするときに、次のコマンドを (Ansible から) 実行します。

python manage.py generate_secret_key

それは単に:

  • 秘密鍵を生成する必要があるかどうかを確認します
  • ファイルに生成しsecretkey.txtます(カスタマイズ可能)

次に必要なのは、設定ファイルに含めることだけです。

with open('/path/to/the/secretkey.txt') as f:
    SECRET_KEY = f.read().strip()

静的な秘密鍵をリポジトリに保存しなくても完全に自動化されたプロビジョニング プロセスを利用できるようになりました。

于 2016-03-13T14:20:50.730 に答える
5

if/then ロジックの代わりに、機密データを除外するために設計されたツールを使用する必要があります。私は YamJam https://pypi.python.org/pypi/yamjam/を使用しています。os.environ メソッドのすべての利点が得られますが、より単純です。これらの環境変数を設定する必要があり、それらをスクリプトのどこかに配置する必要があります。YamJam は、これらの構成設定をマシンの構成ストアに保存し、プロジェクトごとの機能をオーバーライドできるようにします。

from YamJam import yamjam

variable = yamjam()['myproject']['variable']

基本的な使い方です。また、os.environ メソッドと同様に、フレームワーク固有ではなく、Django またはその他のアプリ/フレームワークで使用できます。私はそれらすべて、複数の settings.py ファイル、if/then の脆弱なロジック、および環境のラングリングを試しました。結局、yamjam に切り替えましたが、後悔していません。

于 2014-05-03T16:12:38.420 に答える