【DevSecOps対策】0から始めるSnyk活用


# Snykとは？

Snykとは、オープンソースソフトウェアや依存関係、コンテナ、インフラストラクチャコードのセキュリティ脆弱性を検出し、修正するための開発者向けのセキュリティプラットフォームです。Snykは、開発の初期段階からセキュリティを統合することで、セキュリティリスクを低減し、迅速な修正を可能にします。

Snyk製のツールには以下の種類があります：

- [**Snyk Code:**](https://snyk.io/jp/product/snyk-code/) カスタムコードの脆弱性をリアルタイムで検知して修正
- [**Snyk Open Source:**](https://snyk.io/jp/product/open-source-security-management/) オープンソースとその依存関係にある脆弱性の検知と修正
- [**Snyk Container:**](https://snyk.io/jp/product/container-vulnerability-management/) コンテナや Kubernetes アプリケーションの脆弱性の検出と修正
- [**Snyk IaC:**](https://snyk.io/jp/product/infrastructure-as-code-security/) クラウドの設定ミスを修正
- [**Snyk AppRisk:**](https://snyk.io/jp/product/snyk-apprisk/) ビジネス全体のリスクを軽減

# アカウント作成＆初期設定セットアップ

  - SnykのURLに飛んでアカウント作成をします

https://app.snyk.io/login

  - 現時点では、Github, BitBucket, Google, AzureAD, Docker IDに対応しています。今回はGithubでログインします。
          
  - `Where is the code you want to scan?` と聞かれるので、どのソースリポジトリを対象にするかを選択することができます。
    ![snyk-01-(0).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/beeb11d8-9093-b0d3-fc90-92250117fc4e.png)
    
  - Github かBitbucket CloudかSynk CLIしか連携できないように見えますが、`View all Integrations`をクリックすれば、GitlabやAzureReposなど色々な選択肢が出てきます。
    ※現時点ではCodecommitは対応していないようです。
    
  - Snykのスキャン対象に、PublicリポジトリのみかPrivateリポジトリも含めるかを選択できます。
    
  - 各機能を有効化することができます。どの機能も便利なので、とりあえず、すべて有効のままにしておくでOKです。
    - Pull Request Checks: プルリクエストに新しい問題や脆弱性がないかテストする
    - New Fix Pull Requests: 新しく発見されたオープンソースの問題や脆弱性に対するプルリクエストを自動的に作成します。
    - Dependency Upgrade Pull Requests: 自動依存性アップグレードのプルリクエストでパッケージを最新の状態に保つ
    - Snyk Code: ソースコードの問題や脆弱性を分析する
  - GithubからSynkを信用するか聞かれるので、`Authorize snyk`ボタンをクリックします
  - Githubのどのリポジトリを含めるか聞かれるため、Snykスキャンを対象にするリポジトリを選択し、`Import and scan`をクリックします

## その他の連携
  左ペインの `Integrations` から、連携したいサービスを選び設定します

  ![snyk-01- (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/d4a5c312-2c84-329a-1a00-f85e82d93f37.png)
    
  - 基本的にはどのサービスも進む上で、手順が記載されているので、従うだけで迷わずに連携することが可能だと思います。
  - 一部 `Upgrade plan to enable`と記載されていますが、Snykの有料プランじゃないと使えないっぽいです。
  - リモートリポジトリだけではなく、コンテナイメージのリポジトリや、CI/CDサービス、IDE、Slack等の通知サービスにも対応しています。
    
## 各Snykの機能の有効化
    
  WEB UIの左ペインの`Settings`から、各機能を有効化されていない場合有効化にチェックを入れます
  ![snyk-01- (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/88ed9e18-ee33-c107-1f87-c789c9659247.png)

  
  - Snyk Open Source： `Language`ペインから有効化し、よく利用するプログラミング言語の設定に飛び、利用するパッケージマネジャーにチェックを入れます
  - Snyk Code：`Snyk Code`ペインから有効化します
  - Snyk IaC：`Snyk IaC`ペインから有効化します。利用しているIaCのTypeにそれぞれチェックを入れます。`Terraform`, `Cloudformation`, `ARM`, `Kubernetes`にのみ対応していますので、AWS CDKを使用している場合は`cdk synth`コマンドを使用して`Cloudformation`テンプレートに変換して使いましょう。
  - Snyk Previewは実験的な機能のため、面白そうなもののみ有効化すればいいと思いますが、予告なく機能が削除される可能性があることに注意です

## Slack連携

- 連携方法は2種類あり、Incoming Webhook機能を使用しても連携できますが、現在はドキュメントからだと[「Slack App」での連携が推奨](https://docs.snyk.io/integrate-with-snyk/jira-and-slack-integrations/slack-app)のようです。
- Qiita上では`Incoming Webhook`の方のやり方しか記載がなかったので、SnykのSlackのアプリを使用した方法をご紹介します。


![snyk-01- (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/fb8cc08d-731e-dc40-5d50-64ad47934ffb.png)

- Slackで`アプリを追加する`から`Snyk`を検索し、 `Snyk for Slack`のアプリを追加します

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/28e79437-bb3c-c78b-7693-72c3bdd578d1.png)

- SlackのChannel IDは、Snykからの通知を受けたいチャンネルを右クリックして、`チャンネル詳細を表示する`から、下にスクロールすると表示されます。
![snyk-01- (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/44bcf044-0722-c578-db39-bab083b34e1e.png)

- Channel IDをコピーし、SnykのSlack App設定画面にSlackのChannel IDを入力して、Saveします。

![snyk-01- (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/aca61ca6-a802-7e7c-266e-0968e3f94750.png)

- Severity levelで設定した深刻度レベル以上の問題が発見した際にSlackに通知されるようになります。
- Snykからの通知を受けたいチャンネルに移動し、`@Snyk for Slack`とメッセージを打って、`Snyk for slack`アプリをチャンネルに追加します。


## IDEにSynkをインストール

ここではVS Codeで行いますが、他のIDEでも同様の手順でインストールできます。
VS Codeの拡張機能で、`Snyk Security`の拡張機能を探し、インストールします

![snyk-01- (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/71f8845b-ada6-8167-be89-315e54e8848d.png)

Synkの拡張機能がインストールされたら、Snykの拡張機能に遷移し、`Connect ＆Trust Workspace`をクリックします

![snyk-01- (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/bd05ad8f-7b90-bf65-8fb8-4e048e75b0dd.png)

- WEB画面に遷移し、認証ます。
![snyk-01- (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/41328057-06c4-dd34-6979-dec79df3a530.png)

認証されると、Folder配下のCodeがすべてスキャンされ、脆弱性があるようなコードが浮き彫りになります。

![snyk-01- (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/03feb6ae-8124-ec2c-7337-89124a8093f9.png)

## Synk CLI
CLIのインストールは以下のドキュメントを参照し、各OSやお使いのパッケージマネージャーに合わせてインストールします。

https://docs.snyk.io/snyk-cli/install-or-update-the-snyk-cli

Nodeを使用している場合は、以下のコマンドでインストールできます。

```bash
npm install snyk -g
```

CLIを使用するためには、SnykのAPI TOKENが必要になります。
以下のページにアクセスし、Auth TokenのKey部分で`click to show`のボタンを押すと、表示されます。

https://app.snyk.io/account

API TOKENを使って認証してSynk CLIをつかえるようにしましょう。
```bash
snyk auth <API_TOKEN> 
```

以下のメッセージが出力されれば、連携完了です。
`Your account has been authenticated. Snyk is now ready to be used.`

WEB UI上で連携したGithubのProjectのディレクトリにし、Snykの各機能のテストコマンドを実行すると、ディレクトリにあるファイルをリアルタイムにスキャンが脆弱性のあるコードを特定してくれます。

```bash
# 自分のリポジトリに移動
cd <自分の管理リポジトリフォルダ>
# Snyk Open Sourceの機能でスキャンし、npmやpip等のOSSのライブラリの脆弱性を特定します。
snyk test 
# Snyk IaCの機能でTerraformやKubernetes等のコードをスキャンし、権限が広いなどの安全でない構成を特定します。 
snyk iac test 
# Snyk containerの機能でスキャンし、コンテナイメージとKubernetesアプリケーションの脆弱性を特定します。
snyk container test
# Snyk Codeの機能でスキャンし、アプリケーションコードの脆弱性を特定します。
snyk code test
```

事前にWebUI上で、Projectを登録していない場合は、以下のようなエラーで怒られるみたいです。

```jsx
Could not detect supported target files in /path/to/your/current-directory/
Please see our documentation for supported languages and target files: https://snyk.co/udVgQ and make sure you are in the right directory.
```

SnykのCLIに関しての本領はCI/CDのCIの機能として効果を発揮します。

デプロイ前のセキュリティテストに取り入れてみると良いかもしれません。

以下はAWS Codebuildのbuildspec.ymlの書き方の例になります。

```yaml
version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 18
    commands:
      - npm install -g snyk
  pre_build:
    commands:
      - snyk auth $SNYK_TOKEN  # Snykの認証　Codebuildの環境変数にSNYK_TOKENの値を設定
  build:
    commands:
      - snyk iac test  # Snyk iac テストの実行
artifacts:
  files:
    - '**/*'
```

Codecommitは現状Snyk側で対応してません。
プロジェクトのリポジトリを定期的にスキャンしたい場合もあると思います。
Codecommitでリポジトリを管理している場合は、そんなときに、上記のようなセキュリティスキャン用のCodebuild プロジェクトを作成しておいて、定期的にEventBridgeでCodebuildのプロジェクトを走らせてソースコードをスキャンしてあげると良いかと思います

Synk CLIの使い方については以下に情報がまとまっております。

https://snyk.io/jp/blog/snyk-cli-cheat-sheet/


## SnykからGithubへ自動PRを飛ばす

- Githubのプロジェクトを連携し、PRの設定をすると、なんと定期的に自動でSnykからPRが飛んでくるようになります。
![snyk-01- (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/89726287-22e4-095f-a488-e2c7a0a8c6f0.png)

一つ内容を見てみると既にpackage.jsonのアップデートだけではなく、依存関係であるpackage-lock.jsonの中身まで変更してくれているようです。

あとは、内容的に問題なければ、マージするだけという、なんともありがたやな機能です。
![snyk-01- (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/ff6c1230-64d7-afaa-b2fb-4e8037d879fd.png)

連携するには、GithubのPersonal Accessトークンが必要になります。

以下にアクセスし、Fine-grained tokensに切り替え、「Generate new token」ボタンをクリックして、アクセストークンを作成します。

https://github.com/settings/tokens

`Token name（トークンの名前）`：任意
`Expiration（トークンの有効期間）`：30日
`Repository access (トークンを使用したアクセスの権限)`: Only select repositoriesを選択し、ご自身のリポジトリを選択します。

![snyk-01- (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/eef2b16b-d3c8-e0ad-46e3-56f168dc434f.png)

WEB UIの左ペインの`Settings` > `Integrations`の`GitHub`から`Open Snyk automatic PRs from a fixed GitHub account.`の入力部分にGithubで作成したTokenを入力し、`Save`をクリックします

![snyk-01- (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/e18d7f25-9c92-1026-fffb-f0b215dd0a3c.png)

`Automatic fix PRs`の `New vulnerabilites` と `Known vulnerabilities (backlog)` にチェックを入れて`Save`しましょう。これでPRが自動に飛んでくるようになります。

その他、`Dockerfiles`の項目の、`Detect Dockerfiles`や`Update Dockerfile base images`にチェックすることでリポジトリ内のDockerfileもスキャンしてくれるようになるので、お勧めです

### WEB UIの使いこなし方

リモートリポジトリのソースコードの健康状態を監視に役立ちます。
定期的に確認することで、セキュリティ対策の勉強をすることができる。
SnykのWeb UIの左メニューの`Projects`から、リモートリポジトリのプロジェクトを選択すると、リモートリポジトリ内のファイルの一覧が表示され、脆弱性(Issues)があるものはレベル別に、Critical, High, Medium, Lowの4段階で表示されます。

![snyk-01- (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/b94243b4-a8b8-3511-09ed-aa0321ea6fa2.png)

各ファイルをクリックすると、そのファイルの脆弱性の詳細が表示されます。
`ignore`ボタンをクリックすると、その脆弱性を無視して、スキャン対象から外すことができます。
`Full details`ボタンをクリックすると、ソースコードのどの部分に脆弱性があるのかが表示されます。

![snyk-01- (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/f4097a7a-29a0-c3cf-3543-8f199323e8d3.png)

`Full details`ボタンをクリックすると、この場合はリソースの権限が広すぎることがわかります。

![snyk-01- (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/f9ef4a79-de7d-9927-f4c5-91dd54e06807.png)

`ignore`ボタンをクリックすると、この脆弱性をいつまで無視するかの設定を細かく設定することができます。

![snyk-01- (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/a52e1bc2-eb67-1181-1992-237c3b7ceedd.png)

ものによっては以下のように、`[Fix this vulnerability]`と記載されているものがあり、このボタンを押すと、直接リモートリポジトリに対してPRを投げることができるそうです。

![snyk-01- (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/9ddb943f-a3fc-09ed-7e22-17cfd494505c.png)

ですが、私は無料プランで利用しているため、このボタンを押すと、エラーになります。
自動コード修正 PR機能は、無料版では機能が一部制限がされているようです。

![snyk-01- (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/3a8a8c08-29f3-954a-01f9-232eb6ef6dc9.png)

感想としては、AWSのSecutiry HubやInspector等で引っかからなかった部分も検知してくれるので非常にありがたいと思っております。


## IDEの拡張機能について

正直なところ、こちらが一番便利です。

IDEでコードを書いていると、その場で脆弱性を検知してくれるので、開発者がコードを書いている段階で、セキュリティを意識することができます。

![snyk-01- (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/03feb6ae-8124-ec2c-7337-89124a8093f9.png)

また上記の`CODE QUALITY`の項目には、コードの品質を向上させるための機能もあります。
いくつかコードの記載に対してセキュリティ的にもっとこうした書き方が良いような提案をしてくれます。
提案も複数提案してくれるので、どれが一番良いかを選択することができます。
SQL Ingectionとかの対策になるので、とても参考になります。

![Screenshot 2024-08-01 095327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/5d5f669d-1fb2-590c-75af-03bc4b8e0d7e.png)

## まとめ

いかがでしたでしょうか？ Snykの各ツールの設定自体もどれもそこまで難しくなく利用できるかと思います。
Snykを活用して、開発のタイミングからセキュアなコーディングを行い、スピーディーに開発していきましょう！