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

news2024/11/24 6:20:35

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 serverV1

import (
	"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.UnimplementedAuthorizationServer
	conf   *config.Config
	redis  *redis.Client
	repo   *Repository
	logger 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
	}
	// 获取头部 token
	token, exists := httpHeaders["authorization"]
	duration := 7 * 24 * 60 * 60
	if !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:]

	// 验证 token
	if 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-authz
  namespace: rgrpc-dev
spec:
  action: CUSTOM
  provider:
    name: rgrpc-dev-authz-grpc-provider
  rules:
    - to:
        - operation:
            hosts:
              - api.your-domain.com:31380

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/596854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Opencv 2

这里写目录标题 图像阈值平滑处理形态学 腐蚀操作膨胀操作开运算和闭运算梯度运算礼帽和黑帽图像梯度 sobel算子scharr算子canny边缘检测图像金字塔图像轮廓绘制轮廓轮廓特征轮廓近似边界矩形 模板匹配 图像阈值 平滑处理 均值滤波 blur cv2.blur(img,(3,3)) 相当于平均卷积…

基于Wi-Fi指纹匹配的室内定位方法(附代码)

引言 室内定位技术已广泛应用于商场导航、智能家居、人员搜救等领域&#xff0c;具有不可估量的商业价值和非常广阔的应用前景。全球导航卫星系统&#xff08;GNSS&#xff09;可以为室外定位提供良好的定位精度&#xff0c;然而在室内环境下卫星信号的衰减使得室内的位置信息…

day43|动态规划6-完全背包及其应用-零钱兑换II-组合总和IV

完全背包 前情提要&#xff1a; 0-1背包指的是给定背包重量&#xff0c;将物品放入背包中&#xff0c;使得背包中的物品达到最大的价值。&#xff08;每个物品只能往其中放一次&#xff09; 在0-1背包问题中&#xff0c;第二层for循环需要是倒序遍历才可以保证每个物品只使用一…

Pandas使用技巧

Pandas 是一个强大的数据分析 Python 库&#xff0c;提供了一系列用于数据清洗、转换、分析和可视化的 API。在使用 Pandas 进行数据处理时&#xff0c;常见的指令包括&#xff1a; 数据读取和解析 read_csv()&#xff1a;用于读取 CSV、Excel等格式的数据文件&#xff0c;并将…

大数据:HDFS存储原理,fsck命令查看文件副本状态,namenode元数据,edits流水账,fsimage合并,hdfs读取数据

大数据&#xff1a;HDFS存储原理&#xff0c;fsck命令查看文件副本状态&#xff0c;namenode元数据&#xff0c;edits流水账&#xff0c;fsimage合并&#xff0c;hdfs读取数据 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0…

django业务流程配置

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

【MySQL】如何速通MySQL(2)

&#x1f4cc;前言&#xff1a;本篇博客介绍如何速通MySQL的第二篇&#xff0c;主要介绍Mysql中主要的基础的入门&#xff0c;学习MySQL之前要先安装好MySQL&#xff0c;如果还没有安装的小伙伴可以看看博主前面的博客&#xff0c;里面有详细的安装教程。或者看一下下面这个链接…

结构方程模型(SEM)以及用R语言实现

目录 结构方程模型概述 结构方程模型匹配 1.协方差SEM 2.分段SEM 在R语言中实现sem进行结构方程建模和路径图可视化 – 拓端tecdat 结构方程模型是一个线性模型框架&#xff0c;它对潜变量同时进行回归方程建模。 ​​​​​​​在R语言中实现SEM进行结构方程建模和路径图…

VPP 编译记录

目录 虚拟机安装 VPP编译 下载一些工具 下载vpp源码 编译 首次构建 非首次直接编译 虚拟机安装 由于使用的统信系统作为宿主机器&#xff0c;在上面貌似只有VM virtualBox软件&#xff0c;先在应用商店安装此应用。 下载ubuntu 64位镜像 一开始没注意下载了32位的系统…

基于springboot_vue的学生在线选课java教学质量评价系统

对教师教学质量进行客观公正的评价,是一项十分严肃和重要的工作。是引导教师进行教学方法改进&#xff0c;提高教学质量的重要手段。它以教师的教学活动为主要评价对象&#xff0c;通过教学评价,发现存在的问题,了解学生的实际学习状况&#xff0c;明确教学改进的努力方向。但是…

【算法系列之二叉树II】leetcode112. 路径总和

257. 二叉树的所有路径 力扣题目链接 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","…

解决spark程序 Permission denied: user=<username>, access=WRITE...等常见hive权限报错

Permission Denied Permission Denied: 这是最常见的错误消息之一&#xff0c;表示当前用户没有足够的权限执行写入操作。报错信息可能类似于&#xff1a; org.apache.hadoop.security.AccessControlException: Permission denied: user<username>, accessWRITE, inode&…

Linux教程——操作系统是什么,操作系统概述

Linux 也是众多操作系统之一&#xff0c;要想知道 Linux 是什么&#xff0c;首先得说一说什么是操作系统。 计算机是一台机器&#xff0c;它按照用户的要求接收信息、存储数据、处理数据&#xff0c;然后再将处理结果输出&#xff08;文字、图片、音频、视频等&#xff09;。计…

Linux高级---k8s安全认证

文章目录 一、访问控制概述1、客户端2、认证、授权与准入控制 二、认证管理1、认证方式2、HTTPS认证大体分为3个过程 三、授权管理1、授权策略2、RBAC3、Role、ClusterRole4、RoleBinding、ClusterRoleBinding5、RoleBinding引用ClusterRole进行授权6、实战&#xff1a;创建一个…

Java线程池总结

背景 Java线程池的写法和参数是面试中出现频率很高的基础题。越是基础的东西&#xff0c;特别是对高阶职位的面试者&#xff0c;需要回答的符合自己面试的职位等级。 这里也不能说是一个多么好的答案&#xff0c;只是说如果是我&#xff0c;我怎么回答&#xff0c;仅供参考。…

Java --- springboot3依赖管理和自动配置机制

目录 一、依赖管理机制 二、自动配置机制 一、依赖管理机制 &#x1f695;、为什么导入starter-web所有相关依赖都导入进来&#xff1f; ①、开发什么场景&#xff0c;导入什么场景启动器。 ②、maven依赖传递原则。A-B-C&#xff1a; A就拥有B和C ③、导入 场景启动器。 场…

JavaScript 发展的前世今生

专栏介绍 本专栏主要用作于开放性知识点分享学习&#xff0c;其主要知识点范围是 以围绕 原生 JavaScript 语法 从基础知识到高阶语法阶段的学习分享。 导语&#xff1a; 既然博主&#xff0c;计划将此专栏打造为 JavaScript 的知识点学习分享集结地。所以&#xff0c;本章节就…

奥威BI,适合中国电商的大数据分析平台

电商数据分析做得好不好&#xff0c;除了分析思维这类主要因素外&#xff0c;大数据分析平台的选择也尤为重要。从电商数据分析实际体验来看&#xff0c;电商行业需要大数据分析平台需满足海量数据秒分析、数据直观易懂、操作简单易上手这三大基础要求&#xff0c;如能提供系统…

Tomcat下载安装以及配置

目录 tomcat的下载安装 修改控制台乱码 idea配置tomcat tomcat的下载安装 到tomcat的官网https://tomcat.apache.org/下载所需版本&#xff0c;我们下载的tomcat必须要和我们的jdk相匹配否则会导致tomcat运行和部署的时候出错&#xff0c;挑选tomcat的版本的时候参考下图 …

阿里系cookie之acw_sc__v2 逆向分析

文章目录 声明案例地址目标参数加密流程与逆向分析js代码python调用测试声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! cookie中使用acw_sc__v2的网站有很多,比如前程无忧、诸葛找房、…