SnykではじめるDevSecOps

# はじめに
[Snyk](https://snyk.io)はコードベースを軸にオープンソースの依存関係、コンテナ、インフラストラクチャ等の脆弱性を検出し、自動的な修正を可能とするセキュリティプラットフォームです。

ソフトウェア開発ライフサイクル（SDLC）に従って、開発者のセキュリティ対策を支援します。

また、Snykは米国に本社を置き、ロンドンを拠点としたユニコーン企業です。
世界中で2,700万人以上の開発者がSnykのツールを使用し、IPOも間近と噂されています。

開発者として初めてSnykを利用する場合、GitHubまたは、Googleアカウントを利用したフェデレーションのサインインにより、簡単に始めることができます。また、SSOにも対応しています。

本記事では、DevSecOpsを踏まえて、Snykの基本的な使い方などについて解説しています。

## DevSecOps
DevSecOpsは、DevOpsのカルチャーにセキュリティを融合したDevOpsのアプローチです。

DevOpsのカルチャーに対して、最初からセキュリティ対策を組み込み、ワークフローの速度が低下しないよう、セキュリティプロセスを自動化します。


従来のシステム開発は、開発と運用プロセスを分離し、運用プロセスに関わるセキュリティ対策は煩雑で負荷が高い作業となっていました。

クラウドファーストの今、システム開発の期間は短縮され、セキュリティ対策についてはスコープや考え方など抽象的になってきていると思います。

:::note
セキュリティを定義し、アジリティを落とさず品質を保つためのアプローチがDevSecOpsであり、ソリューションがSnykです。
:::

## プロダクト概要
Snykは、**コードを保護**することを目的に、脆弱性の検出、優先順位付け及び修復を機能として提供しています。

![Snyk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f3774c29-c0d6-03ab-fd8a-f5e9e387a089.png)

- Snyk Open Source
    - オープンソースの脆弱性を検出し、自動的に修正
- Snyk Code
    - アプリケーションコードの脆弱性をリアルタイムで検出し、修正
- Snyk Container
    - コンテナイメージと、Kubernetesアプリケーションの脆弱性を検出し、修正
- Snyk Infrastructure as Code
    - Terraform、CloudFormation、Kubernetes、ARMテンプレートの設定ミスを検出し、修正

Snykのこれら機能は、IDEのコーディング、ソースコードリポジトリ及び、CI/CDパイプラインで使用することができます。

Snyk Codeと、Snyk Infrastructure as Codeはデフォルトで有効になっていて、Snyk Open Sourceについては、設定で有効にすることができます。

インターフェースは以下になります。フリープランの場合、制限以内であればSnykが提供する基本的な機能が利用できます。各プランの詳細については、[Plans & Pricing](https://snyk.io/plans/)を参照。

- Snyk.io
    - WebベースのUI
- Snyk CLI
    - コマンドラインインターフェイス
- Snyk API
    - APIの提供

## Synkの使用方法

### 脆弱性DB
2021年12月10日、Log4jの脆弱性が公表されて大きな話題となりました。
CVSSスコアも10となり、極めて深刻な脆弱性になります。

Snykの公式ブログでも記事になっています。

- [Log4Shell vulnerability disclosed: Prevent Log4j RCE by updating to version 2.15.0](https://snyk.io/blog/log4j-rce-log4shell-vulnerability-cve-2021-4428/)

Snykは、[脆弱性DB](https://security.snyk.io/)を公開しています。
検索窓に検索したい脆弱性のパッケージ名や、CVEを入力して検索すると、脆弱性情報が簡単に取得できます。

今回のLog4jの脆弱性について、検索窓からlog4jで検索すると、**CVE-2021-44228**の脆弱性が確認できます。

![スクリーンショット 2021-12-12 22.07.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f5b93f9b-2422-d31d-8eeb-5ca100ce0a9c.png)

:::note
Snykの脆弱性DBは、脆弱性情報を調査するための手段としても活用することができます。
:::

### IDEのコーディング
Visual StudioCode（以下、VSCode）拡張機能を使用して、IDEのコーディング時に脆弱性スキャンができます。

言語はJavaScript, TypeScript, Java, Python, C#をサポートし、VueやReactなどのフレームワークにも対応しています。

VSCode拡張機能を使用するために、拡張機能の検索窓からSnykを検索してインストールします。
詳細については[Visual Studio Code extension](https://docs.snyk.io/features/integrations/ide-tools/visual-studio-code-extension-for-snyk-code)を参照。

![スクリーンショット 2021-12-18 23.09.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/bb2c83cd-3a8b-d0b1-2ad6-15f44fe32a0e.png)

### docker scan
`docker scan`コマンドは、dockerイメージに対して、脆弱性を検出するコマンドです。
検出する際は、Snykのエンジンを利用して脆弱性を検出しています。

Snykのアカウント作成後、ログインして認証することで利用できます。
認証しないで実行した場合、以下の様なメッセージが出力されます。

`# docker scan hello-world`

```console
Docker Scan relies upon access to Snyk, a third party provider, do you consent to proceed using Snyk? (y/N)
y
failed to get DockerScanID: bad status code "400 Bad Request"

```

認証するためには以下のコマンドを実行し、ログインを行います。

`# docker scan --login`


```console

Now redirecting you to our auth page, go ahead and log in,
and once the auth is complete, return to this prompt and you'll
be ready to start using snyk.

If you can't wait use this url:
https://snyk.io/login?token=********


Your account has been authenticated. Snyk is now ready to be used.
```

上記コマンド実行後、認証ページにリダイレクトされるため、ブラウザからログインを行います。

![スクリーンショット 2021-12-11 23.22.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/fc25fb8f-aef9-00bf-d0c0-a9c13d93ecae.png)

認証完了後、プロンプトに戻ります。

![スクリーンショット 2021-12-11 23.22.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/60486a5d-b2b0-33cf-b48b-05fce57c081d.png)

再度、コマンドを実行すると、結果が返ってきます。以下の例では、脆弱性は検出されませんでした。

`# docker scan hello-world`

```console

Testing hello-world...

Organization:      brutus03
Package manager:   linux
Project name:      docker-image|hello-world
Docker image:      hello-world
Platform:          linux/amd64
Licenses:          enabled

✓ Tested hello-world for known issues, no vulnerable paths found.

Note that we do not currently have vulnerability data for your image.

```

:::note
例えば、ガバナンスの一環として開発時に、docker scanコマンドの実施をガイドラインにすれば、開発時のセキュリティ向上が期待できます。
:::

### Snyk Infrastructure as Code
検証として、過去に作成したTerraform（aws）のコードをスキャンしてみます。

WebベースのUIを使用して脆弱性スキャンを行うために、煩雑な操作はありません。
SynkのProjects画面から、脆弱性スキャンを行いたいリポジトリを追加するだけで、自動的に脆弱性スキャンが開始されます。

以下は脆弱性スキャン終了後の画面になります。Terraformの場合、tfファイルのみをサポートしているため、この例では4ファイルが正常にインポートできましたが、1ファイルはtfファイルではないため、インポートできていません。

![スクリーンショット 2021-12-19 21.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/537b12bb-e035-efc1-c37c-3bd102a8876b.png)

スキャンされた結果から、Highのファイルを確認します。
**Credentials are configured via provider attributes**のタイトルをクリックして、詳細を展開します。

![スクリーンショット 2021-12-19 21.45.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/0e9d4d7e-994b-15a5-984d-ef4b5fb4c05e.png)

Policy id:[SNYK-CC-TF-74](https://snyk.io/security-rules/SNYK-CC-TF-74)のリンクを参照すると、検出された脆弱性について影響や解決方法が確認できます。

![スクリーンショット 2021-12-19 22.30.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/63e442b6-a1eb-78d5-afb6-dc37ecc507d1.png)

本記事の例では、クレデンシャル情報となる環境変数が問題として検出され、解決方法としてAWS SecretsManagerまたは、AWS Systems Managerのパラメーターストアのリファレンスが提示されています。

[AWS Secrets Manager](https://aws.amazon.com/jp/secrets-manager/)は、コード内のハードコードされた認証情報 (パスワードを含む) をAPIコールに置き換えることで、クレデンシャルをプログラムから取得できるサービスです。

:::note
Synkは、コードをより適切に保護する方法について、アドバイスします。
:::

# おわりに
本記事では例としてIacのコードを検証しましたが、サインアップから脆弱性を検出するまで30分もかかっていません。

SynkのシンプルなUI、スピーディーな仕組みについて、感銘を受けました。

クラウドファーストを前提としたシステム開発の手法に対して、とても親和性が高いと感じています。セキュリティがパイプラインに統合されることにより、開発者はリリースに集中できます。

## 参考
- [DevOpsとは？](https://www.splunk.com/ja_jp/data-insider/what-is-devops-and-why-is-it-important.html)
- [DevSecOps Overview](https://snyk.io/series/devsecops/)
- [DevSecOps とは](https://www.redhat.com/ja/topics/devops/what-is-devsecops)
- [Docker ローカルイメージに対するぜい弱性スキャン](https://matsuand.github.io/docs.docker.jp.onthefly/engine/scan/)