PaPoo
cover
technews
Author
technews
世界の技術ニュースをリアルタイムでキャッチし、日本語でわかりやすく発信。AI・半導体・スタートアップから規制動向まで、グローバルテックシーンの「今」をお届けします。

SonarQubeでJavaのバグと脆弱性を見つける話:静的解析が「後から困る」を減らしてくれる

この記事のキーポイント

そもそも何が起きていたのか

元記事は、かなり現場感のある話から始まります。
あるチームがセキュリティ監査を受けたところ、​支払い処理モジュールに重大な脆弱性が見つかりました。

しかも、ユニットテストも統合テストも通っていたし、コードレビューも一見きれいだった。
それなのに、監査で見つかったのはユーティリティクラスに隠れていたハードコードされたAPI keyだった、というわけです。

ここが非常に重要です。
テストは「機能が正しく動くか」を見るのは得意ですが、​秘密情報がコードに埋め込まれていないかまでは見てくれません。
このズレ、地味だけど本当に怖いんですよね。動くコードほど安心してしまうので、こういう問題は見落とされやすいと思います。

SonarQubeは何をしてくれるのか

SonarQubeは、コードを実行せずに読み解いて問題を探す static code analysis ツールです。
ざっくり言うと、コードの「見た目」と「書き方」から、危なそうな場所を自動で洗い出します。

記事では、SonarQubeが次のようなものをチェックすると説明しています。

ここで面白いのは、SonarQubeが単なる「警告ツール」ではなく、​secure coding practices(安全なコードの書き方)をチームに定着させる道具として使われている点です。
ツール単体より、開発文化まで変えにいく感じがある。ここはかなり本質的だと思います。

Jenkinsに組み込んで、毎回自動でチェックする

記事のチームは、SonarQubeを Jenkins pipeline に組み込みました。
つまり、ビルドのたびに自動で解析する仕組みです。

これが大事なのは、​手動でやるチェックは忘れられるからです。
「あとでスキャンしておこう」は、だいたいあとでやられません。人間は忙しいので。

この構成では、MavenのSonar pluginを通じてコードメトリクスをSonarQubeサーバーに送り、サーバー側でルールに照らして分析します。
結果として、テストと並行して解析が走り、ビルド時間への影響は小さいと説明されています。

要するに、開発の流れを止めずに、裏で安全チェックを回す。
これはかなり実用的です。

実際に見つけたルール:java:S2068

記事で特に印象的なのが、​java:S2068 というルールです。
これは、​password や key のように見える文字列を探して、ハードコードされた認証情報の可能性を指摘します。

たとえば、コードの中にAPI keyをベタ書きしていると、SonarQubeが「それ、秘密情報では?」と警告してくれるわけです。

ここは本当にありがたい。
人は「あとで環境変数に移す予定だった」と思ってそのまま忘れがちです。
そしてそのまま main branch に入って、本番へ行く。怖い。実に怖い。
SonarQubeは、そういう**“うっかり本番流出”**をかなり減らせると思います。

記事では、この警告が pull request のダッシュボードで即座に見え、マージ前に修正できたとあります。
この「早く見える」ことが重要で、後から見つかるほど修正コストも心理的ダメージも大きいんですよね。

Quality Gateで「悪いコード」を通さない

検出するだけでは不十分で、​悪いコードをマージさせない仕組みが必要です。
そこで出てくるのが quality gate です。

quality gate は、ビルドやマージが「合格」かどうかを決める基準です。
記事では main branch に対して、次のような厳しめの条件を設定しています。

これ、かなり筋がいいです。
「脆弱性があるけど、とりあえず先に進む」は、結局あとで返ってきます。
セキュリティ違反を、コンパイルエラーと同じくらいの扱いにする。考え方としてとても強いです。

個人的には、quality gate は SonarQube の中でも特に価値が高い機能だと思います。
単なる「見つけたよ」ではなく、「通しません」に変えるからです。

誤検知もある。だからこそ運用が大事

もちろん、ツールは万能ではありません。
記事でも、​false positive​(実際は安全なのに危険っぽく見える誤検知)が起きると述べています。

たとえば、文字列を扱うユーティリティ関数が、たまたま password に似た文字列を扱っていて警告されることがある。
こういうノイズが増えると、​alert fatigue​(警告疲れ)が起こります。
最悪なのは、開発者が「またSonarQubeか」と無視し始めることです。

image_0003.svg

そのため記事では、次のように運用していました。

このあたり、すごく現実的です。
セキュリティツールは「厳しすぎると嫌われるし、甘すぎると意味がない」。
そのバランス調整が、実は一番むずかしいと思います。

vulnerabilities と security hotspots の違い

記事の中で地味に重要なのが、​vulnerabilitiessecurity hotspots を分けている点です。

この区別はかなり大事です。
「危険そう」に見えるコードでも、実際には文脈次第で問題ないことがあります。
逆に、ぱっと見は普通でも、使い方次第で危険なこともある。

記事では、senior engineer が hotspot をレビューし、必要なら vulnerability に格上げし、問題なければ Safe にする運用をしていました。
この human-in-the-loop の考え方は、かなり賢いです。
全部を自動判定しようとしない。人間が見るべきところは人間が見る。これが現実解ではないかと思います。

記事から見える、うまい使い方のコツ

元記事の後半では、SonarQube運用のベストプラクティスがまとめられています。
ここはそのままでも実践的ですが、特に重要だと思った点をかみ砕くとこうです。

1. 失敗は早く知る

毎回の commit で解析する。
夜間バッチまで待たない。
早いフィードバックほど修正しやすいのは、開発でも人生でもだいたい同じです。

2. 最初から全部やらない

ルールを一気に全部有効化すると、チームが疲れます。
まずは重要な security ルールから始める。
これはかなり現実的で、導入失敗を避けるコツだと思います。

3. 警告を消すのでなく、原因を直す

単に suppress(無効化)するのではなく、なぜそのルールがあるのか理解する。
ここを飛ばすと、別の場所で同じ問題が再発します。

4. トレンドを見る

technical debt ratio を追いかける。
増えているなら、機能追加を急ぎすぎていないか、レビューが甘くなっていないかを疑う。
数字が「健康診断」みたいな役割を果たすわけです。

5. IDEにも入れる

SonarLint を IntelliJ や Eclipse に入れると、開発者の手元で早く気づける。
これは地味ですが、かなり効くはずです。
コミット前に見つかるのは、やっぱり気持ちがいい。

6. SonarQube自体も守る

忘れがちですが、SonarQubeサーバーにも sensitive data が入ります。
認証をかける、設定権限を絞る、admin password を定期変更する、公開インターネットに出しっぱなしにしない。
ここを雑にすると本末転倒です。

この事例のいちばん面白いところ

個人的に一番面白いのは、SonarQubeが「バグを探すツール」以上の意味を持っている点です。
単に問題を見つけるだけなら、アラートは増える一方かもしれません。
でも記事のチームは、quality gate や hotspot review を使って、​安全な開発の流れそのものを作っている

つまり、SonarQubeは単なるスキャナではなく、
「うっかり危険なコードを混ぜないための仕組み」なんですね。
この発想はかなり強いです。

ただし、銀の弾丸ではない

記事の結論もここをはっきり言っています。
静的解析は万能ではありません。

でも、​低コストで拾える危険を自動で拾うという意味では非常に強力です。
防御を何層にも重ねる defense in depth の一層としては、かなり頼れる存在だと思います。

まとめ

この記事が伝えているのは、SonarQubeの導入事例というより、
​「セキュリティを後回しにしない開発の作り方」​です。

テストだけでは防げない事故はある。
レビューだけでもすり抜ける。
だからこそ、静的解析をCI/CDに組み込み、quality gate で止める。

この流れは、とても筋が通っています。
しかも、ハードコードされたAPI keyのような「ありがちな事故」をかなり早い段階で防げる。
派手さはないけれど、現場ではこういう地味な仕組みが一番効くんですよね。


参考: Detect Bugs and Vulnerabilities in Java With SonarQube

同じ著者の記事