什么是机密?
在软件开发中,机密是一段敏感信息,用于对系统、服务、数据和 API 的访问权限进行身份验证或授权。 示例包括:
- API 密钥和访问令牌,使你能够与外部服务(例如 GitHub 的 REST API)进行交互********。 访问令牌还允许像 GitHub Actions 这样的服务执行需要身份验证的任务,正如我们稍后将进行的实验所示。
- 数据库凭据,授予对本地数据库和外部数据库和存储的访问权限****。
- 私钥(例如专用 SSH 和 PGP 密钥),可用于访问其他服务器并加密数据****。
由于机密提供如此多的访问权限,包括对关键系统的访问权限,因此我们完全理解确保机密安全的重要性****。
当机密被公开时,会发生什么情况?
- 攻击者可能会获得未经授权的访问,进入机密所允许访问的所有内容****。
- 黑客可能会窃取数据,包括敏感的用户数据****。 这可能会带来隐私和法律后果,并损害你和你的应用程序的信任。
- 如果黑客在你的云提供商帐户上运行未经授权的工作负载,公开的机密可能造成经济损失****。
- 黑客还可能会利用公开的机密删除、修改和干扰服务器,可能导致停机和数据丢失****。
请务必全面评估机密所授予的所有访问权限和能力,并警惕黑客可能借此实施的恶意行为。 例如,如果你的 GitHub 帐户的 personal access token 已被公开,黑客就能以你的身份在 GitHub 上发布内容和进行修改。
管理机密的最佳做法
要避免此类问题,请遵循最佳做法,以防止泄露,并降低泄密后的损失影响。
遵循小特权原则 (PoLP)
应尽可能限制机密的权限范围,仅授予必要的操作权限和访问范围。 例如:
- 如果机密仅用于读取数据而不对数据进行更改,请选择将其设置为只读****。
- 如果使用的 API 允许将机密限制为仅特定范围或权限,请仅选择你需要的范围或权限。**** 例如,如果只需要创建使用 GitHub 机密的议题,则机密没有理由访问仓库内容或其他任何内容。
- 如果机密将授予攻击者对拥有该机密的用户帐户的完全访问权限,请考虑创建服务帐户,以便拥有该机密的所有权****。
保护应用程序中的机密
- 从不硬编码机密。 始终使用环境变量或平台的机密管理工具(如 GitHub 的仓库机密)****。
- 如果必须与他人共享机密,请使用专用工具,例如密码管理器****。 请勿通过电子邮件或即时消息发送机密。
- 如果可能,请设置过期日期,并定期轮换机密;这降低了旧机密被利用的风险********。
- 如果应用程序生成日志,请确保在记录机密之前对其进行处理****。 否则,活动机密可能会保存到纯文本中。
如果公开机密,应尽量降低损失
- 即使机密只公开了一秒钟,也应视为已泄露,并立即撤销该机密****。 然后,生成一个新的机密并确保存储安全。
- 请检查任何可能显示已泄露机密被用于可疑操作的活动日志****。
- 分析机密被泄露的原因,并优化相关流程,避免类似问题再次出现。
GitHub 如何帮助保护你的机密安全
你可以采取许多措施来保护你的机密安全,而 GitHub 也提供了多种功能,帮助你守护这些机密。 人人都会犯错,而我们提供的功能可以帮助你捕捉那些不小心泄露的机密:
- 推送保护(我们稍后会进行试验),可阻止将机密推送到 GitHub 上的仓库。
- 机密扫描扫描仓库,并在发现机密时创建警报。 对于某些机密,我们还会通知提供商,以便他们可以采取措施,例如自动撤销这些机密。
练习安全地存储机密
在本练习中,我们将创建 personal access token 并将其存储在安全位置,以便可以将其与 GitHub Actions 一起使用。 我们将创建的操作是一个简单的工作流,用于响应议题。
1.创建练习仓库
首先创建一个要从其工作的仓库。 new2code
帐户有一个模板仓库,可用于快速入门。
- 导航到新仓库页面。 遵循此链接将在
new2code
帐户上预先选择模板。 - 在“Owner”下,确保已选择用户帐户。
- 在“Repository name”字段中,键入
secret-action
。 - 在说明字段下,选择“Public”,设置仓库可见性****。
- 单击“创建存储库”。
2.提交虚假令牌
人非圣贤,孰能无过。在编码过程中,难免会有不慎提交机密的情况发生。 在本练习中,我们将有意提交一个虚假令牌,以便熟悉并适应触发警报的流程****。
-
导航到刚创建的仓库。
-
单击文件列表中的
.github/workflows
,导航到 YAML 工作流文件。 -
单击文件列表中的
comment.yml
,打开工作流文件。 -
要编辑工作流文件,请在右上角单击 。
-
在第 13 行
GH_TOKEN: ""
上,在引号之间插入此虚假令牌:secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde
最终结果应如下所示:
GH_TOKEN: "secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde"
-
要尝试提交更改,请在右上角单击“Commit changes...”,然后在对话框中再次单击“Commit changes”********。
-
现在应会看到推送保护警报,内容为“Secret scanning found a GitHub Secret Scanning secret on line 13”。
如果我们现在不是在测试一个虚假令牌,那么这个操作就会提醒我们,我们已经离公开令牌只差一步之遥了。 查看可在警报上选择的选项。
-
要停止提交并避免公开机密,请单击“Cancel”。 在右上角,单击“Cancel changes”,然后放弃未保存的更改(如果出现提示)。
3.创建真实令牌
接下来,让我们尝试遵循最佳做法。 首先,我们将创建一个 personal access token,它将允许该操作代表你执行任务(它所创建的评论将显示为来自你的用户帐户)。
Note
请注意,我们在每个配置步骤中都需遵循最低权限原则。 你的令牌将具备最短的有效期、仅限访问所需的仓库,并且只拥有执行操作所必需的最低权限。
- 导航到新的 personal access token 页面。
- 在“Token name”下,为新令牌指定一个名称。 可以使用类似于“Action token”的内容。
- 在“Expiration”下,选择“7 days”。
- 在“Repository access”下,选择“Only select repositories”****。
- 在“Select repositories”下拉列表中,只需选择你之前创建的练习仓库****。
- 在“Permissions”部分的“Repository permissions”右侧,单击 ,查看所有可能的权限。
- 向下滚动到“Issues”,在右侧的下拉列表中,选择“Read and write”。
- 在页面底部,单击“Generate token”。 如果系统提示,请再次单击“Generate token”进行确认。
从这一刻起,必须确保安全地管理生成的令牌。 由于我们不久将使用该令牌,因此可以暂时将其复制到剪贴板。
4.安全地存储令牌
现在可以安全地将新令牌存储在仓库中。
-
导航到在练习开始时创建的仓库。
-
在存储库名称下,单击 “设置”。 如果看不到“设置”选项卡,请选择“”下拉菜单,然后单击“设置”。
-
在边栏的“安全性”部分中,选择 机密和变量,然后单击 操作。
-
在“Repository secrets”下,单击“New repository secret”****。
-
在“Name”字段中,键入机密的名称****。 在本练习中,我们将使用
MY_TOKEN
。 -
在“Secret”字段中,粘贴之前生成的 personal access token****。
-
单击“添加机密”。
你的机密现已安全加密,可供使用!
5.在操作中引用令牌
现在我们可以更新 YAML 工作流文件,使用该令牌并测试其是否生效。
-
导航回仓库。 如果你当前在仓库的设置页面,可以单击仓库名称下方的“ Code”****。
-
单击文件列表中的
.github/workflows
,导航到 YAML 工作流文件。 -
单击文件列表中的
comment.yml
,打开工作流文件。 -
要开始编辑工作流文件,请在右上角单击 。
-
在第 13 行
GH_TOKEN: ""
上,将空引号替换为${{ secrets.MY_TOKEN }}
。 这将引用我们之前添加的仓库机密。GH_TOKEN: ${{ secrets.MY_TOKEN }}
-
要提交更改,请在右上角单击“Commit changes...”****
-
在“Commit changes”对话框中,编辑“Commit message”以反映我们所做的更改。 例如,可以输入“Updating workflow to use repository secret”。
-
确保已选择“Commit directly to the
main
branch”。 -
单击“提交更改”。
6.测试令牌和工作流
我们现在应该一切已准备就绪! 接下来让我们来测试一下这个工作流吧。
-
在存储库名称下,单击 “问题”。
-
单击“新建问题”。
-
在“Add a title”下,可以键入喜欢的任何标题。
-
在文本区域中的“Add a description”下,键入
Hello
。 -
在文本区域下方,单击“Create”****。
工作流执行完成后,你应该会看到一条新的评论出现。 由于我们使用的是你的令牌,因此这条评论将显示为由你本人发布,并包含一个问候语作为回应。
后续步骤
要深入了解机密扫描和推送保护,可以在 GitHub Skills 中完成机密扫描简介课程。