PyPIとは?pipとの違いや使い方、セキュリティリスクと安全対策を解説|サイバーセキュリティ.com

PyPIとは?pipとの違いや使い方、セキュリティリスクと安全対策を解説



PyPIは、Pythonで利用するパッケージを公開・配布するためのリポジトリです。pipを使えば必要な機能を簡単に追加できますが、PyPIとpipの役割の違いが分からない方もいるでしょう。また、悪意あるパッケージやサプライチェーン攻撃にも注意が必要です。本記事では、PyPIの仕組みやpipとの違い、基本的な使い方、パッケージの公開方法、想定されるセキュリティリスクと安全対策を分かりやすく解説します。

PyPIとは

PyPIとは「Python Package Index」の略で、Python向けのソフトウェアパッケージを公開・配布するためのリポジトリです。「パイピーアイ」と読みます。

Pythonの標準機能だけでは実現が難しい処理も、PyPIで公開されているパッケージを導入することで、効率的に実装できます。Web開発、データ分析、機械学習、API連携、業務自動化など、さまざまな用途のパッケージが公開されています。

PyPIの公式サイトでは、Pythonコミュニティによって開発・共有されたソフトウェアを検索し、インストールできると説明されています。Pythonの開発環境を支える重要な基盤の一つです。

PyPIが果たす役割

PyPIには、開発者が作成したPythonパッケージの配布ファイル、バージョン情報、動作条件、説明文などが登録されています。

利用者は必要なパッケージを検索し、後述するpipを使って自分の開発環境へインストールできます。一方、パッケージの開発者は、自作したソフトウェアをPyPIへ登録することで、世界中のPython利用者に公開できます。

たとえば、HTTP通信を行う「requests」、数値計算に利用される「NumPy」、データ分析に利用される「pandas」などもPyPIで配布されています。

パッケージ・ライブラリ・モジュールの違い

Pythonでは、「パッケージ」「ライブラリ」「モジュール」という言葉が使われます。それぞれの意味は次の通りです。

用語 主な意味
モジュール Pythonのコードを記述したファイル
パッケージ 複数のモジュールなどをまとめたもの
ライブラリ 再利用できる機能やプログラム群の総称
配布パッケージ pipなどでインストールするために配布されるソフトウェア一式

Pythonでは、インポートするコードのまとまりと、PyPIからインストールする配布物の両方が「パッケージ」と呼ばれることがあります。PyPIの記事で使われるパッケージは、主にpipでインストールする配布パッケージを指します。

PyPIとpipの違い

 

PyPIとpipは一緒に使われることが多いため混同されやすいですが、役割が異なります。

PyPIは、Pythonパッケージが登録されているリポジトリです。一方のpipは、PyPIなどからパッケージを取得し、Python環境へインストールするためのパッケージ管理ツールです。

項目 PyPI pip
正式名称 Python Package Index pip
種類 パッケージリポジトリ パッケージ管理ツール
主な役割 パッケージの公開・配布 パッケージの取得・インストール
利用方法 Webサイトで検索・確認 コマンドラインで操作
イメージ パッケージを置く倉庫 倉庫から荷物を取り寄せる道具

pipの公式ドキュメントでは、pipはPythonのパッケージインストーラーであり、PyPIだけでなく、ほかのパッケージインデックスからもソフトウェアをインストールできると説明されています。

pipとpip3の違い

環境によっては、pipではなくpip3というコマンドが使われます。

Python 2とPython 3が同じ端末にインストールされていた環境では、Python 3用のpipであることを明確にするためにpip3が使われていました。現在はPython 3が主流ですが、pipがどのPython環境に対応しているか分かりにくい場合があります。

そのため、次のようにPythonの実行環境を指定してpipを起動する方法が分かりやすいでしょう。

python -m pip install パッケージ名

Windowsでは、次の形式も利用できます。

py -m pip install パッケージ名

python -m pipを使用すると、指定したPythonインタープリターに対応するpipを実行できます。複数のPythonがインストールされている環境で、意図しない場所にパッケージが入ることを防ぎやすくなります。

PyPIはPythonパッケージを公開・配布する場所であり、pipはPyPIなどからパッケージを取得してインストールするためのツールです。

PyPIの基本的な使い方

PyPIを利用する場合は、公式サイトでパッケージを検索し、pipを使ってインストールする方法が一般的です。

ここでは「requests」を例に、基本的な操作を説明します。

PyPIでパッケージを検索する

PyPIの公式サイトには検索欄があり、パッケージ名や関連キーワードから目的のパッケージを探せます。

パッケージの詳細ページでは、説明文、最新バージョン、リリース履歴、対応するPythonのバージョン、ライセンス、プロジェクトへのリンクなどを確認できます。

似た名前のパッケージが複数表示された場合は、名前だけで判断せず、公式ドキュメントやソースコードの公開先、開発者、更新履歴なども確認しましょう。

パッケージをインストールする

パッケージをインストールする基本的なコマンドは次の通りです。

python -m pip install requests

pipは、指定されたパッケージだけでなく、そのパッケージが動作するために必要な依存パッケージも解決し、インストールします。

バージョンを指定してインストールする

特定のバージョンを指定する場合は、パッケージ名の後ろに==とバージョン番号を記述します。

python -m pip install requests==2.32.3

バージョンを指定しない場合は、pipが条件に合うバージョンを選択します。開発環境と本番環境で同じ動作を再現したい場合は、使用するバージョンを明示することが重要です。

インストール済みのパッケージを確認する

現在の環境にインストールされているパッケージは、次のコマンドで確認できます。

python -m pip list

特定のパッケージの詳細を確認する場合は、pip showを使います。

python -m pip show requests

パッケージを更新する

パッケージを更新する場合は、--upgradeを指定します。

python -m pip install --upgrade requests

ただし、最新版へ更新すると、既存のプログラムと互換性がなくなることがあります。本番環境で利用しているパッケージは、更新内容を確認し、テスト環境で動作を検証してから更新しましょう。

パッケージをアンインストールする

不要になったパッケージは、次のコマンドで削除できます。

python -m pip uninstall requests

requirements.txtから一括インストールする

複数のパッケージを使うプロジェクトでは、依存関係をrequirements.txtにまとめて管理できます。

requests==2.32.3
Flask==3.1.0

記載されたパッケージを一括でインストールするコマンドは次の通りです。

python -m pip install -r requirements.txt

現在の環境にインストールされているパッケージとバージョンを出力する場合は、次のコマンドを利用できます。

python -m pip freeze > requirements.txt

requirementsファイルは、インストール対象の一覧をpipへ渡したり、環境を再現したりする目的で利用されます。

PyPIを利用するときは仮想環境を使う

Pythonパッケージをインストールする際は、プロジェクトごとに仮想環境を作る方法が推奨されます。仮想環境とは、Python本体やパッケージをほかのプロジェクトから分離して管理する仕組みです。Python Packaging User Guideでも、pipとvenvを使って仮想環境へパッケージをインストールする方法が案内されています。

仮想環境を作成するには、プロジェクトのフォルダで次のコマンドを実行します。

python -m venv .venv

Windowsで仮想環境を有効にする場合は、次のコマンドを実行します。

.venv\Scripts\activate

macOSやLinuxでは次の通りです。

source .venv/bin/activate

仮想環境を有効にしてからpipを実行すれば、そのプロジェクト専用の環境にパッケージがインストールされます。

仮想環境を使うことで、プロジェクトごとに異なるバージョンを利用しやすくなり、パッケージ同士の競合やシステム環境への影響を抑えられます。

自作したPythonパッケージをPyPIに公開する方法

PyPIでは、ほかの開発者が作ったパッケージを利用するだけでなく、自作したパッケージを公開することもできます。

一般的な公開手順は、パッケージの構成を整え、配布用ファイルをビルドし、TestPyPIで確認した後に本番のPyPIへアップロードする流れです。

PyPIとTestPyPIの違い

TestPyPIは、パッケージの公開手順を試すためのテスト用環境です。本番のPyPIとは別のサービスであり、実際のパッケージ一覧に影響を与えずにアップロードやインストールを確認できます。

初めてパッケージを公開する場合は、いきなり本番のPyPIへアップロードせず、TestPyPIでパッケージの表示やインストールを確認するとよいでしょう。

パッケージの構成を整える

現在のPythonパッケージでは、pyproject.tomlを使ってプロジェクト名、バージョン、説明、依存関係、ビルド方法などを設定する方法が一般的です。

pyproject.tomlは、Pythonのパッケージ作成や各種開発ツールの設定に利用されるTOML形式の設定ファイルです。

パッケージをビルドする

配布するパッケージを作成するには、buildなどのツールを利用します。

python -m pip install build
python -m build

ビルドすると、通常はdistフォルダ内にwheel形式やソース配布形式のファイルが生成されます。

PyPIへアップロードする

作成した配布ファイルは、TwineやTrusted Publishingを使ってPyPIへ公開できます。Twineを使う場合の基本的なコマンドは次の通りです。

python -m twine upload dist/*

Python Packaging User Guideでは、パッケージのビルド、TestPyPIでの確認、本番PyPIへのアップロードまでの手順が案内されています。

PyPIを利用する際のセキュリティリスク

PyPIには有用なパッケージが数多く公開されていますが、登録されているすべてのパッケージが安全であるとは限りません。

PyPIの公式ブログでも、PyPI上のすべてのパッケージやリリースを信頼済みとして扱うべきではなく、利用者がインストール前に確認する必要があると説明されています。

悪意あるパッケージ

攻撃者が、情報窃取や不正通信などを目的としたコードを含むパッケージをPyPIへ公開することがあります。

利用者がそのパッケージをインストールすると、インストール処理やプログラムの実行時に悪意あるコードが動作する可能性があります。開発端末に保存されている認証情報、環境変数、設定ファイルなどが狙われるケースも考えられます。

特に、動作確認のために管理者権限でインストールした場合や、重要な認証情報を保存した開発端末で実行した場合は、被害が大きくなるおそれがあります。

タイポスクワッティング

タイポスクワッティングとは、有名なパッケージとよく似た名前の悪性パッケージを公開し、利用者の入力ミスを狙う手口です。

たとえば、正規のパッケージ名の文字を一部入れ替えたり、単語を追加したりして、本物に見せかけます。利用者がパッケージ名を手入力し、スペルの違いに気づかずインストールすると、悪性パッケージを実行してしまいます。

PyPIでは、プロジェクト作成時にタイポスクワッティングの可能性を自動検知して警告する仕組みが導入されていますが、利用者側での確認が不要になったわけではありません。

依存関係混乱攻撃

依存関係混乱攻撃、またはDependency Confusionとは、企業が社内で利用している非公開パッケージと同じ名前のパッケージを、攻撃者が公開リポジトリへ登録する攻撃です。

開発環境の設定によっては、社内リポジトリの正規パッケージではなく、PyPI上の悪性パッケージが選択される可能性があります。

pipの公式ドキュメントでは、非公開パッケージを取得するために--extra-index-urlを使用すると、同名の公開パッケージが選択される依存関係混乱の危険があると警告しています。

サプライチェーン攻撃

Pythonパッケージには、別のパッケージを依存関係として取り込むものがあります。直接インストールしたパッケージが安全でも、その依存先に悪意あるコードや脆弱性が含まれていれば、システムへ影響が及ぶ可能性があります。

また、正規パッケージの開発者アカウント、ソースコード管理サービス、CI/CD、公開用トークンなどが侵害され、不正なバージョンが公開されることもあります。

このように、ソフトウェアの開発、ビルド、公開、配布の途中を狙う攻撃が、ソフトウェアサプライチェーン攻撃です。

脆弱性が残るパッケージ

悪意を持って作られたパッケージだけでなく、既知の脆弱性が残っている古いパッケージにも注意が必要です。

開発が終了しているパッケージや、更新が長期間止まっているパッケージを使い続けると、脆弱性が修正されないままシステムに残る可能性があります。直接利用していない依存パッケージに脆弱性が含まれているケースもあるため、依存関係全体を把握することが重要です。

攻撃者が正規パッケージに似た悪性パッケージを公開し、開発者が確認せずにインストールすると、認証情報の窃取やマルウェア感染につながる可能性があります。

PyPIを悪用したサイバー攻撃事例

PyPIやPythonパッケージを悪用した攻撃は、実際に確認されています。ここでは、代表的な事例を紹介します。

PyTorchの依存パッケージが悪用された事例

2022年12月25日から30日にかけて、Linux環境でpipを使ってPyTorchのナイトリービルドをインストールした一部の利用者に、悪意あるtorchtritonパッケージが配布される事案が発生しました。

攻撃者は、PyTorchが独自のパッケージインデックスで利用していた依存パッケージと同じ名前のパッケージをPyPIへ登録しました。その結果、PyPI上の悪性パッケージが優先的に選択され、機密情報を外部へ送信するコードがインストールされました。

安定版のPyTorchは影響を受けていませんでしたが、公開リポジトリと独自リポジトリを併用する際の依存関係混乱リスクを示す事例です。

Ultralyticsの公開フローが侵害された事例

2024年12月には、画像認識ライブラリなどを提供する「Ultralytics」の一部バージョンに、不正なコードが混入するサプライチェーン攻撃が発生しました。

この事例ではPyPI自体の脆弱性が悪用されたわけではなく、GitHub Actionsのワークフローや公開プロセスが侵害されました。影響を受けたバージョンはPyPIから削除されています。

正規パッケージの名前や開発者だけを確認しても、ビルド・公開フローが侵害されていれば不正なバージョンを取得する可能性があります。パッケージ利用者だけでなく、公開者側のセキュリティ対策も重要であることが分かる事例です。

PyPIを安全に利用するための対策

PyPIを安全に利用するには、パッケージをインストールする前の確認と、インストール後の継続的な管理が必要です。

パッケージ名と公開元を確認する

パッケージ名はコピー&ペーストし、手入力によるスペルミスを避けましょう。公式ドキュメントや開発元のWebサイトからPyPIのページへ移動する方法も有効です。

PyPIの詳細ページでは、プロジェクトの説明、ソースコードの公開先、開発者、ライセンス、対応するPythonのバージョン、リリース履歴などを確認します。

ダウンロード数が多い、検索結果の上位に表示される、最近更新されているといった理由だけで安全と判断してはいけません。

いきなり本番環境へインストールしない

新しいパッケージは、仮想環境やコンテナなどの隔離された環境で確認してから本番環境へ導入しましょう。

動作確認では、想定外のファイル作成、外部通信、環境変数へのアクセス、過剰な権限要求などがないかを確認します。重要な認証情報を保存していない検証環境を使うことで、問題が発生した場合の影響を抑えられます。

バージョンを固定する

本番環境で利用するパッケージは、requirements.txtやロックファイルなどを使ってバージョンを固定します。

requests==2.32.3

バージョンを固定していない場合、新しいリリースが公開された際に、検証していないコードが自動的に取り込まれる可能性があります。

ただし、固定したまま更新しないと脆弱性が残るため、「固定して終わり」ではありません。更新情報と脆弱性情報を確認し、検証後に定期的に更新する運用が必要です。

ハッシュ値を検証する

pipには、requirementsファイルに記録したハッシュ値と配布ファイルを照合するハッシュチェック機能があります。

python -m pip install --require-hashes -r requirements.txt

ハッシュチェックを有効にすると、登録されたものと異なるファイルが取得された場合にインストールを停止できます。pipの公式ドキュメントでは、ハッシュチェックを利用する場合、すべてのパッケージと依存関係についてバージョンとハッシュを指定する必要があると説明されています。

既知の脆弱性を確認する

Python環境やrequirementsファイルに含まれる既知の脆弱性は、pip-auditなどのツールで確認できます。

python -m pip install pip-audit
pip-audit

requirementsファイルを対象にする場合は次の通りです。

pip-audit -r requirements.txt

pip-auditは、Python環境や依存関係を既知の脆弱性情報と照合するツールです。ただし、既知の脆弱性を検出するものであり、悪意あるすべてのパッケージを判定できるわけではありません。

利用しているパッケージを把握する

企業では、どのシステムでどのパッケージとバージョンを利用しているかを一覧化しましょう。

SBOM(Software Bill of Materials)を作成してソフトウェアの構成要素を把握しておけば、脆弱性が公表された際に、影響を受けるシステムを特定しやすくなります。

利用されていないパッケージや、管理者が不明なパッケージ、更新が停止しているパッケージは、定期的に見直す必要があります。

企業では利用ルールを定める

企業の開発環境では、開発者が任意のパッケージを自由にインストールできる状態を避けることも重要です。

承認済みパッケージの許可リスト、社内パッケージリポジトリ、脆弱性スキャン、ソースコードレビューなどを組み合わせることで、悪性パッケージや未確認パッケージの利用を抑えられます。

非公開パッケージとPyPIを併用する場合は、単純に--extra-index-urlを追加するのではなく、依存関係混乱が起きないリポジトリ設計やパッケージ命名ルールを検討しましょう。

パッケージ公開者が行うべき安全対策

PyPIへパッケージを公開する開発者は、利用者以上にアカウントや公開フローの管理が求められます。

多要素認証を設定する

PyPIでは、2024年1月1日からすべてのユーザーに2要素認証が必須化されています。プロジェクトの管理やファイルのアップロードを行うには、2要素認証の設定が必要です。

PyPIだけでなく、登録メールアドレス、GitHubやGitLabなどのソースコード管理サービスにも多要素認証を設定しましょう。

長期間使用するAPIトークンを減らす

CI/CDからPyPIへパッケージを公開する場合は、長期間有効なAPIトークンを保存する方法よりも、Trusted Publishingの利用が推奨されます。

Trusted Publishingでは、対応するCI/CDサービスとPyPIを連携し、公開時に短時間だけ有効な認証情報を発行できます。長期間有効なトークンを保存する必要がないため、認証情報が漏えいした場合のリスクを抑えられます。

ビルドと公開のフローを保護する

ソースコードが安全でも、ビルドや公開の処理が侵害されれば、悪性コードを含むパッケージが正規の名前で公開される可能性があります。

CI/CDの権限を必要最小限にし、依存関係やGitHub Actionsなどの外部処理をバージョンやコミット単位で固定します。不要になったAPIトークンやシークレットは削除し、不審なリリースがないか公開履歴も確認しましょう。

PyPIに関するよくある質問

PyPIは無料で利用できますか?

PyPIでは、Pythonパッケージの検索、ダウンロード、公開を基本的に無料で利用できます。

ただし、PyPIは多くの利用者がパッケージを公開できるオープンなサービスです。無料で利用できることと、すべてのパッケージが安全であることは別の問題です。

PyPIにあるパッケージはすべて安全ですか?

すべてが安全であるとは限りません。

PyPIでは不正なパッケージの検出や削除、タイポスクワッティング対策などが進められていますが、悪性パッケージや侵害された正規パッケージが一時的に公開される可能性はあります。インストール前に名前、公開元、ソースコード、依存関係などを確認しましょう。

pip installは必ずPyPIから取得しますか?

必ずPyPIから取得するわけではありません。

pipはPyPI以外のパッケージインデックス、ローカルファイル、Gitなどのバージョン管理システムからもパッケージをインストールできます。利用している設定やコマンドによって取得先が変わります。

PyPIとGitHubの違いは何ですか?

PyPIは、主にPythonパッケージを配布するためのリポジトリです。GitHubは、ソースコードの保存、変更履歴の管理、共同開発などを行うプラットフォームです。

GitHubでソースコードを管理し、完成した配布パッケージをPyPIへ公開するという使い方が一般的です。

PyPIにないパッケージもインストールできますか?

pipでは、Gitリポジトリ、ローカルフォルダ、配布ファイル、PyPI以外のパッケージインデックスなどからもインストールできます。

ただし、入手元がPyPI以外であっても、安全性を確認する必要があります。URLや公開元が信頼できるかを確認し、検証環境で動作を確認してから利用しましょう。

まとめ

PyPIは、Python向けのパッケージを公開・配布するリポジトリであり、pipはPyPIなどからパッケージを取得してインストールするためのツールです。両者を利用することで、Pythonに必要な機能を効率的に追加できます。

一方、PyPIには悪意あるパッケージ、タイポスクワッティング、依存関係混乱、正規パッケージの公開フローを狙うサプライチェーン攻撃などのリスクがあります。PyPI上に存在するという理由だけで安全と判断せず、パッケージ名や公開元、依存関係、バージョン、脆弱性情報を確認することが重要です。

企業で利用する場合は、仮想環境での検証、バージョンとハッシュ値の固定、脆弱性スキャン、SBOMによる管理、社内リポジトリや許可リストの整備を進めましょう。利用者と公開者の双方がソフトウェアサプライチェーンを意識することで、PyPIの利便性を生かしながらセキュリティリスクを抑えられます。

SNSでもご購読できます。