無印吉澤

Site Reliability Engineering(SRE)、ソフトウェア開発、クラウドコンピューティングなどについて、吉澤が調べたり試したことを書いていくブログです。

HashiCorp のツールを動かすと自動的に作られる checkpoint_signature とは何か?

Otto の動作を調べていて気付いたのですが、ottoコマンドを実行すると ~/.otto.d ディレクトリ以下に checkpoint_signature というファイルが自動的に作られるようです。

例えば、一度 ~/.otto.d ディレクトリを削除してから otto version を実行すると、以下のようにファイルが作られます。

% rm -rf ~/.otto.d
% otto version
Otto v0.1.2

% tree -F ~/.otto.d
/Users/myoshiz/.otto.d
├── checkpoint_cache
└── checkpoint_signature

0 directories, 2 files

checkpoint_signature の中身は、以下のようなテキストファイルです。

8e7691ee-fa98-9ccb-260b-27031234fd81


This signature is a randomly generated UUID used to de-duplicate
alerts and version information. This signature is random, it is
not based on any personally identifiable information. To create
a new signature, you can simply delete this file at any time.
See the documentation for the software using Checkpoint for more
information on how to disable it.

手元の環境で見てみたら ~/.vagrant.d/data ディレクトリ以下にも checkpoint_signature と checkpoint_cache がありました。これって一体何だろう?と思って、少し調べてみました。

Checkpoint は HashiCorp 製品の最新情報を取得する機能

"hashicorp checkpoint" で検索したところ、Checkpoint (https://checkpoint.hashicorp.com/) のページが見つかりました。

このサイトにある説明が、Checkpoint のほとんどすべてなのですが、日本語訳すると次の通りです。

  • Checkpoint は、OSSまたはプロプライエタリ製品の、バージョンおよびアラート情報を提供するために HashiCorp が動作させているサービス
  • HashiCorp 製品は、時々、Checkpoint API に対して、その製品が動作する環境の情報を送信する
  • この送信は必須ではなく、送信するかどうかは設定可能
  • Checkpoint は HashiCorp 製品に対して、動作中のバージョンが最新か、セキュリティ脆弱性があるか、などの情報を提供する

また、この Checkpoint サービスのクライアント側の(Ottoなどに組み込まれている)ソースコードは、GitHubで公開されていました。

hashicorp/go-checkpoint
https://github.com/hashicorp/go-checkpoint

クライアント側は checkpoint.go(約350行)のみ、Go に詳しくなくても簡単に読める内容で、主な動作は以下の通りでした。

  • 環境変数 CHECKPOINT_DISABLE が設定されていたら、動作しない
  • ランダムな16バイトの signature (ファイル:checkpoint_signature)を作成する
  • signature には以下の2通りの用途がある
    • キャッシュに含まれる signature と比較し、キャッシュが正しいか確認する
    • signature をサーバに送信し、同じアラート情報を何回も繰り返し受信することを防ぐ
  • HTTPリクエストの送信先は
    https://checkpoint-api.hashicorp.com/v1/check/{{製品名}}
  • HTTPリクエストのURLパラメータは、以下の情報を含む
    • version: バージョン番号
    • arch: runtime.GOARCH の値、または呼び出し元で指定した文字列
    • os: runtime.GOOS の値、または呼び出し元で指定した文字列
    • signature: signature の値
  • HTTPレスポンスは、以下の情報を含むJSON
    • product: 製品名
    • current_version: 最新バージョンのバージョン番号
    • current_release: 最新バージョンのリリース日(UNIX時間)
    • current_download: ダウンロードページのURL
    • current_changelog_url: 最新バージョンのChangeLogのURL
    • project_website: 製品のWebサイトのURL
    • outdated: 古いバージョンの場合は true
    • alerts: アラートメッセージの配列
  • 前回のリクエストから CacheDuration(デフォルトは48時間)以内なら、リクエストを送信せずにキャッシュ(checkpoint_cache)を使う
  • キャッシュには、signature、バージョン番号、レスポンスの内容が書き込まれている

Checkpoint API を直接叩いてみる

例えば、Otto 用のURLに対してHTTPリクエストを送ると、以下のようなレスポンスが得られます。

% curl https://checkpoint-api.hashicorp.com/v1/check/otto
{"product":"otto","current_version":"0.1.2","current_release":1446498717,"current_download_url":"https://ottoproject.io/downloads.html","current_changelog_url":"https://github.com/hashicorp/otto/blob/v0.1.2/CHANGELOG.md","project_website":"https://ottoproject.io","alerts":[]}

Otto の現時点での最新版は 0.1.2 です。ここで 0.1.0 というバージョン番号を与えて呼び出すと、レスポンスに "outdated":true が追加されているのがわかります。

% curl "https://checkpoint-api.hashicorp.com/v1/check/otto?version=0.1.0"
{"product":"otto","current_version":"0.1.2","current_release":1446498717,"current_download_url":"https://ottoproject.io/downloads.html","current_changelog_url":"https://github.com/hashicorp/otto/blob/v0.1.2/CHANGELOG.md","outdated":true,"project_website":"https://ottoproject.io","alerts":[]}

まとめ

Checkpoint は、ソフトウェアの最新バージョンを自動的にチェックして、重要なセキュリティ脆弱性があればユーザに通知するための機能でした。ソースコードを読んでも、それ以外に、特に変わった機能は見当たりませんでした。同じような機能を作っている会社はあちこちにあると思います。

ただ、ローカル環境の情報をサーバに自動アップロードする、という機能は不信感を持たれがちなところです。それを、Vagrantなどのツールの一部として公開するのではなく、たとえ1ファイルでも個別のリポジトリとして公開するのは、ユーザからの信頼を得るには良い方法だと思いました。