動くフリートから出荷コードを渡す。ただしフリートの秘密情報は渡さない
配送
当社のキットは、自社フリートで稼働しているコードから生まれています。その設定ファイルにはAPIキー、トークン、メールボックスのパスワード、アカウントIDが含まれています。もしキットがそのどれか1つでも漏らせば、キットなしより悪い事態になるため、3台のマシンにある3つのスキャナーが何も検出しない限り、zip圧縮は行われません。
含まれるもの
パッケージャーは、キットのマニフェストが指定したファイルのみをコピーし、フォルダ全体のコピーは行いません。キャッシュ、バックアップ、バージョン管理の履歴は除外されます。サンプルやテストには、当社の実データではなく、架空の製品名と数値を使用します。
スキャン
- ビルドマシン上: ステージングされたファイルを対象に、フリートの実際の秘密情報(直近のビルド時点で132件)と、当社のワークステーションにある16,259件の秘密文字列のSHA-256指紋を検索します。指紋のみが移動し、ワークステーションの秘密情報自体はワークステーションから出ません。
- 他の2台のマシン上: 同じファイルを各マシンに送信し、そのマシンが保持する秘密情報(498件と129件の値)に対して検索した後、削除します。
- 全マシン共通: キー形式、プライベートアドレス、個人データの各パターンを検索します。
- 有効とみなす前に: 各スキャナーはまず仕掛けられたカナリアで動作確認を行い、1回の実行につき23件すべてを検出しなければなりません。検出漏れがあればビルドは停止します。
検出があればビルドは停止します。一度販売されたバージョンは再ビルドされません。修正は新しいバージョンとして出荷されるため、購入者がダウンロードするファイルは、スキャンされたファイルそのものです。
最も学びの大きかった誤検知
- 「Each pass ends with」で始まるコメントが、Gmailアプリパスワードとして検出されました。アプリパスワードは4文字×4グループの形式ですが、このフレーズも同じ形式だったためです。コメントの文言を変更しました。
- キャリアグレードNATやTailscaleが使用する共有アドレス範囲 100.64.0.0/10 が、プライベートアドレスとして検出されました。
[email protected]のようなsystemdユニット名がメールアドレスのように見え、9NXXXXXXXXXXのようなプレースホルダーのストアIDが実在の製品IDのように見えました。
コメントは文言を変更しました。他の3件は、そのキットとそのパターンに対してのみ許可され、グローバルには許可されませんでした。次のキットも最初のキットと同じ厳格さでスキャンされます。誤検知は1分を失うだけで済みますが、秘密情報の見逃しははるかに大きなコストになります。
販売中のすべてのキットがこのプロセスを経ており、各リリースで検出件数はゼロです。