searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

OPA简介及其在服务网格中的部署

2023-10-30 01:58:18
33
0

OPA简介

OPA,全名为"Open Policy Agent",是一个开源的策略决策引擎,用于编写和执行访问控制策略、验证策略和其他策略决策逻辑。OPA 最初由云原生计算基金会(CNCF)托管,并且被广泛用于云原生应用程序开发、微服务架构、容器编排等现代云计算和应用程序开发场景中

1. 策略定义: OPA 允许用户定义策略,这些策略可以用于控制应用程序的行为,例如访问控制、认证、授权等。策略以声明性语言编写,可以灵活地定义各种安全和访问控制规则。

2. 云原生适用: OPA 被广泛用于云原生应用程序和容器编排平台(如Kubernetes)中,以管理和执行策略。例如,在 Kubernetes 中,OPA 可以用于定义谁可以访问哪些资源、执行哪些操作等。

3. 多语言支持: OPA 提供了多种语言的客户端库,允许你在不同的编程语言中嵌入和使用它,以便与不同的应用程序和服务集成。

4.REST API: OPA 提供了 REST API,可以通过 HTTP 请求来查询和评估策略,这使得它易于与各种应用程序和服务进行集成。

5. 数据驱动: OPA 不仅可以用于访问控制,还可以用于数据验证和转换。你可以定义策略来验证和转换输入数据,以确保其符合期望的格式和标准。

6. 透明性和可观察性: OPA 具有良好的日志记录和跟踪功能,可以帮助你了解策略评估的细节,以及为什么一个策略被接受或拒绝。

OPA 是一个强大的工具,用于在应用程序和服务中实施策略控制。它的灵活性和可扩展性使其适用于多种用例,从访问控制到数据验证和更多。如果你需要在你的应用程序中实施复杂的策略逻辑,OPA可能是一个有用的选择。

 

OPA的简单部署(docker)

docker run -p 8181:8181 openpolicyagent/opa run --server --log-level debug

 

istio中部署opa

其中官方文件中包含:

EnvoyFilter:ext-authz;

Namespace:opa-istio;

Secret:server-cert(ns:opa-istio);

ConfigMap:inject-policy(ns:opa-istio),opa-istio-config,opa-policy;

Service:admission-controller(ns:opa-istio);

Deployment:admission-controller(ns:opa-istio);

MutatingWebhookConfiguration:opa-istio-admission-controller;

其中opa-istio-config,opa-policy为命名空间内的ConfigMap,其中opa-istio-config主要定义了envoy_ext_authz_grpc地址为9191,opa-policy主要定义了授权策略

EnvoyFilter yaml以及注释如下:

apiVersion: networking.istio.io/v1alpha3  # 指定Kubernetes API的版本
kind: EnvoyFilter  # 声明要创建的资源类型为EnvoyFilter
metadata:
  name: ext-authz  # 给EnvoyFilter资源命名为"ext-authz"
  namespace: istio-system  # 将资源放置在istio-system命名空间中
spec:
  configPatches:
    - applyTo: HTTP_FILTER  # 应用此补丁到Envoy的HTTP_FILTER
      match:
        context: SIDECAR_INBOUND  # 匹配上下文为SIDECAR_INBOUND
        listener:
          filterChain:
            filter:
              name: "envoy.filters.network.http_connection_manager"  # 匹配过滤器链中的名称
              subFilter:
                name: "envoy.filters.http.router"  # 匹配子过滤器名称
      patch:
        operation: INSERT_BEFORE  # 在指定过滤器之前插入新的过滤器
        value:
          name: envoy.ext_authz  # 新过滤器的名称为envoy.ext_authz
          typed_config:
            '@type': type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz  # 配置ExtAuthz过滤器的类型
            transport_api_version: V3  # 指定传输API版本为V3
            status_on_error:
              code: ServiceUnavailable  # 在错误时返回ServiceUnavailable状态码
            with_request_body:
              max_request_bytes: 8192  # 允许的最大请求字节数
              allow_partial_message: true  # 允许部分消息
            grpc_service:
              google_grpc:
                target_uri: 127.0.0.1:9191  # gRPC服务的目标URI
                stat_prefix: "ext_authz"  # 统计前缀

这个EnvoyFilter资源的作用是配置Istio Envoy代理,以便在HTTP请求到达时执行授权检查,可以将请求传递给一个名为"ext_authz"的gRPC服务(target_uri: 127.0.0.1:9191),并在错误时返回ServiceUnavailable响应。这个过程允许在请求到达Envoy代理之前执行自定义的授权逻辑。

设置

kubectl label namespace default opa-istio-injection="enabled"
kubectl label namespace default istio-injection="enabled"

 

在 Istio 中部署 OPA(Open Policy Agent)是一种常见的做法,可以用于实施访问控制策略、安全策略等。以下是详细说明如何在 Istio 中部署 OPA 的步骤:

前提条件:
- 已经安装和配置 Istio。
- 你已经有一个 OPA 策略或决策逻辑,可以使用 OPA 来实施。

步骤:

1. 部署 OPA 作为 Sidecar:

   部署 OPA 作为 Istio 的 Sidecar,可以确保所有进出应用程序的流量都经过 OPA 策略评估。你可以使用 Istio 的 `sidecar.istio.io/user-config` 注解将 OPA 配置添加到 Istio 部署中。以下是一个示例部署 YAML 文件:

 

   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: my-app
   spec:
     template:
       metadata:
         annotations:
           sidecar.istio.io/user-config: |
             {
               "opa": {
                 "policies": {
                   "example": "data.example.allow == true"
                 }
               }
             }
       containers:
       - name: my-app
         image: my-app-image:latest


   

   上述示例中,我们在 `sidecar.istio.io/user-config` 注解中指定了 OPA 配置,它包括了一个示例策略。你需要根据你的需求自定义策略。

2. 配置 Istio 控制面板:

   在 Istio 控制面板中,你需要配置 Istio 的 `AuthorizationPolicy` 来指定 OPA 作为策略决策点。以下是一个示例的 `AuthorizationPolicy`:


  

 apiVersion: security.istio.io/v1beta1
   kind: AuthorizationPolicy
   metadata:
     name: opa-policy
   spec:
     selector:
       matchLabels:
         app: my-app
     action: CUSTOM
     provider: opa
     rules:
     - from:
       - source:
           notNamespaces: ["istio-system"]
     when:
     - key: request.headers[authorization]



   在上述示例中,我们定义了一个 `AuthorizationPolicy`,该策略使用 OPA 作为提供者,并在所有非`istio-system`命名空间的请求中启用它。这将确保所有进入 `my-app` 的请求都会受到 OPA 的策略评估。

3. 部署 OPA 服务器:

   为了 OPA 能够执行策略评估,你需要部署 OPA 服务器并将你的策略加载到 OPA 中。通常,你可以在 Kubernetes 中以容器的方式运行 OPA 服务器,并使用 `ConfigMap` 或 `Secret` 存储策略文件或配置。

4. 策略编写和加载:

   编写你的策略文件并将其加载到运行中的 OPA 服务器中。你可以使用 OPA 的 REST API 或命令行工具来加载策略。

5. 测试和验证:

   部署完成后,请确保测试和验证策略是否按预期工作。可以使用 `kubectl` 或类似的工具来发送请求并查看 OPA 的决策结果。

这些步骤提供了一个基本的指南,用于在 Istio 中部署和配置 OPA。根据你的实际需求和策略复杂性,可能需要更复杂的配置和管理。确保详细阅读 Istio 和 OPA 的文档以获取更多信息和示例。

opa policy设置和修改

更改或设置 OPA(Open Policy Agent)的策略,通常需要编辑策略文件,然后将更新后的策略加载到运行中的 OPA 服务器中。下面是一般的步骤:

1. 编辑策略文件:
   
   打开你的策略文件,这可以是一个 JSON 或 Rego 文件,根据你的策略配置而定。编辑策略以满足新的需求或要求。确保你理解策略文件的结构和语法,以便正确地进行修改。

2. 将策略文件加载到 OPA:

   有多种方法可以将策略文件加载到运行中的 OPA 服务器中:

   -使用 OPA REST API:
   
     通过发送 POST 请求将策略文件发送给 OPA 服务器。例如,可以使用 `curl` 命令:

   
     curl -X PUT localhost:8181/v1/policies/my-policy -d @path/to/your-policy.rego

     这会将策略文件加载到名为 "my-policy" 的策略集合中。

   -使用 OPA 命令行工具:

     OPA 提供了一个命令行工具,可以用来加载策略文件。例如:

  
     opa load path/to/your-policy.rego
  

     这会将策略文件加载到默认的策略集合中。

3. 验证策略更改:

   在加载策略后,确保它按照你的预期工作。可以通过发送请求并查看 OPA 的决策结果来验证策略的更改是否生效。

4. 持续监控和管理:

   一旦策略更新成功,就需要确保对策略的更改得到了适当的监控和管理。策略可能需要根据业务需求定期更新。

以上步骤是一个基本的流程,实际操作可能因使用的环境和工具而有所不同。具体来说,你需要查看 OPA 和你使用的环境(例如 Kubernetes、Istio)的文档,以了解如何正确地编辑、加载和管理策略。

另外,强烈建议在更新策略之前,进行充分的测试和评估,以确保新策略不会导致不希望的行为或安全问题。

 

0条评论
0 / 1000
z****n
2文章数
0粉丝数
z****n
2 文章 | 0 粉丝