CI/CDと秘匿情報: Pipelinesが秘密データを保持する方法
秘密を守れない友人は信用できません。インテグレーション済みの各コンポーネントの認証情報を預けるという意味で、ミッションクリティカルなCI/CDツールにも同じことが言えます。
他の様々なサービスに接続する必要のあるCI/CDツールにとって、秘密を安全に保つのは難しいことです。それぞれが独自のパスワードやトークンを必要とし、盗まれないようにしなければなりません。ワークフローを定義するプレーンテキストファイルで機密データを公開することは大きなセキュリティリスクとなります。
JFrog Pipelinesは最初から秘密を守るように設計されています。多くのCIソリューションとは異なり、特別なインストールやメンテナンスが必要なプラグインやアドオンを提供するのではなく、秘密データの管理がはじめから組み込まれています。
ここでは、秘密データの中央管理とJFrog Platformの詳細なアクセス権限を組み合わせてPipelines integrationsが提供する利便性、セキュリティ、および管理者コントロールについてご紹介します。
Pipelines Integrations
Pipelinesには使用頻度の高いツールに対応した様々なインテグレーション機能が用意されているので、簡単に各サービスへ接続できます。多くの場合、インテグレーションの追加に必要なのは分かりやすい名前を付け、APIエンドポイントを指定し、ユーザーの資格情報を入力するだけです。接続可能なインテグレーションにはGitHub、Bitbucket、Docker、Kubernetes、SlackそしてAWS、GCP、Azureなどのクラウドサービスがあります。
秘密データのセントラル・ストレージ
JFrog Pipelinesはインテグレーションに必要となる秘密データを暗号化し、セントラル・ストレージに保管して安全に守ります。
例えば、Jasmineの開発チームがコンテナイメージのためにプライベート・Docker registryを使用している場合、 Docker Registry integrationでユーザー名とパスワードを指定します。
JasmineのPipelines DSLがこのDocker Registry Integrationを使用する場合、プレーンテキストファイルの中にインテグレーションを表す分かりやすい名前(Jasmine_Docker)だけが表示されます。Pipelines Integrationsが接続処理を行い、秘密データは表示されません。
integrations:
- name: Jasmine_Docker # Our private docker registry
これにより、開発者が知る必要があるのは、サービスにアクセスするのに必要なインテグレーションの分かりやすい名前だけとなります。開発者はサービスへの接続を許可する秘密データを直接使用する必要はありません。別の管理者がインテグレーションを設定する場合、チームの開発者は使用を許可されているインテグレーションの秘密を管理する必要がないので、秘密データを共有することなく安全にサービスを共有することができます。
管理者コントロール
制御のためにインテグレーションを追加、編集、削除できるのはJFrog Platformの管理者ユーザーだけです。また、ベストプラクティスに従いPipelinesはパスワードやトークンなどの重要な秘密をUIには表示せず、ディスクマークだけを表示します。
大規模かつチームが複数ある組織では、すべてのユーザーがすべてのサービスにアクセスできるようにしたいわけではないでしょう。管理者がインテグレーションを追加または編集する時、特定のパイプラインソースのみがこのインテグレーションにアクセスできるように制限することができます。このようにしてサービスを一部のパイプラインのみに制限することが可能となり、パイプラインを使用する権限を持つユーザーやグループだけに制限することができます。
これによって開発者はインテグレーションの利用や共有は容易で、許可されたサービスのみ利用可能となります。
- 例えば、SanjayはJasmineのチームではないため、JasmineのプライベートなDockerレジストリにイメージをプッシュすることはできません。管理者であるKimがJasmineのチームにこのインテグレーションの使用を制限する方法は以下の通りです。
- KimがパイプラインのソースとしてJasmineのプロジェクトのリポジトリ(例: jasmine/pipelinest)を追加する
- Jasmine_Docker (Docker Registry Integration)でKimはパイプラインのソースとしてjasmine/pipelinestのみを指定する
- In Administration | Permissions, Kim adds the pipeline source
jasmine/pipelines
to the permissions target for Jasmine’s team.
開発者の利用可能性
Pipelinesはインテグレーションの秘密データを一元的に保持していますが、Pipelines DSLでその詳細にアクセスすることができます。ステップのintegrationsブロックでインテグレーションを指定することにより、そのステップのシェルスクリプトで使用することができます。
例えば、パイプラインのビルド完了時に通知メールを送信する必要がある場合、組み込みのユーティリティ機能を使用して、管理者が追加したSMTPインテグレーションで「TeamJasmine」という名前を付けます。
integrations:
- name: TeamJasmine # SMTP integration
execution:
onSuccess:
- send_notification TeamJasmine --body "built docker image docker-local/demo:$pipeline_name.$run_number"
同様に、シェルスクリプトがインテグレーションによって保持されている値を必要とする場合は、 環境変数を使用します。例えば、SSH Key Integrationの秘密鍵を使用して Secure Shell (SSH) コマンドを実行するには以下のようにします。
integrations:
- name: mySSHKeys # SSH Keys integration
execution:
onExecute:
- echo "$int_mySSHKeys_privateKey" > key.txt
- chmod 400 key.txt
- ssh -i key.txt user@host 'do some work'
いずれの例でも、Pipelines DSLファイル内のキーやパスワードが公開されることはありませんので、オンラインのソースコードリポジトリに保存しても安全が保たれます。この重要な情報はPipelines環境の安全な場所から漏洩することはありません。
トップ中のトップシークレット
Pipelines Integrationsを利用する場合、安全にリソースを共有しながら、認証のための秘密データをより安全に保つことができます。JFrog Platformの統一された権限モデルを使用して、必要な人にはアクセスを許可し、それ以外の人にはアクセスをブロックすることができます。
これはクラウドネイティブ、そしてエンタープライズ規模のCI/CDで使えるPipelinesの設計の1つに過ぎませんが、非常に重要です。ワンストップでDevOpsを実現するシステムを構築するための包括的なアプローチを反映したものとなっています。
皆さんもぜひお試しください。そして、Pipelinesがリリースをいかに安全かつ迅速なものにするかを体感してください。