安全なインストール¶
デフォルトでは、pip はリモートからの改ざんを防ぐためのチェックを行わず、配布物からの任意のコードの実行を伴います。しかし、これらの動作を変更して、より安全なインストールメカニズムを提供するように pip を使用することが可能です。
これは、以下の手順を実行することで実現できます。
ハッシュチェックモードを、
--require-hashes
を渡すことで有効にするソース配布を、
--only-binary :all:
を渡すことで許可しない
ハッシュチェックモード¶
バージョン 8.0 で追加されました。
このモードは、requirements.txt ファイルに埋め込まれたローカルハッシュを使用して、リモートからの改ざんやネットワークの問題から保護します。これらのハッシュは、--hash
要件ごとのオプションを使用して指定されます。
ハッシュチェックは、すべてか無かの命題であることに注意してください。*いずれかの*要件に対して --hash
を指定すると、このモードがグローバルにアクティブになります。
パッケージのハッシュを追加するには、次のように行に追加します。
FooProject == 1.2 \
--hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 \
--hash=sha256:486ea46224d1bb4fb680f34f7c9ad96a8f24ec88be73ea8e5a6c65260e9cb8a7
追加の制限¶
*すべて*の要件にハッシュが必要です。
これは、部分的にハッシュ化された要件ファイルはほとんど役に立たず、したがってエラーの可能性が高いためです。悪意のある攻撃者は、ハッシュ化されていない要件のいずれかを通じて、インストールに不正なコードを紛れ込ませる可能性があります。
#md5=...
構文を介して URL スタイルの要件に埋め込まれたハッシュはこのルールを満たすのに十分であることに注意してください (ハッシュの強度にかかわらず、レガシーの理由から)。ただし、可能な限り sha256 などのより強力なハッシュを使用する必要があります。*すべて*の依存関係にハッシュが必要です。
要件ファイルに明記されハッシュ化されていない依存関係がある場合、エラーが発生します。
要件は固定されている必要があります (URL、ファイルシステムパス、または
==
を使用)。これは、要件指定子に一致する新しいバージョンがリリースされたときに、予期しないハッシュの不一致を防ぎます。
ハッシュチェックモードの強制¶
--require-hashes
コマンドラインオプションを渡すことで、ハッシュチェックモードを強制的に有効にすることができます。
これは、デプロイスクリプトで、要件ファイルの作成者がハッシュを提供したことを確認するのに役立ちます。また、フェッチしたパッケージのハッシュが表示されるため、ハッシュのリストをブートストラップする便利な方法でもあります。パッケージごとに推奨されるアーカイブのみをフェッチするため、pip hashを使用して代替アーカイブのハッシュを追加する必要がある場合があります。たとえば、バイナリ配布とソース配布の両方がある場合などです。
ハッシュアルゴリズム¶
現時点でお勧めするハッシュアルゴリズムは sha256 ですが、hashlib
でサポートされているすべてのアルゴリズムを含む、より強力なアルゴリズムも許可されています。ただし、md5、sha1、sha224 などの弱いアルゴリズムは、誤った安心感を与えるのを避けるために除外されています。
パッケージごとの複数のハッシュ¶
パッケージごとに複数のハッシュを使用することができます。これは、パッケージがさまざまなプラットフォーム用のバイナリ配布を提供する場合、またはバイナリ配布とソース配布の両方を許可することが重要な場合に重要です。
キャッシングとの相互作用¶
バージョン 23.1 で変更されました: ローカルにビルドされた wheel キャッシュは、ハッシュチェックモードでも使用されます。
ハッシュチェックモードでローカルにビルドされた wheel のキャッシュからインストールする場合、pip は wheel のビルドに使用された元のソース配布のハッシュとハッシュを照合します。これらの元のハッシュは、各キャッシュエントリに格納されている origin.json
ファイルから取得されます。
PyPI (または他のインデックスサーバー) からのハッシュの使用¶
PyPI (および特定の他のインデックスサーバー) は、各ダウンロード URL のフラグメント部分に、#sha256=123...
のように、配布のハッシュを提供します。これは、pip がダウンロードの破損を防ぐためのチェックとして使用します。
hashlib
からのサポートが保証されている他のハッシュアルゴリズム (sha1、sha224、sha384、sha256、sha512) もここでサポートされています。このハッシュはリモートから発信されるため、改ざんに対する有効なガードではなく、すべてのパッケージにローカルハッシュが必要であるという --require-hashes
の要件を満たしていません。
再現可能なインストール¶
ハッシュチェックモードは、pip download および pip wheel でも機能します。ハッシュチェックモードと他の再現性戦略の比較については、再現可能なインストール を参照してください。
警告
setup.py
の setup_requires
キーワード引数に注意してください。これを使用する (まれな) パッケージは、setuptools によってこれらの依存関係が直接ダウンロードされ、pip のハッシュチェックがスキップされます。このようなパッケージを使用する必要がある場合は、setup_requires の制御 を参照してください。
setuptools を直接使用しないでください¶
python setup.py install
、python setup.py develop
、または easy_install
を呼び出すなど、setuptools の非推奨のインターフェースを直接使用して実際のプロジェクトをインストールすることで、すべてのセキュリティ作業が無効にならないように注意してください。
これらは、要件ファイルで見逃したものがあれば、喜んでチェックせずにダウンロードします。プロジェクトが進化するにつれて、見逃してしまうのは簡単です。安全のため、pip と --no-deps
を使用してプロジェクトをインストールしてください。
python setup.py install
の代わりに、以下を使用してください。
$ python -m pip install --no-deps .
$ python -m pip install --no-deps .
C:> py -m pip install --no-deps .
python setup.py develop
の代わりに、以下を使用してください。
$ python -m pip install --no-deps -e .
$ python -m pip install --no-deps -e .
C:> py -m pip install --no-deps -e .