在本文中,我将分享一种安全地将敏感信息提交给版本控制系统(VCS)的方法。重点将是提交 AWS 凭证,但该方法也适用于 Azure 和谷歌云平台(GCP)。
重现结果的代码可以在这里找到。
本文面向数据科学家;您没有软件开发背景,因此不了解软件工程的最佳实践。然而,从这个搜索结果来看,似乎总的来说开发者也能受益。
假设您是一名初级数据科学家,负责构建一个管道来分析文本数据。自然,这个任务包括在 S3 桶周围移动文件,并调用各种 AWS 服务来做诸如情感分析、命名实体识别、主题建模等事情。
您将获得一组允许您访问这些服务的凭据。您决定通过环境变量进行身份验证,因此您编写了一个名为env.sh
的脚本,它执行以下操作:
图 1:导出环境变量以认证 AWS 服务的脚本
你应该把这个剧本交给你的 VCS 吗?
提交这个脚本可以方便您的同事从您停止的地方继续工作。他们不需要搜索合适的凭证。他们只需要克隆你的回购,一切都将开箱即用。
但是,提交该脚本存在安全风险。想象一下,有人入侵/泄露了你公司 VCS 服务器的内容。或者,也许你的公司有一天决定开源这个回购协议,从而意外地将他们的私人信息暴露给全世界,因为他们忘记了将它从回购协议的历史中抹去。
有没有兼顾便利性和安全性的解决方案?
为了使事情更加具体,我们将使用下面的脚本main.py
:
图 2:main . py 的内容
用python main.py "this movie is really awesome!"
调用main.py
会调用亚马逊领悟为文本"this movie is really awesome!"
产生一个情感分类和置信度评分,像这样:
图 3:main . py 的示例输出
本文中与main.py
相关的部分是第 8 行,它为所需的服务创建了一个客户机,并依赖于AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
环境变量的存在来进行认证。因此,您需要在运行main.py
之前执行source env.sh
。
现在的问题是:我们应该如何承诺env.sh
?
解决方案包括使用名为 sops 的工具对env.sh
进行加密,并使用 AWS KMS 来管理加密和解密过程的密钥。Sops 可以在 Windows、Linux 和 Mac 上运行,并且可以与 AWS KMS 以及 Azure 和 GCP 的类似服务很好地集成。
在使用 sop 加密env.sh
之前,我们需要经历几个步骤。
就 AWS 服务而言,您需要访问 AWS KMS 的客户管理密钥(CMK)。一种方法是让您的帐户管理员为您创建和管理此密钥,并创建另一个 IAM 用户,其唯一目的是能够使用此密钥进行文件加密/解密。我们姑且称这个用户为sops-user
。
作为普通帐户用户,您只需遵循以下步骤:
- 安装 sop。点击此处为您的机器下载相关软件包。
- 更新您的 AWS 凭证文件以包含
sop-user
的凭证:
图 4:插入 AWS 凭证文件的额外内容
3.定义SOPS_KMS_ARN
环境变量,以便 sop 知道在哪里可以找到 CMK:
图 5:如何告诉 sop 使用哪个 CMK
解决了这个问题,我们现在准备加密env.sh
。
加密env.sh
只是一个执行的问题:
图 6:如何加密 env.sh
这是加密过程后env.sh
的样子:
图 7:加密后的 env.sh 片段
运行source env.sh
将会抛出一个错误,因为env.sh
不再是一个有效的 shell 脚本。
在调用source
之前,您需要解密env.sh
。你可以这样做:
图 8:如何获得加密的 env.sh
让我们花点时间来考虑一下上一节中的解决方案实现了什么。
加密形式的env.sh
(图 7)仍然可读,但实际上是乱码。因此,它可以安全地提交给贵公司的 VCS。
如果这个回购被黑或者泄露给公众会怎么样?如果没有正确的密钥来解密,几乎不可能恢复存储在中的凭据,因为只有密钥可以访问它。请注意,sops-user
的凭证永远不会提交给回购。
在合作方面,你的同事只需要知道sops-user
的凭证就可以解密env.sh
,继续开发main.py
。
因此,这种解决方案是方便性和安全性之间的一个很好的折衷。
本文介绍了一种提交敏感信息的简单方法,即使用名为 sops 的工具,并利用云服务提供商提供的服务。
如果你有任何问题或者想分享替代方法,请在评论中告诉我。