ASM单点登录(二)ASM + 阿里云身份服务IDaaS实现网格内应用单点登录

简介: 作为业内首个全托管Istio兼容的阿里云服务网格产品ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM产品是基于社区Istio定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了Istio组件与所管理的K8s集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。从2022年4月

作为业内首个全托管Istio兼容的阿里云服务网格产品ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM产品是基于社区Istio定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了Istio组件与所管理的K8s集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。从2022年4月1日起,阿里云服务网格ASM正式推出商业化版本, 提供了更丰富的能力、更大的规模支持及更完善的技术保障,更好地满足客户的不同需求场景, 详情可见产品介绍:https://www.aliyun.com/product/servicemesh

背景

在上一篇中我们通过ASM外部授权 + Keycloak的方式实现了网格内应用单点登录。若不想自行运维keycloak或类似认证/授权系统,同样可以使用阿里云IDaaS作为认证/授权管理系统来实现单点登录,在本文中,我们通过对创建IDaaS实例并进行简单的配置,实现网格内应用单点登录。



准备工作

  • 创建一个ASM实例及ACK集群,并且将ACK集群加入至ASM
  • 创建一个ASM网关,用于随后将服务暴露至公网
  • 为default命名空间启用Sidecar自动注入

部署和配置

一、创建EIAM 云身份服务实例及测试账号

打开云身份服务控制台,创建IDaaS实例,参见文档:https://help.aliyun.com/document_detail/408892.html?spm=5176.b73997031.help.dexternal.5f1075080MP3wA

一个IDaaS实例可以看做是一个账号系统,这一步即可理解为创建了一个账号系统。接下来在账号系统中创建一个测试账号。

点击IDaaS实例名称进入IDaaS实例

点击导航栏“账户”,并在“账户”页面点击“创建账户”按钮

输入账户信息,点击保存

至此,我们已经在阿里云IDaaS上创建了一个单点登录账户系统,且添加了一个账户。

二、添加和配置OIDC应用

IDaaS实例中的应用可以理解为接口,该IDaaS实例可以通过不同的应用暴露接口,以各种方式进行单点登录,本文中将使用OIDC应用进行演示。

进入上一步创建的IDaaS实例,点击左侧导航栏中“应用”,选择“标准协议”,再点击OIDC应用的“添加应用”按钮,创建一个新的OIDC应用。

点击导航栏“应用”,回到应用列表

点击应用名称进入刚才创建的OIDC应用,点击“登录访问”选项卡,再点击“单点登录”子选项卡。

设置redirect URI为http://ASM网关SLB地址/oauth2/callback

下拉页面,点击显示高级配置。

确认email和profile scope被勾选

点击保存,将上述变更保存。

然后点击授权选项卡,为第一步创建的账户授权允许通过OIDC登录这个账户。

选择步骤一创建的账户,并点击“保存授权”。

三、部署oauth2proxy

本例中,我们需要将oauth2proxy作为外部鉴权服务,未携带认证信息的请求被发往鉴权服务时,会触发登录流程,登录成功后,鉴权服务则会放行请求,请求携带身份信息被发往应用。

本文提供了oauth2proxy部署的模板,需要将模板中的待填写配置项(由${}包裹)进行替换后,部署至ACK集群。配置中的部分字段需要从IdP处获取或自行生成。

  • Issuer:阿里云身份认证服务控制台 - 应用 - 步骤2中创建的OIDC应用 - 登录访问 - 单点登录 -  应用配置信息 - Issuer
  • ClientID: 阿里云身份认证服务控制台 - 应用 - 步骤2中创建的OIDC应用 - 通用配置 - client_id
  • ClientSecret: 阿里云身份认证服务控制台 - 应用 - 步骤2中创建的OIDC应用 - 通用配置 - client_secret
apiVersion: apps/v1
kind: Deployment
metadata:
  name: oauth2-proxy
  namespace: istio-system
spec:
  selector:
    matchLabels:
      app: oauth2-proxy
  template:
    metadata:
      labels:
        app: oauth2-proxy
    spec:
      containers:
      - name: oauth2-proxy
        image: quay.io/oauth2-proxy/oauth2-proxy:v7.2.0
        args:
        - --provider=oidc
        - --cookie-secure=false
        - --redirect-url=https://${入口网关地址}/oauth2/callback
        - --cookie-samesite=lax
        - --cookie-refresh=1h
        - --cookie-expire=4h
        - --cookie-name=_oauth2_proxy_istio_ingressgateway
        - --set-authorization-header=true
        - --email-domain=*
        - --http-address=0.0.0.0:4180
        - --upstream=static://200
        - --skip-provider-button=false
        - --whitelist-domain=*
        - --oidc-issuer-url=${Issuer}
        - --skip-provider-button=false
        - --scope=openid profile email
        env:
        - name: OAUTH2_PROXY_CLIENT_ID
          value: "${ClientID}"
        - name: OAUTH2_PROXY_CLIENT_SECRET
          value: "${ClientSecret}"
        - name: OAUTH2_PROXY_COOKIE_SECRET
          value: "${CookieSecret}"
        resources:
          requests:
            cpu: 10m
            memory: 100Mi
        ports:
        - containerPort: 4180
          protocol: TCP
        readinessProbe:
          periodSeconds: 3
          httpGet:
            path: /ping
            port: 4180
---
apiVersion: v1
kind: Service
metadata:
  name: oauth2-proxy
  namespace: istio-system
spec:
  type: NodePort
  ports:
  - name: http
    port: 4180
    protocol: TCP
    targetPort: 4180
    nodePort: 30020
  selector:
    app: oauth2-proxy

四、部署测试应用并将其暴露于网关

本文使用httpbin应用作为测试,该应用可以辅助查看请求内容,便于验证登录后的身份信息。您可以使用如下YAML在ACK集群 default 命名空间下部署httpbin应用。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: httpbin
---
apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: httpbin
    service: httpbin
spec:
  ports:
  - name: http
    port: 8000
    targetPort: 80
  selector:
    app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpbin
      version: v1
  template:
    metadata:
      labels:
        app: httpbin
        version: v1
    spec:
      serviceAccountName: httpbin
      containers:
      - image: docker.io/kennethreitz/httpbin
        imagePullPolicy: IfNotPresent
        name: httpbin
        ports:
        - containerPort: 80

将应用部署至ACK集群后,配置ASM网关规则及虚拟服务,将应用通过网关暴露出来。先应用下方网关规则到ASM实例

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  selector:
    app: istio-ingressgateway
  servers:
    - hosts:
        - '*'
      port:
        name: http
        number: 80
        protocol: HTTP

再应用下方虚拟服务到ASM实例,虚拟服务仅指定了一条指向httpbin应用的默认路由规则。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: ingressgateway-vs
  namespace: istio-system
spec:
  gateways:
    - ingressgateway
  hosts:
    - '*'
  http:
    - name: default
      route:
        - destination:
            host: httpbin.default.svc.cluster.local
            port:
              number: 8000

五、创建外部授权服务及授权策略

打开ASM控制台,进入网格实例,点击导航栏中“零信任安全”,展开菜单后点击“外部授权服务”,点击“创建”

协议选择HTTP、服务地址为第三步部署的oauth2proxy的集群内域名,即:oauth2-proxy.istio-system.svc.cluster.local,服务端口即为oauth2-proxy服务的4180端口,超时时间设置为10秒。为了使得授权流程及认证成功后的身份信息能够被正确传递,还需设置以下几项:

  • 启用“在鉴权请求中携带header”,并添加下列值
  • cookie
  • x-forward-access-token
  • 启用“鉴权通过时覆盖header”,并添加下列值
  • authorization
  • cookie
  • path
  • x-auth-request-access-token
  • x-forwarded-access-token
  • 启用“鉴权失败时覆盖header”,并添加下列值
  • content-type
  • set-cookie
  • 启用“在鉴权请求中携带请求body”,并设置最大长度为10240(10K)。

点击确定创建外部授权服务。

接下来还需要创建授权策略,将请求指向外部授权服务进行授权流程。在当前服务网格实例左侧导航栏点击“授权策略”,点击使用yaml创建,将下面yaml拷贝粘贴,点击确定创建。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: oidc
  namespace: istio-system
spec:
  action: CUSTOM
  provider:
    name: httpextauth-oidc
  rules:
    - {}
  selector:
    matchLabels:
      istio: ingressgateway

验证

经过前面5个步骤的配置,我们现在可以访问应用以验证单点登录是否已经生效。在浏览器输入入口网关地址,访问应用,返回的页面为oauth2-proxy的登录页面。

点击“Sign in with OpenID Connect”,将跳转到阿里云IDaaS登录页面

输入第一步创建的测试账号和密码,点击登录,登录成功后,页面跳转至httpbin应用。

点击Httpbin应用页面上的Request inspection,展开后点击/headers,点击右侧Try-it-out,再点击Execute,即可查看请求的Headers,可以看到,请求中携带了Authorization和Cookie两个Header,Authorization为一个JwtToken,可通过工具进行Decode,查看JwtToken中携带的身份信息。

目录
相关文章
|
3天前
|
弹性计算 负载均衡 容灾
应用阿里云弹性计算:打造高可用性云服务器ECS架构
阿里云弹性计算助力构建高可用云服务器ECS架构,通过实例分布、负载均衡、弹性IP、数据备份及多可用区部署,确保业务连续稳定。自动容错和迁移功能进一步增强容灾能力,提供全方位高可用保障。
15 0
|
4天前
|
弹性计算 API Python
阿里云百炼应用之流程编排
阿里云通义百炼平台流程编排使用教程。
|
5天前
|
Cloud Native 关系型数据库 OLAP
高效易用的数据同步:阿里云瑶池 Zero-ETL服务来啦!
在大数据时代,企业有着大量分散在不同系统和平台上的业务数据。OLTP数据库不擅长复杂数据查询,不具备全局分析视角等能力,而OLAP数据仓库擅长多表join,可实现多源汇集,因此需要将TP数据库的数据同步到AP数据仓库进行分析处理。传统的ETL流程面临资源成本高、系统复杂度增加、数据实时性降低等挑战。为了解决这些问题,阿里云瑶池数据库提供了Zero-ETL服务,可以快速构建业务系统(OLTP)和数据仓库(OLAP)之间的数据同步链路,将业务系统的数据自动进行提取并加载到数据仓库,从而一站式完成数据同步和管理,实现事务处理和数据分析一体化,帮助客户专注于数据分析业务。
62 0
|
8天前
|
负载均衡 监控 Go
Golang深入浅出之-Go语言中的服务网格(Service Mesh)原理与应用
【5月更文挑战第5天】服务网格是处理服务间通信的基础设施层,常由数据平面(代理,如Envoy)和控制平面(管理配置)组成。本文讨论了服务发现、负载均衡和追踪等常见问题及其解决方案,并展示了使用Go语言实现Envoy sidecar配置的例子,强调Go语言在构建服务网格中的优势。服务网格能提升微服务的管理和可观测性,正确应对问题能构建更健壮的分布式系统。
28 1
|
14天前
|
存储 监控 前端开发
【专栏】阿里云ARMS前端监控的引入方法,以提升应用质量和稳定性
【4月更文挑战第29天】本文介绍了阿里云ARMS前端监控的引入方法,以提升应用质量和稳定性。该工具通过实时收集和分析用户行为、性能数据,提供错误监测和实时告警。步骤包括注册阿里云账号,创建前端监控项目,获取并嵌入监控代码到页面中,部署并运行,最后查看监控数据。案例和经验分享强调了合理设置监控指标、与其他工具结合以及定期分析数据的重要性。注意保护用户隐私,正确管理监控代码,并解决可能出现的数据不准确和大量错误告警问题。
|
14天前
|
NoSQL 数据管理 MongoDB
数据管理DMS产品使用合集之如何通过阿里云的数据管理服务(DMS)导出MongoDB数据
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
14天前
|
运维 Serverless 应用服务中间件
Serverless 应用引擎产品使用之在阿里云Serverless中函数计算FC nginx 部署上去之后放置静态页面如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
219 0
|
14天前
|
弹性计算 运维 Serverless
Serverless 应用引擎产品使用之在阿里函数计算中,使数据库和阿里云函数计算位于同一个内网中如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
989 0
Serverless 应用引擎产品使用之在阿里函数计算中,使数据库和阿里云函数计算位于同一个内网中如何解决
|
14天前
|
运维 监控 Serverless
Serverless 应用引擎产品使用之在使用阿里云函数计算部署网站时,网站打开不稳定如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
169 0
|
15天前
|
运维 Serverless API
Serverless 应用引擎产品使用之在阿里云函数计算中通过调用函数如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
282 10