これは、 SaaSサービスの構築と運用に必要だったさまざまな側面を取り上げているブログ シリーズの 3 番目のブログです。
私の最初のブログでは、分散クラウド用の新しいプラットフォームを構築することになったニーズについての背景を説明しました。 このプラットフォームを使用して、お客様はスマート製造、公共安全のためのビデオフォレンジック、アルゴリズム取引、通信事業者の 5G ネットワークなど、複雑で多様な一連のapplicationsを構築します。
これらのapplicationsの多くはミッションクリティカルであるため、お客様は当社が多層セキュリティを提供するだけでなく、分散クラスターを安全に保つために継続的に改善する能力も備えていることを期待しています。 このブログでは、複数のクラスターにわたるインフラストラクチャ、applications、およびデータのセキュリティ保護の課題について説明します。
上で述べたように、applicationsへのユーザー アクセス (たとえば、銀行口座や電子メールへのアクセス) を保護するという問題はよく理解されています。 ただし、検証プロセスに人間が関与しないため、アプリ間またはアプリからデータへのアクセスで同じことを行うのはそれほど簡単ではありません。
applicationが別のリソースに安全にアクセスするには (たとえば、オブジェクト ストアに保存されたデータや、別のapplicationへの API 呼び出しなど)、次のことを行う必要があります。
認証プロセスの一環として、要求側applicationは、PKI 証明書または秘密 (パスワードなど) やキーの形式で ID を提示できます。 シークレットまたはキーを ID として使用する場合、対処する必要がある問題が 2 つあります。
これらのセキュリティ操作 (アプリ間のやり取り) を信頼性が高く繰り返し実行することは、簡単な問題ではありません。 これが簡単ではない理由はたくさんあります:
その結果、動的な環境全体でインフラストラクチャ、applications、データを保護することは非常に困難な問題となります。 クラウド プロバイダーはこの課題に立ち向かい、これらの問題に対処するための多くのツールを提供していますが、次の理由により、これらを統合して維持することは容易ではありません。
多くの企業は単一のクラウド プロバイダであり、そのプロバイダーのセキュリティ プリミティブの管理と強化にリソースを投資するだけで十分かもしれませんが、当社は異種環境 (ハイブリッド クラウドとエッジ) で運用しており、これらの問題を解決するために新しいソリューションを構築する必要がありました。
私たちのチームには、図 1 に示すように、分散インフラストラクチャ全体に存在する可能性のあるapplications、インフラストラクチャ、およびデータのセキュリティを提供するという任務がありました。
その結果、当社のプラットフォーム チームは、エッジ、あらゆるクラウド、ネットワーク PoP 全体にプラットフォーム セキュリティを提供するために、次の 4 つの側面を統合した新しいソフトウェア サービスを構築することを決定しました。
アイデンティティは根本的な問題であり、アイデンティティの問題が解決されれば、多くのセキュリティ上の課題に簡単に対処できるようになります。 しかし、アイデンティティの問題を解決するには、アイデンティティが何を意味するのか、そして信頼できる方法でアイデンティティを発行するにはどうすればよいのかを定義する必要があります。 暗号マニアはあらゆることに独自の解釈を加えるのが好きで、アイデンティティの定義も例外ではありません。
人物または物が何であるか、または何であるかと見なされるかを構成する、信頼できる機関によって委任されていない安全なプロトコルを介して暗号で認証された、偽造不可能で暗号で検証可能な一意の特性のセット全体。
本質的に必要なのは、安全に配信される、偽造不可能で暗号的に検証可能な ID です。 このような ID を発行するのは、次の 2 つの理由で困難です。 1)アイデンティティのブートストラップと2)信頼のルート
アイデンティティに関連してよく議論されるアプローチがいくつかあります。SPIFFE と Hashicorp Vault です。 SPIFFE は、当社のシステムで ID ドキュメント (X.509 証明書) として使用できる命名スキームですが、その形式はバイナリ データを含む一部の ID 属性には適していないことを明確にしておきます。 Vault は ID 文書を発行するために使用できますが、ID のブートストラップと信頼のルートの問題の課題は解決されません。
たとえば、VM が AWS で起動されると、ブートストラップ ID が提供され、AWS のメタデータ サービスが信頼のルートとして機能します。 ID ドキュメント (AWS が独自の暗号化キーを使用して署名したもの) は次のようになります。
instanceId は起動されたapplicationインスタンスの一意の ID を示す場合がありますが、他のapplicationsがこの特定のインスタンスと通信するために使用する既知の名前 (myserver.acmecorp.com) にチェーンされる必要があります。 その結果、この AWS ブートストラップ ID ドキュメントだけでは不十分ですが、applicationsが別のapplicationと通信するために使用できる別の ID を発行するために使用できます。
前述したように、applicationsがクラウド プロバイダーやエッジ ロケーション間で通信し、情報を共有できるようにする ID を提供することが重要でした (図 2)。 つまり、これらすべての環境で機能する ID ブートストラップと信頼のルートの両方のためのシステムを構築する必要がありました。
私たちは Kubernetes を使用してapplications(マイクロサービスと VM の両方) を管理およびオーケストレーションするため、起動されるすべてのポッドの一意の ID のブートストラップを Kubernetes のポッド作成プロセスに組み込む必要がありました。 図 3 は、K8s Webhook メカニズムを使用してポッド作成プロセスに接続する方法を示しています。 この Webhook (Voucher と呼ばれる) は、クラスターで作成されたすべての Pod にWingmanと呼ばれるセキュリティ サイドカーを挿入し、信頼のルートとして使用できる必要な暗号署名情報も提供します。 この Webhook は、Wingman が Volterra の SaaS バックエンドの Identity Authority から X.509 証明書を要求するために使用する、有効期間が短い署名済みトークンを提供します。
アイデンティティ機関は、K8s クラスターの 1 つが侵害された場合に「爆発半径」を最小限に抑える方法で、アイデンティティを作成するルールを適用します。 共通のルート CA または K8s クラスターのフェデレーションに依存する他の多くのソリューションでは、爆発半径を制限できません。これは、私たちの設計上の決定における主要な入力でした。
K8s の特定の Pod の場合、Pod の作成後に属性が変更される場合があります。たとえば、Pod は作成後に新しいサービスに接続できます。 つまり、ID 証明書を新しいサービスに合わせて更新する必要がありました。 Wingman は、K8s API サーバーの更新を追跡するバウチャーを継続的に監視します。
このメカニズムは、当社独自のワークロードであるか顧客のワークロードであるかに関係なく、当社のプラットフォーム上で実行されるすべてのapplicationインスタンスに、一意かつユニバーサルなグローバル ID を提供します。 この固有の ID とサイドカー (Wingman) は、分散システム全体のすべての通信、アクセス、およびキー/シークレットを保護するために使用されます。
Pod ごとに一意の ID を持つことは、通信するサービス間で相互認証を実装するタスクを容易にするため、素晴らしいスタートとなります。 私たちの基盤となるインフラストラクチャは、gRPC、REST、IPSec、BGP などのさまざまなプロトコルで実行されるさまざまなサービスで構成されています。 チームは当初から、プロトコルに関係なく、すべての通信当事者間の相互認証と通信セキュリティ (暗号化チャネル) を実現するという目標を設定しました。 これはまた、特定のプロトコル セット (HTTP/TCP と HTTPS など) に限定されるソリューション (Istio など) に ID を結び付けることができないことも意味します。 IP ベース)。
当社のプラットフォームでは、お客様が選択したワークロードを実行することもできるため、これらのワークロードはさまざまなプロトコルを実行できると予想しており、プラットフォームは特定のプロトコル セットに限定された ID を提供することでワークロードの能力を制限すべきではありません。 代わりに、認証は ID から分離され (Wingman 経由)、さまざまなサービス メッシュ テクノロジへの接続が可能になります。 当社のサービス メッシュ サイドカー/データプレーン (以前のブログで説明) は、この ID を使用して顧客のワークロードに mTLS を提供します。
私たち自身のインフラストラクチャ サービスの多くは Volterra Golang サービス フレームワーク (今後のブログで説明します) を使用して記述されていたため、(Wingman からの) ID を使用するロジックをフレームワークに直接組み込むことにしました。 これにより、開発者は mTLS のサービス メッシュ サイドカーに依存せずに、サービス間通信をすぐに保護できるようになりました。
相互認証された安全なチャネルを実現した後の次の論理的なステップは承認です。これは、要求の受信者 (サーバー) が、識別された発信者 (クライアント) からの要求を許可するかどうかを決定するプロセスです。 リクエストを許可しない理由は、割り当て制限、権限など、多数考えられます。 これらの理由とそのしきい値は動的に変化するため、承認のためのハードコードされた一連のルール (ポリシー) は、当社のプラットフォームでは実現不可能でした。
私たちは、Open Policy Agent のエンジンを出発点として使い、Wingman サイドカー内で認証用のラッパーを構築することにしました。 このラッパー コードは、関連するポリシーを動的に取得し、高速評価のためにそれらをホットな状態に保ちます。 認証と同様に、承認エンジンを ID (および認証) から分離することで、認証直後だけでなく、ビジネス ロジックの深いところまで含めたリクエスト処理の複数の段階で承認ポリシーを適用できるようになりました。
Wingman は顧客のワークロードを含むすべてのワークロードに挿入されるため、当社のプラットフォームは組み込み機能として認証エンジンを提供します。 Open Policy Agent (OPA) は Rego と呼ばれる強力な言語に基づいて構築されていますが、その複雑さを開発者や顧客から隠したいと考えていました。 当社のプラットフォーム上のすべてのポリシーは、はるかに理解しやすく直感的なポリシー構造を使用して定義できるため、ユーザー (DevOps) が Rego を学習する必要がなく、間違いを回避できます。 認証構成と同様に、Golang サービス フレームワークは、認証のために Wingman を自動的に呼び出し、開発者から認証の複雑さを隠すことで、Wingman の認証エンジンに接続されました。
認証には固有の ID (Wingman を使用して発行) を使用し、承認にはプログラム可能なポリシー エンジン (Wingman 内) を使用することで、mTLS を使用して通信を保護し、堅牢でプログラム可能なポリシーを使用してすべてのアクセスを制御できます。
毎日、エンジニアはコード内にキーやパスワードを保存することで不注意なミスを犯し、それが何らかの形でパブリック コードやアーティファクト リポジトリに流れてしまいます。 秘密の管理は難しく、使いやすいツールキットと明確に定義されたプロセスがなければ、開発者は最短の道をたどることになります。 その結果、当社の設立当初から、プラットフォーム セキュリティ (ネットワーク セキュリティやアプリ セキュリティとは異なります) チームの使命は、開発者が「ソース コードや成果物などの秘密はどこに保存すればよいのか」といった質問をしなくても済むようにすることでした。
プラットフォームの構築を開始したときに、シークレット管理に利用できる 2 つの一般的なアプローチを評価しましたが、どちらにも次のような欠点がありました。
私たちの場合、SaaS サービスであるため、いかなる侵害によっても顧客の秘密が漏洩しないように、顧客の秘密を保護するためのより堅牢な方法を考え出す必要がありました。
その結果、私たちは Volterra Blindfold (商標) と呼ぶ新しい手法を実装することにしました。これは、図 4 に示すように、セキュリティ サイドカーである Wingman と連携して機能します。 このアプローチにより、秘密の所有者は、秘密が望ましくない第三者(復号化サーバーを含む)に平文で公開されないように、秘密をロック(暗号化)することができます。 秘密は中央の復号化サーバーに保存されることもなく、この設計により、ある意味ではサーバー設計が大幅に簡素化されます。
私たちは、完全にオフラインの設定で使用できる目隠しツールをユーザーに提供します。このツールは、シークレット (S) を暗号化して配布することができます。たとえば、シークレット自体をワークロードとともに保存し、レジストリにアップロードすることができます。 これを達成したら、次の手順を実行する必要があります。
これにより、集中型コントロール プレーンがクリア テキスト (S) のシークレットにアクセスすることはなくなり、シークレットはアクセス期間中、ポッドのランタイム メモリでのみ使用できるようになります。 さらに、アクセス ポリシーを適用して、誰がシークレットにアクセスできるのか定義することもできます。 ポリシーは、application名、場所、コンプライアンス レベルなどの ID 属性に基づいて定義できます。 この方法では、ワークロードの複雑なサブセットを切り分け、正確なアクセス制御を実現できます。 このポリシーは、暗号化、ブラインド化、復号化、およびブラインド解除のプロセスに暗号的に組み入れられており、ポリシーの意図を無効にすることは計算上不可能です。
当社独自の Blindfold 技術を使用して各秘密をロックし、Wingman を使用してポリシーと偽造不可能な ID に基づいて各秘密を開封することで、既存のソリューションの問題を克服し、中央の金鉱の侵害を心配することなく、分散環境で秘密管理を実現できます。
シークレットとキー管理は同じ問題に対する 2 つの異なる名前のように聞こえるかもしれませんが、誰に尋ねるか、またソリューションをどのように実装するかに応じて、この 2 つの間には微妙な (しかし実際には重要な) 違いがあります。
秘密とは、秘密にされ、権限のない者には公開されないはずの情報を指します。 ある意味では、暗号鍵は秘密の特殊なケースです。 一方、キー管理とは、一般的に、機密性の高い暗号化キー素材を安全に保管し、その素材の使用を制御するシステムを指します。 場合によっては、キー管理システムがキーの生のバイトを許可された当事者に渡すことがあり、そのため秘密管理システムと混同される可能性があります。 ただし、ほとんどの場合、キー管理システムは実際にはキー マテリアルの生のバイトを配布せず、代わりに承認された要求者に対して操作を実行し、操作の出力のみを送信します。 多くのキー管理システムは、キーがソフトウェアに平文で公開されることがないように、キーマテリアル用のハードウェア ストレージ (HSM など) によってバックアップされています。
分散環境では、単一のクラウド プロバイダであっても、暗号キーの管理、同期、ローテーションの問題は非常に困難であり、現在のソリューションはエラーが発生しやすく、非効率的で、安全でもありません。 たとえば、現在 3 つの AWS リージョンを使用しており、3 つのリージョンすべてで同じ暗号キーを使用したい場合は、キーを手動で同期してローテーションする必要があります。 環境が複数のクラウド プロバイダー (パブリックおよび/またはプライベート) にまたがる場合、問題はさらに悪化します。 これらすべてを実行した後でも、application所有者はこれらの KMS 機能を利用するために複雑なコードを記述する必要があります。
当社のプラットフォームは、Wingman サイドカーにすべての面倒なapplicationを実行させ、暗号化、復号化、HMAC、HMAC 検証、デジタル署名、署名検証、キーの取得 (許可されている場合) などのキー管理要求を行うためのシンプルなインターフェイスをapplicationに提供することで、キー管理の複雑さをすべてアプリケーションから隠します。 これにより、当社独自のインフラストラクチャ サービスだけでなく顧客のワークロードでも、キー管理がまったく難しくなくなります。
次の図 (図 5) は、Volterra の KMS が環境間でどのように機能し、ワークロードがキー管理と暗号化操作を Wingman サイドカーにオフロードするのに役立つかを示しています。 設定に応じて、Wingman はキーをキャッシュし、applicationが認識することなくキャッシュを更新できます。 ここでの実現要因は、先ほど紹介した普遍的で偽造不可能なアイデンティティです。 各ポッドは、その場所に関係なく、グローバルに一意の ID を取得するため、Volterra KMS システムは、暗号キーや、暗号化、復号化、HMAC、HMAC 検証、デジタル署名、署名検証などの特定の操作にアクセス ポリシーを非常に正確に適用することが容易になります。
すべてのキーは Volterra の SaaS バックエンドを介して管理されるため、異機種環境で実行されるワークロードはキーの同期、ローテーション、失効などを処理する必要はなく、保存データのセキュリティ ニーズすべてに対応するシンプルな Wingman API を知っておくだけで済みます。
多層プラットフォーム セキュリティを使用することで、まったく新しい方法で 3 つの重大な問題に対する包括的なソリューションを提供できるようになりました。 当社のシステムは、「タートルズ・オール・ザ・ウェイ・ダウン」の問題に悩まされることのないユニバーサル ID を安全にブートストラップし、金鉱問題を心配することなく保存および配布できる秘密を管理し、分散環境における保存データのセキュリティを容易にするキー管理を提供することができます。 これにより、社内チームと顧客に次のようなメリットがもたらされました。
このブログ シリーズでは、パブリック クラウド、プライベート ネットワーク PoP、エッジ サイトにある多数のapplicationクラスターを使用して、グローバルに分散された SaaS サービスを構築および運用するために必要なさまざまな側面について説明します。 次はapplicationとネットワークのセキュリティです…
私たちは、この機能をオープンソース プロジェクトとしてより広範なコミュニティに提供するために協力してくれるボランティアの開発者とソリューション アーキテクトを数名募集しています。何か楽しいことに参加することに興味がある場合は、 asingla@volterra.ioまで直接ご連絡ください。