RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

GitHubのシークレットスキャニングに助けられた話

f:id:tech-rakus:20200901193742p:plain

はじめに

はじめまして、新卒一年目のYoshidaMichaelです。
研修でGitの使い方を学び、「家で作ってるBotもGitで管理しちゃうぞー!」なんて意気込んでいたわけですが、
うっかりトークンが載った状態のコードをpushしてしまって大変なことになりそうでした。

今回はそれをGitHubに助けていただいた、そんなお話です。

シークレットスキャニング

シークレットスキャンニングについて - GitHub Docs

GitHubリポジトリをスキャンして既知のシークレットのタイプを探し、誤ってコミットされたシークレットの不正使用を防止します

なんとGitHubではpushされた際に自動でトークン (ここではシークレットと表現されています) が含まれていないか
確認してくれるんですね。

どうやら私のようなうっかりミスをする人は多いらしく、トークンスキャニングを導入してから発見されたトーク
流出は1年間で10億件にものぼるそうです。
この機能が導入されてなかったと思うと恐ろしい話ですね......。

提携サービス

実はトークンが流出した当初、私はシークレットスキャニングがGitHubの機能であることを知りませんでした。
というのも、私がGitHubへpushした際に受けた警告は以下のようなものだったのです。

f:id:YoshidaMichael:20200830020427j:plain
トークン流出時に受け取ったメッセージ


これを見て「うわー、DiscordってGitHubの投稿まで見てるんだ!すごい!」なんて思ったわけですが、調べてみるとGitHubが調査してトークンを発見、提携しているサービスと情報を共有しているそうです。

現在GitHubは32のサービスプロバイダと提携しており、それらのサービスであれば万一トークンが流出しても大惨事になることは防げそうです。

根本対処

今回はシークレットスキャニングが優秀だったおかげでトークンを発見してもらい、すぐさまDiscordにトークンを
リセットしてもらえたわけですが、いつも発見してもらえるかは正直わからないところです。

また、そもそもGitHubと提携していないサービスのトークンであれば検出されず、そのまま外部へ流出してしまうこともあるでしょう。

そこでここでは「そもそもトークンを流出させない工夫ってないの?」という方法を調べてみましたので紹介しようと
思います。

方法1 : 別のファイルに記述してそれを読み取る

Botを動かす環境にトークンの記述されたファイルを用意してそれを読み取る方法です。
ファイルはGitHubにはpushせず、Botを動かす環境だけで管理するようにします。
この方法は別の環境でBotを動かしたい場合全ファイルを動かすだけで良いので楽な反面、そのファイルをうっかりGitHubなどにアップしないことは気をつけなければなりません。

方法2: 環境変数に記述する

どうやらメジャーな方法はこちらのようです。
環境変数自体はWindowsでプログラミングをする際にPathを通す過程で触った方も多いのではないでしょうか。

環境変数とは - IT用語辞典 e-Words

環境変数とは、OSが設定値などを永続的に保存し、利用者や実行されるプログラムから設定・参照できるようにしたもの。プログラムの実行時などに必要となる、利用者やコンピュータごとに内容が異なる設定値などを記録するために用いられる。

Pythonでは標準ライブラリで環境変数の設定、取得等が行えるそうなのでPythonを利用した開発ではこちらの方法も気軽に利用できそうですね。(Python以外でも気軽かはわかりません。)

私も今後はこちらでトークン管理をしようかなと思います。

まとめ

今回はGitHubのシークレットスキャニングとトークン管理の方法について紹介しました。
皆さんのトークン流出によるリスクを少しでも下げることに貢献できましたら幸いです。
それでは!

Copyright © RAKUS Co., Ltd. All rights reserved.