Skip to main content

Snykで始めるセキュアなPython開発

blog feature secure python dev

2021年8月4日

0 分で読めます

Python開発者として、アプリケーションのセキュリティを手軽に強化したいとお考えなら、ここが最適です。Snykは、既存の開発ワークフローにシームレスに組み込むことで、Pythonアプリを構成するコード(自分で書いたコード、利用するオープンソースライブラリ、コンテナ、Infrastructure as Code(IaC))をすべて保護します。

Snykプラットフォームは、Pythonアプリを構成するさまざまな要素を、できるだけ手間をかけずに保護できるよう設計された4つの製品で構成されています。

  • Snyk Code:Pythonコードに含まれるセキュリティと品質の問題を検出し、修正します。

  • Snyk Open Source:アプリの構築に使用するオープンソースのPythonパッケージに含まれるセキュリティ脆弱性やライセンスの問題を検出し、修正します。

  • Snyk Container:Pythonコンテナイメージに含まれるセキュリティ脆弱性を検出し、修正します。

  • Snyk Infrastructure as Code:Pythonアプリのデプロイを構成するコードに含まれるセキュリティ脆弱性を検出し、修正します。

この記事では、すでに利用している開発方法にSnykのセキュリティテストを簡単に組み込む方法をご紹介します。以下で説明する各ステップを試す場合はもちろん、小規模なプロジェクトであれば、Snykの無料プランで十分にご利用いただけます。

最初からPythonアプリをセキュアに

開発者にとって、問題の発見が早いほど修正も容易です。コードをパッケージ化してリリースした後に重大な脆弱性を修正するより、開発プロセスの早い段階で修正するほうが、はるかに時間を節約できます。

プロのヒント: Snykは、オープンソースプロジェクトであれば無料でお試しいただけます。IDEプラグインでSnyk Open SourceまたはSnyk Codeを使用する場合、SnykにGitHubリポジトリへのアクセスを許可する必要はありません。Snykを試す最も簡単な方法は、無料アカウントを作成してオープンソースリポジトリをスキャンすることです。インストールは不要で、わずか数秒で連携できます。

Snykでは、IDE、Advisor、Snyk CLIを使って、開発のごく早い段階からコードを保護できます。

IDE

IDE内でもSnykを使ってコードを保護できます。たとえば、PyCharm用のSnykプラグインはSnyk Open SourceとSnyk Codeの両方に対応しており、オープンソースの依存関係にある既知の脆弱性だけでなく、自分で書いたコードのセキュリティ問題やバグも簡単に見つけて修正できます。

プラグインの設定は簡単です。他のJetBrainsプラグインと同じように、IDE内から直接ダウンロードしてインストールできます。

PyCharmでPreferencesからPluginsを開き、JetBrainsマーケットプレイスでSnykを検索して、OKをクリックすると、プラグインをダウンロードしてインストールできます。

次に、プラグインをSnykアカウントに接続します。プラグインの画面でConnect your IDE to Snykボタンをクリックし、表示される手順に従って認証してください。

これで準備完了です。あとはSnykのテストを実行するだけです。Analyze now!ボタンをクリックして、Snykのセキュリティテストを開始します。数秒後、プラグインに検出された問題の一覧が表示され、次の3つのカテゴリに分類されます。

  • オープンソースのセキュリティ:プロジェクトに取り込んだ直接依存および間接(推移的)なオープンソース依存関係に含まれる既知の脆弱性

  • コードのセキュリティ:自分で書いたコードに検出されたセキュリティ上の弱点

  • コードの品質:自分で書いたコードの品質に関する問題

PyCharmに、Snykが検出したセキュリティ上の問題が表示されたPythonプロジェクト。package_index.pyのコマンドインジェクションやパストラバーサルの脆弱性が示されています。

自分で書いたコードに問題が見つかった場合、プラグインはデータフローの詳細を示し、問題につながるコードのファイルや行を特定します。ファイル名をクリックすると、問題の原因となっている行をすぐに開けます。データフロー分析により、問題とアプリケーション内でのデータの流れを把握でき、複雑な問題も理解しやすくなります。

プラグインの機能は、問題の表示だけではありません。コードの問題点を示すだけでなく、ほかのユーザーによる修正例も提示するため、より迅速に対処できます。

IDE内のSnykセキュリティプラグインに表示された、Pythonコードの脆弱性と変更箇所を強調表示したコード差分

Snyk Advisor

Snyk Advisorは、使用するオープンソースパッケージやコンテナのベースイメージを選ぶ際に役立つ、無料のオンライン調査ツールです。PyPI上のすべてのプロジェクトに加え、Docker HubのPythonベースイメージも収録しています。Python開発者はSnyk Advisorでさまざまなパッケージやイメージを調査し、プロジェクトに組み込む前に全般的な健全性やセキュリティ状況を確認できます。

Jinja2 PythonパッケージのSnyk Advisorページ。健全性スコア99/100、人気度とメンテナンスのグラフ、セキュリティの詳細を表示

上の手順でスキャンしたプロジェクトの場合、Jinja2パッケージを調べると、バージョン3が最も人気があるだけでなく、脆弱性もないことがわかります。

CLI

Snyk CLIは、ローカルの開発環境で手動、またはCI/CDパイプラインの一部としてSnykのセキュリティスキャンを実行できる、強力な無料ツールです。豊富な引数を使って、スキャン結果から特定の詳細情報を抽出したり、テストプロセスをカスタマイズしたりできます。

注: Snyk CLIはNode.jsとnpm、SCOOP、またはHomebrewを使用します。Snyk CLIを使う前に、これらをインストールしてください。

Snyk CLIのセットアップは簡単です。npmまたはHomebrewですばやくインストールし、Snykアカウントで認証するだけです。

npm install -g snyk
snyk auth

Pythonプロジェクトのテストは、あと1ステップで完了します。プロジェクトのルートフォルダからsnyk testコマンドを実行するだけです。

Snyk Open Sourceのテストでは、次のコマンドで依存関係もインストールする必要があります。

pip install -r requirements.txt 
snyk test

プロのヒント: 仮想環境を有効にしてpip freeze > requirements.txtコマンドを実行すると、プロジェクトのrequirements.txtを生成できます。

Snykは、脆弱な依存関係やライセンスの問題の一覧に加えて、一部の依存関係について、推奨するアップグレード先のバージョンなど、修正に役立つ情報も提供します。

この記事で使用したプロジェクトでは、Jinjaパッケージのバージョン2.11.1に起因する中程度の深刻度の脆弱性がSnykによって検出され、修正を適用するためにバージョン2.11.3へのマイナーアップグレードが推奨されています。

SnykがPythonの依存関係9件をスキャンし、脆弱性のあるJinja2パッケージと推奨されるアップグレードを特定したターミナル画面。

Snyk CLIを使うと、新たに公表された脆弱性や、既存の脆弱性に対する新しい修正について通知を受け取ることもできます。その場合は、次のコマンドを使用します。

snyk monitor

「結果は、指定されたURLにあるSnykアプリで確認できます。新たに関連する脆弱性が公表された場合は通知が届きます。」

Python Flaskアプリにおける中程度の深刻度のJinja2正規表現によるサービス拒否脆弱性を示すSnykのプロジェクトダッシュボード

同じSnyk CLIを使って、Pythonコンテナのセキュリティ問題やInfrastructure as Code(IaC)もスキャンできます。Snyk CodeのCLI対応も近日公開予定です。ぜひご期待ください。

同じプロジェクトで、次のコマンドを使ってアプリケーションのコンテナイメージをテストしてみましょう(テストの前にイメージをビルドしてください)。

snyk test --docker debian --file-Dockerfile

Snyk CLIはイメージをスキャンして問題を検出し、ベースイメージのアップグレードに役立つヒントも提示します。

SnykがDebianのDockerイメージをスキャンし、tar、bash、glibcの脆弱性を報告しているターミナル。

最後に、Snyk Codeを使ってコードをスキャンできます。次のコマンドを実行します。

snyk code test .

CLIがローカルプロジェクトをスキャンし、結果を表示します。

ターミナルに、Snyk Code CLIがPythonの設定ファイル内にハードコードされた重大度の高いシークレットを検出した様子が表示されている

Snyk CLIのヒントやテクニックについては、CLIチートシートをご覧ください。

SnykのIDEプラグイン、Snyk Advisor、Snyk CLIは、オープンソースのPythonプロジェクトであれば、スキャン回数無制限で無料でご利用いただけます。

Pythonリポジトリにセキュリティ対策を組み込む

2019年に実施された前回のPythonコミュニティ調査によると、Python開発者の90%がGitHubなどのソースコード管理(SCM)システムを利用しています。2021年に同じ質問をすれば、さらに高い割合になるとしても不思議ではありません。

開発時間やプロセスの多くをこうしたシステム上で費やすため、開発を遅らせずにセキュリティ対策を簡単に加えられれば、大きなメリットがあります。たとえば、次のようなことができたらどうでしょうか。

  • 脆弱なコードをPythonリポジトリに取り込まないよう、新しいプルリクエストをすべて自動でスキャンできたらどうでしょうか。

  • Pythonアプリケーションの健全性を保ち、最新の状態にするために、古くなったPythonパッケージをアップグレードするプルリクエストを自動で作成できたらどうでしょうか。

  • 新たに公表された脆弱性をすばやく修正できるよう、通知と、問題の解決に必要な推奨修正を含むプルリクエストを受け取れたらどうでしょうか。

  • CI/CDプロセスの一部としてセキュリティを自動化するために、GitHub ActionsやBitbucket Pipelinesにセキュリティテストを追加できたらどうでしょうか。

  • 自社独自のコードを保護するために、セキュリティ問題をすばやくスキャンし、悪意のあるデータがアプリ内をどのように流れるかを自分のコード上に重ねて特定できたらどうでしょうか。

Snykなら、こうしたすべてを実現できます。わずか数ステップでPythonプロジェクトをSnykにインポートし、適切に保護できます。

Snykでインテグレーション、次にGitHubを開き、Pythonプロジェクトを選択してSnykにインポートします。新しいプロジェクトのインポート時に、SnykはPythonプロジェクトを構成するすべての要素を自動でスキャンし、プロジェクトページに個別のサブプロジェクトとして表示します。

python-flask-sample-appリポジトリのコード解析、deployment.yaml、Dockerfile、requirements.txtを表示したSnyk Projectsダッシュボード。

たとえば、deployment.yaml fileを開くと、アプリケーションのKubernetesデプロイ設定でSnyk Infrastructure as Codeが検出した問題の詳細を確認できます。

KubernetesデプロイメントのYAMLと、コンテナがrootユーザー制御なしで実行されていることを示す警告を表示したセキュリティ問題ダッシュボード

インポート後、PythonプロジェクトはSnykによって継続的に監視されます。オープンソース依存関係に新たな脆弱性が見つかった場合や、既存の脆弱性に新たな修正が公開された場合には、プルリクエストが自動的に作成されます。

Snykボットが脆弱なPython依存関係を修正するため、Jinja2を2.11.1から2.11.3にアップグレードするGitHubプルリクエスト

Snykはほかのさまざまな状況でもプルリクエストを自動で作成します。また、作成のペースや頻度を調整し、プルリクエストが多くなりすぎないようにできます。Snykの修正機能の詳細は、Snykのドキュメントをご覧ください。

SnykのSCMインテグレーションは、オープンソースのPythonプロジェクトであればスキャン回数無制限で無料でご利用いただけます。対応するSnyk製品はSCMによって異なります。

CI/CDの一部としてPythonのセキュリティを自動化

CIプロセスにPythonのセキュリティテストを組み込むことで、コードを本番環境にプッシュする前に脆弱性を検出できます。このセキュリティゲートを追加すれば、ローカル環境で手動テストを実行しなかった場合でも問題を検出できます。

SnykはJenkins、CircleCI、TeamCityなどの主要なCI/CDツールと連携します。また、前述のとおり、Snyk CLIはあらゆる自動化パイプラインのステップとして使用できます。ここでは、GitHub ActionsのワークフローにSnykのセキュリティテストを追加する例を見てみましょう。

Snykは、Python 3.6、3.7、3.8を含む最新バージョンのPythonに対応したActionを提供しています。ここでは、この記事でテストしてきた同じPythonプロジェクトのセキュリティテストを自動化するために、このActionを使用します。

まず、リポジトリの設定(Settings †’ Secrets)でSnyk APIトークンをシークレットとして登録します。次に、Actionsタブを開き、Python Snyk Actionを使った新しいカスタムワークフローを作成します。

name: Example workflow for Python using Snyk
on: push
jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@master
      - name: Run Snyk to check for vulnerabilities
        uses: snyk/actions/python@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

予想どおり、上記のCLIテストで検出されたものと同じ脆弱性により、ビルドが失敗しました。

SnykがPython Flaskプロジェクトをスキャンし、依存関係の脆弱性を1件報告しているGitHub Actionsのセキュリティジョブ。

このActionはSnyk CLIをベースにしているため、対応するすべての引数を使って、CIプロセスの一部として実行するSnykのセキュリティテストの動作を調整できます。

開発は速く、安全は確かに。

Pythonは、開発をスピーディーに進めたい開発者に最適です。非常に汎用性が高く、書きやすい言語であり、アプリケーションに機能をすばやく追加できる豊富なオープンソースライブラリがそろっています。アプリをリリースする際には、DockerやRed Hatなどが使いやすいPythonコンテナのベースイメージを多数提供しています。さらに、Kubernetesやインフラの設定をPythonで記述することもできます。

開発スピードとセキュリティは両立できます。この記事を通して、ローカル開発環境やGitベースのワークフローの一部として、あるいは自動ビルドプロセスと連携して、既存のPython開発ワークフローにセキュリティを簡単に組み込めることをご理解いただけたのではないでしょうか。何より、開発スピードを落とす必要はありません。

CTFを始めよう

オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。

続きを読む

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSecのご紹介:AI開発のスピードに対応するセキュリティ

AI駆動型開発のスピードに、従来のセキュリティワークフローは追いついていません。SnykのAgentic AppSecは、セキュリティエージェントが脆弱性を継続的に検出、修正、検証し、人が基準を定められるようにします。

blog feature ai violet
Blog

VulnBump:AIエージェントはビルドを壊さずに脆弱な依存関係を修正できるか?

VulnBumpは、実際の依存関係アップグレード307件を対象にAIエージェントをテストします。脆弱性が解消され、ビルドとテストが成功した場合にのみ、修正としてカウントされます。

Blog

フロンティアモデルは脆弱性を発見した。攻撃者だけがエクスプロイトチェーンを見つけた。

静的解析で欠陥は見つかりましたが、ライブ攻撃テストで侵害につながる連鎖を実証できたのは唯一でした。Evo COS、Claude Security、Claude Code Securityを比較します。