電通総研 テックブログ

電通総研が運営する技術ブログ

GitHubリポジトリの機密情報チェックツール

こんにちは、X(クロス)イノベーション本部 ソフトウェアデザインセンター セキュリティグループ、2021年新卒入社の大西です。私は昨年10月にセキュリティグループへ配属され、3ヶ月間、技術調査としてGitHub上の機密情報を見つけ出すチェックツールを調査していました。今日は、GitHubリポジトリに機密情報をプッシュしてしまった場合に、それを検知するツールについてお話しします。 皆さんは、ソースコードを書く際に機密情報をハードコードしてしまっていないでしょうか。機密情報をハードコーディングしたままGitHub上に公開すると、その情報を不正利用されてしまいます。例えば、AWSのアクセスキーID、シークレットアクセスキーが漏洩すると、勝手にEC2インスタンスを立ち上げられて仮想通貨のマイニングに使用され、莫大な請求が届くという事例が相次いでいます。これを防止するためには機密情報のハードコード防止が必要ですが、人間が注意するにしても限界があります。自動化はできないか、と考えたのが今回技術調査を行った背景です。ISIDでも業務でGitHubを利用しており、パブリックリポジトリもいくつか所有しています。ISIDが持つパブリックリポジトリこちらから見られます。

技術調査記録

それでは、不正利用などから会社の資産、情報を守るためのチェックツールを調査した記録を書いていきます。 この調査のためにまず行ったことは、候補に挙がっていたチェックツールの特徴や使い方を知ることです。今回いくつかのチェックツールを対象に調査したのですが、オープンソースツールも含まれており、GitHub上でソースコード自体も見ることができました。 それぞれのツールの特徴を掴んだ後は、実際に様々な機密情報(もし流出しても使用できないように失効済み)をリポジトリに仕込んでから、各ツールでスキャンし検知率や誤検知率、解析速度などを比較しました。ここで時間がかかったのが、リポジトリに仕込むための機密情報を様々なプロバイダーから収集してくることです。今回は、AWSやAzure、GCPなどのクラウド系を中心に16種類の機密情報を埋め込んだのですが、クラウドに触るのがほぼ初めてだったのでどこにどんな情報があるのかを探すのが大変でした。社内のクラウドグループの方からもお力をお借りし、無事にターゲットとしていた機密情報をゲットしました。そして、それらを埋め込んだリポジトリをスキャンし、この調査で私たちがツールに求める要件が明確になってきました。その要件とは、 - 過去のコミット履歴もスキャンできること - メンテナンス、サポート等が充実していること - 費用面が安く抑えられること でした。

過去のコミット履歴のスキャンに関しては、HEADコミットやmainブランチだけでなく、全てのブランチ、そしてブランチごとの履歴も含め全てスキャンしてくれるツールであることが重要になってきます。なぜなら、履歴に機密情報が含まれていれば簡単にそれを盗めるからです。また、メンテナンス・サポートに関しては、機密情報の種類は年々変わっていくので、検出できる機密情報の種類を増やしたり、検知のルールを変えたりしなければなりません(例えば、AWSのアクセスキーIDはAKIA, ANPAなどのプレフィックスが付いているが、将来このプレフィックスが変更されると、それに伴って検知のルールも変更しなければならない)。将来のことも考え、細かなところまできっちりメンテナンスしてくれているようなツールを選ぶことが重要であると考えました。費用面に関しては、もちろん安く抑えられた方がいいですね。 というわけで、今回は5つツールを調査しましたが、その中でも良いと判断したオープンソースツール1つと有償ツール1つをご紹介したいと思います。

Gitleaks

Gitleaksは、機密情報をハードコードすることを防ぐ静的解析ツール。オープンソースなので無償で利用でき、HomebrewやDockerなどから簡単にインストールできる。リモート、ローカルどちらのスキャンも可能。

言語: Go

検出する機密情報の種類: AWS, GCP, SSH, GitHub, Slackなどの機密情報、約100種類(version 8.2.7) https://github.com/zricethezav/gitleaks/blob/master/config/gitleaks.toml

GitHubでのStar数: 8.8k

機密情報の検出方法: 正規表現

下図のように"gitleaks detect -v"とコマンドを打つと、検出された機密情報が表示される↓

gitleaksの検出結果画面1

使ってみた感想

  • メリット

    • 過去のコミット履歴まで遡って検知してくれる
      • メインブランチだけでなく、他のブランチ、そしてそれぞれのブランチの履歴までスキャンできる
    • ルールのカスタマイズが可能(正規表現でルールを書く必要がある)
      • ルールをカスタマイズすればより多くの機密情報をスキャンできる
    • 8系がリリースされ、7系に比べスキャンスピードが速くなった
    • 8系がリリースされてから検知できるシークレット数が増加した(+60種類くらい)
    • pre-commit hookを使用すればコミットする前にスキャンされるため、GitHubに誤って機密情報をプッシュしてしまうことがなくなる
    • GitHub ActionsGitHub Marketplaceに登録されている
      • ymlファイルに記述するだけで、CI/CDパイプラインの中で検出できる
  • デメリット

    • 8系で検知できるシークレット数が増えた分、誤検知が多くなった
      • 具体的には、調査したリポジトリの中にIonic API tokenという名前で45件の検出があった
      • Configファイルのallow listの中に上記の文字列を入れれば、スキャンはスキップされる
      • 正規表現をカスタマイズすれば誤検知を減らすことができる

Secret Scanning

Secret ScanningはGitHubが提供するスキャン機能。Secret Scanningは、すべてのパブリックリポジトリ、およびGitHub Advanced Securityが有効になっている組織が所有するプライベートリポジトリで利用できる。パブリックリポジトリでは自動的にSecret Scanningが有効になり、リポジトリをプッシュすると、コンテンツをスキャンして機密情報を探す。

検出する機密情報の種類: - パブリックリポジトリ:約100種類 - プライベートリポジトリ:約100種類 詳しくは、こちらのページで!

GitHubリポジトリのメインページ -> Securityタブ -> 左サイドバーのSecret scanning alertsをクリックすると、機密情報が見つかった場合その一覧が見られる↓

Secret Scanningの検出結果画面2

使ってみた感想

  • メリット

    • Secret Scanningで機密情報が検出された場合、GitHubが機密情報を発行したサービスプロバイダーと連携をとって対応に当たってくれる

      • パブリックリポジトリ
        • トークンなどの機密情報(シークレット)を発行したサービスプロバイダー(AWS, Azureなど)に通知する
        • サービスプロバイダーは、資格情報を検証してから、シークレットを取り消すか、新しいシークレットを発行するか、直接連絡するかを決定する(ユーザーまたはサービスプロバイダーに関連するリスクによって異なる)
      • プライベートリポジトリ
        • リポジトリ管理者と組織の所有者にメールアラートを送信する
        • リポジトリにシークレットをコミットしたユーザーに対し、関連するシークレットスキャンアラートへのリンクを含む電子メールアラートを送信する。コミット作成者は、リポジトリ内のアラートを表示し、アラートを解決できる。
        • GitHubリポジトリにアラートを表示する
    • Secret Scanningを使用していて困った時にGitHub社のサポートを受けられる(英語対応)

    • ルールのカスタマイズが可能(正規表現でルールを書く必要がある)

  • デメリット

    • プライベートリポジトリをスキャンするためには、所属する組織が、有償のGitHub Advanced Securityをオプション購入してからSecret Scanningを有効にしなければならない
    • リポジトリをプッシュした後にスキャンするため、スキャンする時点ですでに機密情報が漏れている可能性がある

今後の対応

今後は、試験運用として、Gitleaksを使って機密情報のスキャンをしていくことになりました。理由としては、上記でも述べたように、過去のコミット履歴もスキャンできること、メンテナンスが充実していること、無償で利用できることがあげられます。また、GitHub上のコミュニケーションも活発で、例えば、投稿されたissueはアクティブに対応されています。Gitleaksで社内のリポジトリを定期的にスキャンし、機密情報が検出された時はリポジトリ所有者に通達するなどし、開発者のセキュリティ意識向上につなげていきます。

(もしも、機密情報を見つけたら......) もし、機密情報をGitHubにプッシュしていることに気が付いたら、その情報を完全に削除するのには手間がかかります。なぜなら、gitの仕組み上変更履歴は全てツリー中に含まれており、履歴をたどれば機密情報の含まれたコミットまでたどり着けることがあるため、履歴を全て改変する必要があるからです。機密情報の含まれたコミットをいかなるブランチやタグからも遡れないようにする必要があります。そのためにはBFGツールなどを使ってgitリポジトリの履歴から特定の文字列やファイルを削除します。また、GitHub上ではgitリポジトリそのものの他に、Pull RequestやIssueに貼られたEmbed commentなど、gitリポジトリ内のコンテンツが表示されうる機会が存在します。 これらの情報を完全に削除するにはGitHubのサポートに連絡して削除してもらうしかありません。 機密情報の削除についてはこちらの記事が参考になりました。

今後はツールを活用し機密情報を外部に漏らさない対策を強化していきたいと思います。

執筆:@onishi.mayu、レビュー:@higaShodoで執筆されました