ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

ZenML Service Connector 安全最佳实践:认证方法选型与凭据管理指南

ZenML Service Connector 安全最佳实践:认证方法选型与凭据管理指南 ZenML Service Connector 安全最佳实践认证方法选型与凭据管理指南【免费下载链接】zenmlZenML : One AI Platform from Pipelines to Agents. https://zenml.io.项目地址: https://gitcode.com/GitHub_Trending/ze/zenmlService Connector 是 ZenML 中用于安全连接云资源如 AWS、GCP、Azure、Kubernetes 集群、容器注册表等的核心机制。不同云平台提供了多种认证方式如何为不同场景选择最合适的认证方法、如何在共享凭据与保护凭据之间取得平衡是生产级 MLOps 平台落地时绕不开的问题。本文基于 ZenML 官方最佳实践文档结合仓库源码系统讲解用户名密码、隐式认证、长期凭据、临时凭据与角色扮演等认证模式的适用场景与安全权衡帮助你在配置 ZenML Service Connector 时做出有据可依的安全决策。Service Connector 类型尤其是面向云平台的那些提供了与远端云平台能力对齐的丰富认证方法。虽然目前并不存在一种统一所有流程的认证标准但仍有一些易于识别的模式可以作为选择认证方法配置 Service Connector 时的通用准则。本文探讨这些模式并就哪些认证方法最适合你的需求给出建议。需要说明的是理解本部分内容可能需要一定的认证与授权基础知识——文档尽量保持简洁并停留在高层概念上但部分领域仍会略显技术化。用户名密码Username and password最应避免的认证方式核心结论应尽可能避免使用主账户密码作为认证凭据。只要存在可用的替代认证方法或其他类型的凭据如会话令牌、API Key、API Token就应优先使用后者。如果别无选择也务必清楚知晓你正在把密码分享给哪些第三方——理想情况下密码永远不应离开本地主机或开发环境。用户名/账户名加密码是最典型的认证方式也是 Web 控制台和本地 CLI 登录的事实标准但它却是所有认证方法中安全性最差的一种绝不应该用于与团队或组织中的其他成员共享认证自动化工作负载。事实上云平台本身也不允许在认证云平台 API 时直接使用用户账户密码作为凭据总会存在一个流程将账户/密码凭据兑换为另一种形式的长期凭据。即使在文档中把密码列为凭据的服务例如 DockerHub也同时允许使用 API 访问密钥替代用户账户密码。隐式认证Implicit authentication零配置接入但需显式开启核心结论隐式认证能让你无需任何配置即可立即访问部分云资源但若要扩展初始允许访问的资源范围则需要额外投入。如果你关注可移植性、并希望他人能够复现你的结果这不是推荐的认证方式。安全警告该方法可能构成安全风险因为它会让用户获得与 ZenML Server 本身相同范围的云资源访问权限。因此所有隐式认证方法默认都是禁用的需要在 ZenML 部署中显式设置环境变量ZENML_ENABLE_IMPLICIT_AUTH_METHODS或 helm chart 中的enableImplicitAuthMethods配置项为true才能启用。“隐式认证”只是对下述行为的一种形象说法Service Connector 将使用本地存储的凭据、配置文件、环境变量以及运行环境中本地或云端可用的任何形式的认证信息。大多数云平台及其对应的 Service Connector 类型都包含某种形式的隐式认证能够自动发现并使用运行环境中的以下认证形态通过云平台 CLI 在本地设置并存储的配置与凭据通过环境变量传入的配置与凭据附着在工作负载环境本身的某种隐式认证——这仅适用于已经运行在云资源所在云平台内部的虚拟环境。不同云平台对此称呼不同但本质上是同一回事AWS如果你运行在 Amazon EC2、ECS、EKS、Lambda 或其他 AWS 云工作负载上凭据可以直接从instance metadata service实例元数据服务加载即使用附着在工作负载上的 IAM 角色来认证其他 AWS 服务而无需配置显式凭据GCP类似的metadata service元数据服务允许通过附着在 GCP 工作负载如 GCP VM 或 GKE 集群上的服务账号访问其他 GCP 云资源Azure可以通过 Azure Managed Identity托管身份 服务访问其他 Azure 服务同样无需显式凭据。隐式认证的可移植性限制选择隐式认证方法时需注意以下两点它们会影响后续的可移植性与可用性配合本地 ZenML 部署如默认部署或通过zenml login --local启动的本地 ZenML Server时隐式认证将使用你本地机器上配置的配置文件和凭据或环境变量。这些凭据不会提供给本地环境之外的任何人也无法被本地主机上其他环境例如本地 K3D Kubernetes 集群、本地 Docker 容器中的工作负载访问配合远端 ZenML Server时隐式认证仅在ZenML Server 与 Service Connector 类型所面向的云平台位于同一云时才生效。例如使用 AWS Service Connector 类型则 ZenML Server 也必须部署在 AWS如 EKS Kubernetes 集群中。你可能还需要手动调整 ZenML Server 所在远端云工作负载的云配置以允许访问资源例如为附着在 EC2 或 EKS 节点上的 AWS IAM 角色添加权限、为附着在 GKE 集群节点上的 GCP 服务账号添加角色。GCP 隐式认证示例以下示例展示了使用 GCP Service Connector 的隐式认证方法立即获得 ZenML Server 也能访问的所有 GCP 资源的访问权。注意这之所以可行正是因为 ZenML Server 也部署在 GCPGKE 集群且集群附着了一个具备项目资源访问权限的 GCP 服务账号zenml service-connector register gcp-implicit --type gcp --auth-method implicit --project_idzenml-core示例命令输出注册成功并列出可访问资源Successfully registered service connector gcp-implicit with access to the following resources: ┏━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ RESOURCE TYPE │ RESOURCE NAMES ┃ ┠───────────────────────┼─────────────────────────────────────────────────┨ ┃ gcp-generic │ zenml-core ┃ ┠───────────────────────┼─────────────────────────────────────────────────┨ ┃ gcs-bucket │ gs://annotation-gcp-store ┃ ┃ │ gs://zenml-bucket-sl ┃ ┃ │ gs://zenml-core.appspot.com ┃ ┃ │ gs://zenml-core_cloudbuild ┃ ┃ │ gs://zenml-datasets ┃ ┃ │ gs://zenml-internal-artifact-store ┃ ┃ │ gs://zenml-kubeflow-artifact-store ┃ ┃ │ gs://zenml-project-time-series-bucket ┃ ┠───────────────────────┼─────────────────────────────────────────────────┨ ┃ kubernetes-cluster │ zenml-test-cluster ┃ ┠───────────────────────┼─────────────────────────────────────────────────┨ ┃ docker-registry │ gcr.io/zenml-core ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛从源码层面看隐式认证的开关受两层约束其一Service Connector 实例可以显式设置allow_implicit_auth_methods跳过检查其二未显式放行时会通过handle_bool_env_var(ENV_ZENML_ENABLE_IMPLICIT_AUTH_METHODS)读取环境变量来决定是否放行否则抛出AuthorizationException见 service_connector.py。对应的环境变量定义在 constants.pyhelm 部署则通过 values.yaml 中的enableImplicitAuthMethods及各云平台authMethod的implicit选项进行配置。长期凭据Long-lived credentials, API keys, account keys推荐的凭据底座核心结论长期凭据是认证方法的“魔法配方”。当它与自动生成短期 API Token、或账户模拟/角色扮演等能力搭配使用时是理想的认证机制——尤其是在生产环境使用 ZenML、以及与 ZenML 团队其他成员共享结果时。作为通用最佳实践云平台也尤其擅长这一点账户密码从不会直接用作云平台 API 认证的凭据总是存在一个流程把账户/密码凭据兑换为另一种长期凭据AWS使用aws configureCLI 命令GCP提供gcloud auth application-default loginCLI 命令Azure提供az loginCLI 命令。你的原始登录信息不会存储在本地也不会用于访问工作负载取而代之的是会生成 API Key、账户密钥account key或其他形式的中间凭据存储在本地主机上用于向远端云服务 API 完成认证。提示使用 Service Connector 注册的**自动配置auto-configuration**功能时这类凭据通常就是被自动识别并从本地机器提取出来的凭据类型。不同云平台对这些长期凭据的命名各不相同但通常代表同一概念仅在身份信息与所附着权限级别上略有差异AWS有账户访问密钥Account Access Keys与 IAM 用户访问密钥IAM User Access KeysGCP有用户账户凭据User Account Credentials与服务账号凭据Service Account Credentials。总体上可以区分以下两类凭据用户凭据user credentials代表人类用户通常直接绑定到用户账户身份。这类凭据通常关联非常广泛的权限范围因此不建议在本地主机范围之外共享或使用服务凭据service credentials用于自动化流程与程序化访问无人类直接参与。它们不直接绑定用户账户身份而是绑定服务账号、IAM 用户等其他形式的记账主体专为非人类主体设计。这类凭据通常还可以限制权限范围因此更适合与更广泛的受众共享。ZenML 云平台 Service Connector 两类凭据都支持但应尽可能使用服务凭据而非用户凭据尤其是在生产环境中。将 ML 流水线等自动化工作负载附着到服务账号而非用户账号既为用户身份增加了一层额外保护也有助于落实另一项安全最佳实践——最小权限原则least-privilege principle为每个主体只授予其正常运作所需的最低权限。仅靠长期凭据本身仍不理想一旦泄露即使权限受限也存在安全风险。好消息是ZenML Service Connector 提供了额外的机制与长期凭据组合使用时可以让长期凭据更安全地与 ZenML 用户及自动化工作负载共享自动从长期凭据生成临时凭据甚至降低其权限范围以落实最小权限原则实现账户模拟与角色扮演的认证方案。生成临时凭据与降权凭据Generating temporary and down-scoped credentials生产环境的首选大多数使用长期凭据的认证方法还实现了额外的机制来进一步降低凭据意外暴露与安全事故风险使其非常适合生产环境。签发临时凭据Issuing temporary credentials这种认证策略将长期凭据安全地存储在 ZenML Server 上远离实际 API 客户端以及需要认证远端资源的用户。取而代之的是向客户端签发具有有限生命周期、到期即失效的 API Token。Service Connector 能够按需need-to-have basis从长期凭据生成这些 API Token。例如AWS Service Connector 的 Session Token、Federation Token 和 IAM Role 认证方法以及 GCP Service Connector 支持的基本所有认证方法都具备这一能力。AWS 临时凭据示例以下示例展示 AWS Service Connector 配置的长期凭据保存在 ZenML Server 上与客户端实际收到并用于访问资源的临时 Kubernetes API Token 凭据之间的差异。首先查看为 AWS Service Connector 配置的长期凭据zenml service-connector describe eks-zenhacks-cluster示例命令输出注意 AUTH METHOD 为session-token配置中aws_access_key_id与aws_secret_access_key均显示[HIDDEN]Service connector eks-zenhacks-cluster of type aws with id be53166a-b39c-4e39-8e31-84658e50eec4 is owned by user default and is private. eks-zenhacks-cluster aws Service Connector Details ┏━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ PROPERTY │ VALUE ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ ID │ be53166a-b39c-4e39-8e31-84658e50eec4 ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ NAME │ eks-zenhacks-cluster ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ TYPE │ aws ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ AUTH METHOD │ session-token ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ RESOURCE TYPES │ kubernetes-cluster ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ RESOURCE NAME │ zenhacks-cluster ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ SECRET ID │ fa42ab38-3c93-4765-a4c6-9ce0b548a86c ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ SESSION DURATION │ 43200s ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ EXPIRES IN │ N/A ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ OWNER │ default ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ SHARED │ ➖ ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ CREATED_AT │ 2023-06-16 10:15:26.393769 ┃ ┠──────────────────┼──────────────────────────────────────┨ ┃ UPDATED_AT │ 2023-06-16 10:15:26.393772 ┃ ┗━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ Configuration ┏━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━┓ ┃ PROPERTY │ VALUE ┃ ┠───────────────────────┼───────────┨ ┃ region │ us-east-1 ┃ ┠───────────────────────┼───────────┨ ┃ aws_access_key_id │ [HIDDEN] ┃ ┠───────────────────────┼───────────┨ ┃ aws_secret_access_key │ [HIDDEN] ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━┛然后查看签发给客户端的临时凭据。注意 Kubernetes API Token 的过期时间zenml service-connector describe eks-zenhacks-cluster --client示例命令输出AUTH METHOD 变为tokenEXPIRE IN 为约 12 小时的倒计时Service connector eks-zenhacks-cluster (kubernetes-cluster | zenhacks-cluster client) of type kubernetes with id be53166a-b39c-4e39-8e31-84658e50eec4 is owned by user default and is private. eks-zenhacks-cluster (kubernetes-cluster | zenhacks-cluster client) kubernetes Service Connector Details ┏━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ PROPERTY │ VALUE ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ ID │ be53166a-b39c-4e39-8e31-84658e50eec4 ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ NAME │ eks-zenhacks-cluster (kubernetes-cluster | zenhacks-cluster client) ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ TYPE │ kubernetes ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ AUTH METHOD │ token ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ RESOURCE TYPES │ kubernetes-cluster ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ RESOURCE NAME │ arn:aws:eks:us-east-1:715803424590:cluster/zenhacks-cluster ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ SECRET ID │ ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ SESSION DURATION │ N/A ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ EXPIRES IN │ 11h59m57s ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ OWNER │ default ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ SHARED │ ➖ ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ CREATED_AT │ 2023-06-16 10:17:46.931091 ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────┨ ┃ UPDATED_AT │ 2023-06-16 10:17:46.931094 ┃ ┗━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ Configuration ┏━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ PROPERTY │ VALUE ┃ ┠───────────────────────┼──────────────────────────────────────────────────────────────────────────┨ ┃ server │ https://A5F8F4142FB12DDCDE9F21F6E9B07A18.gr7.us-east-1.eks.amazonaws.com ┃ ┠───────────────────────┼──────────────────────────────────────────────────────────────────────────┨ ┃ insecure │ False ┃ ┠───────────────────────┼──────────────────────────────────────────────────────────────────────────┨ ┃ cluster_name │ arn:aws:eks:us-east-1:715803424590:cluster/zenhacks-cluster ┃ ┠───────────────────────┼──────────────────────────────────────────────────────────────────────────┨ ┃ token │ [HIDDEN] ┃ ┠───────────────────────┼──────────────────────────────────────────────────────────────────────────┨ ┃ certificate_authority │ [HIDDEN] ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛签发降权凭据Issuing downscoped credentials除了签发临时凭据部分认证方法还支持把生成的临时 API Token 限制为访问目标资源或资源集所需的最小权限集。目前 AWS Service Connector 的 Federation Token 与 IAM Role 认证方法支持该能力。以下示例证明即使源 AWS Service Connector 能用其长期凭据访问多个 S3 bucket签发给 S3 客户端的 AWS 客户端 Token 也只能访问它被签发的那个 S3 bucket。首先注册一个可访问多个 bucket 的 federation-token 连接器zenml service-connector register aws-federation-multi --type aws --auth-methodfederation-token --auto-configure示例命令输出可见其可访问多个 S3 bucket、Kubernetes 集群与 ECR 仓库Successfully registered service connector aws-federation-multi with access to the following resources: ┏━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ RESOURCE TYPE │ RESOURCE NAMES ┃ ┠───────────────────────┼──────────────────────────────────────────────┨ ┃ aws-generic │ us-east-1 ┃ ┠───────────────────────┼──────────────────────────────────────────────┨ ┃ s3-bucket │ s3://aws-ia-mwaa-715803424590 ┃ ┃ │ s3://zenfiles ┃ ┃ │ s3://zenml-demos ┃ ┃ │ s3://zenml-generative-chat ┃ ┃ │ s3://zenml-public-datasets ┃ ┃ │ s3://zenml-public-swagger-spec ┃ ┠───────────────────────┼──────────────────────────────────────────────┨ ┃ kubernetes-cluster │ zenhacks-cluster ┃ ┠───────────────────────┼──────────────────────────────────────────────┨ ┃ docker-registry │ 715803424590.dkr.ecr.us-east-1.amazonaws.com ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛接下来用 ZenML Python Client 验证签发给客户端的降权凭据确实被限制为客户端请求访问的那个 S3 bucketfrom zenml.client import Client client Client() # Get a Service Connector client for a particular S3 bucket connector_client client.get_service_connector_client( name_id_or_prefixaws-federation-multi, resource_types3-bucket, resource_ids3://zenfiles ) # Get the S3 boto3 python client pre-configured and pre-authenticated # from the Service Connector client s3_client connector_client.connect() # Verify access to the chosen S3 bucket using the temporary token that # was issued to the client. s3_client.head_bucket(Bucketzenfiles) # Try to access another S3 bucket that the original AWS long-lived credentials can access. # An error will be thrown indicating that the bucket is not accessible. s3_client.head_bucket(Bucketzenml-demos)示例输出访问目标 bucket 成功返回 200访问其他 bucket 抛出 403 Forbidden from zenml.client import Client client Client() Unable to find ZenML repository in your current working directory (/home/stefan/aspyre/src/zenml) or any parent directories. If you want to use an existing repository which is in a different location, set the environment variable ZENML_REPOSITORY_PATH. If you want to create a new repository, run zenml init. Running without an active repository root. # Get a Service Connector client for a particular S3 bucket connector_client client.get_service_connector_client( ... name_id_or_prefixaws-federation-multi, ... resource_types3-bucket, ... resource_ids3://zenfiles ... ) # Get the S3 boto3 python client pre-configured and pre-authenticated # from the Service Connector client s3_client connector_client.connect() # Verify access to the chosen S3 bucket using the temporary token that # was issued to the client. s3_client.head_bucket(Bucketzenfiles) {ResponseMetadata: {RequestId: 62YRYW5XJ1VYPCJ0, HostId: YNBXcGUMSOh90AsTgPW6/Ra89mqzfN/arQq/FMcJzYCK98cFx539LLfAKzZaLhwaiJTms3mnU, HTTPStatusCode: 200, ...}} # Try to access another S3 bucket that the original AWS long-lived credentials can access. # An error will be thrown indicating that the bucket is not accessible. s3_client.head_bucket(Bucketzenml-demos) ClientError: An error occurred (403) when calling the HeadBucket operation: Forbidden从源码看get_connector_client是上述流程的核心入口它会先校验资源类型与资源 ID、检查凭据是否过期has_expired、验证连接器是否允许访问请求的资源再通过_get_connector_client生成一个可能配置了不同凭据、甚至不同类型例如 AWS → Kubernetes的客户端实例返回给调用方见 service_connector.py。AWS 认证方法常量SESSION_TOKEN、FEDERATION_TOKEN、IAM_ROLE、STS_TOKEN、IMPLICIT均定义于 aws_service_connector.pyGCP 侧的SERVICE_ACCOUNT、OAUTH2_TOKEN、IMPERSONATION等认证方法定义于 gcp_service_connector.py。账户模拟与角色扮演Impersonating accounts and assuming roles灵活性与控制力最强核心结论这类认证方法需要更多前期工作因为需要根据目标受众预先在云平台中开通多个承载权限的账号与角色。但另一方面它们也提供了最大的灵活性与控制力。尽管存在运维成本但如果你是平台工程师、具备理解并搭建认证资源所需的基础设施知识这类方法非常适合你。这些认证方法提供了另一种在 Service Connector 中配置长期凭据而不向客户端暴露它们的方式尤其适合作为那些不支持自动降低签发临时 Token 权限的云平台 Service Connector 认证方法的替代方案。账户模拟与角色扮演的流程非常相似可概括如下用与主用户账号或主服务账号更推荐关联的长期凭据配置 Service Connector。作为最佳实践通常给这些凭据附加精简的权限甚至零权限仅保留允许执行账户模拟或角色扮演操作所需的权限。这样即使主凭据意外泄露也难以造成实质损害除主账号及其长期凭据外还需要在云平台中预先开通一个或多个承载访问目标资源所需有效权限的次级访问主体一个或多个 IAM 角色供角色扮演assume一个或多个服务账号供账户模拟impersonateService Connector 配置中还需要包含目标 IAM 角色名称或待模拟的服务账号名称收到请求时Service Connector 会将与主账号关联的长期凭据兑换为仅具有目标 IAM 角色或服务账号权限的短期 API Token。这些临时凭据签发给客户端用于访问目标资源而长期凭据则被安全保管永远不必离开 ZenML Server 边界。GCP 账户模拟示例本示例在 GCP 中准备了以下资源主服务账号empty-connectorszenml-core.iam.gserviceaccount.com除 Service Account Token Creator 角色允许其模拟下面的次级服务账号外无任何权限并为该账号生成服务账号密钥次级服务账号zenml-bucket-slzenml-core.iam.gserviceaccount.com仅有访问zenml-bucket-slGCS bucket 的权限。首先证明empty-connectors服务账号没有访问任何 GCS bucket或其他资源的权限——注册一个直接使用服务账号密钥长期凭据的普通 GCP Service Connectorzenml service-connector register gcp-empty-sa --type gcp --auth-method service-account --service_account_jsonempty-connectorszenml-core.json --project_idzenml-core示例命令输出列出资源时报授权失败无权访问 GCS bucket 与 GKE 集群Expanding argument value service_account_json to contents of file /home/stefan/aspyre/src/zenml/empty-connectorszenml-core.json. Successfully registered service connector gcp-empty-sa with access to the following resources: ┏━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ RESOURCE TYPE │ RESOURCE NAMES ┃ ┠───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────┨ ┃ gcp-generic │ zenml-core ┃ ┠───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────┨ ┃ gcs-bucket │ error: connector authorization failure: failed to list GCS buckets: 403 GET ┃ ┃ │ https://storage.googleapis.com/storage/v1/b?projectzenml-coreprojectionnoAclprettyPrint ┃ ┃ │ false: empty-connectorszenml-core.iam.gserviceaccount.com does not have ┃ ┃ │ storage.buckets.list access to the Google Cloud project. Permission storage.buckets.list ┃ ┃ │ denied on resource (or it may not exist). ┃ ┠───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────┨ ┃ kubernetes-cluster │ error: connector authorization failure: Failed to list GKE clusters: 403 Required ┃ ┃ │ container.clusters.list permission(s) for projects/20219041791. [request_id: ┃ ┃ │ 0xcb7086235111968a ┃ ┃ │ ] ┃ ┠───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────┨ ┃ docker-registry │ gcr.io/zenml-core ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛接着注册一个真正使用账户模拟来访问zenml-bucket-slGCS bucket 的 GCP Service Connector并验证其可以访问该 bucketzenml service-connector register gcp-impersonate-sa --type gcp --auth-method impersonation --service_account_jsonempty-connectorszenml-core.json --project_idzenml-core --target_principalzenml-bucket-slzenml-core.iam.gserviceaccount.com --resource-type gcs-bucket --resource-id gs://zenml-bucket-sl示例命令输出通过模拟--target_principal指定的服务账号成功获得对目标 bucket 的访问权Expanding argument value service_account_json to contents of file /home/stefan/aspyre/src/zenml/empty-connectorszenml-core.json. Successfully registered service connector gcp-impersonate-sa with access to the following resources: ┏━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┓ ┃ RESOURCE TYPE │ RESOURCE NAMES ┃ ┠───────────────┼──────────────────────┨ ┃ gcs-bucket │ gs://zenml-bucket-sl ┃ ┗━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━┛从源码结构看GCP 的 impersonation 是service-account认证的一个特殊形态在 gcp_service_connector.py 中二者共用同一套凭据提取逻辑区别在于 impersonation 额外通过--target_principal指定被模拟的服务账号从而换取目标服务账号权限的短期 STS 凭据。这与文档中“账户模拟/角色扮演是长期凭据 次级权限主体”的模型完全吻合。短期凭据Short-lived credentials用于临时授权实用性有限核心结论这类认证方法使用显式配置在 Service Connector 中、或由 Service Connector 在自动配置期间生成的临时凭据。在所有可用认证方法中它可能是实用性最低的一种日常使用中很可能永远用不到——因为短期凭据一旦过期Service Connector 就会失效需要手动更新或替换。另一方面如果你希望在不暴露长期凭据的前提下授予团队中其他人对某些资源的临时访问权这种认证方法就很理想。前文已经介绍过大多数云平台 Service Connector 都可以从其他长期凭据自动生成临时凭据。顺理成章地临时凭据也可以由外部手段如云平台 CLI手动生成后直接用于配置 Service Connector或在 Service Connector 自动配置期间自动生成。这可以作为一种方式授予外部方对某些资源的临时访问权并让 Service Connector 在一段时间后自动失效即过期。你的长期凭据保持安全Service Connector 只存储一个短期凭据。AWS 短期凭据自动配置示例以下示例使用 Service Connector 自动配置从本地云平台 CLI此处为 AWS配置的长期凭据自动生成短期 TokenAWS_PROFILEconnectors zenml service-connector register aws-sts-token --type aws --auto-configure --auth-method sts-token示例命令输出注册成功并列出可访问资源⠸ Registering service connector aws-sts-token... Successfully registered service connector aws-sts-token with access to the following resources: ┏━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ RESOURCE TYPE │ RESOURCE NAMES ┃ ┠───────────────────────┼──────────────────────────────────────────────┨ ┃ aws-generic │ us-east-1 ┃ ┠───────────────────────┼──────────────────────────────────────────────┨ ┃ s3-bucket │ s3://zenfiles ┃ ┃ │ s3://zenml-demos ┃ ┃ │ s3://zenml-generative-chat ┃ ┃ │ s3://zenml-public-datasets ┃ ┠───────────────────────┼──────────────────────────────────────────────┨ ┃ kubernetes-cluster │ zenhacks-cluster ┃ ┠───────────────────────┼──────────────────────────────────────────────┨ ┃ docker-registry │ 715803424590.dkr.ecr.us-east-1.amazonaws.com ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛现在 Service Connector 配置了一个会在一定时间后过期的短期 Token。查看连接器即可验证其临时性zenml service-connector describe aws-sts-token示例命令输出AUTH METHOD 为sts-token配置中多了aws_session_token字段且均为[HIDDEN]Service connector aws-sts-token of type aws with id 63e14350-6719-4255-b3f5-0539c8f7c303 is owned by user default and is private. aws-sts-token aws Service Connector Details ┏━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ PROPERTY │ VALUE ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ ID │ e316bcb3-6659-467b-81e5-5ec25bfd36b0 ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ NAME │ aws-sts-token ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ TYPE │ aws ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ AUTH METHOD │ sts-token ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ RESOURCE TYPES │ aws-generic, s3-bucket, kubernetes-cluster, docker-registry ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ RESOURCE NAME │ multiple ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ SECRET ID │ 971318c9-8db9-4297-967d-80cda070a121 ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ SESSION DURATION │ N/A ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ EXPIRES IN │ 11h58m17s ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ OWNER │ default ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ SHARED │ ➖ ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ CREATED_AT │ 2023-06-19 17:58:42.999323 ┃ ┠──────────────────┼─────────────────────────────────────────────────────────────────────────┨ ┃ UPDATED_AT │ 2023-06-19 17:58:42.999324 ┃ ┗━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ Configuration ┏━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━┓ ┃ PROPERTY │ VALUE ┃ ┠───────────────────────┼───────────┨ ┃ region │ us-east-1 ┃ ┠───────────────────────┼───────────┨ ┃ aws_access_key_id │ [HIDDEN] ┃ ┠───────────────────────┼───────────┨ ┃ aws_secret_access_key │ [HIDDEN] ┃ ┠───────────────────────┼───────────┨ ┃ aws_session_token │ [HIDDEN] ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━┛注意该 Service Connector 的临时属性——它将在 12 小时内失效zenml service-connector list --name aws-sts-token示例命令输出EXPIRES IN 显示约 11 小时 57 分钟的倒计时┏━━━━━━━━┯━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━━━━┯━━━━━━━━┓ ┃ ACTIVE │ NAME │ ID │ TYPE │ RESOURCE TYPES │ RESOURCE NAME │ SHARED │ OWNER │ EXPIRES IN │ LABELS ┃ ┠────────┼───────────────┼─────────────────────────────────┼────────┼───────────────────────┼───────────────┼────────┼─────────┼────────────┼────────┨ ┃ │ aws-sts-token │ e316bcb3-6659-467b-81e5-5ec25bf │ aws │ aws-generic │ multiple │ ➖ │ default │ 11h57m12s │ ┃ ┃ │ │ d36b0 │ │ s3-bucket │ │ │ │ │ ┃ ┃ │ │ │ │ kubernetes-cluster │ │ │ │ │ ┃ ┃ │ │ │ │ docker-registry │ │ │ │ │ ┃ ┗━━━━━━━━┷━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━┷━━━━━━━━┷━━━━━━━━━┷━━━━━━━━━━━━┷━━━━━━━━┛总结如何为你的场景选择认证方法将本文的几类认证模式放在一起可以形成一张清晰的决策参考认证模式凭据存放位置安全性适用场景限制与注意点用户名密码本地/共享最低几乎不适用绝不共享、不用于自动化密码不应离开本地主机隐式认证implicit运行环境本地 CLI 配置、环境变量、云元数据服务中取决于环境本地快速接入、与 ZenML Server 同云部署默认禁用需显式开启可移植性差授予与 ZenML Server 同等范围的访问长期凭据API key / account keyZenML Server加密存储中作为其他安全机制的基础凭据泄露即风险应优先使用服务凭据并遵循最小权限原则临时 降权凭据客户端侧短期 Token高生产环境首选依赖云平台能力AWS Session/Federation/IAM RoleGCP 大部分方法账户模拟 / 角色扮演ZenML Server 云平台预置角色最高控制力最强平台工程团队、多团队共享资源需提前开通 IAM 角色/服务账号运维成本高短期凭据sts-token 等客户端侧临时 Token高临时授权外部方访问过期即失效需手动更新或替换实用性有限推荐组合在团队共享与生产环境中首选「长期凭据 自动签发临时/降权 Token」或「长期凭据 账户模拟/角色扮演」的组合——长期凭据始终安全地保存在 ZenML Server 上客户端只接触生命周期有限的临时凭据权限范围也被严格限制在目标资源之内。这既落实了最小权限原则也让 ZenML Server 成为凭据的唯一保管边界。进一步阅读可以继续查看 Service Connectors 使用指南 了解注册与使用流程认证管理 了解 ZenML 如何安全存储与托管这些凭据以及各云平台的 Service Connector 类型文档AWS、GCP、Azure查看每种认证方法的具体参数与命令行选项。【免费下载链接】zenmlZenML : One AI Platform from Pipelines to Agents. https://zenml.io.项目地址: https://gitcode.com/GitHub_Trending/ze/zenml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表