私の人生のために、私はこれをどこでも探していて、答えを見つけていません。重複を投稿しないことを願っています。
秘密鍵は、一般的なsettings.pyとは別のファイルに保管することをお勧めします。また、SECRET_KEY、AWS_SECRET_KEYなどのキーを含む「secret.py」ファイルをコミットしないでください。
私の質問は次のとおりです。実稼働サーバーでは、秘密鍵を参照する必要があります。つまり、「secret.py」設定ファイルはサーバーのどこかにあるはずです。その場合、本番環境で秘密鍵をどのように保護しますか?
これに関する議論については、Djangoデプロイメントドキュメント を参照してください。
制作にはかなりの数のオプションがあります。その方法は、機密データ変数を実稼働環境の環境変数として設定することです。次に、settings.py
を介してos.environ
の変数を取得します。
import os
SECRET_KEY = os.environ['SECRET_KEY']
別の可能なオプションは、secret.py
ファイルをデプロイスクリプト経由でコピーすることです。
さまざまなWebサーバーには他の特定のオプションもあると確信しています。
設定はモジュール形式で保存する必要があります。それにより、設定を複数のファイルに広げることになります。
たとえば、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
...
私はそれが長い時間を経ていることを知っていますが、新しい秘密キーをまだ生成していない場合に使用する小さなDjangoアプリをオープンソースにしただけです。 Django -generate-secret-key 。
pip install Django-generate-secret-key
次に、my Djangoプロジェクトを実行する新しいサーバーをプロビジョニング/デプロイするときに、次のコマンドを実行します(Ansibleから):
python manage.py generate_secret_key
それは単に:
secretkey.txt
ファイルに生成します(カスタマイズ可能)必要なのは、設定ファイルに含めることだけです:
with open('/path/to/the/secretkey.txt') as f:
SECRET_KEY = f.read().strip()
完全に自動化されたプロビジョニングプロセスの恩恵を受けることができ、静的な秘密鍵を保存する必要はありませんリポジトリ内。
If/thenロジックの代わりに、機密データを除外するために設計されたツールを使用する必要があります。 YamJam https://pypi.python.org/pypi/yamjam/ を使用します。これはos.environメソッドのすべての利点を可能にしますが、より簡単です-それらの環境変数を設定する必要があります。どこかにスクリプトに入れる必要があります。 YamJamは、これらの構成設定をマシン構成ストアに格納し、プロジェクトごとにオーバーライドすることもできます。
from YamJam import yamjam
variable = yamjam()['myproject']['variable']
基本的な使い方です。また、os.environメソッドと同様に、フレームワーク固有ではなく、Djangoまたは他のアプリ/フレームワークで使用できます。 if/thenと環境の論争のロジック最後に、私はyamjamに切り替えて後悔していません。