认证鉴权

简要概述

认证、鉴权。

配置示例

security:
  enable: true
  authentication:
    insecure_rpcs:
      - SearchHosts
    oidc_provider:
      issuer: https://accounts.example.com
      config:
        client_id: example
        supported_signing_algs:
          - RS256
        skip_client_id_check: true
        skip_expiry_check: false
        skip_issuer_check: true
        insecure_skip_verify: true
    http_users:
      - username: user1
        password: pass1
        groups:
          - sysadmin
  authorization:
    allowed_groups:
      - sysadmin

配置参数

Security

名称 类型 说明
enable bool 是否开启认证、鉴权
authentication Authentication 用户认证,也就是当前是谁在登录
authorization Authorization 用户鉴权,也就是当前登录用户是否有权限操作对应资源

Authentication

名称 类型 说明
insecure_rpcs []string 对应 gRPC 的方法,可以跳过认证
oidc_provider OIDCProvider OIDC 相关配置
http_users []BasicAuth 用户密码列表

OIDCProvider

名称 类型 说明
issuer string oidc 提供者
config OIDCConfig oidc 配置

OIDCConfig

名称 类型 说明
client_id string 用于验证 token.aud 是否与 client_id 相等
supported_signing_algs []string 服务端允许 token 的签名算法类型
skip_client_id_check bool 忽略 token.aud 与client_id 的验证
skip_expiry_check bool 忽略 token 是否过期的验证
skip_issuer_check bool 忽略 token issuer 的验证
insecure_skip_verify bool 忽略 issuer 的ca验证

BasicAuth

名称 类型 说明
username string 用户名
password string 用户 secret_key
groups []string 用户归属组

Authorization

名称 类型 说明
allowed_groups []string 所有请求至该服务端的用户必须至少属于一个组内
opa_native OPANative 内置鉴权功能
opa_external OPAExternal 获取外部 opa bundle 鉴权策略
opa_envoy_plugin OPAEnvoyPlugin 连接外部 opa-envoy-plugin 服务鉴权

OPANative

名称 类型 说明
enabled bool 是否开启该鉴权服务
policy Policy 本地策略文件 “auth.rego” 与 “data.yaml” 路径
  • Policy
名称 类型 说明
auth_file string 为空,则默认使用内嵌 “internal/security/auth.rego” 源代码
data_file string 为空,则默认使用内嵌 “internal/security/data.yaml” 源代码

OPAExternal

名称 类型 说明
enabled bool 是否开启该鉴权服务
config string 对应 open policy agent 配置文件内容

OPAEnvoyPlugin

名称 类型 说明
enabled bool 是否开启该鉴权服务
service Service 插件配置内容
  • Service
名称 类型 说明
grpc_address string 对应 opa-envoy-plugin 服务地址

使用场景

允许所有请求

security:
  enable: false

服务端允许所有接口请求,均以匿名用户,也就是关闭认证鉴权。

HTTP Basic 用户

security:
  enable: true
  authentication:
    http_users:
      - username: user1
        password: pass1
      - username: user2
        password: pass2

开启服务端接口验证,通过 HTTP Basic Auth 方式,允许用户 “user1:pass1” 或 “user2:pass2” 发起请求通过认证。

忽略特定 RPC 验证

security:
  enable: true
  authentication:
    insecure_rpcs:
      - Demo
      - HealthCheck
    http_users:
      - username: user1
        password: pass1

开启服务端接口认证,但是忽略 “Demo” 与 “HealthCheck” 两个 gRPC 方法的检查,这个还是被鉴权策略约束。

开启 Tokne 支持 HS256 签名

security:
  enable: true
  authentication:
    oidc_provider:
      issuer: https://accounts.example.com
      config:
        supported_signing_algs:
          - HS256
        skip_issuer_check: true
        insecure_skip_verify: true
    http_users:
      - username: user1
        password: pass1

支持客户端 Token 是以 HS256 签名算法,其中 “token.sub” 为 “user1” 并使用 “pass1” 为密钥做签名。

注意:这种签名的 token 不会传递给所配置的 oidc 服务提供验证,而是替换使用本地配置的 http basic 用户所对应的密码作为 token 的签名密钥

仅允许特定用户组访问

security:
  enable: true
  authentication:
    oidc_provider:
      issuer: https://accounts.example.com
      config:
        skip_issuer_check: true
        insecure_skip_verify: true
    http_users:
      - username: user1
        password: pass1
        groups:
          - sysadmin
      - username: user2
        password: pass2
        groups:
          - guest

  authorization:
    allowed_groups:
      - sysadmin

则该服务仅可被属于 “sysadmin” 用户组的用户访问,使用 “http basic” 既仅 “user1”。

如果使用 “oidc” 当前仅但 “jwt” 中包含 “groups” 属性且存在 “sysadmin” 用户组用户。

使用应用本地鉴权策略

# 认证鉴权配置
security:
  enable: true
  # 认证:谁在登录
  authentication:
    http_users:
      - username: user1
        password: pass1
        groups:
          - sysadmin

  # 鉴权:能做什么
  authorization:
    # 内置权限规则,通过本地配置文件管理
    opa_native:
      enabled: true
      #policy:
        # 未配置则为 internal/security/auth.rego 内嵌文件
        #auth_file: "./config/auth.rego"
        # 未配置则为 internal/security/data.yaml 内嵌文件
        #data_file: "./config/data.yaml"

如果未配置 “security.authorization.opa_native.policy.auth_file” 参数,则服务在编译时会使用源代码路径下 “internal/security/auth.rego” 内容,并在编译时嵌入至应用二进制内。如果配置则需保证文件存在,同时策略文件独立于应用程序。

同理,如果未配置 “security.authorization.opa_native.policy.data_file” 参数,则服务在编译时会使用源代码路径下 “internal/security/data.yaml” 内容,并在编译时嵌入至应用二进制内。如果配置则需保证文件存在,同时策略文件独立于应用程序。

使用外部鉴权策略文件

# 认证鉴权配置
security:
  enable: true
  # 认证:谁在登录
  authentication:
    http_users:
      - username: user1
        password: pass1
        groups:
          - sysadmin

  # 鉴权:能做什么
  authorization:
    # 权限规则由外部管理,如更改权限本地实时生效,无需重启服务
    opa_external:
      enabled: true
      # 配置内容见:https://www.openpolicyagent.org/docs/latest/configuration/
      config: |
        services:
          test:
            url: http://192.168.0.2:8080
        bundles:
          test:
            resource: /bundle.tar.gz
        decision_logs:
          console: false        

以上配置说明在服务启动时,会从 “http://192.168.0.2:8080/bundle.tar.gz” 下载权限规则并加载至应用内。

使用外部 opa-envoy-plugin 服务

# 认证鉴权配置
security:
  enable: true
  # 认证:谁在登录
  authentication:
    http_users:
      - username: user1
        password: pass1
        groups:
          - sysadmin

  # 鉴权:能做什么
  authorization:
    # 通过把数据提交至 opa-envoy-plugin 服务,由它进行判断功能
    opa_envoy_plugin:
      enabled: true
      service:
        grpc_address: 192.168.0.1:9191

这个同 envoy ext_authz 插件。

每次鉴权时,均需连接 “grpc_address” 地址做个判断,如果服务故障则会拒绝连接请求。

多个鉴权服务同时使用

security:
  enable: true
  authentication:
    oidc_provider:
      issuer: https://accounts.example.com
      config:
        skip_issuer_check: true
        insecure_skip_verify: true
    http_users:
      - username: user1
        password: pass1
        groups:
          - sysadmin
      - username: user2
        password: pass2
        groups:
          - guest

  authorization:
    allowed_groups:
      - sysadmin

    opa_native:
      enabled: true
      ......

    opa_external:
      enabled: true
      ......

    opa_envoy_plugin:
      enabled: true
      ......

如果同时启用了 “allowed_groups”、“opa_native”、“opa_external”、“opa_envoy_plugin” 鉴权功能,则一个请求必须同时满足以上才可被允许访问。