核心概念实战指南:Bundles、Sources、Stacks 与 Secrets 全面解析)
后端认证鉴权云原生【免费下载链接】opaOpen Policy Agent (OPA) is an open source, general-purpose policy engine.项目地址https://gitcode.com/gh_mirrors/op/opa点击查看免费下载OPA Control PlaneOCP是围绕 Open Policy AgentOPA构建的集中式策略管理系统它把从多个 Git 仓库拉取 Rego 与数据、按标签选择器注入全局策略、构建并分发 OPA Bundle这一整套流程封装为可配置、可自动化的流水线。本文以 OCP 概念文档为主体结合本仓库中 OPA 端的 Bundle 消费机制与 glob 匹配实现系统讲解 Bundles、Sources、Stacks、Secrets 与多配置文件合并的完整配置体系读完即可独立编写一套覆盖源码拉取 → 数据装配 → 策略注入 → 对象存储分发的 OCP 配置。BundlesOCP 的打包与分发单元Bundles 是 OCP 中策略的主要打包与分发单元。每个 bundle 包含 Rego 策略、数据文件并面向任意数量的 OPA 实例消费。OCP 配置中针对 bundle 的requirements声明了一组需求列出需要纳入该 bundle 的源Rego、数据等。OCP 负责构建 OPA Bundles并将其推送到外部对象存储系统如 S3、GCS、Azure Blob Storage 以及本地文件系统。OPA 实例则被配置为直接从这些存储系统下载 bundle——OPA 侧如何配置认证与 bundle 下载可参考仓库内的 OPA Configuration 文档。从 OPA 端源码看bundle 在 OPA 侧由 Manifest 结构 描述包含revision版本号、rootsbundle 声明拥有的数据根路径默认根为即全部数据、metadata任意元数据等字段。这意味着 OCP 构建出的 bundle 一旦被 OPA 实例下载OPA 会根据roots限定该 bundle 能写入的数据范围并在决策时携带版本与元数据信息——理解这一点有助于设计多 bundle 共存时的数据隔离策略。命名空间约束禁止包重叠OCP 要求bundle 内不得包含包package相互重叠的多个源。构建 bundle 时OCP 会检查所有被纳入的源确保不存在两个不同的源声明了相同或互为前缀的包。该规则对 bundle 内所有源传递性地生效。一旦发现重叠OCP 会报告构建错误requirement lib1 contains conflicting package x.y.z - package x.y from system此例中lib1是声明了包x.y.z的源名称system是声明了包x.y的另一个源名称因为x.y是x.y.z的前缀两者发生重叠。如果你的使用场景需要放宽该限制可以在 opa-control-plane 仓库的 Issue #30 中留言并提供用例细节。Bundle 配置字段详解bundles配置项下每个 bundle 支持以下字段object_storage配置 bundle 分发的存储后端S3、GCS、Azure Blob Storage 或文件系统等。OCP 将构建好的 bundle 写入该对象存储并由其对外提供Filesystempathbundle 的创建路径例如bundles/prod-app.tar.gz。Amazon S3 (aws)bucket桶名称例如my-prod-bucketkeybundle 的路径与/或名称例如prod/bundle.tar.gzregion桶所在的 AWS 区域credentials引用一个命名 Secret 用于与目标对象存储认证。GCP Cloud Storage (gcp)project桶所属的 GCP 项目bucket桶名称objectbundle 名称含路径credentials引用命名 Secret。Azure Blob Storage (azure)account_urlAzure 账户 URLcontainerBlob 存储容器名称pathbundle 的路径与名称credentials引用命名 Secret。labels为 bundle 添加元数据用于描述环境、团队、系统类型等。标签会被 Stacks见下文用于 bundle 选择与策略组合。requirements指定必须纳入 bundle 的策略或数据来自 Sources。requirements 可包含可选的path与prefix设置用于重写包名与数据路径详见Path and Prefix Rewrites小节。excluded_files可选构建时从 bundle 中排除的文件列表例如各类隐藏文件。配置示例bundles: prod-app: object_storage: filesystem: path: bundles/prod-app.tar.gz labels: environment: prod team: payments requirements: - source: app-policybundles: prod-app: object_storage: aws: bucket: my-prod-bucket key: prod/bundle.tar.gz url: https://s3.amazonaws.com region: us-east-1 credentials: s3-prod-credsbundles: prod-app: object_storage: gcp: project: my-gcp-project bucket: policy-bundles object: bundles/my-app/bundle.tar.gz credentials: gcp-service-accountbundles: prod-app: object_storage: azure: account_url: https://mystorageaccount.blob.core.windows.net container: policy-bundles key: bundles/my-app/bundle.tar.gz credentials: azure-credentials提示AWS 示例中的url字段用于自定义 S3 端点当使用 MinIO 等兼容 S3 的对象存储时这一字段尤其有用。credentials 的具体类型定义见 Secrets 小节。Sources策略与数据的来源Sources 定义了 OCP 如何从外部系统、本地文件或内置库拉取 Rego 与数据用于组合并构建 bundle。Source 类型一览git从 Git 仓库HTTPS支持 token/basic auth 凭据拉取策略代码与数据。repo仓库 URLhttps 或 ssh例如https://github.com/example/app-policy.gitreference可选git 引用例如refs/heads/maincommit可选构建 bundle 所基于的提交 SHA例如d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3path可选纳入策略的仓库内路径例如policies/authzinclude_files可选显式纳入 bundle 的文件excluded_files可选显式排除的文件例如.*/*credentials引用命名 Secret 用于与 Git 仓库认证。datasources将 HTTP(S) 端点、API 或其他外部数据服务配置为策略评估的数据源。name数据源名称path数据在data树中的挂载路径type目前支持httptransform_query查询转换config数据源配置credentials访问凭据。files构建时提供给 OCP 的本地内嵌文件。directory构建时提供给 OCP 的本地目录。paths构建 bundle 时使用的单个 rego 或 datasource 文件路径。builtin引用 OCP 内置的策略或库模块。requirements指定对其他源或内置库的依赖支持可组合的策略开发。credentials引用命名 Secret 以访问 Git/datasource 端点。配置示例以下配置从 git 获取策略app-policy、从文件获取数据global-data并通过 HTTP 从 Amazon S3 拉取额外数据s3-data。所用凭据信息见 Secrets 小节sources: app-policy: git: repo: https://github.com/example/app-policy.git reference: refs/heads/main excluded_files: - .*/* credentials: github-token global-data: paths: - global/common.json s3-data: datasources: - name: s3-datasource type: http path: data/from/s3 config: url: https://my-bucket.s3.my-region.amazonaws.com/s3-data.json credentials: aws_auth注意paths既支持.rego策略文件也支持数据文件datasources内的path决定拉取到的数据落在data树的哪个位置例如上面的示例会把 JSON 数据挂载到data.data.from.s3下供策略以data.data.from.s3引用。Path 和 Prefix 重写命名空间挂载机制当把源纳入 bundle、stacks 或作为其他源的 requirement 时可以使用path与prefix设置重写 Rego 包名与数据路径。这允许将源挂载到不同命名空间以避免冲突在受控前缀下导入外部策略与数据只从源中选取特定的数据或策略子树。配置项每个 source requirement 可指定path选择要纳入的data子树默认data即全部内容prefix所选内容挂载的新前缀默认data即不改变。示例基本的 path 与 prefix 用法bundles: my-app: requirements: - source: library-policies path: library prefix: imported.lib.v1该配置从library-policies源选取data.library下的全部内容将包名从data.library.authz重写为data.imported.lib.v1.authz把数据从data.library移动到data.imported.lib.v1并相应调整所有引用。为全部内容添加前缀requirements: - source: external-policies prefix: external.policies这将external-policies的全部内容挂载到data.external.policies命名空间下。只选取特定子树requirements: - source: shared-utils path: utils.validation prefix: app.validation仅取data.utils.validation子树挂载到data.app.validation。重要注意事项data.前缀可省略path: library等价于path: data.library每个 source requirement 只允许一对path/prefix数据的路径选择依赖文件系统结构——只能选择与实际目录边界对应的路径挂载是传递性的若源 A 依赖带挂载配置的源 B则两套挂载配置都会被应用。Stacks全局策略注入与选择器Stacks 强制要求某些策略被分发到由 OCP 管理的 OPA 实例。OCP 构建 bundle 时会通过 Selectors 识别适用的 stacks然后把 stacks 通过requirements声明的源加入 bundle。以下场景适合使用 stacks存在临时性 OPA 部署如 CI/CD 流水线、Kubernetes 集群需要保证应用一套一致的策略存在全局或分层规则希望实现组织级策略并在众多 OPA 部署中自动强制。考虑这样一个例子组织内多个微服务使用 OPA 强制 API 授权规则每个微服务与 bundle 由独立团队拥有希望强制一条全局策略阻止出现在黑名单blocklist中的用户。Stacks 提供了一种便捷且可扩展的强制方式无需手动修改每个微服务的策略也无需要求每个团队都编写调用公共库的策略你只需定义一次该全局策略然后配置一个 stack 将其注入各微服务的 bundle 中。由于 Stacks 本质上涉及多个策略决策_冲突_可能发生详见 Conflict Resolution 小节。Selectors标签选择器OCP 构建 bundle 时会纳入所有适用 stack 的源。一个 stack 适用当且仅当满足以下两条选择器匹配 bundle 的 labels并且满足以下任一条件exclude 选择器不匹配 bundle 的 labels或exclude 选择器未定义。选择器与 exclude 选择器以相同方式求值。一个选择器匹配当选择器为空或选择器中的所有键都存在于 labels 中并且满足以下任一条件至少一个选择器值与对应 label 值匹配或选择器值为空[]选择器值与 label 值匹配当选择器值与 label 值相同或选择器值包含匹配 label 值的 glob 模式*。关于 glob 匹配OCP 实现了与 OPA 的 glob 内建函数 相同的匹配逻辑——仓库中builtinGlobMatch的实现即 OPA 侧glob.match内建函数它基于编译后的 glob 模式对目标字符串做匹配这与 OCP 在选择器求值时使用的语义保持一致。冲突解决Conflict Resolution当 stack 策略与 bundle 策略产生不同决策时称为_冲突_。类似地当多个 stacks 被纳入同一 bundle 时它们也可能产生冲突决策。在把最终决策返回给应用之前整体策略应通过组合不同决策来解决潜在冲突。一般而言冲突解决涉及产生决策的 bundle 策略每个产生独立决策的一个或多个 stack 策略一个**入口entrypoint**策略通过组合以上所有策略产生最终决策。模式一stack 的 deny 覆盖 bundle 的 allow该模式适用于bundle 所有者定义产生 allow 决策的策略单个 stack 所有者定义产生 deny 决策的策略返回给应用的最终决策应把 allow 置为 true当且仅当bundle 策略产生 allow即allow为 true且stack 策略未产生 deny即deny未定义或为 false。以一个简单示例说明两个 bundle 策略加一个 stack 策略。bundle 策略允许访问微服务 APIpetshop 服务和 notifications 服务stack 策略基于黑名单拒绝访问最后由入口策略组合 bundle 与 stack 策略产出最终决策。petshop 服务定义策略允许任何人查看宠物资料view pet profiles员工更新宠物资料update pet profilespackage service allow if { input.action view_pets } allow if { input.action update_pets input.principal.is_employee }notifications 服务定义策略允许客户订阅新闻简报package service allow if { input.action subscribe_to_newsletter input.principal.is_customer }stack 策略拒绝黑名单数据源中包含的用户package globalsecurity deny if { input.principal.username in data.blocklist }最后入口策略组合服务策略与 stack 策略产生最终决策package main main if { data.service.allow not data.mandatory.globalsecurity.deny }下面的配置展示了 bundles、sources、stacks 如何被组织在一起。注意automount: false由于 stack 的入口策略main包需要被单独挂载而 bundle 自身的策略位于service包下两者不会冲突automount用于控制 stack 源是否以 bundle 名自动挂载bundles: petshop-svc: labels: environment: prod requirements: - source: petshop-svc notifications-svc: labels: environment: prod requirements: - source: notifications-svc stacks: mandatory: selector: environment: [prod] requirements: - source: main automount: false - source: globalsecurity sources: petshop-svc: ... notifications-svc: ... globalsecurity: ... main: ...模式二stack 与 bundle 的 deny 取并集该模式适用于bundle 所有者定义产生一组 deny 原因deny reasons的策略stack 所有者定义产生 deny 原因集合的策略返回给应用的最终决策应为所有 deny 原因的并集。以简单示例说明一个 bundle 策略加两个 stack 策略最终决策由入口策略通过求并集生成。假设查询 OPA 的应用是 CI/CD 流水线中的一个作业它提供一组待部署的构建产物build artifacts。bundle 策略拒绝包含未带 qa 认证的产物的部署package pipeline deny contains msg if { some artifact in input.artifacts qa in artifact.attestations msg : sprintf(deployment contains untested artifact: %v, [artifact.name]) }第一个 stack 策略阻止不含 SBOM 的部署package pipelines.stacks.sbom deny contains deployments must contain sbom if { not input.sbom }第二个 stack 策略阻止包含关键 CVE 产物的部署package pipelines.stacks.cves deny contains msg if { some artifact in input.artifacts some cve in data.cves[artifact.sha] cve.level critical msg : sprintf(artifact contains critical cve: %v, [cve.id]) }入口策略对所有 deny 原因取并集以产生最终集合。由于 stacks 在构建时动态加入 bundle入口策略遍历stacks命名空间——只有适用的 stacks 才会出现在 bundle 中package pipelines deny contains msg if { some msg in data.pipeline.deny } deny contains msg if { some stackname some msg in data.pipelines.stacks[stackname].deny }注意这里的关键技巧some stackname遍历data.pipelines.stacks下实际存在的 stack 命名空间因此构建时未注入的 stack 不会产生任何 deny天然实现了仅组合已注入策略的语义。配置示例bundles: pipeline-a1234: labels: environment: prod type: pipeline requirements: - source: pipeline-a1234 options: no_default_stack_mount: true stacks: sbom: selector: environment: [prod] type: [pipeline] requirements: - source: sbom cves: selector: environment: [prod] type: [pipeline] requirements: - source: cves pipelines: selector: type: [pipeline] requirements: - source: pipelines sources: pipeline-a1234: ... sbom: ... cves: ... pipelines: ...no_default_stack_mount: true告诉 OCP 不要以默认方式把 stack 源挂载到 bundle 中从而让入口策略pipelines拥有对挂载命名空间的完全控制。Secrets凭据的集中管理目标Secrets 使 OCP 能够安全地与外部系统对象存储、Git、datasources 等通信而无需在配置文件中硬编码凭据。支持的 Secret 类型aws_auth用于 S3/MinIO 存储access key/secret keyaccess_key_idsecret_access_keysession_tokenbasic_auth用于 Git 或 HTTP(S) 源用户名/密码或 tokenusernamepasswordheadersgcp_auth用于 Google Cloud Storageapi_keycredentialsJSON 凭据文件azure_auth用于 Azure Blob Storageaccount_nameaccount_keygithub_app_auth用于以 GitHub App 身份认证integration_idinstallation_idprivate_key应用的 PEM 格式私钥ssh_key用于 ssh 密钥认证keyPEM 编码的 ssh 私钥passphrase可选ssh 密钥口令fingerprints可选ssh 密钥指纹token_auth用于 Bearer token 或 JWT token 认证tokenpassword用于 datasource 或数据库的基于密码的认证password配置示例secrets: s3-prod-creds: type: aws_auth access_key_id: ${S3_ACCESS_KEY_ID} secret_access_key: ${S3_SECRET_ACCESS_KEY} github-token: type: basic_auth username: ${GITHUB_USERNAME} password: ${GITHUB_TOKEN}Secret 值支持${VAR}环境变量插值这使凭据可以从环境变量或 Kubernetes Secret 注入避免出现在版本控制中。上文 bundle 示例中的credentials: s3-prod-creds、credentials: github-token即引用此处定义的 Secret。配置组织Configuration OrganizationOCP 配置文件可以组织为单个文件也可以拆分到多个文件与目录中。对于小型或简单部署单个配置文件可能已足够且更易管理。当定义应用application时常见实践是把相关的 bundles 与 sources 组织在同一个配置文件中——这使应用的策略逻辑与其数据源紧密耦合更新与评审都更直接。最佳实践建议将 Secrets 与特定环境environment-specific的覆盖配置放在单独的文件或目录中将每个应用的 bundles 与 sources 分组在一起使用词法命名与目录结构避免冲突在协作环境中对每个文件进行版本控制并采用基于目录的组织方式以支持团队工作流与自动化部署流水线。选择与你的运维复杂度匹配的粒度对较大的团队与环境倾向模块化对小规模部署保持简单。多配置文件与覆盖Multiple Configuration Files and Overrides执行 OCP 命令时通过-c/--config指定配置文件或目录的路径。该 flag 可以指向单个文件或目录如果提供目录OCP 会递归加载该目录及其所有子目录的内容并合并。默认行为OCP 合并对象键并覆盖标量值。文件按词法顺序加载最后一个设置标量或列表值的文件生效。如果指定了--merge-conflict-fail参数则标量和列表值永不被覆盖——若两个文件将同一字段设置为不同值将返回错误。这一合并语义在实战中非常有用例如把 tokensAPI 认证放在tokens.yaml、把凭据放在credentials.yaml、把每个应用的 bundles/sources 放在各自的my-alpha-app.yaml、my-beta-app.yaml中然后以opactl run --config/config.d/config.yaml --config/config.d/tokens.yaml ...的方式组合加载。仓库中的 Deploy as a Service 教程 展示了在 Kubernetes 中通过多个 configmap 文件完成配置的实际做法。从概念到实战完整的 OCP 工作流将以上概念串联起来一个典型的 OCP 工作流是定义 Sources从 Git 拉取团队策略从文件/目录读取本地数据用 HTTP datasource 引入外部数据定义 Bundles声明requirements装配来源配置object_storage决定分发目标S3/GCS/Azure/文件系统用labels标记环境与团队定义 Stacks用selector按 labels 匹配 bundle注入全局策略并通过入口策略entrypoint解决冲突定义 Secrets为 git、对象存储、datasource 配置认证凭据执行构建运行opactl buildOCP 检查命名空间冲突、应用 path/prefix 重写、按选择器注入 stack 策略、构建 bundle 并推送至对象存储OPA 消费OPA 实例从对象存储下载 bundle依据 bundle 的roots/metadata提供决策服务。关于opactl build之后如何配置 OPA 消费 bundle 并验证策略仓库中的 Quick Start 提供了一个可在本机完整走通的示例用opa run -s -w ./bundles/hello-world/bundle.tar.gz启动 OPA 监听 bundle再用curl localhost:8181/v1/data/rules/allow验证决策结果。小结OCP 的核心概念可以浓缩为四个相互配合的构件Bundles打包与分发单元受命名空间约束约束、Sources策略与数据的装配来源支持 path/prefix 命名空间重写、Stacks基于标签选择器的全局策略注入与冲突解决、Secrets外部系统认证的集中管理。在此基础上多文件配置与词法合并规则为大规模、多团队的组织提供了模块化基础。理解这些概念后你可以直接参照本文的 YAML 示例搭建自己的 OCP 配置并将 OCP 构建的 bundle 无缝接入本仓库 OPA 的 bundle 消费机制。赞分享后端认证鉴权云原生【免费下载链接】opaOpen Policy Agent (OPA) is an open source, general-purpose policy engine.项目地址https://gitcode.com/gh_mirrors/op/opa点击查看免费下载相关推荐OPA Control PlaneOCPREST API 完全参考Bundle、Source、Stack 与 Secrets 的声明式管理实战OPA Control PlaneOCPREST API 完全参考Bundle、Source、Stack 与 Secrets 的声明式管理实战 OPA C后端认证鉴权云原生OPA Control Plane (OCP) 快速入门集中式策略管理与 Bundle 构建实战OPA Control Plane OCP 快速入门集中式策略管理与 Bundle 构建实战 OPA Control Plane简称 OCP是 Open后端认证鉴权云原生OPA Control PlaneOCPKubernetes 部署实战Git 源、S3 Bundle 分发与动态 API 配置OPA Control PlaneOCPKubernetes 部署实战Git 源、S3 Bundle 分发与动态 API 配置 本篇技术指南围绕 OCP后端认证鉴权云原生创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考