Spring Cloud Security:OAuth2 鉴权与零信任安全架构实践

发布于:2025-03-26 ⋅ 阅读:(32) ⋅ 点赞:(0)

引言

在微服务架构中,系统规模的扩展与业务复杂度的提升,使传统安全模型难以应对分布式环境下的认证与授权挑战。OAuth2 作为现代授权框架,结合零信任架构(Zero Trust Architecture),为微服务安全提供了标准化解决方案。

聚焦Spring Cloud Security,基于 OAuth2 与 JWT 规范,深入解析微服务安全的核心组件与实战策略,涵盖:细粒度权限控制、服务间认证续期、多因素认证(MFA)、全链路审计追踪,助力开发者构建安全可靠的分布式系统。

一、Spring Cloud Security 核心组件

1.1 OAuth2 授权机制

OAuth2(Open Authorization 2.0)是一种开放授权协议,它通过访问令牌(Access Token)和多种授权模式实现去中心化认证,其核心流程如下:

+---------+           +---------------+  
| Client  |--(A)---->| Authorization |  
|         |<--(B)----| Server        |  
|         |--(C)---->| Resource      |  
+---------+           +---------------+  

• 角色:客户端(Client)、授权服务器(Authorization Server)、资源服务器(Resource Server)

• 核心流程:

  • 用户授权:客户端获取临时授权码。

  • 换取令牌:客户端用临时授权码向授权服务器换取 Access Token。

  • 访问资源:资源服务器验证 Token 有效性后返回数据。

• 核心优势:

  • 用户密码不暴露:全程无需向客户端提供密码。

  • 权限可回收:Token可设置有效期和权限范围。

三方责任分离:授权服务器专注验证,资源服务器专注数据。

1.2 JWT 规范与安全增强

1.JWT 规范与核心要素

JWT(JSON Web Token)是基于RFC 7519的开放标准,通过数字签名实现跨域或跨服务声明的安全传输。其设计目标是成为无状态授权协议的核心载体。

(1) 核心结构
[Header].[Payload].[Signature]
在这里插入图片描述

(2) 核心特性

  • 无状态性

服务端无需存储会话信息,仅通过签名验证令牌合法性。

  • 自包含声明

Payload 可携带身份标识(sub)、权限范围(scope)等结构化数据。

  • 跨域传输

JWT 可通过HTTP Header、URL 参数等方式安全传递。

  • 声明(Claims)规范:
{
  // ===== 标准声明(RFC定义) =====
  "iss": "https://auth.yourdomain.com",  // 签发者(Issuer)
  "sub": "user@123",                     // 主体标识(Subject)
  "aud": ["api-service", "gateway"],     // 接收方(Audience)
  "exp": 1717024400,                     // 过期时间(Expiration)

  // ===== 业务声明(自定义建议) =====
  "authz": {
    "roles": ["order_manager"], 
    "scopes": ["order:read", "order:write"],
    "resources": {
      "/api/orders": ["GET", "POST"],
      "/api/users": ["GET"]
    }
  }
}

(3) 安全传输实践
HTTP Header 传输(推荐)

GET /api/orders HTTP/1.1
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...

Cookie 传输(需启用 Secure/HttpOnly)

Set-Cookie: token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...; Secure; HttpOnly; SameSite=Strict

(4) 关键安全原则

  • 签名 ≠ 加密

JWT 默认仅签名,敏感数据需通过JWE(JSON Web Encryption)加密。

  • 短有效期设计

Access Token≤ 15 分钟,建议搭配Refresh Token使用。

  • 密钥管理

• 私钥:存储在HSM/KMS

• 公钥:通过JWKS 端点分发

2. 安全增强实践

(1) 关键增强措施
签名算法强化

• 推荐:使用RSASSA-PSS(PS256/PS384/PS512)替代传统 RS256,防范哈希填充攻击。

• 禁用 none 算法:显式配置允许的算法列表,避免无签名伪造攻击

(2) 密钥全生命周期管理

graph LR
  A[密钥生成] -->|HSM| B[密钥存储]
  B --> C[密钥使用]
  C --> D[密钥轮换]
  D -->|旧密钥保留| E[密钥归档]
  E -->|过期时间| F[密钥销毁]

(3) 令牌安全策略
• 短期令牌:Access Token有效期 ≤15 分钟

• 刷新令牌隔离存储:使用加密数据库进行存储,与访问令牌分离

• 声明最小化原则:Payload 仅包含必要字段,避免暴露敏感数据

3.代码示例

Spring Security JWT 示例(RSA 非对称加密):

@Bean
public JwtEncoder jwtEncoder() {
    // 动态密钥配置(支持轮换)
    String keyId = UUID.randomUUID().toString(); 

    // 构建RSA密钥对(符合JWK标准)
    RSAKey rsaKey = new RSAKey.Builder(publicKey)  // 公钥用于验证方
        .privateKey(privateKey)                  // 私钥仅存于签发服务
        .keyID(keyId)                            // 唯一标识当前密钥版本
        .algorithm(JWSAlgorithm.RS512)           // 使用RS512抵抗碰撞攻击
        .build();

    // ===================== JWK源配置 ======================
    // 封装为JWKSet(支持多密钥共存场景)
    JWKSource<SecurityContext> jwkSource = 
        new ImmutableJWKSet<>(new JWKSet(rsaKey));

    // ==================== 编码器安全配置 ====================
    NimbusJwtEncoder jwtEncoder = new NimbusJwtEncoder(jwkSource);

    // 强制声明签名算法(防范算法替换攻击)
    jwtEncoder.setJwtClaimsSetConverter(claims -> {
        // 显式指定Header算法参数
        JwsHeader.Builder headers = JwsHeader.from(JWSAlgorithm.RS512); 
        return new JwtClaimsSet(claims, headers.build());
    });

    return jwtEncoder;
}

关键代码解析:

(1) 动态密钥 ID
String keyId = UUID.randomUUID().toString();
• 安全价值:避免使用固定 KeyID,降低密钥枚举风险。

• 运维优势:密钥轮换时新旧版本可共存,通过 KeyID 自动路由。

(2) 算法强制声明
JwsHeader.from(JWSAlgorithm.RS512);
• 防御场景:阻止攻击者篡改alg头为none或弱算法

• 行业实践:符合OWASP JWT 安全规范第 5 项

(3) NimbusJwtEncoder 配置
new NimbusJwtEncoder(jwkSource);
• 框架选择:Nimbus 库是 Java 生态中最符合 RFC 标准的实现。

• 扩展能力:JWKSource结构天然支持多租户密钥隔离。

安全增强措施对照表
在这里插入图片描述

标准JWT生成流程(含安全控制点)

在这里插入图片描述

1.3 零信任架构(Zero Trust Architecture)
核心原则:

  • 动态最小权限:基于上下文动态调整授权范围。

  • 持续验证机制:突破传统"一次认证,全程信任"模式。

  • 服务网格纵深防御:通过mTLS强化服务间通信安全。

实现方式:
• 基于身份的细粒度访问控制。

• 持续验证用户和设备的安全性。

三、微服务安全加固实战

3.1 细粒度权限控制体系

1. 分层授权模型设计

在微服务架构中,细粒度权限控制是确保系统安全的核心机制。通过分层授权模型,可以实现从资源级到数据域级的全面权限管理。以下是典型的分层授权模型:

┌───────────────────────┐
│ Resource Level │ # 资源级访问控制(URL/API端点)
├───────────────────────┤
│ Operation Level │ # 操作级权限(CRUD控制)
├───────────────────────┤
│ Data Scope Level │ # 数据域隔离(租户/组织隔离)
└───────────────────────┘
(1) 资源级访问控制(Resource Level)

功能:控制用户是否可以访问某个 API 端点或 URL。

实现方式:

• 基于 URL 的权限配置(如antMatchers(“/api/payments/**”).hasRole(“USER”))。

• 使用@PreAuthorize注解在方法级别控制访问。

适用场景:

• 限制用户访问特定 API 端点(如支付接口、用户管理接口)。

(2) 操作级权限控制(Operation Level)

功能:控制用户是否可以对资源执行特定操作(如创建、读取、更新、删除)。

实现方式:

• 在方法级别使用注解(如@PreAuthorize(“hasAuthority(‘PAYMENT_UPDATE’)”))。

• 结合基于角色的访问控制(RBAC)实现动态权限分配。

适用场景:

• 限制用户对资源的操作权限(如仅允许管理员删除数据)。

(3) 数据域隔离(Data Scope Level)

功能:控制用户只能访问特定范围的数据(如租户、组织、部门)。

实现方式:

• 在查询中动态添加数据过滤条件(如WHERE tenant_id = ?)。

• 使用自定义注解或服务方法验证数据权限。

适用场景:

• 多租户系统中的租户数据隔离。

• 组织架构中的部门数据隔离。

2. Spring Security 注解级控制

Spring Security 提供了强大的注解支持,结合SpEL(Spring Expression Language),可以实现灵活的细粒度权限控制。

示例代码

@PreAuthorize("hasAuthority('PAYMENT_READ') && " +
              "@dataScopeService.checkTenantAccess(authentication, 
#tenantId)")
@GetMapping("/payments/{tenantId}")
public Payment getPayment(@PathVariable String tenantId) {
    // 业务逻辑
}

代码解析

@PreAuthorize:

• 在方法执行前进行权限验证。

• 支持SpEL 表达式,可灵活组合多种权限规则。

hasAuthority(‘PAYMENT_READ’):

• 验证用户是否具有PAYMENT_READ权限。

@dataScopeService.checkTenantAccess:

• 调用自定义服务方法,验证用户是否有权访问指定租户的数据。

参数说明:

• authentication:当前用户的认证信息。

• #tenantId:方法参数,表示目标租户 ID。

组合条件:

• 通过&&运算符组合多个条件,确保用户同时满足权限和数据域访问要求。

3. 最佳实践

(1) 权限设计原则

最小权限原则:用户只能访问必要的资源和操作。

动态权限分配:通过角色和权限的组合,实现灵活的权限管理。

数据隔离:确保用户只能访问其所属租户或组织的数据。

(2) 性能优化

缓存权限数据:将用户权限缓存到Redis 或本地缓存,减少数据库查询。

批量验证:在批量操作中,提前验证用户权限,避免逐条检查。

(3) 日志与审计

记录权限变更:跟踪用户权限的分配和回收。

审计数据访问:记录用户对敏感数据的访问行为。

4. 扩展功能

(1) 自定义注解

可通过自定义注解简化权限控制逻辑:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize("@dataScopeService.checkTenantAccess(authentication, #tenantId)")
public @interface TenantAccessControl {
}

(2) 动态权限管理

结合数据库或配置中心,实现动态权限加载:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/api/**").access("@permissionService.hasPermission(authentication, request)")
        .anyRequest().authenticated();
    return http.build();
}

总结

通过分层授权模型和Spring Security 的注解级控制,可以实现从资源级到数据域级的细粒度权限管理。结合最佳实践和扩展功能,能够构建高效、灵活且安全的权限控制体系。

3.2 服务间认证自动续期机制

双令牌认证策略(Access Token + Refresh Token)通过访问令牌(Access Token)和刷新令牌(Refresh Token)的双令牌机制,解决令牌过期问题,实现服务间认证的自动续期,确保服务间通信的连续性和高效性。

1. 双令牌策略流程设计

关键组件

访问令牌(Access Token):短期有效(如 15 分钟),用于服务间通信,减少长期暴露的安全风险。

刷新令牌(Refresh Token):长期有效(如 24 小时),用于获取新的访问令牌。每次刷新令牌时,需强制重新验证服务身份(SPIFFE ID 绑定),确保身份可信度,防止滥用。

2. Spring Security 实现

配置 OAuth2AuthorizedClientProvider

在 Spring Security 中,通过OAuth2AuthorizedClientProvider配置密码模式和刷新令牌机制:

@Bean
public OAuth2AuthorizedClientProvider authorizedClientProvider() {
    return OAuth2AuthorizedClientProviderBuilder.builder()
            .password()          // 密码模式(支持刷新令牌)  <--- 【修改点:clientCredentials→password】
            .refreshToken()      // 启用刷新令牌机制       <--- 【新增】
            .build();
}

配置解析

•.password():服务间认证使用固定账号密码获取访问令牌和刷新令牌(需在认证服务预注册)。

•.refreshToken():允许通过刷新令牌自动续期访问令牌。

3. SPIFFE ID 绑定实现(安全增强)

自定义令牌请求增强器

通过SPIFFE ID 绑定进一步增强服务身份认证:

// 自定义令牌请求增强器(将 SPIFFE ID 附加到请求中)
public class SpiffeRequestEnhancer implements RequestEntityConverter<OAuth2PasswordGrantRequest> {
    @Override
    public RequestEntity<?> convert(OAuth2PasswordGrantRequest request) {
        // 从服务身份证书中提取 SPIFFE ID(示例)
        String spiffeId = loadSpiffeIdFromCertificate(); 

        // 在令牌请求中添加 spiffe_id 参数
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("grant_type", "password");
        params.add("username", request.getUsername());
        params.add("password", request.getPassword());
        params.add("spiffe_id", spiffeId);  // <--- 【新增 SPIFFE ID 绑定】

        return RequestEntity
            .post(URI.create(request.getClientRegistration().getProviderDetails().getTokenUri()))
            .body(params);
    }
}

4. 自动续期流程

首次认证:服务 A 使用客户端 ID 和密钥获取访问令牌和刷新令牌。

令牌过期:服务 A 发现访问令牌过期,使用刷新令牌向认证服务申请新访问令牌。

自动续期:认证服务验证刷新令牌的有效性,并检查SPIFFE ID 合法性,然后颁发新的访问令牌。

无缝切换:服务 A使用新访问令牌继续访问服务 B,无需人工干预。

5. 最佳实践

缓存刷新令牌:将刷新令牌存储在安全的缓存(如Redis),避免频繁调用认证服务。

令牌轮换:每次刷新访问令牌时,使旧刷新令牌失效(如更新 JWT 密钥或数据库标记状态)。

监控与告警:监控令牌续期失败的情况,并及时告警,确保认证机制的高可用性。

3.3 多因素认证集成方案

多因素认证(MFA)通过组合多种独立凭证提升敏感操作安全性,典型认证因素包括:

• 知识因素:密码/PIN码

• 持有因素:移动设备/硬件令牌

• 生物特征:指纹/面部识别等

1.MFA分层架构设计

为了不影响用户体验同时支持多种MFA方式,通常采用MFA分层架构设计。

通过分层架构,将MFA逻辑解耦,支持动态扩展不同的认证方式,使系统具备更高的可维护性和扩展性。架构组件及流程如下:

  +----------------+     +-----------------+
  |  User Request  |---->| Primary Auth    |
  +----------------+     +--------+--------+
                                   |
                      +------------v------------+
                      |  Risk Engine Evaluation|
                      +------------+-----------+
                                   |
                          +--------v--------+
                          | MFA Enforcement |
                          +--------+--------+
                                   |
                    +--------------v--------------+
                    |  Secondary Auth Providers   |
                    |  (SMS/OTP/Biometric/...)    |
                    +-----------------------------+

核心组件

(1) Primary Auth:主认证
• 功能:基础身份核验(如用户名密码/API Key)

• 输出:用户身份标识与初步信任凭证

(2) Risk Engine:风险评估引擎
• 决策逻辑:实时分析请求上下文(IP信誉、设备指纹、行为基线)

• 输出:动态判定是否触发MFA及认证强度要求

(3) MFA Enforcement:MFA 执行层
• 核心能力:

• 按风险等级调度认证方式(如高风险强制生物识别)

• 支持多协议提供者动态接入

• 自动熔断不可用服务

(4) Secondary Auth Providers:二次认证提供者
• 实现方式:标准化接口集成(如OTP、⽣物识别、硬件令牌)

• 扩展性:无需改造核心逻辑即可新增认证方式

2. Spring Security 实现

通过扩展认证过滤器链实现分层验证:

全局异常处理器:

@RestControllerAdvice
public class MfaExceptionHandler { 
    @ExceptionHandler(MfaRequiredException.class)
    public ResponseEntity<MfaChallenge> handleMfaRequired(MfaRequiredException ex) {
        return ResponseEntity.status(HttpStatus.PRECONDITION_FAILED) // 412
                .body(ex.getChallenge());
    }
}

自定义认证过滤器与提供者:
//1. 自定义认证过滤器


public class MfaAuthenticationFilter extends OncePerRequestFilter {
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) {
        if (requiresMfa(req)) {
            MfaChallenge challenge = mfaService.generateChallenge();
            sendChallengeToUser(challenge);  
            throw new MfaRequiredException(challenge); // 触发412响应 <--- 【依赖新增的异常处理器】
        }
        chain.doFilter(req, res);
    }
}

// 2. 认证提供者实现

public class MfaAuthenticationProvider implements AuthenticationProvider {
    public Authentication authenticate(Authentication auth) {
        MfaAuthenticationToken token = (MfaAuthenticationToken) auth;

        // 主认证
        if (!primaryAuthService.verify(token)) {
            auditService.logFailure(token);  
            throw new BadCredentialsException("认证失败");
        }

        // 动态风控
        RiskScore score = riskEngine.evaluate(token);
        if (score.requiresMfa()) {
            MfaResult result = mfaService.verifySecondaryAuth(token);
            if (!result.isValid()) {
                throw new MfaVerificationException(result.getCause());
            }
        }

        return buildFullAuthentication(token);
    }
}

流程解析

• 主认证:验证用户名和密码。

• 风险评估:根据用户行为、IP 地址等评估风险。

• MFA 触发:如果风险较高,发送验证码并要求用户输入。

• 认证完成:验证 MFA 代码后,返回完整的认证对象。

关键实现机制

• 异常驱动流程:通过MfaRequiredException中断过滤器链,返回412状态码和 MFA 元数据。

• 上下文传递:使用SecurityContextHolder跨层传递设备指纹/会话标识。

• 异步验证:对 TOTP 等时效敏感场景采用反应式校验模式。

3. 最佳实践

• 渐进式认证

graph LR
  A[低风险操作] -->|Cookie验证| B[直接放行]
  C[中风险操作] -->|OTP验证| D[短期会话]
  E[高风险操作] -->|生物识别| F[全权限访问]

• 熔断保护:当某MFA服务故障率 > 5% 时自动切换备用通道

• 密钥管理:采用HSM加密存储TOTP种子,定期轮换策略

• 上下文绑定:将MFA凭证与原始请求参数哈希绑定,防止中间人攻击

4. 扩展能力

(1) 认证协议扩展

通过AuthenticationProvider接口实现标准集成,例如 WebAuthn 集成:

@Bean
public WebAuthnAuthenticationProvider webAuthnProvider() {
    return new WebAuthnAuthenticationProvider(
        attestationVerifier, 
        new SimpleCredentialRepository()
    );
}

(2) 智能风控增强

在风险评估引擎中集成AI模型:

# 风险评分模型伪代码
def evaluate_risk(request):
    features = {
        'ip_reputation': query_threat_intel(request.ip),
        'behavior_velocity': calc_operation_frequency(request),
        'device_anomaly': detect_device_change(request)
    }
    return risk_model.predict(features)

(3) 零信任整合

与SPIFFE/SPIRE实现身份联动:

// 签发携带MFA声明的SVID
spireClient.IssueSVID(&workload.X509SVIDParams{
    Entries: []*common.Selector{
        {Type: "mfa", Value: "biometric_verified"},
    },
})

5. 性能优化

• 缓存策略:对风险评估结果设置 TTL 缓存(默认 30s)。

• 并行验证:同时发起多因素认证请求,取最先响应的结果。

• 降级方案:在 MFA 服务超时(>800ms)时,启用备用问题验证。

6. 监控指标
在这里插入图片描述

3.4 全链路安全审计体系

1. 审计事件分类

为了全面覆盖系统的安全状态,审计事件通常分为以下几类:
在这里插入图片描述

附:合规标准索引表

| 标准编号           | 核心要求摘要                      |
|--------------------|-----------------------------------|
| 等保2.0 8.1.4.3    | 用户身份鉴别行为需留存可追溯日志  |
| GDPR Article 30    | 数据处理操作必须记录完整操作轨迹  |
| ISO27001 A.12.4.1  | 系统访问行为需保留审计证据链      |

2. 分布式追踪架构

技术栈:Spring Cloud Sleuth(链路追踪) + Zipkin(可视化分析)

实现跨服务的全链路审计追踪,确保每个请求的完整调用链路可追溯。

架构设计
在这里插入图片描述

核心组件:

Trace ID:唯一标识一个请求的全局 ID,贯穿整个调用链路。

Span ID:标识调用链中的一个子操作(如服务 A 调用服务 B)。

Sleuth:自动生成 Trace ID 和 Span ID,并将它们注入日志中。

Zipkin:收集和展示分布式追踪数据,提供可视化界面。

3.分布式追踪示例

通过配置Sleuth 和 Zipkin,实现全链路审计追踪。

配置文件(application.yml)

spring:
  sleuth:
    sampler.probability: 1.0  # 采样率设置,全量采集追踪数据
  zipkin:
    base-url: http://zipkin:9411 # 数据上报地址 (Zipkin 服务器地址)

logging:
  pattern.level: "%5p [${spring.app.name},%X{traceId},%X{spanId}]"

关键配置项:

• 采样率配置:生产环境建议按需调整(默认 0.1)。

• 日志标记注入:在日志中注入Trace ID 和 Span ID,实现日志与调用链的精准关联。

4. 日志治理方案

存储架构:

服务节点 → Kafka(削峰解耦) → Elasticsearch(持久化存储)
Elasticsearch:用于存储海量日志数据,支持全文检索和复杂查询。

Kafka:作为日志收集的中间件,确保日志的可靠传输。

分析体系:

• 可视化分析:Kibana仪表盘(实时日志检索/统计)。

• 安全防护:基于规则的实时告警(如爆破攻击检测)。

• 防篡改机制:数字签名 + 区块链存证(关键日志)。

5. 最佳实践
在这里插入图片描述

6. 高阶扩展能力

• 实时监控:通过 Flink 实现毫秒级异常模式识别。

• 自动处置:联动 WAF/IP 黑名单实施攻击阻断(如封禁异常 IP)。

• 智能分析:集成 ML 模型检测隐蔽攻击链。

总结

通过 Sleuth + Zipkin 构建的追踪能力,结合 ELK 日志分析体系,形成覆盖采集-存储-分析-防护的全链路审计闭环。配合分级存储和自动化响应机制,在保障系统安全性的同时实现运维成本最优。

四、安全度量与持续改进

4.1 关键安全指标监控

为了确保系统的安全性,需要持续监控以下关键安全指标:
在这里插入图片描述

监控工具

• Prometheus + Grafana:用于实时监控和告警。

• ELK Stack:用于日志分析和异常检测。

4.2 安全态势可视化

通过安全仪表盘(Security Dashboard),实时展示系统的安全状态和趋势。

功能解析

• Real-time Auth Flow:实时展示认证请求的流量和状态(如成功、失败、延迟)。

• Risk Heatmap:可视化系统风险分布(如高风险API端点、异常IP地址)。

• Compliance Status:展示系统合规性状态(如GDPR、PCI DSS)。

• Threat Intelligence:集成威胁情报,实时检测和响应安全威胁。

• Audit Log Trends:分析审计日志趋势,识别异常行为(如频繁登录失败)。

• Vulnerability Scan:展示漏洞扫描结果和修复进度。

4.3 持续改进机制

• 自动化安全测试

集成 SAST/DAST 工具至 CI/CD 流水线,拦截漏洞代码。

• 威胁情报驱动

对接 MITRE ATT&CK 框架,动态更新检测规则。

• 红蓝对抗演练

定期模拟攻击链,验证安全防护体系有效性。

五、总结

5.1 重点核心

• OAuth2 双令牌机制:Access Token 与 Refresh Token 实现服务安全通信与自动续期。

• 分层权限控制:资源级 → 操作级 → 数据域级模型,@PreAuthorize注解实现方法级校验。

• 安全增强:动态 MFA 触发(短信/OTP/生物识别)、全链路审计追踪(Sleuth + Zipkin)、零信任架构(持续验证 + mTLS 加密)。

5.2 架构演进建议
• 协议升级:OAuth2.1 规范 + OpenID Connect 单点登录。

• 基础架构:SPIFFE 服务身份体系 + Vault 密钥管理 + OpenTelemetry 统一监控。

• 云原生安全:Istio 服务网格流量治理 + 容器镜像签名/运行时防护。