LoginSignup
51
31

More than 1 year has passed since last update.

はじめに

Snyk の無償アカウントでどこまでできるかやってみました。

Snykとは

Snykとはセキュリティプラットフォームです。

Snyk(スニーク)はデベロッパーファーストのセキュリティプラットフォームです。Snykは、コードやオープンソースとその依存関係、コンテナやIaC(Infrastructure as a Code) における脆弱性を見つけるだけでなく、優先順位をつけて修正するためのツールです。Gitや統合開発環境(IDE)、CI/CDパイプラインに直接組み込むことができるので、デベロッパーが簡単に使うことができます。

出典: https://qiita.com/advent-calendar/2021/snyk

docker, IaC, プログラム等の様々なソースコードの脆弱性をチェックすることができるSaaSです。

Snykの画面構成

Snykの画面をひと通り見てみます。

Dashboard画面

脆弱性スキャン対象のプロジェクトを管理する画面です。

image.png

いまはまだプロジェクトを追加していないので空の状態です。

Reports画面

脆弱性スキャンのレポートを表示する画面です。

image.png

いまはまだスキャンしていないので空の状態です。

Projects画面

脆弱性スキャン対象のプロジェクトを表示する画面です。

image.png

いまはまだプロジェクトを追加していないので空の状態です。
プロジェクト数が増えても、左側のフィルタで検索しやすい作りになっていますね。

1 つのアカウントで大量のプロジェクトを管理できるように設計されているようです。

Integrations画面

Snyk と連携できるサービスの一覧を表示する画面です。

image.png

連携できるサービスが 58 個もありました!

サービスは以下の 11 カテゴリに分類されています。

  • ソース管理
  • コンテナレジストリ
  • コンテナオーケストレーター
  • 展開された環境
  • 継続的インテグレーション
  • IDE プラグイン
  • パッケージリポジトリ
  • サーバーレス
  • サービスとしてのプラットフォーム
  • 通知
  • 脆弱性管理

GitHub/GitLab, AWS/Azure/GCP, Jenkins/CircleCI, VSCode/Eclipse などなど。

有名なツールは一通り揃ってそうです。

Members

メンバーを管理する画面です。

image.png

いまはまだメンバーを追加していないので空の状態です。

image.png

左上の Add members ボタンをクリックすると、メンバー追加画面が表示されます。

メールアドレスをカンマ区切りで複数入力して、オーガナイゼーションを選択すると一気に大量のメンバーを追加できるようです。

1 つのアカウントで大量のメンバーを管理することを考えて画面を作り込んでいるようです。

スキャンしてみる

GitHub リポジトリをスキャンしてみます。

リポジトリを追加する

Project 画面を開き、Add project ボタンをクリックして、GitHub を選択します。

image.png

自分の GitHub アカウントのリポジトリからスキャンしたいものを選択します。

ここでは、Python のリポジトリ kannkyo/boilerplate-python を選択して、Add selected repositories ボタンをクリックします。

image.png

ほんの 1,2 秒で脆弱性スキャン結果が表示されました!はやい!

image.png

スキャン結果を確認する

Dockerfile から脆弱性を検出したようです。

Dockerfile リンクをクリックして、詳細を表示します。

image.png

ベースイメージ(Current image)の python:3.9-slim-buster に脆弱性が 72 件 (内、クリティカル(C) 2 件、高(H) 9 件)含まれていることがわかりました。

また、より脆弱性が少ない代替イメージ(Alternative upgrades)として python:3.11.0a1-slim-bullseye を提案されました。

クリティカルな脆弱性の詳細を確認します。

Issues タブを選択して、SEVERITY=Critical を選択します。

image.png

クリティカルな脆弱性が、どちらも glibc の脆弱性(CVE-2021-33574, CVE-2021-35942)であることがわかりました。

1 つ目の脆弱性(CVE-2021-33574)の Show more detail をクリックして、脆弱性の詳細を確認します。

image.png

次のように書いてあります。

Introduced through: python@3.9-slim-buster › glibc/libc6@2.28-10
python@3.9-slim-buster で導入されたglibc/libc6@2.28-10によるもの
Fix: No remediation path available.
処置方法はない。

ベースイメージによって導入された脆弱性であることと処置方法は無いことがわかりました。

処置する

Snykの機能を使って、次に脆弱性を処置してみます。

プルリク作成

Open a fix PR ボタンをクリックします。

image.png

Open a fix PR ボタンをクリックします。

image.png

一瞬でプルリクが作成されました。

ほんとに一瞬です。

1 秒もかかってない。はやい!

image.png

実際のプルリク: https://github.com/kannkyo/boilerplate-python/pull/8

プルリク確認

プルリクには、脆弱性の一覧やベースイメージを変更する旨のメッセージが細かく記述されています。

日本語対応していないのがちょっとザンネンですが、非常にわかりやすく読みやすい PR です。

次に、変更箇所を確認します。

image.png

たしかにベースイメージを変更していますね。

Dockerfile は マルチステージビルド にしていたので FROM 句が 2 箇所あったのですが、しっかり両方とも処置してくれてます。

マージ

PR をマージしてマージ後にスキャン結果がどう変わるかを確認します。

まず PR をマージしました。

image.png

次に Snyk の画面に戻ります。

すると、これまた一瞬のうちに脆弱性スキャンが終わってました。

image.png

ベースイメージが更新された旨のメッセージが表示されています。

The base image python:3.11.0a1-slim-bullseye is up to date
ベースイメージの python:3.11.0a1-slim-bullseye は更新された

処置方法のないクリティカルな脆弱性 1 件だけが残った状態になりました。

image.png

snyk ではこれを自動処置できないようです。

処置するとすると、Dockerfile で apt-get remove する感じでしょうか。

設定を変更する

Snykには、GitHub リポジトリの脆弱性を自動的にスキャンするための便利な設定があります。

image.png

ためしに設定してみます。

到達可能な脆弱性分析 ベータ

アプリケーションがオープンソースの依存関係をどのように使用しているかを詳しく調べる設定です。

とりま、Enable にします。

image.png

オープンソースのセキュリティとライセンス

新しい PR が開かれるたびに、GitHub 統合を通じてインポートされたプロジェクトのセキュリティとライセンスの問題をチェックする設定です。

とりま、Enable にします。

image.png

自動修正プルリクエスト

新しい脆弱性が発見された馬祭などにプルリクを自動で作成する設定です。

とりま、Enable にします。

image.png

Dockerfile ベースイメージを自動的に更新します

最新のベースイメージを使用するように Dockerfiles を更新するプルリクエストを自動的に発生させる設定です。

とりま、Enable にします。

image.png

自動依存関係アップグレードプルリクエスト

プルリクエストを自動的に発生させて、古い依存関係を更新する設定です。

とりま、Enable にします。

image.png

Snyk Code

ソースコードの脆弱性をチェックする設定です。

SnykはデフォルトではDockerfileやパッケージマネージャのファイルから脆弱なパッケージを含むかどうかのチェックだけを実行します。

Snyk Codeの設定をenableにするとソースコード内の脆弱性も診断してくれるようになります。

Enable にします。

image.png

他のリポジトリも追加する

他のリポジトリも追加してみます。

エラーが出ました。

image.png

どうも、Snyk のサポート対象外の言語だったようです。

Snyk のサポート対象原語は以下のサイトにまとまっています。

追加した設定を試してみる

プルリク作成時の自動スキャン

プルリクを作成して、 snyk の自動スキャンを実行してみます。

プルリク:https://github.com/kannkyo/boilerplate-verilog/pull/4

スキャンが実行されてGitHubの画面上にスキャン結果が表示されました。

image.png

コードスキャン

Snyk Codeによるコードスキャンを試しに実行します。

Snyk Codeを有効化した後には再度全てのプロジェクトをインポートする必要がある点に注意してください。

再インポートして、スキャン結果を確認します。

image.png

スキャン結果の画面にCode analysis という項目が追加されています。

boilerplate-python リポジトリとboilerplate-nodejsリポジトリのコードで脆弱性が発見されたことがわかります。

次に、 boilerplate-python リポジトリの Code analysis リンクをクリックして、脆弱性の詳細を確認します。

image.png

Flask の REST API のメソッドでクロスサイト・スクリプティングの脆弱性が検出されました。

Full details ボタンをクリックしてさらなる詳細を確認します。

image.png

左側にデータフローが、右側にソースコードが表示されました。

ソースコードで 19 行目の name と 28 行目の "Hello {}!".format(name) がハイライトされています。

入力された文字列を全くチェックせずに使ったため、クロスサイト・スクリプティングの脆弱性有と判定されたようです。

まとめ

Snyk というセキュリティプラットフォームを使ってみました。

ポイント

  • Snykの脆弱性チェックが非常に高速。
  • Snykの画面は、多数のユーザやプロジェクトを管理するのに便利な細かい工夫がなされていた。使いやすそう。
  • Snykは、1つのリポジトリ内に混在しているパッケージ、IaC、ソースコードの全ての脆弱性チェックが可能。
  • Snykは、58種類の11カテゴリのサービスと連携可能。
51
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51
31