Travis CIでGitHub Personal access tokensが漏れないようにする
2017-05-09 漏れていた人はメールで通知が来ていると思いますが、Travis CIのログ上にGitHubのTokenが漏れていたケースがあるという話がありました。 (漏れていたTokenはGitHub側で既にrevokeされていると思います。またメールに漏れている一覧が載ってるはず)
これ自体はTravis CIのバグではなくて、ユーザーが書いたデプロイスクリプトなどのツール側のバグによってGitHubのTokenなどsecretな環境変数がログ上に出ている話です。 Travis CIのログはPublicで誰でも見ることができるので、標準出力にTokenが露出していると問題があります。
どのようなケースでGitHubのTokenが標準出力に出てしまうかというと、git push
のミスが一番多いと思います。
例えば次のようにGitHubのTokenを使って、Travis CIからGitHubへpushしているスクリプトは問題があります。
git push --force --quiet "https://${GH_TOKEN}@github.com/example/test.git" gh-pages
このスクリプトは、--quiet
が付いてるので GH_TOKEN
が漏れないように見えますが、
git push
に失敗すると、エラー結果に含まれるpush先("https://${GH_TOKEN}@github.com/example/test.git"
)がログにでるため安全ではありません。
そのため、標準出力と標準エラー出力を両方共潰さないと、GH_TOKEN
が漏れるケースがあります。
git push --force --quiet "https://${GH_TOKEN}@github.com/example/test.git" gh-pages >/dev/null 2>&1
この手法はAuto-deploying built products to gh-pages with Travisの古いバージョンで紹介されていたので知ってる人も多いと思います。
このTravis CI上のGitHub Token(GitHubには限らないけど)漏れは結構前から見かけることがあって、いくつか報告した記憶もあります。
- GH_TOKEN is leaked · Issue #8 · jirutka/rake-jekyll
- Security concern about merge-development-with-master.sh (T6661) · Issue #3727 · babel/babel
この辺の問題があるリポジトリについて、Travis側が過去のログを調査して今回の通知を出したようです。
また、今日から環境変数とマッチする文字列は、ログ上では[secure]
に自動で置換されるようになっています。
Both new builds and archived build logs with this issue will see the string [secure] instead of potentially exposed secure environment variables. Logs on both our open-source .org, and closed-source .com platforms have been updated. – The Travis CI Blog: Security Advisory: Secured Environment Variables
Travis CIからGitHubへpushする
Travis CIからGitHub(gh-pages)へpushしたい場合、自分の場合はGitHubのtokenではなくSSHのキーを使うようにしています。
GitHubにはリポジトリごとにreadまたはwriteのDeploy KeysとしてSSHの公開鍵を登録することができます。
GitHubのTokenは権限は設定できますがユーザー単位なので、一度漏れるとそのユーザーのすべてのリポジトリに影響があります。 GitHubのDeploy Keysはリポジトリごとなので、漏れてもそのリポジトリのみしか読み書きすることができません。
add-deploy-key-to-githubなどを使うと、CLIからDeploy Keysを作ってリポジトリに登録できるので、それを使ってgit pushすると簡単です。
(Token方式みたいにgit push先を変更する必要もないけど、ssh経由にする必要があるので git config --global url.ssh://[email protected]/.insteadOf https://github.com/
などしておくとデプロイスクリプトの変更がいらない)
Deploy Keys(SSHキー)を使ったgh-pages
へのpush方法は次の記事などで解説されています。
- Auto-deploying built products to gh-pages with Travis
- Travis CIからgh-pagesへデプロイする設定 via SSH/git push | Web Scratch
- Travis CI から GitHub へ git push を行う設定 | Tips Note by TAM
フローチャート
- Travis CIからGitHubへpushしたい
- => リポジトリ用のsshキーを作ってdeploy keyに登録して使う
- Travis CIでGitHubのtokenが必要(APIを使う処理)
- => Personal access tokensをリポジトリ用に新規作成して使う
- Tokenが漏れると影響範囲が広いので、使い回しはしない
その他
今回の話はまた違いますが、npmへpublishされたパッケージから秘密の情報が混じっていたり、awsのcredentialsがリポジトリに漏れているのは稀によく見るので、そういうのが起こりにくいような仕組みを保つ必要がありそうです。
npmへpublishするのにpackage.json の files フィールドでホワイトリストを使うとか、awslabs/git-secretsなどでpush前にチェックするなど
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。