Istio 实现 ext-authz 外部扩展鉴权以及对接基于 k8s 的微服务

news/2024/11/9 3:37:52/

Istio 实现 ext-authz 外部扩展鉴权以及对接基于 k8s 的微服务

可以实现基于 redistoken 鉴权以及实现 rbac 鉴权。

转载请注明来源:https://janrs.com/vrsr


Istio 的外部鉴权本质是基于 Envoy 实现的,直接看 Envoy 的代码,链接地址:点击自动跳转

Isio 官方的 Demo 代码,链接:点击自动跳转

实现

Istio 提供了基于 HTTP 方式以及 Grpc 方式的外部鉴权扩展,这里这实现了 Grpc

配置

修改 IstioConfigmap 配置。在 mesh 字段下面添加以下代码配置:

extensionProviders:- name: "rgrpc-dev-authz-grpc-provider"envoyExtAuthzGrpc:service: "auth.rgrpc-dev.svc.cluster.local"port: 50051

截图如下

创建 Istio 鉴权 Grpc 服务

本质上,Istio 的外部鉴权是基于 Evnoy 实现,只需要实现了 EnvoyGrpc 方法后 Istio 就会自动调用。

需要实现的 Envoyexternal_auth.pb.go文件 链接:点击自动跳转

只需要实现里面的 Check 方法即可。Envoy 官方提供了 v2 以及 v3 代码的实现,这里我只实现了 v3 的接口。

写好代码后将服务做成镜像部署到 k8s

案例代码如下:

package serverV1import ("encoding/json"authv3 "github.com/envoyproxy/go-control-plane/envoy/service/auth/v3"typev3 "github.com/envoyproxy/go-control-plane/envoy/type/v3""github.com/go-kit/log""github.com/go-kit/log/level""github.com/redis/go-redis/v9""google.golang.org/genproto/googleapis/rpc/status""google.golang.org/grpc/codes""authservice/config""golang.org/x/net/context"
)type Server struct {authv3.UnimplementedAuthorizationServerconf   *config.Configredis  *redis.Clientrepo   *Repositorylogger log.Logger
}func NewServer(conf *config.Config,redis *redis.Client,repo *Repository,logger log.Logger,
) authv3.AuthorizationServer {return &Server{conf:   conf,redis:  redis,repo:   repo,logger: logger,}
}var (UnauthorizedMsg = "没有权限"ForbiddenMsg    = "没有权限"
)// Response 返回 HTTP Body 数据
type Response struct {Code int64    `json:"code"`Msg  string   `json:"msg"`Data struct{} `json:"data"`
}// Check istio-grpc 外部鉴权方法
func (s *Server) Check(ctx context.Context, req *authv3.CheckRequest) (*authv3.CheckResponse, error) {// 以下是我的逻辑代码。可以全部删除然后自行修改attrs := req.GetAttributes()httpHeaders := attrs.GetRequest().GetHttp().GetHeaders()// 获取请求路径path, exists := httpHeaders[":path"]if !exists {_ = level.Info(s.logger).Log("msg", "获取不到 :path 字段")return s.Unauthorized(), nil}// 判断是否是白名单if s.repo.IsWhiteListApi(path) {return s.Allow(), nil}// 获取头部 tokentoken, exists := httpHeaders["authorization"]duration := 7 * 24 * 60 * 60if !exists {_ = level.Info(s.logger).Log("msg", "未传递头部 authorization 字段")return s.Unauthorized(), nil}// 去除头部 "Bearer "字符串if len(token) <= 7 {_ = level.Info(s.logger).Log("msg", "authorization 数据格式错误。没有设置 Bearer 前缀")return s.Unauthorized(), nil}// 截取后面的 token 字符串token = token[7:]// 验证 tokenif err := s.repo.GetAuthentication(ctx, token, int64(duration)); err != nil {_ = level.Info(s.logger).Log("msg", "access token 不存在")return s.Unauthorized(), nil}return s.Allow(), nil
}// Allow 通过鉴权。返回 200
func (s *Server) Allow() *authv3.CheckResponse {return &authv3.CheckResponse{Status: &status.Status{Code: int32(codes.OK)},HttpResponse: &authv3.CheckResponse_OkResponse{OkResponse: &authv3.OkHttpResponse{},},}
}// Unauthorized Unauthorized 未授权 401
func (s *Server) Unauthorized() *authv3.CheckResponse {resp := &Response{Code: int64(typev3.StatusCode_Unauthorized),Msg:  UnauthorizedMsg,Data: struct{}{},}respJson, err := json.Marshal(resp)httpBody := ""if err == nil {httpBody = string(respJson)}return &authv3.CheckResponse{Status: &status.Status{Code: int32(codes.Unauthenticated)},HttpResponse: &authv3.CheckResponse_DeniedResponse{DeniedResponse: &authv3.DeniedHttpResponse{Status: &typev3.HttpStatus{Code: typev3.StatusCode_Unauthorized},Body:   httpBody,},},}
}// Forbidden Forbidden 没有权限 403
func (s *Server) Forbidden() *authv3.CheckResponse {resp := &Response{Code: int64(typev3.StatusCode_Forbidden),Msg:  ForbiddenMsg,Data: struct{}{},}respJson, err := json.Marshal(resp)httpBody := ""if err == nil {httpBody = string(respJson)}return &authv3.CheckResponse{Status: &status.Status{Code: int32(codes.PermissionDenied)},HttpResponse: &authv3.CheckResponse_DeniedResponse{DeniedResponse: &authv3.DeniedHttpResponse{Status: &typev3.HttpStatus{Code: typev3.StatusCode_Forbidden},Body:   httpBody,},},}
}

创建 IstioAuthorizationPolicy

最后设置 IstioAuthorizationPolicy。设置后,所有经过 Istio 网关的请求都会自行被拦截,然后调用部署好的 Grpc 鉴权服务进行鉴权。

需要注意的是:provider 需要跟上面 IstioConfigmap 中的 extensionProviders.name 字段的值对应上才会调用到配置中的 Grpc 地址

使用的是 CUSTOM 配置,配置如下:

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:name: rgrpc-ext-authznamespace: rgrpc-dev
spec:action: CUSTOMprovider:name: rgrpc-dev-authz-grpc-providerrules:- to:- operation:hosts:- api.your-domain.com:31380

转载请注明来源:https://janrs.com/vrsr


http://www.ppmy.cn/news/142726.html

相关文章

让PHP更快的提供文件下载

一般来说, 我们可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件. 但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作. 于是, 很多时候, 我们采用让PHP来做转发, 为用户提供文件下载. <?php $file "/tmp/dummy.tar.gz"; …

机器学习常识 13: PCA

摘要: 主成分分析 (principal component analysis, PCA) 是一种有理论依据的无监督特征提取的线性方法. 1. 特征选择与特征提取 特征选择是指从已有的特征里面选择出一个子集. 例如: 身高、体重、性别、年龄、体温、血相等等, 如果要一个人是否患流感&#xff0c;身高、体重等…

AMEYA360:纳芯微推出车规级耐高压、三线霍尔开关及锁存器NSM101x系列

纳芯微推出全新三线制车规霍尔效应开关/锁存器NSM101x系列&#xff0c;为数字位置检测提供高精度的解决方案&#xff0c;可被广泛应用于汽车执行器等的位置检测。 NSM101x产品系列包含了3个产品型号&#xff0c;即NSM1011(单极霍尔开关)、NSM1012(全极霍尔开关)、NSM1013(霍尔锁…

01 【Vue简介 初识Vue 模板语法和数据绑定】

01 【Vue简介 初识Vue 模板语法和数据绑定】 1.Vue简介 1.1官网 英文官网中文官网 1.2介绍与描述 Vue 是一套用来动态构建用户界面的渐进式JavaScript框架 ○构建用户界面&#xff1a;把数据通过某种办法变成用户界面 ○渐进式&#xff1a;Vue可以自底向上逐层的应用&…

如何关闭windows杀毒软件

首先点击桌面左下角开始按键&#xff0c;点击“设置”图标; 找到并单击“更新和安全”选项; 在左侧列表中找到“windows安全中心”&#xff0c;右侧选中“病毒和威胁保护”选项; 4 最后在弹出窗口中下拉&#xff0c;找到“Windows Defender防病毒”选项&#xff0c;将开关…

疫情防护新时代-新型紫外线口罩消毒器

一次偶然的机会接触到一款非常新颖的电子产品-善电口罩消毒器&#xff0c;在这里分享给大家。善电口罩消毒器是专为防护疫情设计的黑科技产品&#xff0c;它采用的紫外线波长照射的方式口罩进行消毒。 外形方面&#xff0c;它采用的是流线型的设计风格&#xff0c;贴合人体的设…

紫外线消毒器:飞利浦紫外线杀菌灯TUV36W

飞利浦紫外线杀菌灯TUV36W辐射波长在200nm至300nm间的紫外线对微生物具有极强的杀伤力&#xff0c;飞利浦紫外线杀菌灯的辐射能量90%集中在253.7nm&#xff0c;它与杀菌效率曲线的峰值波长(265nm)非常接近&#xff0c;所以当253.7nm辐射达到一定值时&#xff0c;可对肠道病菌&a…

EPA消毒柜,空气净化器等等注册认证

一 、EPA的定义&#xff1a; EPA是美国环境保护署(U.SEnvironmentalProtectionAgency)的英文缩写。它的主要任务是保护人类健康和自然环境。 1976年&#xff0c;EPA发出了有关设备法规状态的&#xff08;联邦登记公告&#xff09;&#xff0c;EPA对FIFRA法案sec.2(9)(1)和sec…