服务网格ASM集成了开放策略代理(OPA)插件,通过OPA定义访问控制策略,可以使您的应用实现细粒度的访问控制。

前提条件

背景信息

作为由CNCF托管的一个孵化项目,开放策略代理(OPA)是一个策略引擎,可用于为您的应用程序实现细粒度的访问控制。OPA作为通用策略引擎,可以与微服务一起部署为独立服务。为了保护应用程序,必须先授权对微服务的每个请求,然后才能对其进行处理。为了检查授权,微服务对OPA进行API调用,以确定请求是否被授权。OPA

步骤一:启用OPA插件

在创建ASM实例的时候可以启用OPA插件。如果创建时没有启用,按以下步骤启用该插件。

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 基本信息页面单击右上角的功能设置
  5. 功能设置更新页面中勾选启用OPA插件
  6. 单击确定
    基本信息页面可以看到OPA插件的状态变为开启

步骤二:部署OPA

部署业务Pod之前,需要部署OPA配置文件和OPA策略的配置项Configmap。

  1. 通过kubectl连接到ASM实例中新添加的ACK集群,执行以下命令,部署OPA配置文件。
    kubectl apply -n {替换成实际的namespace} -f - <<EOF
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: opa-istio-config
    data:
      config.yaml: |
        plugins:
          envoy_ext_authz_grpc:
            addr: :9191
            path: istio/authz/allow
    EOF        
  2. 通过kubectl连接到ASM实例中新添加的ACK集群,执行以下命令,部署OPA策略。
    kubectl apply -n {替换成实际的namespace} -f - <<EOF
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: opa-policy
    data:
      policy.rego: |  ###以下为示例策略定义,需要替换成实际的策略定义
        package istio.authz
        import input.attributes.request.http as http_request
        default allow = false
        allow {
            roles_for_user[r]
            required_roles[r]
        }
        roles_for_user[r] {
            r := user_roles[user_name][_]
        }
        required_roles[r] {
            perm := role_perms[r][_]
            perm.method = http_request.method
            perm.path = http_request.path
        }
        user_name = parsed {
            [_, encoded] := split(http_request.headers.authorization, " ")
            [parsed, _] := split(base64url.decode(encoded), ":")
        }
        user_roles = {
            "guest1": ["guest"],
            "admin1": ["admin"]
        }
        role_perms = {
            "guest": [
                {"method": "GET",  "path": "/productpage"},
            ],
            "admin": [
                {"method": "GET",  "path": "/productpage"},
                {"method": "GET",  "path": "/api/v1/products"},
            ],
        }
    EOF        

步骤三:注入OPA代理

重新部署示例应用Bookinfo到ASM实例,确认每个POD都注入了OPA代理。

  1. 重新部署示例应用Bookinfo到ASM实例,请参见部署应用到ASM实例
  2. 定义相应的Istio虚拟服务和入口网关,请参见定义Istio资源
  3. 登录容器服务控制台
  4. 在控制台左侧导航栏中,单击集群
  5. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的应用管理
  6. 在工作负载页面单击容器组页签。
  7. 容器组页面,从命名空间下拉列表中选择default
    此时Bookinfo应用的Pod状态应为运行中,并且每一个Pod内都被注入了Sidecar代理(istio-proxy)和OPA代理(opa-istio)。注入OPA代理

执行结果

以上配置的OPA策略限制了对BookInfo的访问,定义如下所示。