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には限らないけど)漏れは結構前から見かけることがあって、いくつか報告した記憶もあります。

この辺の問題があるリポジトリについて、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

image

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方法は次の記事などで解説されています。

フローチャート

  1. Travis CIからGitHubへpushしたい
    • => リポジトリ用のsshキーを作ってdeploy keyに登録して使う
  2. Travis CIでGitHubのtokenが必要(APIを使う処理)
    • => Personal access tokensをリポジトリ用に新規作成して使う
    • Tokenが漏れると影響範囲が広いので、使い回しはしない

その他

今回の話はまた違いますが、npmへpublishされたパッケージから秘密の情報が混じっていたり、awsのcredentialsがリポジトリに漏れているのは稀によく見るので、そういうのが起こりにくいような仕組みを保つ必要がありそうです。

npmへpublishするのにpackage.json の files フィールドでホワイトリストを使うとか、awslabs/git-secretsなどでpush前にチェックするなど