皆様こんにちは、サーバーサイドエンジニアの草分です。 最近ポケモン最新作を買ってしまったのでひたすら野原でボールを投げ続ける日々を送っています。
さて本題に入りましょう。
Amazon ECRには、pushしたコンテナイメージへのイメージスキャン(脆弱性診断)機能があります。
メドピアではこれを利用して全社横断的にアプリの脆弱性の検知および可視化を行っています。
この記事では、Railsアプリをイメージスキャンした際の【偽陽性】警告の問題と、その解決策について紹介いたします。
問題
ECRのイメージスキャンには「基本スキャン」「拡張スキャン」の2種類があり、この内の拡張スキャン(Enhanced scanning)では、Rubyのgemやnpmのパッケージなども診断の対象となります。
Gemfile.lockに脆弱性のあるライブラリの記載があった場合でも、拡張スキャンを使えば自動検知&一覧化することができます。
ただし現時点(2022/01)ではアプリが使用するGemfile.lockだけでなく、インストールしたgemのディレクトリまで無差別に診断してしまうようです。
Rubyのgemは.gemspec
ファイルの記載に従って動作するため、gemパッケージ内にGemfile.lockが含まれていても通常は使われることはありません。
しかしそんなことはお構いなしに脆弱性警告を発してくるため、使っているgemによっては身に覚えのない警告を大量に受け取ることになるでしょう。困りましたね。
Inspector側でなんとかして欲しいという思いもありますが、この問題に対して以下の対策を実施しました。
対策
gemのパッケージからGemfile.lockを除外する
冒頭のケースでは、gem内にサンプルアプリ(Gemfile.lock入り)が含まれていたため警告対象となっていました。
こういった不要なGemfile.lockについては、gemから除外してしまってもよいでしょう。
.gemspec
ファイルのspec.files
から除外することで、gemパッケージから除外することが可能です。
こちらについてはgem側にPRを送って対処しました。
Exclude sample directories from spec.files by lnit · Pull Request #12 · k0kubun/rack-user_agent · GitHub
迅速にマージ&リリースいただけたので非常に助かりました。ありがとうございました。
リリース後に対象gemをアップデートすれば警告除去完了です。
Dockerイメージから不要なGemfile.lockを除外する
他にも複数のgemが警告対象となっていたのですが、gem側への対応はいつリリースされるか分からず待ち状態となってしまいます。
そこで、アプリのDockerイメージから使用していないGemfile.lockを一括削除することとしました。
RUN bundle install RUN find $(gem environment gemdir) -name "*.lock" | xargs rm -vf
といっても、上記のようにbundle install後にファイルを削除するのみです。Dockerfileごとに追加する必要はありますが、ひとまずこの対応で警告は抑制できました。
うっかりアプリで使用するGemfile.lockを消さないように削除対象には注意しましょう。
まとめ
自動検知ゆえの困ったことはいろいろありましたが、手動で脆弱性やバージョンのチェックを逐一していくのはさすがに無理があります。うまくAmazon Inspectorを手懐けて、セキュアな生活を送っていきましょう!
補足: 採用しなかった対策
forkしたgemを使う
gemをforkしてspec.files
を変更したものをインストールする方法も試してみましたが、gitからインストールしたgemはリポジトリ内の全ファイルがイメージ内に入ってしまうようで、うまくGemfile.lockが除去できませんでした。
forkしたgemを手元でビルド→アプリ内に取り込む という手順を踏めば除去できますが、手間が大きいため没としました。
AWS側で警告を抑制する
Amazon Inspector側にも警告の抑制機能はあるようです。
Suppression rules - Amazon Inspector
しかし、さすがに特定ディレクトリの警告を抑制する設定はなく、今回の問題には対処できませんでした。
是非読者になってください
メドピアでは一緒に働く仲間を募集しています。 ご応募をお待ちしております!
■募集ポジションはこちら
https://medpeer.co.jp/recruit/entry/
■開発環境はこちら