snyk を使ってプロジェクトのセキュリティ管理を(できるだけ)楽にする．

# はじめに
この記事は[Snykを使ってセキュリティにまつわる記事を投稿しよう！【PR】Snyk](https://qiita.com/advent-calendar/2021/snyk)の3日目の記事です．

普段の開発で「**セキュリティや脆弱性には気を付けないといけない**」と思っていても実際に行うのは簡単ではないですよね．

- 書いているコードにセキュリティリスクがないか
    - 書いている人が確認する？レビュワーが確認する？両方？
    - XSSやCSRF・SQLインジェクションなど様々な場合について考えられる？
- 使用しているライブラリなどに重大な脆弱性がないか
    - 使っているもの全て確認する？
    - どれくらいの頻度で確認する？
    - どうやって修正すれば良い？どのバージョンに上げれば良い？

パッと思いつくだけでも，考慮すべきことがたくさんあります．特に，個人開発やOSSではセキュリティレベルを担保することはかなり難しいと思います．

そこで今回は， [snyk(スニーク)](https://snyk.io/)を使って上記を自動化したいと思います．
(スニークって初見で読むの難しくないですか...?)

snykを使うと上記の考慮事項を以下のように解決できます．

- 書いているコードにセキュリティリスクがないか
    - 書いている人が確認する？レビュワーが確認する？両方？ -> **snykが確認してくれる**
    - XSSやCSRF・SQLインジェクションなど様々な場合について考えられる？ -> **snyk codeでチェックする**
- 使用しているライブラリなどに重大な脆弱性がないか
    - 使っているもの全て確認する？ -> **snyk Open Sourceで(OSSに関しては)全て見てくれる**
    - どれくらいの頻度で確認する？ -> **snyk Open Sourceで定期的に確認**
    - どうやって修正すれば良い？どのバージョンに上げれば良い？ -> **snyk Open SourceでPRを自動作成**

# 準備
snykを使うにあたって，アカウントを作成する必要があります．とはいえGithubやGoogleアカウントと連携できるので，とても簡単に作れるはずです．
今回はGithubアカウントで登録することで，Githubとの連携が済んでいることを前提に話します．他のアカウントを使った場合も，登録後に表示されるダッシュボードのintegrationタブから簡単にGithub連携ができるはずです．

https://qiita.com/SnykSec/items/aa80a976eb17299fff62

上記記事に従ってアカウントを作成してください．

# 本題
実際に snyk の機能を使っていきます．snykはいくつかの機能に名前が分かれています．まずはライブラリなどの脆弱性に関する snyk Open Sourceを体験してみた後，静的解析によってコードに危険性がないかチェックしてくれる snyk Code を使用してみます．
## snyk Open Source
snyk Open Source は 定期的に使用しているライブラリなどに脆弱性がないか，あれば自動で修正するためのPull Requestを作成したりと，使用しているオープンソースライブラリに問題がないか確認してくれる機能です．

https://docs.snyk.io/products/snyk-open-source

[準備](#準備)でアカウントを作成できていれば，[ダッシュボード](https://app.snyk.io/)にアクセスできるようになっているはずです．

アクセスすると，右上に「Add project」ボタンがあるので押します．
![スクリーンショット 2021-11-23 17.53.00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/a3c5c605-bedd-d8ad-1fef-e6b1e0c45a1a.jpeg)

試しに，僕の個人開発である[ポートフォリオ](https://github.com/masibw/portfolio-next)をimportしてみたいと思います．
追加したいプロジェクトにチェックを入れ，右上の「Add selected repositoriesボタンを押せばOKです．Settingsで検査を除外するフォルダの指定など，細かい設定を行うことができまが，今回は変更せず実行します．
![スクリーンショット 2021-11-23 17.58.08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/a90a3f6c-6186-2ebe-ae08-d0a8e80552cc.jpeg)

しばらく待つと，深刻度Highな懸念が１つあることが表示されました．
![スクリーンショット 2021-11-23 18.03.46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/124188dd-c11f-1ceb-407b-18ead670c69e.jpeg)

クリックして詳細を見てみます．
![スクリーンショット 2021-11-23 18.10.22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/e2827c52-bda9-f2a1-b643-1091893bf329.jpeg)

どうやら `next@12.0.1`で使用されている`shell-quote@1.7.2`に任意コード実行(Remote Code Execution)の脆弱性が存在するようですね．説明を読むと，「exec関数を使って実際のシェルに出力を渡すと任意コードが実行される」とあるので，必ずしも危険なわけでは無いようです．しかし，`next@12.0.2`にアップグレードすると修正できるとも書いてあるので，せっかくならアップグレードしてしまいましょう．
右下にある「Fix this vulnerability」ボタンを押します．

すると，修正する脆弱性とPull Requestを作成するボタンが表示されたページに移動します．
![スクリーンショット 2021-11-23 18.11.29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/2e7d29ea-a4dd-b206-e7c2-969c6d1fc413.jpeg)

「Open a Fix PR」ボタンを押すと，早速Pull Requestを作成してくれました．

https://github.com/masibw/portfolio-next/pull/9

あとはいつも通りPull Requestをレビューして，マージすればOKです！

今回は手動で修正のPull Requestを作成しましたが，デフォルトでは毎日自動でスキャンし，Pull Requestを作成してくれるはずです．

また，デフォルトで該当プロジェクトのCIにもsnykが追加され，PRを作成すると，追加された依存に脆弱性がないかなどをチェックしてくれます．
![スクリーンショット 2021-11-23 18.30.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/54009799-85ec-58ab-041f-0fa1cdcaabc1.jpeg)


Projects一覧の歯車ボタンから設定画面へ移動することで，どれくらいの頻度でスキャン・Pull Request作成をするか選べます．

![スクリーンショット 2021-11-23 18.19.04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/a49b15ca-4dfd-cedc-f108-bc9862d10799.jpeg)

![スクリーンショット 2021-11-23 18.22.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/32080456-b759-8198-afc2-74fb5fc2cca3.jpeg)

自動PRでメジャーバージョンのアップグレードも行うかどうかなど，さらに細かい設定はアイコンの左にある歯車ボタンからSettingsを開き
![スクリーンショット 2021-11-23 18.25.15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/315dea64-6e6b-b8bb-7f73-dc1335cc6cb8.jpeg)

IntegrationsのGithub->Edit Settingsから行えます．
![スクリーンショット 2021-11-23 18.27.06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/7898309b-67c0-a6a9-da63-2ad7378e9cb3.jpeg)

## snyk Code
snyk Codeは静的解析によってアプリケーションコードに危険性がないかをチェックしてくれる機能です．
既に存在するプロジェクトのコードをスキャンすることもできますし，JetBrains系IDEやVSCodeと連携してリアルタイムにチェックすることもできます．

今のところ

- Java
- JavaScript and TypeScript
- Python
- PHP
- C#

に対応しているようです．

https://docs.snyk.io/products/snyk-code/snyk-code-language-and-framework-support

### 既に存在するプロジェクトをスキャンする
まずは右上にある歯車ボタンから設定を開きます．
![スクリーンショット 2021-11-23 18.25.15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/69884bc7-28da-6fda-9b7a-800e3b005a1b.jpeg)

そしてsnyk Codeを有効にします．
![スクリーンショット 2021-11-23 20.09.52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/c60f1035-9647-b41d-ec63-7848f021f616.jpeg)

再度projectをimportしなおす必要があるので，メニュータブの「Projects」から再度「Add project」ボタンを押してimportします．

すると，「Code analysis」が追加されています．
![スクリーンショット 2021-11-23 20.31.39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/ef40ef80-24f0-05f8-29e0-c481cd3b7fd1.jpeg)

今回は危険性のあるコードが発見されませんでしたが，発見されると詳細ページには以下のように表示されます．(ちなみにこれはテストコードなので問題ありません)
![スクリーンショット 2021-11-23 20.34.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/f004cb75-b7f4-1206-cb75-35ceb4fa0024.jpeg)

どのように修正すれば良いかも表示してくれます．素晴らしい...
![スクリーンショット 2021-11-23 20.36.59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/d2d7dc5b-9fd4-18b0-77e5-3c2420785ace.jpeg)

### VSCodeの拡張機能として使う
開発中に問題のあるコードを指摘してもらいましょう．
以下の拡張機能をVSCodeにインストールします．
https://marketplace.visualstudio.com/items?itemName=snyk-security.snyk-vulnerability-scanner

snykのアイコンがサイドバーに表示されるので，アカウントを認証します．
![スクリーンショット 2021-11-23 20.41.10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/7cfa7c68-a82e-947c-27e8-d10fb8a7e9be.jpeg)
![スクリーンショット 2021-11-23 20.41.20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/5b0dcae2-eece-5324-51a9-e5e5a6396933.jpeg)

実際に脆弱性のあるコードを書いてみましょう

```js:index.js

eval(location.hash);

exec(location.hash);

```

コードを書いて保存すると，コードスキャンが実行されます．
どこに脆弱性があり，どんな危険性があるかも説明されていますね．
![スクリーンショット 2021-11-23 21.06.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379424/21f64479-a856-b5c7-64fe-ed66315fd9e9.jpeg)

# さいごに

実際にsnykの様々な機能を使ってみましたが，非常に直感的に設定ができますし簡単に実行できたので使いやすかったです．今回紹介した機能以外にも，コンテナイメージの脆弱性チェックやTerraformやCloudFormationなどのIasSのスキャンなどを行える機能もあるので，是非使ってみてください！


# 参考

https://docs.snyk.io/products/snyk-open-source

https://docs.snyk.io/products/snyk-code

https://qiita.com/SnykSec/items/aa80a976eb17299fff62