认证鉴权
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” 鉴权功能,则一个请求必须同时满足以上才可被允许访问。