SPIFFE 仕様全部読んでく - JWT-SVID

SPIFFE に個人的に興味を持ち始めたので、https://github.com/spiffe/spiffe/blob/main/standards/ にある仕様を全部読んで簡単にまとめてく。今回は、JWT-SVID についてです。 尚、学習中であるため解釈が間違っている可能性は存分にあります。

ざっくりまとめ

原文: JWT-SVID

Schema は、ここを見るとよい: https://github.com/spiffe/spiffe/blob/main/standards/JWT-SVID.schema

Introduction

JOSE Header

以下に記載のないヘッダーはいかなる場合も JWT-SVID JOSE Header に含めてはいけない。

  • MUST
    • alg(Algorithm)
      • 以下、参照
  • OPTIONAL
    • kid(Key ID)
    • typ(Type)
      • JWT or JOSE

alg でサポートされているアルゴリズムは以下の通り

alg Param Value Digital Signature Algorithm
RS256 RSASSA-PKCS1-v1_5 using SHA-256
RS384 RSASSA-PKCS1-v1_5 using SHA-384
RS512 RSASSA-PKCS1-v1_5 using SHA-512
ES256 ECDSA using P-256 and SHA-256
ES384 ECDSA using P-384 and SHA-384
ES512 ECDSA using P-521 and SHA-512
PS256 RSASSA-PSS using SHA-256 and MGF1 with SHA-256
PS384 RSASSA-PSS using SHA-384 and MGF1 with SHA-384
PS512 RSASSA-PSS using SHA-512 and MGF1 with SHA-512

JWT Claims

  • RFC 7519 で定義された claim にいくつか制限を加えている(新しい claim は追加されていない)

    • 実装のために、新しい claim を追加しても良いが、相互運用性に影響を与える可能性には考慮する
  • MUST

    • sub(Subject)
    • aud(Audience)
    • exp(Expiration Time)

Token Signing and Validation

Token Transmission

  • Serialize は、JWS Compact Serialization を必ず使用すること
  • HTTP でトークンを送信する場合には、Bearer スキームを使用し、Authorization ヘッダーで送信するべき
  • gRPC でトークンを送信する場合には、メタデータキー authorizationBearer <serialized_token> を設定するべき

Representation in the SPIFFE Bundle

  • JWT-SVID の署名鍵は、JWK として表現される
  • MUST
    • use
      • jwt-svid
    • kid

Security Considerations

  • JWT-SVID を使用する際のセキュリティ上の考慮点
    • リプレイ攻撃からの保護
      • exp は短めに設定する
      • jti を使用する
    • 複数の aud を持つ場合
      • Bearer トークンという性質上、audience の範囲を必要以上に広げることは十分注意する必要がある
      • 原則は、単一 audience を持つ JWT-SVID を運用することが強く推奨されている
    • Transporting の際に発生するセキュリティリスク
      • 他の Bearer トークンと同様に傍受された際には、攻撃者に対して権限を与えてしまうことになる
        • 基本的には、JWT-SVID が伝送される全ての経路は機密性を提供するべき