🐁

Goアプリの脆弱性をCIにて診断する

2022/10/20に公開

はじめに

快適に安全な開発を継続的に進めていく上で脆弱性診断は大切だと思います。
Goアプリ開発における脆弱性診断をGitHub Actions
にて実行する環境を作ってみたので記事を書いてみました。

脆弱性診断ツール

脆弱性診断にはnancytrivyを用います。

https://gonancy.dev/

nancyはGo言語での依存パッケージの脆弱性を診断してくれるツールです。

https://aquasecurity.github.io/trivy/v0.32/

trivyはコンテナイメージの脆弱性を診断してくれるツールです。
trivyでもGoバイナリの脆弱性を診断してくれるのでnancyは不要だったりしますかね。。。

それぞれの詳しいツールの説明についてはほかの方のブログ記事等にお任せ致します。

nancyによる診断

実装は以下となります。

https://github.com/takokun778/fs-go-ci-vulnerability/blob/main/.github/workflows/vulnerability.yml#L7-L22

GitHub Actionsが用意されていますがgo installで準備しました。
こうして実装しておけば別のCI環境に移行することになってもコピペで移行ができそうだったので。
また、同じ構文を利用してローカル環境での確認も行うことができると思います。

trivyによる診断

実装は以下となります。

https://github.com/takokun778/fs-go-ci-vulnerability/blob/main/.github/workflows/vulnerability.yml#L24-L47

同じくGitHub Actionsが用意されていますがapt-getで準備しました。
nancyと同様の理由です。
(ちゃんと試していませんが、go installができなかった。。。)

コンテナ作成にはkoを用います。

https://github.com/ko-build/ko

最初はkoによるビルド->コンテナリポジトリにプッシュ->プル->スキャンとしていましたが
koのビルドオプションでローカルビルドで完結することができたので
ローカルビルド->イメージ名取得->スキャンとすることができました。
認証のためのPAT生成/管理やDocekrログイン・コンテナプッシュが不要となりスッキリしたと思います。

ローカル環境においても実行が可能ですが、
生成されたDockerイメージを工夫して削除する必要があります。
(現状はlatestを消すのがめんどくさかったのでサボっています。)

おわりに

脆弱性診断をCIで実行できる環境を作ってみました。

お試しでの作成なのでpush時に実行するようにしていますが、
prcronをトリガーに脆弱性を定期的に診断するようにするのがよいかと思います。
cron実行にするなら脆弱性が発見されたら自動でissueが作成されるようにするとよさそうです!

また、今回紹介した以外にもおすすめの脆弱性検査ツールがあればぜひ教えていただきたいです。

今回作成したリポジトリはこちらです。

https://github.com/takokun778/fs-go-ci-vulnerability

Discussion