web-dev-qa-db-ja.com

Django SECRET_KEYセキュリティ、メソッドの安全性を高める方法

Djangoアプリケーションを「インターネット」とも呼ばれる敵対的な環境にデプロイするポイントに近づいており、Django SECRET_KEY。標準的な手順の1つは、settings.pyで秘密鍵を保護することです。十分に公平です。ドキュメントでは、秘密鍵をSVNにコミットしないと言っていますが、 CVSなど...これにより、キーに簡単にアクセスできますが、誰かが秘密キーをリポジトリにコミットしたい場合は、秘密キーが静的であることを示します(質問4を参照)?

とにかく、ここに私の質問があります:

  1. 秘密鍵をsettings.pyに直接保存するよりも、環境変数として安全に保存する方法を教えてください。 たとえば、攻撃者がsettings.pyを読み取ることができる場合、$ echo $Django_SECRET_KEY!と入力するだけの可能性が高いです
  2. settings.pyに直接保存するよりも、秘密鍵をファイルに保存する方が安全ですか? 彼がsettings.pyを読むことができる場合、彼はおそらくDjango_secret_key.txtを読むことができます。
  3. 攻撃者がマシンに危害を加えた場合、単純にpythonインタプリタにsettings.py> print settings.SECRET_KEYとともにロードすることはできませんか?
  4. 最後に、ウェブサーバープロセスが再起動されるたびにランダムに秘密鍵を生成するのは悪い習慣でしょうか?これは完全にランダムな場合もあれば、キーのユーザー入力を要求する場合もあります。 明らかに、攻撃者自身がWebサービスを再起動して選択したキーを入力できる場合、後者は深刻な弱点となります。
26
James

攻撃者がすでにシステムにアクセスできるようになると、すでに手遅れになります。キーを漏らさないことの主な懸念は、キーがハッシュおよび署名セッションのシードとしてしばしば使用されるためです。アイデアは、プロダクション_SECRET_KEY_は、開発またはステージング_SECRET_KEY_とは完全に異なる必要があるということです。ユーザーエクスペリエンスに影響を与える可能性がありますが、実際には再起動ごとにランダムに生成できます(詳細は以下を参照)。

キーを変更するという原則を守っていれば、コミットするかどうかにかかわらず、それほど危険はありません(devからprodに変更されたときにキーが変更されることを確認する限り)。そうしないと、キーを持っている人がハッシュアルゴリズム(セッションに使用される)の結果を予測したり、セッションに署名したりできます。

攻撃者がシステムへのアクセス権を取得した場合、それはもはやあなたのシステムではないため、すでに行き過ぎです。確認する必要があることの1つは、設定ファイルのファイル権限が、Webサーバーを実行しているユーザーのみが読み取り可能であり、他の誰も読み取りできないことです。これにより、不正にWebserverアカウントとは異なる制限付きアカウントにアクセスしたユーザーがキーを侵害するのを防ぎます。

スタックオーバーフローには良い答えがあります: Django SECRET_KEYsberder によって記述され、それが何に使用されるかを詳しく説明します:

実際には、ここにリストされている項目の多くは、_SECRET_KEY_からDjango.utils.crypt.get_random_string()を使用して、ランダムエンジンをシードします。これは、_SECRET_KEY_の値の変更による影響を受けません。

値の変更によって直接影響を受けるユーザーエクスペリエンスは次のとおりです。

  • セッション、データデコードは中断します。これは、どのセッションバックエンド(Cookie、データベース、ファイルベース、またはキャッシュ)でも有効です。
  • すでに送信されたパスワードリセットトークンは機能しません。ユーザーは新しいトークンを要求する必要があります。
  • コメントフォーム(_Django.contrib.comments_を使用している場合)は、値の変更前に要求され、値の変更後に送信されたかどうかを検証しません。これは非常にマイナーですが、ユーザーを混乱させるかもしれません。
  • メッセージ(_Django.contrib.messages_から)は、コメントフォームと同じタイミング条件でサーバー側を検証しません。
19
Lucas Kauffman