web-dev-qa-db-ja.com

秘密鍵を保管しない

Local_settings.pyアンチパターンの原因の1つは、SECRET_KEY、AWSキーなどの値を設定ファイルに書き込むと問題が発生することです。

  • 多くの場合、秘密はそれだけです:秘密!それらをバージョン管理に保つことは、リポジトリにアクセスできるすべての人がそれらにアクセスできることを意味します。

私の質問は、すべてのキーを秘密にする方法ですか?

30
user2015666

local_settings.py GPGで暗号化されたファイル内のデータ-できれば厳密にkey=valueパースしてdictに割り当てる行(他の魅力的なアプローチは、それを実行可能なpythonとして持つことですが、構成ファイル内の実行可能なコードは私を震えさせます)。

python gpgモジュールがあるので問題ありません。キーリングからキーを取得し、GPGキーリング管理ツールを使用して、キーチェーンパスワードを入力し続ける必要がないようにしてください。確認してください。暗号化されたファイルから直接データを読み取るのであり、読み取った復号化された一時ファイルを作成するだけではありません。これは失敗のレシピです。

これは単なる概要であり、自分で作成する必要があります。

このようにして、秘密データはプロセスのメモリ空間にのみ残り、ファイルや環境変数には残りません。

6
Spacedman

私はDjangoプロジェクトをWindows 7とPowershellを使用して実行しているので、私にとっては環境変数を設定するのとは少し異なりました。ただし、設定したら、settings.pyファイル:

import os
SECRET_KEY = os.environ["SOME_SECRET_KEY"]

PowerShellを使用してWindowsで環境変数を設定するには、以下のリンクの指示に従ってください。

http://technet.Microsoft.com/en-us/library/ff730964.aspx

6
Aaron Lelevier

理想的には、local_settings.pyは、本番サーバー/デプロイ済みサーバーではチェックインしないでください。バックアップコピーは別の場所に保存できますが、ソース管理には保存できません。

local_settings.pyは、便宜上、開発構成でチェックインできるため、各開発者が変更する必要があります。

それで問題は解決しましたか?

5
Rohan

元の質問は、環境変数に秘密を保持する方法に関するものでした。これは、本 Djangoの2つのスクープ で広く議論されています。以下は、彼らが言ったことの要約であり、この手法の使用に関する警告が続きます。

1.11版の48ページ(セクション5.3)以降:

Django(およびPython)でサポートされているすべてのオペレーティングシステムは、環境変数を作成する簡単な機能を提供します。

秘密鍵に環境変数を使用する利点は次のとおりです。

  • シークレットを設定に含めないようにすると、すべての設定ファイルをためらうことなくバージョン管理に保存できます。すべてのPythonコードは、設定を含めて、実際にはバージョン管理に保存する必要があります。
  • 各開発者がlocal_settings.py.exampleのコピーアンドペーストされたバージョンを開発用に維持する代わりに、全員が同じバージョンで制御されるsettings/local.pyを共有します。
  • システム管理者は、Pythonコードを含むファイルを変更する必要なく、プロジェクトを迅速に展開できます。
  • サービスとしてのほとんどのプラットフォームは、構成に環境変数の使用を推奨し、それらを設定および管理するための組み込み機能を備えています。

次のページで、本は続きます:

環境変数の設定を始める前に、次のものが必要です。

  • 保存する秘密情報を管理する方法。
  • サーバーでbash設定がどのように機能するか、またはプロジェクトをサービスとしてのプラットフォームでホストする意欲の十分な理解。

それらは、ローカルおよび本番環境で環境変数を設定する方法を説明しています(Herokuを例にして、別のホストを使用しているかどうかを確認する必要がありますが、これは1つの可能性にすぎません)。

環境変数をローカルに設定する方法
エクスポートSOME_SECRET_KEY = 1c3-cr3am-15-yummy

本番環境で環境変数を設定する方法
heroku config:set SOME_SECRET_KEY = 1c3-cr3am-15-yummy

最後に、52ページでは、キーにアクセスする方法について説明しています。たとえば、以下の最初の2行を設定ファイルに入れて、デフォルトでそこに置かれる生のキー文字列を置き換えることができます。

>>> import os
>>> os.environ['SOME_SECRET_KEY'] 
'1c3-cr3am-15-yummy'

このスニペットは、オペレーティングシステムからSOME_SECRET_KEY環境変数の値を取得し、Pythonと呼ばれるSOME_SECRET_KEY変数に保存するだけです。

このパターンに従うと、すべてのコードをバージョン管理に残すことができ、すべての秘密が安全に保たれます。

これは、Apacheサーバーを使用している場合など、場合によっては機能しないことに注意してください。このパターンが機能しない状況に対処するには、その本のセクション5.4(「環境変数を使用できない場合」)を参照してください。その場合、彼らは秘密のファイルを使うことを勧めます。

2017年後半の時点で、このシークレットを環境変数に格納するこの手法は、2つのスクープおよびTwelve Factor Appの設計パターンで推奨されるベストプラクティスです。 Django docsでも推奨されています。ただし、セキュリティ上のリスクがあります。開発者またはコードがシステムにアクセスできる場合、環境変数にアクセスでき、この点は、Michael Reinschによって次のように作成されました。
http://movingfast.io/articles/environment-variables-considered-harmful/

4
Aaron Hall

ファイルから秘密鍵を取得するgetcreds()関数を作成しました。 www.dataからアクセスできる場所にファイルを保持しているので、settings.pyで資格情報が必要な場合はどこでも、引数としてファイル名を渡してgetcreds()を呼び出すだけです。それはファイルのすべての行のリストを返し、ビンゴには隠された秘密があります。ここにコードがあります...

from __future__ import unicode_literals, absolute_import
import os


def getcreds(fname, project, credsroot='/var/www/creds', credsdir=None):
    """ return a list of userid and password and perhaps other data """
    if credsdir is None:
        credsdir = os.path.join(credsroot, project)
    creds = list()
    fname = os.path.join(credsdir, fname).replace("\\", "/")
    with open(fname, 'r') as f:
        for line in f:
            # remove leading/trailing whitespace and append to list
            creds.append(line.strip())
    assert creds, "The list of credentials is empty"
    return creds
2
Mike Dewhirst

Herokuでのデプロイメントと互換性のある方法の1つを次に示します。

  1. 以下を含む.envという名前のgitignoredファイルを作成します。

    export Django_SECRET_KEY = 'replace-this-with-the-secret-key'

  2. 次にsettings.pyを編集して実際のSECRET_KEYを削除し、代わりにこれを追加します。

    SECRET_KEY = os.environ['Django_SECRET_KEY']

  3. 次に、開発サーバーをローカルで実行する場合は、次を使用します。

    source .env
    python manage.py runserver

  4. 最後にHerokuにデプロイしたら、アプリの[設定]タブに移動し、Django_SECRET_KEYを構成変数に追加します。

0
krubo

Os.environを使用する必要があるかもしれません。get( "SOME_SECRET_KEY")

0
lava-lava