S2S认证
S2S身份验证证明了该请求的确切服务/操作程序,并赋予其最低限度的有限时间权限。与用户线程不同,这里没有人-因此凭据寿命短,密码绑定到workload/canal以及清晰的可观察性至关重要。
1)目标和原则
零信托(Zero Trust)默认值:不信任网络,仅信任网络认证和密码。
短寿命的credenschlas:分钟,不是天/月。
绑定到上下文:tenant/region/licence/audience/scopes。
集中发行,分散验证:STS/IdP+本地验证。
最小权限和显式委派:只有必要的漏洞和审核。
"无痛"轮换:双键/双证书窗口和自动化。
2)威胁模型(最低)
窃取持久秘密(API-keys, long-lived RT)。
在VPC/群集中替换服务。
分段断裂时的区域间攻击。
将Replay/流量替换为代理。
供应链/替代容器映像。
配置错误(firewall/mesh广义规则,全部JWKS通用)。
3)基本模式S2S
3.1 mTLS(共同证书)
你是谁:通过渠道证明。
来自内部PKI的证书寿命短(每小时);发布/轮换由mesh/sidecar或SPIRE代理控制。
对一个信任域中的"邻居"和令牌绑定有好处。
3.2服务JWT (STS)
你们是谁。
短访问JWT(2-5分钟)带有"aud","scp","tenant","region"。
通过"kid"和"轮换"通过JWKS签名KMS/HSM,公共密钥。
本地验证(没有IdP网络调用)。
3.3 SPIFFE/SPIRE (SVID)
Worcloads的通用身份:'spiffe ://trust-domain/ns/< ns >/sa/< sa>'。
自动分解/旋转X.509/JWT-SVID,与Istio/Linkerd集成。
3.4 OAuth 2.1 Client Credentials / Token Exchange (RFC 8693)
机器客户从STS获得令牌;要代表OBO (token exchange)操作。
组合:用于通道的mTLS,用于消息的JWT,用于持久身份的SPIFFE。
4)参考体系结构
[KMS/HSM] [Policy Store / PDP]
[STS/IdP (issuer)] ── JWKS ──[Gateway/PEP] ─────[Services/PEP]
│
SVID/JWT │ │ │ │
(SPIRE/Istio)│ mTLS/DPoP │ mTLS/DPoP
│ │ │ │
[Workload/Sidecar]─────────┴───────┴────────────┘
Issuer(STS/IdP):发布短服务JWT/CVID,由JWKS发布。
网关(PEP):网络术语,验证mTLS/JWT,丰富上下文,请求PDP。
服务(PEP):重新验证(depth defense), PDP解决方桉缓存。
SPIRE/mesh: mTLS的自动证书和SVID。
5)服务JWT格式(示例)
json
{
"iss": "https://sts. core",
"sub": "svc. catalog, "//service identity
"aud": ["svc. search"] ,//target service/domain
"exp": 1730390100, "iat": 1730389800,
"tenant": "brand_eu",
"region": "EE",
"scp": ["catalog:read:public","catalog:read:tenant"],
"mtls": { "bound": true, "spiffe": "spiffe://core/ns/prod/sa/catalog" }
}
签名ES256/EdDSA,"kid"指定活动密钥。
可选地binding到通道:标志、hash cert、SVID。
6)引渡政策(STS)和验证
引渡:- 主语取自SVID/客户端证书/客户端寄存器。
- 2-5分钟的寿命,没有refresh-而是重新要求STS。
- Scoopes/受众来自 Policy Store(GitOps)而不是客户请求。
1.检查mTLS(可选)和链的有效性。
2.检查JWKS上的JWT签名(通过"kid")。
3.核对"exp/nbf/iss/aud", tenant/region/licence。
4.丰富上下文并询问PDP (RBAC/ABAC/ReBAC)。
5.缓存PDP解决方案(TTL 30-120 c),事件障碍。
7)多重特南特和地区(信任领域)
共享信任域: 'spiffe: //eu。core`, `spiffe://latam.core`.
按地区划分的JWKS/PKI;区域间-仅通过可信赖的网关。
包含在"tenant/region/licence"标签中,并检查资源合规性。
Logi/Audit按性别和地区划分。
8)Mesh/sidecar和无混合模式
Istio/Linkerd: mTLS开箱即用,在L4/L7级别实施策略,与SPIRE集成。
没有mesh:应用程序中的客户端库+mutual TLS;更难管理轮换-通过代理实现自动化。
9)钥匙,JWKS和轮换
仅在KMS/HSM中使用私人密钥;签名-远程呼叫/设备。
每N天旋转一次;双键:旧的+新被接受,issuer在加热腰果后签署新的。
监视:"kid"消费比例,"挂起"客户在旧钥匙。
yaml issuer:
jwks:
alg: ES256 rotation_days: 30 publish_cache_ttl: 60s sts:
access_ttl: 5m audience_policies:
- subject: "svc. catalog"
allow: ["svc. search","svc. wallet"]
scopes: ["catalog:read:"]
tenancy:
claims: ["tenant","region","licence"]
jwks_per_region: true
10)链接绑定(DPoP/mTLS-bound)
mTLS-bound tokens:在JWT中添加客户端证书的hash;在接待处进行钻探。
DPoP:对于没有mTLS的HTTP客户端-签名每个DPoP密钥请求,在AT中放置DPoP图标。
11)错误和退货政策
标准化代码:- `401 INVALID_TOKEN`/`EXPIRED_TOKEN`/`AUD_MISMATCH`.
- `401 MTLS_REQUIRED`/`MTLS_CERT_INVALID`.
- `403 INSUFFICIENT_SCOPE`/`POLICY_DENY`.
- `429 RATE_LIMITED`.
响应包含可读机器的"error_code"和"as_of"(密钥/策略版本)。
12)可观察性和审计
度量标准:- `s2s_auth_p95_ms`, `verify_jwt_p95_ms`, `jwks_skew_ms`,
- `invalid_token_rate`, `aud_mismatch_rate`, `insufficient_scope_rate`,
- 以"kid"为单位的消费,占请求的mTLS排序比例。
- `subject`, `aud`, `tenant`, `region`, `scp`, `kid`, `sid/svid`, `decision`, `policy_version`, `trace_id`.
- 签发令牌,轮换密钥,更改策略,拒绝请求。
13)生产力
JWT验证是本地的,JWKS缓存(TTL 30-60 s)具有后台更新。
X.509链是定位CA和OCSP/CRL缓存。
在gateway/sidecar上提供昂贵的验证I/O。
使用prefetch令牌/证书(10-20从到期前)。
14)测试
合同/interop:不同的YAP/库,clock skew ± 300 s。
Negative:过期/假令牌,不正确的"aud",错误的区域/tenant,破碎的证书链。
混乱:突然旋转"kid",JWKS不可用,大量外卖,mTLS悬崖。
下载:STS的发行高峰,网关上的验证激增。
E2E:mTLS only,JWT only,组合模式,令牌交换(OBO)。
15)花花公子(runbooks)
1.签名密钥的损害
立即恢复"kid",发布新的,缩短的TTL令牌,审计,搜索"挂起"的客户,强制拒绝旧的"kid"。
2.大众"INVALID_TOKEN"
检查JWKS-KESH, RASHINHRON,令牌起源(TTL太短),暂时扩大skew公差,加热JWKS。
3.mTLS故障
检查CA链,SVID时机,主机时间;通过SPIRE/Istio的紧急重新发布,仅在区域内启用后退路由。
4.成长'AUD_MISMATCH'
视听策略漂移:将STS策略与实际呼叫进行比较,临时添加所需的"aud"并安排调用体系结构的调整。
5.STS不可用/放慢速度
增加已经签发的令牌(grace)的TTL,包括以前的prefetch/refresh, scale-out STS。
16)典型错误
env/代码中长寿命的 API密钥/秘密。
通用JWKS/PKI"适用于所有地区和所有时间"。
缺少binding (mTLS/DPoP) →令牌很容易被带走。
缺省情况下为"aud="和"admin" scopes。
无双键周期轮换→质量401。
仅在gateway上检查令牌(在深处没有防御)。
"沉默"拒绝(不是"error_code"和"reason")-难以借鉴和训练团队。
17)迷你配置模板
PEP(网关)-规则:yaml auth:
require_mtls: true jwks:
url: https://sts. core/.well-known/jwks. json cache_ttl: 60s claims:
required: ["iss","sub","aud","exp","tenant","region"]
tenant_in_header: "x-tenant"
pdp:
endpoint: "opa:8181/v1/data/policy/allow"
decision_cache_ttl: 60s
STS策略(片段):
yaml subjects:
- id: "svc. catalog"
spiffe: "spiffe://core/ns/prod/sa/catalog"
audiences: ["svc. search","svc. wallet"]
scopes: ["catalog:read:"]
ttl: "5m"
18)售前支票清单
- 短服务JWT(≤5分钟),本地验证,JWKS缓存。
- mTLS(或DPoP)已启用;优先是mTLS-bound tokens。
- SPIFFE/SPIRE或等效于自动签发/轮换证书。
- 具有audience/scope策略的STS;仅以可信身份进行发行。
- 按地区划分信任领域和JWKS;tenant/region/licence标记已验证。
- PDP/PEP集成,解决方桉缓存+事件障碍。
- 双键窗口,监视"kid"消费,Alerta on invalid/aud mismatch。
- 完整的S2S记录/审核,包括性能/错误指标。
- 花花公子对钥匙的损害,STS的下降,mTLS的失败。
- contract/negative/chaos/load/E2E测试集已通过。
结论
S2S身份验证是信道信任(mTLS),消息信任(JWT短)和持续的workload身份(SPIFFE)的组合,由集中式STS管理并在本地验证。添加信任域分离、严格的听力/范围、自动旋转和可观察性-并获得一个可靠、可解释和扩展的轮廓以及平台及其地理位置。