CircleCI のセキュリティ対策
このドキュメントでは、CircleCI で講じているセキュリティ対策について説明します。
概要
CircleCI においてセキュリティ問題の予防は最優先事項であり、問題が発生した場合は迅速に対処します。 セキュリティ問題が発生した場合は、CircleCI セキュリティチームの GPG キーを使用して、 security@circleci.com まで暗号化メッセージをお送りください。
- ID: 0x4013DDA7
- フィンガープリント 3CD2 A48F 2071 61C0 B9B7 1AE2 6170 15B8 4013 DDA7
暗号化
CircleCI では、CircleCI サービス内外へのすべてのネットワーク通信で HTTPS または SSH を使用します。 これには、ブラウザーから弊社のサービスアプリケーションへの通信、サービスアプリケーションからビルドマシンフリートへの通信、ビルドマシンフリートからソース管理システムへの通信など、あらゆる通信ポイントが含まれます。 つまり、ユーザーのコードやデータが暗号化されずに CircleCI から送受信されることはありません。ただし、ご自身の判断で暗号化しないコードをビルドに含めることも可能です。 オペレーターは、CircleCI の SSL 構成を回避することも、基盤システムの通信に TLS を使用しないように選択することもできます。
CircleCI のソフトウェアは、ユーザーのコードやそのコードが操作するすべてのデータにアクセスできます。 CircleCI 上のすべてのジョブは、他のあらゆるビルドから独立し、インターネットやユーザー自身のネットワークからアクセスできないサンドボックス (具体的には、Docker コンテナまたは一時的な仮想マシン) 内で実行されます。 ビルドエージェントは、SSH によって Git からコードをプルします。 特定のテスト スイートまたはジョブ構成は、外部サービスまたはネットワーク内のインテグレーション ポイントに対して呼び出しを行うことができます。そうした呼び出しからの応答は、ジョブにプルされ、ユーザー自身の判断でコードに使用されます。 1 つのジョブが完了すると、ジョブを実行したコンテナは廃棄され、リビルドされます。 すべての環境変数は HashiCorp Vault により AES256-GCM96 を使って暗号化され、CircleCI の従業員は見ることはできません。
サンドボックス化
CircleCI では、コードのビルドを実行するために割り当てられるリソースをご自身で制御することができます。 これは、ビルドが実行されるコンテナをセットアップする Builder ボックスのインスタンスを介して行われます。 ビルドコンテナは、ソースコードをプルダウンし、コードベースまたは設定ファイルに含まれるすべてのテスト スクリプトとデプロイスクリプトを実行します。 これらのコンテナはサンドボックス化されます。つまり、ビルド (または並列ビルドの一部分) ごとに専用のコンテナが 1 つずつ作成され、破棄されます。これらのコンテナは外部から使用することはできません。 CircleCI では、特定のビルドコンテナに直接 SSH 接続できる機能を提供しています。 この SSH 処理により、そのビルドコンテナ内のすべてのファイルまたは実行中のプロセスにフルアクセスできるため、ソースコードを任せられるユーザーだけに CircleCI へのアクセスを許可してください。
インテグレーション
CircleCI には、関連する外部のサービスやテクノロジーとのインテグレーションポイントがいくつかあります。
-
WebSocket: CircleCI は、サーバーとブラウザー間の WebSocket 通信に Pusher クライアント ライブラリを使用していますが、インストールには slanger という内部サーバーを使用しています。 そのため、Pusher サーバーが CircleCI インスタンスやソース管理システムにアクセスすることはありません。 こうした仕組みにより、ビルドリストが動的に更新されたり、ビルドの出力が発生と同時に 1 行ずつ表示されたりします。 ビルドステータスとビルド出力の行は、WebSocket サーバーを経由して送信されます (SSL なしで実行するように CircleCI を設定しない限り、SSL 上で同じ証明書を使用して行われます)。したがって、転送時には暗号化されます。
-
Replicated: CircleCI Server のプライベート インスタンスでは、 Replicated を使用して、インストール ウィザード、ライセンス キー、システム監査ログ、ソフトウェアの更新など、CircleCI のメンテナンスやシステムに関する作業を管理します。 CircleCI Server インスタンスは、更新の有無を確認するために、Replicated サーバーと通信してライセンス キー情報やバージョン情報を送信します。 Replicated がユーザーのデータや他のシステムにアクセスすることはありません。 また、CircleCI がユーザーのデータを Replicated に送信することもありません。
-
ソース管理システム: CircleCI を使用するには、GitHub Enterprise、GitHub.com などのソース管理システムのインスタンスとの直接接続をセットアップします。 CircleCI のセットアップ時に、プライベートリポジトリのチェックアウトをシステムに許可します。 この権限は、VCS の設定ページで、リポジトリの管理者ページから CircleCI のデプロイキーとサービスフックを削除して、いつでも取り消すことができます。 CircleCI ではプロジェクトを選択してビルドできますが、VCS の権限モデルは極端なものであるため、CircleCI にはすべてのリポジトリへのアクセスが許可されるか、一切許可されないかのどちらかになります。 CircleCI インスタンスは、Git リポジトリでホスティングされているすべての項目にアクセスでき、コードのプッシュやユーザーの追加など、さまざまなイベントの Webhook を作成します。これが CircleCI にコールバックして、1 つ以上の Git コマンドをトリガーすることで、コードがビルドマシンフリートにプルダウンされます。
-
依存関係とソースのキャッシュ: ほとんどの CircleCI ユーザーは、Amazon VPC などのプライベートクラウドインフラストラクチャ内で S3 または同等のクラウドベースのストレージを使用して、依存関係やソースのキャッシュを格納しています。 これらのストレージサーバーは、このようなサービス上に格納されるすべての項目の標準的なセキュリティパラメーターの対象となります。 つまり、ほとんどの場合、ユーザーは外部からのアクセスを阻止できます。
-
アーティファクト: アーティファクトを表示する際に、他のビルドがブラウザのローカルストレージにアクセスしないようにするために、HTML および XHTML のページは、
*.circle-artifacts.com
のプロジェクト固有のサブドメインでホストされます。 HTML 以外のアーティファクトは通常、ダウンロード速度が最大になるよう S3 URL にリダイレクトされ ます (302 FOUND
)。 これらのタイプのアーティファクトは一つの S3 ドメインでホストされるため、HTML や XHTML ページ上のブラウザのローカルストレージにアクセスする可能性があるので、これらの URL のブラウザに機密データを入力しないでください。 -
iOS ビルド: CircleCI のハードウェア上で iOS ビルドを有料で実行している場合は、macOS フリート上のビルドボックスにソースコードがダウンロードされ、コンパイルやテストの実行もそこで行われます。 ご自身で制御するプライマリビルドコンテナと同様に、CircleCI で実行される iOS ビルドも、アクセスできないようにサンドボックス化されます。
-
Docker: Docker イメージを使用している場合は、Docker Engine について、Docker 公式の seccomp (セキュリティ コンピューティング モード) プロファイルを参照してください。 CircleCI は、Docker のデフォルトの
seccomp
プロファイルに以下のように付加します。
[
{
"comment": "ユーザー名前空間の作成を許可",
"names": [
"clone",
"setns",
"unshare"
],
"action": "SCMP_ACT_ALLOW",
"args": [],
"includes": {},
"excludes": {}
}
]