阅读我们的文章

.

我们如何在遵守 data governance 标准的同时自动管理一个拥有 50 多名用户的账户

越来越多的公司将 Snowflake 作为其 data platforms 的核心。即使是托管解决方案,您也必须管理环境。这可能是一个挑战,尤其是对大公司而言。.

挑战之一是 门禁. .它是任何 data governance 计划的关键部分。雪花计划提供 开箱即用的功能 来帮助应对这一挑战。但是,当您拥有几十个用户和数 TB 的 data 时,仅有内置功能是不够的。您需要考虑管理账户的策略。.

我们去过那里。对于其中一个 我们的客户, 我们管理着一个拥有 50 多个活跃用户的账户。我们设计了一个解决方案来扩展访问控制管理。.

本文将介绍过去一年的主要学习成果。.

最初情况

在我们加入公司之前,账户已经建立起来,很多好的想法也已付诸实施。. 自定义角色 已经创建。对用户进行了细致的管理。但也存在一些限制:

  • 行政管理已完成 人工 这花费了负责人大量的时间。.
  • Data 分析师和开发人员使用他们的账户进行自动化工作。这是一个问题,因为员工必须共享密码。除了严重的安全问题外,在员工离开公司时,还出现了因凭证被撤销而导致的错误。.
  • 有 无文件 的角色,因此很难对当前权限进行审计和定期审查。.

  • 用户完全由 Snowflake 管理。当员工离开公司时,Snowflake 环境的管理员必须意识到这一点。负责用户管理(Active Directory)的团队与负责 Snowflake 账户的团队并不相同。因此,前员工离职后有可能访问公司的 data。.

我们创建了一个新的系统来管理出入控制和克服这些缺陷。.

访问控制框架设计

首先,我们取消了所有用户的默认角色授权(SYSADMIN、USERADMIN......)......只有少数人能够担任这些角色。他们就是负责管理的人。.

其次,我们创建了一个基于自定义角色的访问控制框架。我们定义了两种自定义角色:

  • 访问角色 包括雪花对象上的一组低级权限。例如,访问角色可以包含特定 database 的只读权限。它们不会直接授予用户。.

  • 职能作用 是授予用户的角色。它们包含一组访问角色。它们是为特定团队创建的。.

我们选择在 data 基底级. .通过零拷贝克隆,它可以轻松地将权限从一个环境复制到另一个环境。这也是 权衡 我们赋予最终用户的灵活性与严格执行最小特权原则之间的矛盾。.

在 database 一级,我们定义了 3 个级别的访问角色:

  • 只读

  • 读写

  • 管理员

我们在仓库访问中也采用了类似的策略,有两种角色:

  • 用户

  • 管理员

下面是我们的框架说明。箭头代表补助金。.

Below is an illustration of our framework. Arrows represent grants. Snowflakes

此时,我们对如何管理权限有了更好的认识,但在用户管理方面也遇到了问题。.

用户管理

我们设立了 单点登录 以允许 Snowflake 用户 通过 Azure 活动目录 (AAD) 登录. .因此,我们消除了维护两个用户 database 的复杂性,而且离岗流程也更加稳健。事实上,我们只需在 AAD 中禁用用户,删除操作就会自动复制到 Snowflake 中。.

由于 AD 组和 Snowflake 中的角色之间存在映射关系,因此我们可以为创建的每个用户授予一个角色。我们对每个新用户都遵循相同的流程。.

  • 他们通过我们的票务系统发出请求,在请求中说明他们所属的团队以及他们在访问权限方面的需求
  • 我们将用户添加到相应的 AD 组中

  • 同步在后台进行

  • 用户可以访问 Snowflake,并可以使用我们授予他们的角色

这是真正的人类用户的流程,但它并没有解决本文开头提到的一个局限性:在自动工作中使用个人凭据。.

因此,我们推出了 服务账户. .服务账户管理与我们刚才描述的非常相似。唯一不同的是,我们为每个服务账户创建了一个功能角色。有一个 服务账户与其角色之间的一一对应关系. .因此,我们严格限制每个服务账户的权限范围。.

这些步骤都是很大的改进。一切都记录在案。团队迅速采用了新框架。我们很高兴。.

但是,我们仍然要花费大量时间手动授予访问权限,而且由于是手动操作,还很容易出错。显然,我们需要一个工具来自动完成这些任务。.

自动化救援

我们有几个选择:

  • 使用 雪花 Terraform 提供商 管理环境
  • 编写 bash 脚本,自动创建用户和授予权限
  • 用 Python 或 Go 等语言编写我们自己的 CLI

我们终于用 Python 创建了 CLI。.

我们更喜欢使用 Terraform 部署基础架构,而且只部署基础架构。开始使用 Terraform 管理用户和权限时,可能会出现意想不到的行为。例如,秘密轮换就很难管理。.

我们喜欢 bash,但仅限于临时和简单的操作。在这里,我们需要加载配置文件、与 Snowflake API 交互并操作 data 结构。这是可能的,但从长远来看很难维护。.

除此以外,我们还需要可靠性。实现这一点的方法之一就是编写测试。这在 Python 等编程语言中比较容易实现。.

当您执行该工具时,会在幕后发生以下情况。.

根据设计,该工具不会创建已经存在的角色。权限也是如此。工具会计算 配置与远程环境之间的差异 并进行必要的更改。这使我们能够避免任何停机时间。.

我们最初在本地运行该工具。但这可能会导致一些问题。例如,我们可能会遇到两个工程师试图同时进行修改的冲突。因此,我们设置了一个 工作流基于 Azure DevOps (ADO) 的 CI/CD 功能.

注:我们使用的是 ADO,但也可以使用 GitHub、GitLab 或 Bitbucket。.

下面是最终流程。.

Here is the final process of snowflakes

这种完全自动化的工作流程效果非常好。测试在 CI 管道的早期就能捕捉到默认设置。强制审查也是防止事故发生的一种方式。.

此外,拉取请求也是对所有需求的一种记录。.

结论

我们开始使用这个解决方案还不到一年。虽然实施初期需要投入一定的时间,但这是完全值得的。.

现在,我们把更多的时间花在了与用户讨论他们的要求上,而不是实际实现上。大多数请求只需约 10 行 YAML 即可解决。这非常高效,而且扩展性很好。我们仍然欢迎新用户的加入,我们可以满足他们的需求。此外,我们还解决了最初的问题。因此,这是一次成功!

感谢 萨米-杜吉 审阅本文并与我共同设计此解决方案的人

中号 Blog by Artefact。.

本文最初发表于 Medium.com.
在我们的 Medium Blog 上关注我们!