TL

ワークロードアイデンティティとmTLSによる認証

サービス間にパスワードや長命キーを置かずに済む仕組みを原理から。SPIFFEのSVIDと短命X.509証明書、自動ローテーション、信頼ドメインでmTLS相互認証を成立させる流れが掴めます。

応用ワークロードアイデンティティmTLSSPIFFEX.509ゼロトラストサービスメッシュ最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.ワークロードアイデンティティは『どのサービスか』を暗号的に証明する仕組み。SPIFFEはspiffe://信頼ドメイン/パスという形式の名前(SPIFFE ID)を定め、それをSVID(X.509証明書かJWT)に焼き込んで運ぶ。共有シークレットや長命APIキーを配らずに済む。
  • 2.mTLSはTLSハンドシェイクで双方が証明書を提示し合い、相手の証明書がワークロード鍵で署名された正物か(チェーンが信頼ルートに届くか)と、SAN中のSPIFFE IDが期待どおりかを相互検証する。アプリのIDはネットワーク到達性ではなく証明書で決まる。
  • 3.SVIDは数分〜数時間で失効する短命証明書とし、エージェントが秘密鍵を生成・CSR署名・配布・再発行まで自動で回す。短命化が失効リスト(CRL/OCSP)の必要性を下げ、鍵漏洩の被害窓も縮める。

なぜサービス間認証にパスワードを使ってはいけないのか

マイクロサービスは互いを呼び合いますが、そのとき「呼んでいる相手は本当に注文サービスか、なりすましか」をどう確かめるかが問題になります。素朴な解は共有シークレットや長命の API キーを配ることですが、これは破綻します。鍵は環境変数や設定ファイルやイメージに焼かれて漏れ、漏れても長命ゆえに気づかず使われ続け、ローテーションは手作業で滞り、誰がどの鍵を持つかの管理も崩れます。さらに根本的な誤りとして、多くのシステムはネットワーク到達性をそのまま信頼してしまいます——「同じ VPC にいるから正当」という前提は、内部へ一歩侵入されれば横展開(lateral movement)を許す、ゼロトラストの真逆の発想です(/devops/microservices/)。

ワークロードアイデンティティはこの構図を反転させます。各サービスに暗号的に証明可能な「身元(identity)」を与え、通信のたびに双方がその身元を証明し合う。共有シークレットを配るのではなく、サービスごとに固有の鍵と、それを裏づける短命証明書を自動で発行・更新する。本記事は、SPIFFE が定める身元の表現、SVID と X.509、mTLS による相互認証の手順、そして短命証明書のローテーションと信頼ドメインの原理を解きほぐします。

SPIFFE:身元を表現する標準

身元を暗号で扱う前に、まず「身元とは何の名前か」を決めねばなりません。SPIFFE(Secure Production Identity Framework For Everyone)は、ワークロードの名前を SPIFFE ID という URI 形式で定めます。

spiffe://<trust-domain>/<workload-path>

例:
spiffe://example.org/ns/payments/sa/checkout
└─スキーム─┘ └信頼ドメイン┘ └─ワークロード固有のパス─┘

ポイントは二段構造です。<trust-domain>(信頼ドメイン)は、一つの信頼の根(ルート鍵)を共有する管理境界を表します。同じ信頼ドメインに属するワークロードは、共通のルートに署名された証明書を相互に検証できます。<workload-path> はその境界内で個々のワークロード(名前空間、サービスアカウント、サービス名などの組み合わせ)を一意に識別します。重要なのは、この ID がネットワーク的な位置(IP やポート)と独立している点です。Pod が再スケジュールされ IP が変わっても、ワークロードの身元は不変であり続けます。

SPIFFE IDはネットワークアドレスではない

SPIFFE ID の核心は「身元を、変わりやすいネットワーク座標から切り離す」ことです。IP やポートはオーケストレータの都合で頻繁に変わり、しかも詐称しやすい。SPIFFE ID は暗号鍵に紐づくため、IP がどう変わろうと、また攻撃者が同じネットワークセグメントに居ようと、対応する秘密鍵を持たない限りその身元を名乗れません。認可(誰が何にアクセスしてよいか)はこの安定した ID 名に対して書け、IP ホワイトリストの脆さから解放されます。

SVID:身元を運ぶ証明書

SPIFFE ID は名前にすぎません。それを暗号的に検証可能な形で持ち運ぶ器が **SVID(SPIFFE Verifiable Identity Document)**です。SVID には二系統あります。

観点X.509-SVIDJWT-SVID
実体X.509証明書署名付きJWT
SPIFFE IDの格納先SAN(URI型の Subject Alternative Name)subクレーム
主な用途mTLSでの相互認証(トランスポート層)アプリ層・L7プロキシ越え・短命トークン
相互認証双方向(クライアントもサーバーも証明書を出す)片方向(保持者が提示、検証は公開鍵で)
盗難耐性高い(秘密鍵がTLSで実証され持出しにくい)やや低い(bearerトークンとして転送可能)

mTLS の主役は X.509-SVID です。通常のサーバー証明書が DNS 名を CN/SAN に載せるのに対し、X.509-SVID は SAN の URI 型フィールドに SPIFFE ID を一つだけ載せます。検証側は証明書チェーンを信頼ルートまで辿って正物だと確かめたうえで、SAN の URI を読み取り「相手は spiffe://example.org/ns/payments/sa/checkout だ」と確定できます。つまり証明書は「公開鍵」と「その鍵を持つ者の SPIFFE ID」を、信頼ルートの署名で不可分に束ねた構造物です。秘密鍵を持つ者だけがその身元を名乗れる——これが暗号的身元の核です。

JWT-SVID は、TLS を張れない経路(L7 ロードバランサや API ゲートウェイをまたぐ場合など)でアプリ層トークンとして使われますが、bearer トークンである以上、転送途中で盗まれれば誰でも提示できます。だから JWT-SVID は短命(数分〜十数分)にし、用途も限定するのが原則です。

mTLS:双方向の相互認証

通常の TLS(片方向)は、サーバーだけが証明書を出し、クライアントは「相手が正しいサーバーか」を確かめます。**mTLS(mutual TLS)**は加えて、サーバーがクライアントに証明書を要求し、クライアントも自分の身元を証明します。サービス間通信ではどちらも「呼ぶ側」「呼ばれる側」になりうるため、双方向の証明が要るのです。ハンドシェイクで両者が確かめることは次の通りです。

mTLSハンドシェイクで双方が検証する3点:

(1) 証明書チェーンが信頼ルート(trust bundle)に到達するか
    → 相手の証明書が、自分の信頼ドメインのルートで
      署名された正物だと確認

(2) 相手が対応する秘密鍵を本当に持っているか
    → TLSの鍵交換/署名で、秘密鍵の所有を暗号的に実証
      (証明書のコピーだけでは成立しない)

(3) SAN中のSPIFFE IDが期待した相手か
    → チェーンが有効でも「誰か」は別問題。
      認可ポリシーは(3)のID名に対して評価する

ここで (1)(2) と (3) を分けて理解することが決定的です。(1)(2) は「この証明書は本物で、相手は対応鍵の正当な保持者だ」を保証しますが、それは「相手が信頼ドメインの一員だ」までしか言っていません。同じ信頼ドメイン内の別サービスもまた有効な証明書を持つからです。「呼んでよい相手か」を決めるのは (3) の SPIFFE ID に対する認可です。たとえば「checkout からの呼び出しだけ受ける」というポリシーは、ハンドシェイクで得た相手の SPIFFE ID と照合して初めて効きます。認証(誰か)と認可(何を許すか)を混同しないことが、mTLS 設計の肝です。

チェーンが有効=信頼してよい、ではない

よくある事故は「証明書チェーンが検証を通ったから、その接続を全面的に信頼する」という早とちりです。チェーン検証が保証するのは『相手は同じ信頼ドメインの正規ワークロードのいずれか』までで、『呼んでよい特定の相手』ではありません。信頼ドメイン内の侵害された一サービスも有効な SVID を持つため、SPIFFE ID 単位の最小権限ポリシー(このサービスはこの相手だけ呼べる)を必ず重ねます。mTLS は土台であって、認可の代わりにはなりません。

短命証明書とローテーション

ワークロードアイデンティティが長命 API キーより優れる最大の理由は、証明書を短命(数分〜数時間)にできることです。なぜ短命が効くのかは、失効の仕組みから理解できます。

伝統的な PKI では、漏れた証明書を無効化するために CRL(証明書失効リスト)や OCSP で「この証明書はもう無効」と全検証側へ伝えます。しかしこの失効伝播は遅く、可用性の弱点にもなります(OCSP レスポンダが落ちると検証が止まる)。短命証明書はこの問題を有効期限そのもので解く——証明書が数分で自然失効するなら、漏洩しても攻撃者が使える窓は数分しかなく、わざわざ失効リストへ載せて全世界へ周知する必要が薄れます。鍵漏洩の被害窓 = 証明書の残存寿命、という関係です。

これを人手でやるのは不可能なので、エージェントが全工程を自動化します。SPIFFE の実装(SPIRE など)では、各ノードのエージェントが次を回します。

ローテーションのループ(ワークロードは関与しない):

1. エージェントが秘密鍵を生成(鍵はワークロードのローカルに留め、配らない)
2. CSR(証明書署名要求)を発行サーバー(CA)へ送る
3. CAがワークロードの正当性を確認しSVIDに署名して返す
4. エージェントがSVIDをワークロードへ供給(API/ファイル/メモリ)
5. 残存寿命が一定割合(例: 半分)を切ったら1へ戻り更新
   =古い証明書が失効する前に新しい証明書へ無停止で差し替え

設計の妙は、ワークロードのプロセスは鍵やローテーションを一切意識しない点です。秘密鍵はワークロードのローカルで生成・保持され、ネットワークを流れません(CSR で外へ出るのは公開鍵だけ)。更新は寿命が尽きる前に前倒しで行い、新旧証明書の有効期間を重ねることで、切り替えの瞬間も通信が途切れません。サービスメッシュではこの SVID をサイドカープロキシが受け取り、アプリのコードを変えずに mTLS を透過的にかけます(/devops/service-mesh//devops/service-mesh-sidecar-internals/)。

最初の身元はどう与えるか——アテステーションの鎖

鋭い疑問は「証明書を発行してもらう前の、まだ何の身元も持たないワークロードを、CA はどう信用するのか」です。これをノードアテステーション/ワークロードアテステーションと呼びます。ノードはクラウドの署名付きインスタンス文書(AWS/GCP のメタデータ署名や TPM)で素性を証明し、ワークロードはカーネルが報告する起動者情報(Kubernetes の Pod 情報、Unix の UID/プロセス情報、コンテナのセレクタ)で「確かにそのワークロードだ」と証明します。この最初の信頼の起点(root of trust)が脆いと全体が崩れるため、推測や偽装が可能な属性(環境変数や自己申告のラベルだけ)を素性の根拠にしてはいけません。アテステーションの強さが、発行される全 SVID の信頼の上限を決めます。

信頼ドメインとフェデレーション

信頼ドメインは「一つのルート鍵(trust bundle)を共有する境界」でした。同一信頼ドメイン内なら、各ワークロードは共通ルートで相手の SVID を検証できます。では別組織・別ドメインのサービスと mTLS したいときはどうするか。素朴に互いのルートを全面信頼すると、相手ドメインの全ワークロードを信用することになり境界が崩れます。

解は フェデレーションです。ドメイン A は、ドメイン B の trust bundle(公開鍵の束)だけを取り込み、「spiffe://b.example/... の相手は B のルートで検証する」と限定して受け入れます。秘密鍵は決して共有せず、検証に要る公開のルート情報だけを交換する。これにより、各ドメインは自分のルートを単独で管理(ローテーション・失効)しつつ、相手ドメインの特定の SPIFFE ID に対してだけ認可を開けます。境界を保ったまま相互運用するのがフェデレーションの要点で、ここでも認可は IP ではなく SPIFFE ID 名に対して書きます。

試験・面接で問われる勘所

SPIFFE ID(spiffe://信頼ドメイン/パス の名前)と SVID(その ID を運ぶ X.509 証明書か JWT)を区別できること。mTLS が双方向で証明書を出し合う点、そして『チェーン検証=信頼ドメインの一員』までしか保証せず、『呼んでよい相手か』は SAN 中の SPIFFE ID に対する認可で別途決める、という認証と認可の分離が頻出。短命証明書が CRL/OCSP の必要性を下げる理由(被害窓=残存寿命)と、最初の身元を与えるアテステーション(ノード/ワークロード)が信頼の起点である点を説明できること。

まとめ

  • ワークロードアイデンティティは、サービスに暗号的に証明可能な身元を与える仕組み。共有シークレットや長命 API キーを配らず、ネットワーク到達性を信頼しない(ゼロトラスト)。
  • SPIFFE IDspiffe://信頼ドメイン/パス)は IP と独立した安定した名前で、SVID(X.509 か JWT)がそれを暗号的に運ぶ。mTLS では X.509-SVID の SAN に SPIFFE ID を載せる。
  • mTLS は双方向で証明書を提示し合い、(1) チェーンが信頼ルートに届くか、(2) 秘密鍵の所有、(3) SPIFFE ID が期待した相手か、を検証する。(1)(2) は「正規の一員」まで、認可は (3) の ID 名に対して書く。
  • 短命証明書はエージェントが鍵生成・CSR・署名・配布・更新を自動で回し、失効リストへの依存を下げ被害窓を縮める。最初の身元はアテステーション(ノード/ワークロード)で与え、その強さが全体の信頼の上限を決める。
  • 信頼ドメインは共通ルートの境界で、別ドメインとは秘密鍵を共有せず trust bundle だけ交換するフェデレーションで、境界を保ったまま特定の SPIFFE ID に認可を開く。

DevOps/インフラ Article

ワークロードアイデンティティとmTLSによる認証を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

ワークロードアイデンティティ

比較で見る軸

難易度: advanced / カテゴリ: DevOps/インフラ / タグ数: 6

導入後に効く点

mTLSはTLSハンドシェイクで双方が証明書を提示し合い、相手の証明書がワークロード鍵で署名された正物か(チェーンが信頼ルートに届くか)と、SAN中のSPIFFE IDが期待どおりかを相互検証する。アプリのIDはネットワーク到達性ではなく証明書で決まる。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
DevOps/インフラ
タグ数
6

判断チェックリスト

  • 自社の用途が「ワークロードアイデンティティ / mTLS」に近いか確認する。
  • 強みである「ワークロードアイデンティティは『どのサービスか』を暗号的に証明する仕組み。SPIFFEはspiffe://信頼ドメイン/パスという形式の名前(SPIFFE ID)を定め、それをSVID(X.509証明書かJWT)に焼き込んで運ぶ。共有シークレットや長命APIキーを配らずに済む。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

ワークロードアイデンティティmTLSSPIFFEX.509ゼロトラストワークロードアイデンティティmTLSSPIFFE