web-dev-qa-db-ja.com

Python / Django-パスワードをソースコードに保存しない

PythonとDjangoを使用して、ソース管理に保存するWebアプリケーションを作成します。方法Djangoアップ、パスワードはsettings.pyファイル内のプレーンテキストです。

パスワードをプレーンテキストで保存すると、特にこれがオープンソースプロジェクトであり、ソースコードがバージョン管理されているため(GithubのGithubを通じて、全世界が見ることができるように!)、多くのセキュリティ問題が発生します。

問題は、Django/Python開発環境でsettings.pyファイルを安全に書き込むためのベストプラクティスは何ですか?

36

私は、stackoverflowでPython固有のものに出くわすことはできませんでしたが、 役立つWebサイト を見つけ、解決策を他のコミュニティと共有したいと思いました。

解決策:環境変数。

注:環境変数はLinux/Unix/OS XとWindowsの世界の両方で似ていますが、このコードをWindowsマシンでテストしていません。動作するかどうか教えてください。

Bash/shシェルで、次のように入力します。

export MYAPP_DB_USER='myapp'
export MYAPP_DB_PASSWORD='testing123'

そして、あなたのDjango settings.pyファイルで:

DATABASE_USER = os.environ.get("MYAPP_DB_USER", '')
DATABASE_PASSWORD = os.environ.get("MYAPP_DB_PASSWORD", '')

この場合、環境変数が存在しない場合、ユーザー名とパスワードはデフォルトで空の文字列になります。

45

環境変数は多くの設定に便利ですが、環境変数にパスワードを入力することは notsecure。代替が通常のバージョン管理外の構成ファイルである場合、いくつかのさまざまな短所があります。

  • 環境変数が誤ってリークする可能性があります(プレーンテキストを介して、エンドユーザーに、または〜/.* sh_historyのようなファイルシステムの予期しない場所に送信される可能性があるデバッグチャネルを介して)。

  • 構成ファイルが誤ってバージョン管理に追加され、デプロイメント特権を持たないユーザーがアクセスできるリポジトリに格納される可能性があります。

その他の引数については、ブログの投稿 環境変数は機密事項に有害と見なされる を参照してください。環境はプロセス全体にアクセスでき、子プロセス(および場合によってはサードパーティ)に継承されます。明確な仮定はありません。外部の開発者の間で、環境変数を機密情報として扱います。

Pythonの最も単純な構成ファイルの形式は、単純に a Python module です。

2
Simon Shine

このようなものをsettings.pyに持っている:

db_user = 'my_db_user' db_password = 'my_db_password'

コードに貴重な情報をハードコードすると、セキュリティ上のリスクが生じます。別の方法として、貴重な情報(Apiキー、データベースパスワードなど)を環境変数としてローカルマシンに保存します。例えば。 Linuxでは次のように追加できます。

export DB_USER = "my_db_user" export DB_PASS = "my_db_password"

あなたの.bash_profileに。または、通常、ホスティングプロバイダーに環境変数を設定するオプションがあります。 AWS Elastic Beanstalkを使用すると、コンソールの構成の下に環境変数を追加できます。

次に、情報インポートOSを取得します。

import os db_user = os.environ.get['DB_USER'] db_password = os.environ.get['DB_PASS']

0
Josh

これは古い質問であり、尋ねた人はこれに対処する方法を確実に見つけましたが、私はこれを自分で調べていて、ここでの答えが私が探していた解決策ではなかったので、私は何を追加するかもしれないと考えました私は同じ質問をする可能性のある他の人々のためにやった。

私がしたことは、getpass()を使用して、起動時に実行されるときに設定ファイルにパスワードを要求させることでした。

from getpass import getpass

#[...]

    DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.mysql', #or whatever DB you use
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': getpass(),
        'Host': '',
        'PORT': '',
    }
}
0
Figroth Felanor