ASM集成阿里云IDaaS实现网格内应用单点登录

本文介绍如何在ASM中实现网格内应用的单点登录。

前提条件

背景信息

当前很多应用都需要进行访问控制,登录成功的用户才有权限访问。随着系统复杂度的提升,“单点登录”成为了一个很好的解决方案,您可以使用一个账号登录多个系统。ASM提供的自定义授权服务,可以无侵入地实现网格内应用的单点登录。

使用ASM实现单点登录,可以降低应用的改造、运维等成本。本文使用阿里云IDaaS实例作为身份提供方,实现单点登录到网格内应用服务。网格内应用无需实现认证、鉴权逻辑,通过配置ASM自定义鉴权接入到阿里云IDaaS或任意支持OIDC协议的IdP进行鉴权和登录流程,鉴权通过后,将应用的请求以及认证信息一同发往应用,应用可基于身份信息进行相应业务处理。

相关概念

概念

说明

IdP

Identity Provider的缩写,身份提供商。例如,您可以通过账号+密码的形式来验证您的身份。当您使用支付宝账号登录优酷,这个场景中支付宝即为IdP。

OIDC

OIDC是OpenID Connect的简称,是一个基于OAuth 2.0协议的身份认证标准协议。更多信息,请参见OpenID Connect

Scope

OIDC中的概念,每一个IdP同时也保存了用户的各种信息,例如Email、个人资料等,这些分类被称为Scope。在通过IdP进行Authentication(登录操作)时,一些IdP会要求选择允许访问用户的哪些资料,每一个类别都对应一个Scope。

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

  1. 登录EIAM云身份服务控制台,创建IDaaS实例。具体操作,请参见免费开通实例

    说明

    一个IDaaS实例可以被视为一个账号系统。创建一个IDaaS实例,相当于创建了一个独立的账号系统。

  2. EIAM 云身份服务页面,单击目标IDaaS实例名称。

  3. 在左侧导航栏,选择账户 > 账户与组织

  4. 账户页面的账户页签,单击创建账户

  5. 创建账户面板,设置账户信息,然后单击确定

步骤二:添加和配置OIDC应用

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

  1. 在云身份服务控制台左侧导航栏,单击应用

  2. 应用页面,单击添加应用

  3. 添加应用页面,单击标准协议页签,在OIDC卡片中单击添加应用

  4. 添加应用 - OIDC 协议对话框,配置应用名称,然后单击立即添加

  5. OIDC应用详情页面,选择登录访问 > 单点登录

  6. 单点登录配置页面,设置登录Redirect URI。单击显示高级配置,在用户信息范围,选择您需要获取的信息,然后单击保存

    URL

    说明

    本例中的Redirect URI设置为http://${ASM网关的CLB地址}/oauth2/callback。请将${}替换为您实际的地址。

  7. OIDC应用详情页面,选择登录访问 > 授权,然后单击添加授权

  8. 添加应用授权对话框,为步骤一创建的用户授权,然后单击保存授权

完成OIDC应用的配置后,您需要记录当前应用的Issuerclient_idclient_secret等配置信息,以便在ASM中配置单点登录使用。

  • Issuer:在OIDC应用的登录访问 > 单点登录 > 应用配置信息区域获取。Issuer

  • client_idclient_secret:在OIDC应用的通用配置区域获取。id

步骤三:部署测试应用并将其暴露于网关

本文使用httpbin应用作为测试,该应用可以辅助查看请求内容,便于验证登录后从IdP处获取的信息。

  1. 使用以下内容,在ACK集群的default命名空间下部署httpbin应用。

    展开查看YAML内容

    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
  2. 使用以下内容,在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
  3. 使用以下内容,将虚拟服务应用到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
  4. 配置完网关规则和虚拟服务后,您可以直接通过curl -I http://${ASM网关外部IP:80}命令,访问httpbin服务。

    示例输出:httpbin

步骤四:启用ASM自定义授权服务,配置OIDC单点登录

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格安全中心 > 自定义授权服务,然后单击关联自定义授权服务

  3. 关联自定义授权服务页面,单击OIDC身份认证授权服务页签,进行相关配置,然后单击创建

    说明

    OIDC应用的相关信息由步骤二获取。您可以使用ASM网关作为登录重定向地址。关于Cookie Secret的更多信息,请参见Cookie Secret的生成

  4. 使用数据平面集群KubeConfig,执行以下命令,获取OIDC外部授权服务域名。

    kubectl get svc -n istio-system|grep oauth2proxy|awk -F' ' '{print $1}'
  5. 使用以下内容,创建VirtualService,接收ASM网关的认证请求。

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: oauth2-vs
      namespace: istio-system
    spec:
      gateways:
        - ingressgateway
      hosts:
        - '*'
      http:
        - match:
            - uri:
                prefix: /oauth2
          name: oauth2
          route:
            - destination:
                host: # 上一步获取的外部授权服务域名。
                port:
                  number: 4180
    重要

    为防止VirtualService冲突,请勿将其他VirtualService匹配前缀为/oauth2的路径。

步骤五:创建授权策略

  1. 在网格详情页面左侧导航栏,选择网格安全中心 > 授权策略,然后在右侧页面,单击使用YAML创建

  2. 创建页面,选择命名空间场景模板,配置如下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
    说明

    该权限策略会对所有进入ASM网关的请求进行授权。

步骤六:结果验证

  1. 在浏览器中访问http://${ASM网关外部IP:80}

    显示如下页面,说明单点登录生效。1

  2. 单击Sign in with OpenID Connect

    预期结果:阿里云IDaaS

  3. 阿里云IDaaS的登录页面,输入步骤一创建的测试账号以及密码,然后单击登录

    预期结果:httpbin

  4. 单击Request inspection,选择/headers > try it out > Execute

    预期结果:12

  5. 将上一步骤中Bearer之后请求携带的JWT在JWT Debugger中进行解析。

    关于JWT Debugger的更多信息,请参见JWT debugger

    预期结果:JWT解析成功后,您可以看到如上信息。其中附带IDaaS中存储的用户信息,并且当前的JWT已经经过了ASM的校验。