Snyk無償版を使ってみた

# はじめに

[Snyk](https://snyk.io/) の無償アカウントでどこまでできるかやってみました。

# 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/a90338b8-c5c0-bc99-42cc-7343bf50599d.png)

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

## Reports画面

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/ee8e291c-e1d1-57c9-4fd0-4bde39db50af.png)

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

## Projects画面

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/76e2f8e7-69f0-03ee-6ef4-17c17dd786c5.png)

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

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

## Integrations画面

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/097c1dd3-b842-12cf-4961-a49863f48af9.png)

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

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

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

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

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

## Members

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/6bca7438-3082-145e-7f5d-98bca279ff7b.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/83bfe705-c2fb-b94e-cb80-9bfaad4c6af5.png)

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

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

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

# スキャンしてみる

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

## リポジトリを追加する

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/1a7e092d-2bad-8bc8-0f6f-d1eae464bd3e.png)

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

ここでは、Python のリポジトリ [kannkyo/boilerplate-python](https://github.com/kannkyo/boilerplate-python) を選択して、`Add selected repositories` ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/18382aa8-f407-747e-b9b8-9ebab8fce3de.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/a1fa42e2-b39f-507b-e303-304a49cd3bd8.png)

## スキャン結果を確認する

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/77cce42a-68bf-aab4-6858-580fdfbaead1.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/d0d745fb-817c-9e2d-6031-6e36b1c6fa37.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/5d5fee74-5e35-ce1a-05ea-87aa480c61d4.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/be9f079e-edda-8682-70e4-f9e3f7e5b79a.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/32b8ccd7-1348-bfda-21e1-2ffd9a1221c2.png)

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

ほんとに一瞬です。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/83fe695d-cc7b-2957-2e11-86cc0a7f78c9.png)

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

### プルリク確認

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/a5335d97-b993-67b7-486e-83df4390d021.png)

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

Dockerfile は [マルチステージビルド](https://qiita.com/carimatics/items/01663d32bf9983cfbcfe) にしていたので `FROM` 句が 2 箇所あったのですが、しっかり両方とも処置してくれてます。

### マージ

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/9cd17a38-2f21-923f-dac2-44ec2ec4b13c.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/7a6e60f7-0058-e553-eb02-427b3b812dca.png)

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/a702ca11-5cb5-82e9-28f8-a8f1cabd6102.png)

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

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

# 設定を変更する

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/4b6c6d03-a88b-fa05-73f8-c7f283f390c6.png)

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

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

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

とりま、Enable にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/3ab97a73-a72b-5194-c3fb-daee1c2fa98c.png)

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

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

とりま、Enable にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/ceb91aaa-10b5-32c2-2240-c1be69652a86.png)

## 自動修正プルリクエスト

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

とりま、Enable にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/f66a3a04-d880-88ed-5372-71759763f5f9.png)

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

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

とりま、Enable にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/bc38d556-5135-06f3-3838-9febadb31b1d.png)

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

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

とりま、Enable にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/6fa2bbaf-e0af-dd48-9392-8916d4977128.png)

## Snyk Code

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

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

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

Enable にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/fe451c44-2ed8-002b-7049-315fb5de5ccc.png)

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

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

エラーが出ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/e12a3d30-3dfa-2eaa-9e1d-a12474a02d14.png)

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

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

<https://docs.snyk.io/products/snyk-open-source/language-and-package-manager-support>

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

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

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/2791a099-6ed7-4d07-3547-9ff0a21efd27.png)

## コードスキャン

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/515a26ae-3b7e-cceb-bf3f-2f55ab8fb253.png)

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

[boilerplate-python](https://github.com/kannkyo/boilerplate-python) リポジトリと[boilerplate-nodejs](https://github.com/kannkyo/boilerplate-nodejs)リポジトリのコードで脆弱性が発見されたことがわかります。

次に、 [boilerplate-python](https://github.com/kannkyo/boilerplate-python) リポジトリの `Code analysis` リンクをクリックして、脆弱性の詳細を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/da18fc1e-1056-669d-a893-f67d29b57c7d.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/64a00cd3-9fb6-410a-f4cf-94ada5144496.png)

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

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

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

# まとめ

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

**ポイント**

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