こんにちは!小林和樹と申します。Insight Edgeに参画して約4ヶ月が経ちました。 現在、Insight Edgeでソフトウェア品質向上のためのシステム基盤の選定・構築を担当しています。 その中で、静的解析を共通機能として取り入れるため、そのためのツール調査を実施しています。 特に、セキュリティを高め将来的な負債を減らすこと、開発者に負担をかけずに品質確保の仕組みを導入することを目的としました。 様々な静的解析ツールがある中で脆弱性検出の機能がある、GitHub Code Scanning、SonarQube/SonarCloudを導入対象として比較し、共通機能としてどれが適しているか調査しました。
目次
静的解析について
静的解析をGoogle検索などで調べると、「コードを実行せずに行う検証」と出てきます。 静的解析をすることで、脆弱性・Code Smell・複雑度・バグなどをチェックすることが目的となっています。
静的解析ツールについて
静的解析は基本的にツールを用いて行われます。 静的解析ツールは様々ありますが、それぞれ機能が異なり、目的に応じて使い分けが必要です。 例えば、静的解析ツールの中でも有名なESlintはソースコードがコーディングルールに則っているかを解析し、修正したり指摘したりするツールであり、Prettierはソースコードを整形するFormatterとしての役割を持つツールです。 これらのツールは利用している方も多いのではないでしょうか? 今回紹介するGitHub Code Scanning、SonarQube、SonarCloudは脆弱性検知を備えているメジャーなツールであり、それぞれ特徴的なツールとなっています。
GitHub Code Scanning
GitHub Code Scanningは、特に脆弱性検知に優れており、名前の通りGitHubの1機能です。 GitHub Code Scanningによってソースコードのスキャンが実行されるとPRコメントなどによって結果が表示されます。 脆弱性が見つかった場合、× が表示されます(図1)。
右のDetailsのリンクをクリックすることでどのような脆弱性が見つかったか一覧を表示できます(図2)。
脆弱性の内容によってCritical・High・Medium・Lowの4段階のレベルがあり、High以上は必ず目を通すべきとされています。
導入は非常に簡単でGitHub Actionsによって実行でき、YAMLファイルもほぼ自動で生成してくれます。 導入方法については、本記事では紹介致しませんので私が導入した際に、参考にしました こちら の記事などをご参照ください。
GitHub Code Scanningは、publicリポジトリであれば無料で利用できますが、privateリポジトリで利用するにはEnterpriseアカウントにGitHub Advanced Securityオプションをつける必要があります。
GitHub Advanced Securityオプションを追加することにより、以下3つのセキュリティ機能をリポジトリに追加できます。
- Code scanning
- Secret scanning
- アクセストークンなど本来Gitに上げるべきではない内容を検出し通知する
- Dependabot
- 依存ライブラリのバージョンアップデートや脆弱性情報を通知する
- こちらの機能もpublicでは無料で利用できる
なお、GitHub Code Scanningの脆弱性検知にはCodeQLを利用しているため、ローカルでCodeQLを実行することで同じ結果を得ることができます。 CodeQLの導入方法は こちら をご参照ください。
SonarQube
SonarQubeは総合的に品質管理をするためのオープンソースプラットフォームです。 そのため利用するには、自分でサーバを立てる必要がありますが基本的に無料で利用できます。 現在ではDockerを用いることが多いそうです。(参考記事は こちら)
検査を実行すると図3のような概要ページが表示されます。 コーディングエラーや脆弱性、テストのカバレッジ率など様々な情報を確認できます。アルファベットによって深刻度が一目で分かります。
各項目をクリックすると、種類ごとに検出された課題の一覧が表示されます(図4)。
脆弱性の深刻度は順番に、Blocker・Critical・Major・Minor・Infoの5段階に分かれており、3段階目のMajor以上の数が概要ページの評価に影響します。 深刻度が高いほど、アプリケーションの動作に影響を与える可能性が大きく、Major以上の脆弱性は修正が推奨されています。
SonarCloud
SonarCloudは簡単に言えば、SonarQubeのCloud版となっています。基本的な機能はSonarQubeと変わりませんが、導入は非常に簡単です。(参考記事は こちら) Cloud版であるということで、セットアップや保守という面では、SonarQubeより優れています。
比較観点
今回の調査では、主に脆弱性検出についてメインで取り上げていますが、総合的に判断するため、以下の観点で比較しました。
脆弱性検知
- 検出結果にどのような違いがあるか
- 検知した脆弱性に関してどれぐらいの情報量があるか
対象言語の種類
- JavaScript・TypeScript・Pythonなど社内で用いられる言語に対応しているか
- 対応言語の総数はいくらか
セットアップ・保守の難易度
- セットアップ・保守にどれぐらいの時間を要するか
実行時間
- テストの実行を始めてから、結果が出るまでどれぐらいの時間がかかるか
使いやすさ/見やすさ
- 業務の中で使いやすいのはどちらか
- 脆弱性についての結果は分かりやすくなっているか
価格
- プランごとの価格はいくらか
比較手法
今回は同じソースコードに対して、Github Code ScanningやSonarQubeを用いた場合それぞれどのような結果となるかを調査しました。 そのため、OSSを利用し検証します。
今回比較対象とするソースコードはこちらです。
結果
まずは、GitHub Code Scanningの結果です。 すべてのレベルを合わせて21件の結果が表示されました。(図2参照) High以上の脆弱性は20件であり、 内訳は以下の通りでした。
- Inefficient regular expression(3件)
- 正規表現が非効率であり、DOS攻撃にも繋がる可能性がある
- Incorrect suffix check(8件)
- IndexOfやLastIndexOfの使い方に問題がある
- Useless regular-expression character escape
- エスケープ処理の使い方に問題がある(6件)
- Incomplete multi-character sanitization(2件)
- 文字列の置換メソッドを直接使用してエスケープ処理を行うと、エラーが発生しやすい
- Insecure randomness(1件)
- Math.random()は正確なランダムではなくIDやパスワードなどの生成に使うべきではない
続いてSonarQubeを用いた場合を確認します。 Major以上の脆弱性は1件見つかり、Medium以上のSecurity Hotspotsは45件見つかりました(図4参照)。 脆弱性の内容は、
- Verify the origin of the received message
- Window.postMessage() の脆弱性を悪用される可能性がある(1件)
Security Hotspotsは以下の内訳でした。
- Math.random()の利用(30件)
- 正規表現によるDoSの脅威(15件)
脆弱性として検出されたものは、GitHub Code ScanningとSonarQubeでそれぞれ被らないという結果となりました。 正規表現の問題、 Math.random()については、SonarQubeのSecurity HotSpotとして検出されていますが、Code Scanningでは脆弱性で検出されています。 Math.random()はプログラム上でたくさん用いているものの、GitHub Code ScanningではIDの生成に使っている部分にのみ警告を出しており、セキュリティに大きく関わる部分に絞って検出しているように見えました。 このように、GitHub Code Scanningによって発見された脆弱性については検出理由に納得のいくものが多く感じました。
続いて、それぞれのエラーに対する詳細な情報を見てみます。 GitHub Code Scanningは図5のように、エラー箇所と修正方針のRecommendation、修正例が表示されています。
ユーザは、エラー箇所を確認しRecommendationを見て修正すべきと判断した場合、修正例を見てコードの修正するといった使い方が考えられます。
SonarQubeでは図6のように、どこで見つかった脆弱性か、どんな内容の脆弱性なのかが分けて表示されています。
SonarQubeでは、NoncompliantCodeExampleとCompliantSolutionが対比して書かれているため、CompliantSolutionを確認して修正方針を立てるといった使い方になると考えられます。
では、ツールの使用感や様々な情報から先ほどの観点で比較します。
脆弱性検知
脆弱性検知に関しては、GitHub Code Scanningをおすすめします。 どちらも違った内容の脆弱性を検出しましたが、GitHub Code Scanningの方が、的確にセキュリティ上修正が必要な部分を抜き出して検出していると感じました。 そして、何よりどのように修正すべきかのレコメンドやサンプルがあり、修正にすぐに着手できる点もポイントが高いです。
また、検出できる脆弱性もGitHub Code Scanningの方が多くなっています。 今回はJavaScriptに関して比較しました。
- GitHub Code Scanning
- 全203種類の脆弱性検知が可能
- https://codeql.github.com/codeql-query-help/javascript/
- SonarQube/SonarCloud
- 31種類の脆弱性+62種類のSecurity Hotspots
- https://rules.sonarsource.com/javascript/RSPEC-6096
対象言語の種類
種類の数に関してはSonarQubeに軍配があがりましたが、当社においては、Python・JavaScript・TypeScriptの利用が圧倒的であり、どちらの製品に関しても対象となっています。 使う言語によってどちらを使うべきか考える必要があります。 SonarQubeのカバー範囲に驚かされた結果となりました。
- GitHub Code Scanning
- SonarQube/SonarCloud
- プランによって最大29言語
- https://www.sonarqube.org/features/multi-languages/
セットアップの難易度
セットアップのしやすさについては、GitHub Code Scanningをおすすめします。 導入には、複雑な工程など必要なくGitHub上だけで完結できる点が素晴らしいです。対して、SonarQubeは自分でDockerやAWSなどを用いてサーバを構築する必要があります。 慣れていない人にとってはセットアップに戸惑う可能性があり、アップデートも非常に大変です。(実際私は、アップデートにかなり苦戦しました。) しかし、SonarCloudを用いる場合は、Code Scanningと同じぐらいの手間で導入が可能となっています。
- GitHub Code Scanning
- GitHub Actionsを組み込むのみ。YAMLファイルも自動で生成される
- SonarQube
- 自分でサーバをインストールし、起動する必要がある。また、SonarQube側でプロジェクトをそれぞれ立ち上げる必要がある
- SonarCloud
- SonarCloudとGitHubを連携しGitHub Actionsを作成する
実行時間
実行時間については、SonarQubeに軍配が上がりました。
上記のソースコードに対する実行では、GitHub Code Scanningは約5分、SonarCloudが4分ほどかかったのに対して、SonarQubeは1分ほどで解析が終了しました。
使いやすさ/見やすさ
使いやすさ/見やすさに関しては、GitHub Code Scanningをおすすめします。
GitHub Code ScanningはPRコメントなどGitHubのCI上で全て完結できるので、手間がかなり少なくなっています。
SonarQubeは脆弱性のみならず、さまざまな観点からコードの静的解析を行なってくれます。また、それぞれの解析結果について視覚的にわかりやすく改善ポイントが見えるので、ソースコードのクオリティが一目で分かりやすい点が非常に良いです。
どちらのツールもそれぞれ特徴は異なりますが、十分扱いやすいツールだと言えます。
しかし、今回については脆弱性検出の観点で見ると、脆弱性に関して必要な情報が整理されている点を踏まえてGitHub Code Scanningの方が使いやすいと思います。
- GitHub Code Scanning
- GitHubのUI上で詳細まで確認できる点が非常に便利
- 問題点や修正方法が簡潔に提示される
- SonarQube
- プログラムのどんな部分に問題があるか可視化されており非常に分かりやすい
価格
価格については、利用用途によって大きく異なるのでプランを紹介します。 業務上publicで開発することは考えづらいので、privateなシステム開発を考えると、SonarQubeのCommunityプランが一番コストを抑えることができます。
また、GitHub Code ScanningとSonarCloudを比較します。 仮に5000行ほどのソースコードを持つリポジトリが5つあり、開発者が10名とするとSonarCloudは10万行まで €10/月ほどなので、GitHub Advanced Securityよりも安く済みます。 (GitHub Advanced Securityの価格についてはGitHub社へお問い合わせください。)
- GitHub Code Scanning
- publicでの利用は無料
- GitHub Advanced Securityのライセンスを購入すればprivateでも利用可能。(価格は要問合せ)
- SonarQube
- Communityプランでは基本無料
- その他プランは行数によって変化する
- https://www.sonarsource.com/plans-and-pricing/
- SonarCloud
- publicでの利用は無料
- こちらも行数によって価格は変化する
まとめ
以上の結果から以下のように、星取表をまとめてみました。
◎・・・文句なし
◯・・・十分導入できる
△・・・懸念あり
脆弱性検知 | 対象言語 | セットアップ・保守難易度 | 実行時間 | 使いやすさ/見やすさ | 価格 | |
---|---|---|---|---|---|---|
GitHub Code Scanning | ◎ | ◯ | ◯ | ◯ | ◯ | △ |
SonarQube | ◯ | ◎ | △ | ◎ | ◯ | ◎ |
SonarCloud | ◯ | ◎ | ◯ | ◯ | ◯ | ◯ |
今回の検証では以上の観点のうち、脆弱性検知能力と、セットアップ・保守の負荷の低さを重視しました。
脆弱性検知とセットアップ・保守難易度をどちらも考慮するとGitHub Code Scanningを利用したい...という思いが強いのですが、価格が少しネックになってきます。 また、当社は保守運用まで実施しているプロジェクトはまだ少ないです。 その点を考慮すると、価格も安く、セットアップ・保守難易度も低く十分な静的解析機能を持つSonarCloudが適しているのではないかというのが結論です。
今回の検証では、SonarCloudを選択しましたが、GitHub Code Scanningの脆弱性検知能力は非常に強力です。 規模やユースケースによってこれらの選択は大きく変わると思うのでぜひ今回の記事を検討の参考にしてください。