Skip to content

api security policy authentication

chengyouling edited this page Jan 18, 2024 · 11 revisions

服务端API安全策略鉴权

微服务应用中服务越来越多,调用关系越来越复杂,有些特殊的微服务为了保证安全调用或者特殊情况下仅保证某些API可调用,因此需要针对特定的API接口作鉴权调用,下面介绍如何使用API安全策略鉴权确保服务安全调用。

身份认证

首先确认token校验是否开启,配置信息如下,默认值是true开启token校验:

spring:
  cloud:
    servicecomb:
      webmvc:
        publicKey:
          tokenCheckEnabled: true

认证场景:

1、开启token校验时,通过header或者上下文获取token信息,校验并解析获取服务id、实例id及公钥进行当前客户端身份校验;

2、关闭token校验时,header里面有serviceName信息时,以serviceName作为身份信息通过身份认证;

3、关闭token校验时,header里面无serviceName信息时,校验并解析获取服务id、实例id及公钥进行当前客户端身份校验。

4、如果是校验CSE应用网关的token且注册中心为Nacos(Servicecomb注册中心暂时不支持)时,则需要开启跨Group调用,配置如下:

spring:
  cloud:
    servicecomb:
      cross-group:
        enabled: true
        service-group-mappings:
          cse-app-gateway: CSE_GATEWAY

客户端、服务端开启认证配置

  • 服务端开启校验配置开关
spring:
  cloud:
    servicecomb:
      webmvc:
        publicKey:
          securityPolicyEnabled: true

该配置开启后,会对上游客户端进行身份校验,需要在服务启动时加载。

  • 客户端、微服务网关构建身份信息配置开关
spring:
  cloud:
    servicecomb:
      webmvc:
        publicKey:
          consumerEnabled: true

该配置开启后,请求服务端时,会将本服务的服务id、实例id构建生成token,放入请求上下文中,标识当前客户端身份信息,需要在服务启动时加载。

注意:在serviceA-》serviceB-》serviceC调用链上,serviceB既作为serviceA的服务端,又作为serviceC的客户端,如果serviceB只开启校验配置,那么serviceC只能获取到serviceA的身份信息,所以当serviceC需要校验serviceB的身份信息时,serviceB还要同时开启构建身份信息配置,即serviceB需要配置如下配置信息:

spring:
  cloud:
    servicecomb:
      webmvc:
        publicKey:
          securityPolicyEnabled: true
          consumerEnabled: true

服务端设置鉴权规则

  • 设置API鉴权规则
spring:
  cloud:
    servicecomb:
      webmvc:
        publicKey:
          acls:
            app: canary                       # 应用名称
            mode: permissive                  # 模式,permissive:宽容模式;enforcing:强制模式
            provider: account                 # 服务端名称
            action:
              allow:                          # 白名单策略
                - id: 1                       # 策略编号
                  method: GET                 # 方法名称
                  consumer: allowService      # 客户端名称
                  uri: /checkTokenSecurity    # 调用接口uri
              deny:                           # 黑名单策略
                - id: 1
                  method: GET
                  consumer: denyService
                  uri: /checkTokenProvider

策略分为宽容模式(permissive)和强制模式(enforcing),宽容模式下未匹配白名单信息或者匹配黑名单信息时,打印告警信息[autoauthz unauthorized request]...,强制模式下请求拒绝。

上述策略为宽容模式策略,主要逻辑: 1、如果请求方法为GET、客户端名称为allowService及接口名称为/checkTokenSecurity,符合白名单规则,再判断黑名单策略,如果方法、客户端名称、接口也能匹配,则打印告警信息,请求通过; 2、如果请求方法、客户端名称、接口名称有一个不匹配白名单策略,打印告警信息,请求通过;

如果策略为强制模式策略,逻辑如下: 1、如果请求方法为GET、客户端名称为allowService及接口名称为/checkTokenSecurity,符合白名单规则,再判断黑名单策略,如果方法、客户端名称、接口也能匹配,请求不通过; 2、如果请求方法、客户端名称、接口名称有一个不匹配白名单策略,请求不通过。

uri支持前缀(xxx/)、后缀(/xxx)、精确三种匹配规则。

API白名单设置

微服务中某些接口是仅内部调用或者服务健康检测使用,比如容器部署时探活健康检测接口、服务状态接口等,这些接口作为服务健康检测时需要开放白名单,不作身份验证、安全策略校验等校验。

配置信息:

spring:
  cloud:
    servicecomb:
      webmvc:
        publicKey:
          apiPathWhitelist: '/api/white,/white/*,*/white'

多个API间使用“,”隔开,每个api支持前缀(xxx/)、后缀(/xxx)、精确三种匹配规则。

注意事项

  • 版本要求:1.11.4-2021.0.x/1.11.4-2022.0.x及以上版本。

  • 设置的黑名单、白名单规则是同时生效的。

  • 集成Spring Cloud Huawei以后,默认集成了黑白名单校验模块 spring-cloud-starter-huawei-governance,只需要通过配置开启具体的黑白名单校验规则。

Clone this wiki locally