プロダクトで利用している依存ライブラリを自動アップデートする

こんにちは、クリスマスに向けてカウントダウンが始まっておりますが、皆様いかがお過ごしでしょうか。
この記事は [セゾン情報システムズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/sisco) 17 日目の記事です。

### はじめに
昨今のソフトウェア開発では、OSS を組み合わせてシステムを開発することが主流となっており、0 からすべてを開発するよりもすでにある OSS を組み合わせて開発する方が圧倒的に開発効率が向上します。
ただ便利な反面、依存するライブラリの機能追加やセキュリティのアップデートに追従しておかないと気づいた時には EOL になっていたり、致命的な脆弱性がでてしまったり、なんてことはみなさんも一度は経験あるのではないでしょうか。
皆さんが日ごろ感じられている通り、利用しているすべての依存ライブラリを把握し管理・追従していくのは大変ですし、並大抵の努力ではありません。
できることならスプリントなどのタイムボックスの中でこまめに検知・更新できるようにしていきたいですよね。
昨年の Apache Log4j の件のように広く使われている OSS にクリティカルな脆弱性がある日突然見つかることもあります。
このような脆弱性を利用したゼロデイ攻撃からシステムやアプリケーションを守るためにも、脆弱性の検出やアップデートをすぐに行える仕組みを作っておくことは重要です。
当社でも脆弱性とどう向き合っていくのかは重要なテーマでもあるので今回調べてみたことをまとめてみます。
前置きが長くなってしまいましたが、本題に入っていきます。

### ツールの選定
前置きの中で昨今のソフトウェア開発ではOSSを組み合わせて利用されるという話をしました。
また、OSS の脆弱性のほとんどが間接的に依存しているパッケージによりもたらされるようです。
したがって、直接的に利用しているパッケージだけでなく、それらの依存先のパッケージまで含めて把握し、脆弱性がないか管理する必要があります。
ソフトウェアの依存関係を解析する手段として、Software Composition Analysis（SCA）と呼ばれるツールの活用が挙げられます。
SCA ツールの中から Dependabot について調べて、試してみたのでこちらについて紹介していきます。

### Dependabot とは
[Dependabot](https://dependabot.com/) は GitHub の機能で、言語が持つパッケージ管理のマニフェストファイルを解析して古かったり、安全ではないライブラリを発見してくれます。発見した依存関係を元に 修正バージョンにアップデートする Pull Request を作成して通知してくれたりします。
今回は Dependabot 機能を使って、「プロダクトで利用している依存ライブラリでセキュリティアップデートが出たら自動で Pull Request を作る」というのをやってみたいと思います。

### データソース
[GItHub Advisory Database](https://github.com/advisories) がデータソースになっているようです。GitHub Advisory Databaseは [NVD](https://nvd.nist.gov/) や各種言語のセキュリティアドバイザリの情報など GitHub に報告されたすべての脆弱性のデータを集めた、無料のセキュリティアドバイザリーデータベースです。


### Dependabot の使い方
Repository ページの `Settings` > `Code security and analysis` から、 `Dependency graph` および `Dependabot alerts` の機能を Enable にします。
(Private Repository ではデフォルトは無効です)
![Pasted image 20221211220325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/ca86cc21-aeb0-8b6c-7af3-5c76e3552906.png)

`Dependency Graph` を有効にするとパッケージ管理のマニフェストファイルが解析され、依存パッケージが確認できる様になります。 解析結果は Repository ページの `Insight` > `Dependency Graph` から確認できます。
![Pasted image 20221211220804.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/37e7244b-81b2-f7c3-5958-6f694c215e2d.png)

本記事の執筆時点で Dependency Graph が解析できる対象は以下でした。
最新の情報は[About the dependency graph](https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-the-dependency-graph#supported-package-ecosystems) のドキュメントを参照してください。
![Pasted image 20221211221117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/7b7e0d20-b27e-92cf-3a40-b536e08caebc.png)

`Dependabot alerts` を有効化すると、GitHub Advisory Database に関連する脆弱性情報が登録されると通知される様になります。 Dependabot alerts からの通知は、Repositoryの `Security` > `Dependabot` から確認できます。
![Pasted image 20221211221403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/e3699280-101d-615f-4a26-f591860acb5e.png)

通知された内容の詳細を見てみると、CVSS スコアや CVE ID、対処方法まで記載してくれています。
![Pasted image 20221211221630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/23bfa455-1405-50cc-d977-ac76de62bca2.png)

`Create Dependabot security updates` から手動で Pull Request を作成することも可能です。

### Dependabot の設定
ここからは自動で Pull Request を作成してもらうように設定していきます。
まず Repository ページの `Settings` > `Code security and analysis` から、 `Dependabot security updates` の機能をEnableにします。
![Pasted image 20221211231023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/abb1c6ec-03b3-2577-bab6-60ab93e22f04.png)

ちなみに各機能についての説明は以下です。
| 機能 | 概要 |
| ---- | ---- |
| Dependabot security updates | GItHub Advisory Database に登録された脆弱性に対して、通知および変更を提案する |
| Dependabot version updates | 利用している各種パッケージの更新をチェックし、更新があれば通知および変更を提案する |

次に `Insight` > `Dependency Graph` > `Dependabot` からDependabotの設定を行っていきます。
まず `Enable Dependabot` を押下し Dependabot を有効にして、以下どちらかの方法で `.github/dependabot.yml` を作成していきます。
- `Create config file` を押下して GitHub UI 上で設定ファイルを作成し Commit する
- ローカルリポジトリで設定ファイルを作成し Commit & Push する

作成したファイルは以下です。
```yml
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
  - package-ecosystem: "npm" # See documentation for possible values
    directory: "/" # Location of package manifests
    schedule:
      interval: "daily"
```

設定ファイルの書き方については以下を参考にしてください。
[Configuring Dependabot version updates](https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuring-dependabot-version-updates)
[Configuration options for the dependabot.yml file
](https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file)

作成すると以下のように解析が始まるので待ちます。
![Pasted image 20221211223547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/28e3e31c-82d7-f2b1-39ea-cb833591eef9.png)

解析が終わると Pull Request を自動で作成してくれました。
ちなみに1度に作成してくれるPull Requestの数は5つまでみたいです。
![Pasted image 20221211224831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/b1c28401-004f-dd8c-7aa7-a7f928dd46a2.png)

### 今後やりたいこと
セキュリティアップデートの Pull Request の自動作成までができました。とても便利だと思うのですが、何かと通常の開発タスクに追われてしまうとライブラリアップデートのプルリクエストは滞留してしまうことが懸念されるため、自動でマージまでできるとみんな幸せです。
そこで GitHub Actions を利用すれば、「自動テストが PASS した場合のみマージする」とか「パッチバージョンの更新だけマージする」といったことができそうなので今後やってみたいと思います。
GitHub Actions については [4日目](https://qiita.com/Akifumi_Nakamura/items/5f0f7fafd6bee18f5d95) / [7日目](https://qiita.com/Yoshihiro-Hirose/items/57418a2f391f77c4704c) の記事でも紹介されていますので是非ご覧ください。

### 参考記事
本記事は以下を参考にさせていただきました。
[GitHub の Dependabot version updates で依存ライブラリを継続的に更新する](https://developer.mamezou-tech.com/blogs/2022/06/19/github-enable-dependabot-version-updates/)
[GitHub ActionsでのDependabotの自動化](https://docs.github.com/ja/code-security/dependabot/working-with-dependabot/automating-dependabot-with-github-actions)