Djangoアプリケーションを「インターネット」とも呼ばれる敵対的な環境にデプロイするポイントに近づいており、Django SECRET_KEY
。標準的な手順の1つは、settings.py
で秘密鍵を保護することです。十分に公平です。ドキュメントでは、秘密鍵をSVNにコミットしないと言っていますが、 CVSなど...これにより、キーに簡単にアクセスできますが、誰かが秘密キーをリポジトリにコミットしたい場合は、秘密キーが静的であることを示します(質問4を参照)?
とにかく、ここに私の質問があります:
settings.py
に直接保存するよりも、環境変数として安全に保存する方法を教えてください。 たとえば、攻撃者がsettings.py
を読み取ることができる場合、$ echo $Django_SECRET_KEY
!と入力するだけの可能性が高いですsettings.py
に直接保存するよりも、秘密鍵をファイルに保存する方が安全ですか? 彼がsettings.py
を読むことができる場合、彼はおそらくDjango_secret_key.txt
を読むことができます。settings.py
を> print settings.SECRET_KEY
とともにロードすることはできませんか?攻撃者がすでにシステムにアクセスできるようになると、すでに手遅れになります。キーを漏らさないことの主な懸念は、キーがハッシュおよび署名セッションのシードとしてしばしば使用されるためです。アイデアは、プロダクション_SECRET_KEY
_は、開発またはステージング_SECRET_KEY
_とは完全に異なる必要があるということです。ユーザーエクスペリエンスに影響を与える可能性がありますが、実際には再起動ごとにランダムに生成できます(詳細は以下を参照)。
キーを変更するという原則を守っていれば、コミットするかどうかにかかわらず、それほど危険はありません(devからprodに変更されたときにキーが変更されることを確認する限り)。そうしないと、キーを持っている人がハッシュアルゴリズム(セッションに使用される)の結果を予測したり、セッションに署名したりできます。
攻撃者がシステムへのアクセス権を取得した場合、それはもはやあなたのシステムではないため、すでに行き過ぎです。確認する必要があることの1つは、設定ファイルのファイル権限が、Webサーバーを実行しているユーザーのみが読み取り可能であり、他の誰も読み取りできないことです。これにより、不正にWebserverアカウントとは異なる制限付きアカウントにアクセスしたユーザーがキーを侵害するのを防ぎます。
スタックオーバーフローには良い答えがあります: Django SECRET_KEYsberder によって記述され、それが何に使用されるかを詳しく説明します:
- JSONオブジェクトの署名
- crypto functions salted hmacsまたはランダムエンジンにシードする場合:
- パスワードリセットトークン
- コメントフォームのセキュリティ 偽造されたリクエストから保護するPOSTリクエスト
- フォームセキュリティ
- メッセージの改ざんから保護 メッセージフレームワークはCookieを使用してビュー間でメッセージを渡すことができるため。
- セッションデータを保護し、ランダムセッションキーを作成する 改ざんも回避する。
- ほとんどのパスワードハッシャー用にランダムなソルトを作成
- ランダムなパスワードを作成 必要な場合
startproject
を使用するときに自分自身を作成する- CSRFキーを作成
実際には、ここにリストされている項目の多くは、_
SECRET_KEY
_からDjango.utils.crypt.get_random_string()
を使用して、ランダムエンジンをシードします。これは、_SECRET_KEY
_の値の変更による影響を受けません。値の変更によって直接影響を受けるユーザーエクスペリエンスは次のとおりです。
- セッション、データデコードは中断します。これは、どのセッションバックエンド(Cookie、データベース、ファイルベース、またはキャッシュ)でも有効です。
- すでに送信されたパスワードリセットトークンは機能しません。ユーザーは新しいトークンを要求する必要があります。
- コメントフォーム(_
Django.contrib.comments
_を使用している場合)は、値の変更前に要求され、値の変更後に送信されたかどうかを検証しません。これは非常にマイナーですが、ユーザーを混乱させるかもしれません。- メッセージ(_
Django.contrib.messages
_から)は、コメントフォームと同じタイミング条件でサーバー側を検証しません。