认证鉴权
3 分钟阅读
简要概述
认证、鉴权。
配置示例
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” 鉴权功能,则一个请求必须同时满足以上才可被允许访问。