セキュリティインシデントの発生時には、ソフトウェアプロバイダーもユーザーも、速やかに効果的な措置を講じなくてはなりません。CircleCI は、先日のセキュリティインシデントへの対応において、脅威の封じ込めやユーザーシステムへの不正アクセス対策を進めるうえで、お客様、テクノロジーパートナー様、そしてエンジニアリングチームがオープンに協力しあうことで発揮される力を目の当たりにしました。

本記事では、この 2023 年 1 月 4 日のセキュリティインシデントを受けて開発した機能とツールをいくつかご紹介します。

  • 組織のプロジェクトで CircleCI に保存しているすべてのシークレットを特定できる、対話型の CLI ツール
  • シークレットの監査を効率化する CircleCI UI と API の更新
  • 30 日間分の CircleCI 環境の変更履歴を調べられる、セルフサービス型監査ログの提供範囲の拡張

これらの新機能やツールを組み合わせることで、UI や API 経由でのシークレットのローテーションと、影響を受けたパイプラインと認証情報の保護状況の確認をすばやく行えます。こうした変更を実現できたのも、CircleCI コミュニティのみなさまから認証情報のリセットや、プロジェクトと連携済みサービスのアクティビティの監視に関してご質問、ご要望、対応策をお寄せいただいたおかげです。この度のインシデントについて、みなさまのご協力と今後のご支援にあらためてお礼を申し上げます。

CircleCI-Env-Inspector でシークレットを特定する

CircleCI-Env-Inspector はコマンドライン インターフェース (CLI) ツールであり、CircleCI に保存済みのすべてのシークレットの一覧を JSON レポート形式で出力できます。手作業でのローテーションが必要な項目すべてを調査できるので、プロジェクト環境変数や組織全体用コンテキストに多数のシークレットを保存している場合に特に役立ちます。なお、本ツールで返されるのは名前などの識別情報だけであり、シークレットの値は返されません。これは、シークレットが誤って開示されてしまうリスクをゼロに抑えるためです。

CircleCI-Env-Inspector

CircleCI-Env-Inspector を使用するには、まずこちらのプロジェクトリポジトリにアクセスしクローンしてから、調査対象の全プロジェクトにアクセス可能な CircleCI API トークンを生成してください。組織のすべてのプロジェクトで使用されているシークレットをリストアップするには、組織の管理者アカウントで API トークンを生成する必要があります。

API トークンの用意ができたら、CircleCI-Env-Inspector リポジトリのルートに移動して、run.sh コマンドを実行します。メッセージに従い API トークンを入力すると、プロジェクト環境変数とコンテキストに保存されているシークレットの一覧が返されます。以下に出力の例を示します。

{
  "contexts": [
    {
      "name": "CONTEXT_NAME",
      "url": "https://app.circleci.com/settings/organization/<VCS>/<ORG>/contexts/<CONTEXT-ID>",
      "id": "xxx",
      "variables": [
        {
          "variable": "GITHUB_TOKEN",
          "context_id": "xxx",
          "created_at": "yyy"
        }
      ]
    }
  ],
  "projects": [
    {
      "name": "ORG/REPO",
      "url": "https://app.circleci.com/settings/project/<VCS>/<ORG>/<REPO>/environment-variables",
      "variables": [{ "name": "VAR", "value": "xxxx" }],
      "project_keys": [
        {
          "type": "deploy-key",
          "preferred": true,
          "created_at": "xxx",
          "public_key": "yyy",
          "fingerprint": "zzz"
        }
          ]
    }
  ]

}

このツールでは、コンテキストやプロジェクトの名前、URL、ID 番号、認証情報の作成日時と最終更新日時など、プロジェクトに保存されているシークレットの特定に役立つ情報が得られます。

CircleCI-Env-Inspector はオープンソースのツールです。ぜひ、プロジェクトリポジトリにイシューやプルリクエストをお寄せいただき、機能改善にご協力ください。

updated_atタイムスタンプでシークレットのローテーション記録を確かめる

お客様が長期シークレットを変更したことを実際に確かめてご安心いただけるよう、コンテキスト API および CircleCI Web アプリの環境変数ページとコンテキスト管理ページに updated_at タイムスタンプを追加しました。このタイムスタンプを調べることで、シークレットが正常にローテーションされていることを確かめるとともに、更新が必要なシークレットを特定できます。

API で updated_at タイムスタンプを確認するには、GET リクエストで環境変数の一覧を問い合わせるか、PUT リクエストで環境変数を追加または更新します。コンテキスト API に更新リクエストを送信した場合の応答例を以下に示します。

{
  "variable" : "a_variable",
  "updated_at" : "2023-01-09T20:32:18.568Z",
  "context_id" : "b5a5561a-7159-48f1-854f-1e53a8f315e0",
  "created_at" : "2023-01-09T20:26:57.020Z"
}

応答では、変数の名前、変数の更新日時、変数が保存されているコンテキストの ID 番号、変数が初めて作成された日時が返されます。

また、CircleCI Web アプリでシークレットの更新を行うみなさまのために、コンテキストページの UI にも、変数の作成日時と最終更新日時の情報を追加しています。

環境変数のリスト一覧

組織のコンテキストの環境変数は、[Organization Settings (組織設定)] > [Contexts (コンテキスト)] でご覧いただけます。

SHA256 フィンガープリントで SSH チェックアウトキーを比較する

インシデント対応時の改善策として、ユーザーのみなさまには、CircleCI とターゲット環境の両方においてすべての SSH キーをローテーションするようにお勧めしていました。この対応にあわせて、異なるシステム間でチェックアウトキーを比較しやすいように、v1.1 API に SHA-256 パブリックキーのフィンガープリントを返す機能を追加しました。これは、既存の MD5 フィンガープリントを返す機能の拡張版です。

SHA-256 識別子を取得する API 呼び出しの例を以下に示します。

curl -H “Circle-Token: " https://circleci.com/api/v1.1/project/:vcs-type/:username/:project/checkout-key?digest=sha256

上記の ?digest=sha256 クエリパラメーターで、チェックアウトキーの SHA-256 ハッシュ値を応答で返すように指定しています。

SSH キーのローテーションの詳細については、こちらのサポート記事 (英語) をご覧ください。

セルフサービス型監査ログで CircleCI 内におけるアクティビティを調査する

CircleCI では、ユーザーのみなさまが組織のアクティビティを監査、分析しやすいように、監査ログに重要なシステムイベントを記録しています。この監査ログにアクセスする方法は次の 2 つです。

  1. カスタマーサポートに問い合わせる
  2. Web アプリのセルフサービスポータルを使用する

これまで、セルフサービス型の監査ログを利用できるのは、Scale プラン、Performance プラン、Server プランのユーザーのみでした。しかし現在では、全プランのユーザーのみなさまがシステムを確実に保護できるよう、このセルフサービス型監査ログの提供対象を Free プランにまで一時的に拡大しています。

[Organization Settings (組織設定)] > [Security (セキュリティ)] にアクセスして日付範囲を指定することで、過去 365 日以内のシステムアクティビティのログのうち 30 日間分を取得できます。なお、1 日に取得できる監査ログの件数は、Free プランのお客様は 1 件まで、有料プランのお客様は 3 件までです。

CircleCI 監視ログ

CircleCI の監査ログには、コンテキストやプロジェクト環境変数、SSH キー、API トークンの作成と削除、ジョブの開始日時、完了日時、承認日時、およびパイプラインのスケジュール実行の変更など、重要なシステムアクティビティが記録されます。また、操作の実行日時、操作を開始したユーザー、操作の影響を受けたエンティティ (組織、プロジェクト、アカウント、ビルド)、操作の成否に関するデータも記録されます。

なお、お使いの CI/CD 環境で不正なアクティビティが起きていないことを確かめる際には、CircleCI 監査ログを調べるのも重要ですが、2022 年 12 月 21 日から 2023 年 1 月 4 日までにビルドプロセスで使用したすべての連携済みサービスの監査ログも調べることを強くお勧めします。

まとめ

本記事でご紹介した新機能と更新点は、1 月 4 日に起きたセキュリティインシデントへのみなさまの対応を早急に支援するため、CircleCI エンジニアリングチームが開発したものです。しかし、静的な認証情報を定期的にローテーションすることが、セキュリティのベストプラクティスであることに変わりはありません。そのため、これらの機能は、通常のセキュリティ対策と組み合わせて使うことをお勧めします。パイプラインを保護するための対策には、他にも以下のようなものがあります。

みなさまには、パイプラインの保護に積極的にご協力いただき、厚くお礼申し上げます。CircleCI チーム一同、今後もみなさまのサポートに取り組んでまいります。本インシデントの詳細、CircleCI の現在の対応措置、お客様への推奨事項などについてご不明な点がある場合は、こちらのインシデントレポートをご覧いただくか、カスタマーサポートにお問い合わせください。