Amazon CodeGuru Reviewerがシークレットを検出するようになりました #reinvent

2021.11.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

Amazon CodeGuru Reviewerにハードコーディングされたシークレットの検出機能が追加されました。
この機能を使うと、IDやパスワード、アクセスキーなど秘匿情報をリポジトリにプッシュしてしまった場合でも、CodeGuruのレビュー機能でセキュリティ推奨事項として検出してくれるようになります。

Amazon CodeGuru Reviewer now detects hardcoded secrets in Java and Python repositories

これにより、意図せずシークレットを埋め込んでしまう事故を軽減出来る可能性があります。

Amazon CodeGuru Reviewerについては以下をご参照ください。

何を検出してくれるのか

最大ファイルサイズが100kbまでで、以下のファイルタイプを対象に、ユーザー名/パスワード/RSAキー/各サービスのシークレットを検出してくれます。

  • ファイルタイプ
    • *.config, *.cfg, *.conf, *.cnf, *.cf, *.env, *.ini, *.java, *.json, *.ipynb, *.key, *.md, *.pem, *.plist, *.py, *.rst, *.txt, *.text, *.toml, *.xml, *.yml, *.yaml
  • サービス

ためしてみる

本機能は個別の有効化は不要です。
CodeGuru Reviewerが使用されていれば併せて検出されます。
対応リージョンもCodeGuru Reviewerが使用可能な全てのリージョンで利用可能です。

いくつか試したいと思います。

Pythonコード上にAWSアクセスキーとシークレット

まずは、ありがちなやつをやってみます。
こちらからコードを拝借させて頂いた上で、秘匿情報をハードコーディングしました。

AWS SDK for Python (Boto3)を使ってCloudWatchの値を取得してみた | DevelopersIO

リポジトリは何でも良いですが、CodeCommitを使ってみます。
チェックするだけで統合されるので。

プルリクエストを作成すると統合設定されたCodeGuru側でコードレビューが実施されます。

プルリクエストの変更タブを見るとレビューアのコメントが確認出来ます。
CodeGuruからの指摘が挙がっていますね。
使用しているboto3でのシークレットの利用方法やCWE情報へのリンクも表示されています。

CodeGuru側でもコードレビュー一覧から確認してみましょう。

こちらだと指摘箇所は同じですが、より詳細な情報が確認出来ます。
また、「認証情報を保護」リンクからAWS Secrets Managerに遷移することができ、シークレットの作成とコードスニペットの取得が出来ます。

レビューの指摘から推奨事項の提示まで行ってくれるのでそれに従って対応すれば良さそうですね。
※Secrets Manager部分はあくまでも自分で登録から実装まで行う必要があり、CodeGuru Reviewerに推奨事項の対応として統合されてるわけではないのでご注意ください。

秘匿情報を含んだiniファイル

先程のサポートされているファイル一覧を見て頂いて感じたかもしれませんが、CodeGuru ReviewerはJavaとPythonで利用可能ですが、特定言語に依存しない設定ファイルが多くサポートされています。
なので、C#やRubyなど別の言語のリポジトリでもシークレットに関するチェックは動きそうです。

C#プロジェクトが同梱されているリポジトリでiniファイルに秘匿情報を設定してプルリクエストを作成してみます。

iniファイルの秘匿情報が検出されました。(パスワードはランダムで生成したものです)
設定ファイル等に限っていうと、JavaやPython以外に利用者でも活用出来るかもしれません。

pemファイル

チェック内容にRSAキーとあったので、マネジメントコンソールでキーペアを生成し、ファイルを直接配置して、Pythonコード上へも埋め込んで見ます。

お、検出されないですね。
ドキュメントが間違っているのか私が検討違いなのかちょっとわからないですが、この挙動からなんでもかんでも秘匿情報なら検出してくれるわけではないみたいです。

.NET Coreなどの構成ファイルで接続文字列を記述するパターン

構成ファイルにユーザー名、パスワードまで含まれる接続文字列を記述したパターンを見てみます。

これも検出してくれないですね。

まとめ

本日はCodeGuru Reviewerを使ったシークレットの検出を行ってみました。
うまく検出されるものもあれば、期待どおり検出されなかったものもありました。

従来のCodeGuru Reviewerの使い方と同様で、あくまでも品質向上を目的としたレビューの追加観点としての導入とし、CodeGuru Reviewerを導入しているのでコードレビュープロセスをスキップするなどのような使い方は避けたほうが良さそうですね。
とはいえ、人の目でレビューする限りは見落としは必ずあるので予防的に導入することで十分効果は出るかなって感じがします。

今回試していませんがサポートファイルを見る限りではMarkdownドキュメントからも検出出来るようです。
従来と異なり、JavaとPython以外の利用者でも、活用出来そうなのでCodeGuru Reviewerの間口が広がった感じが少ししますね。