GitHub Actions日志自动掩码accessToken原因及调试取消掩码方法
问题1:GitHub是否会自动识别accessToken类敏感数据做日志掩码?
不会靠字段名语义识别自动掩码。GitHub Actions的日志掩码是纯字符串匹配逻辑,不会检测字段名、也没有自动识别通用token格式的机制,只有两类值出现在日志里时会被替换为***:
- 存储在仓库、组织、环境级别的Secrets中的所有值,以及GitHub自动生成的内置凭证(比如默认的
GITHUB_TOKEN),这类值在工作流启动时就会被自动加入掩码列表 - 工作流运行过程中,主动通过
::add-mask::<值>命令标记为敏感的内容,后续日志中只要出现该字符串就会被掩码
你遇到的accessToken被替换、同接口user.id正常输出的情况,本质是接口返回的accessToken字符串,刚好和当前工作流掩码列表里的某个已注册敏感值完全一致,触发了替换,和字段名叫accessToken没有关系。
问题2:私有仓库调试时如何临时取消掩码打印真实值?
注意:以下操作仅建议在私有仓库、确认日志仅可信人员可访问的临时调试场景使用,调试完成后必须立刻删除打印逻辑,避免凭证泄露。
GitHub没有提供全局关闭日志掩码的开关,可通过以下方式绕过掩码匹配打印真实值:
- 如果你在之前的步骤里用
::add-mask::主动标记过该token,临时删除对应add-mask命令即可 - 如果是匹配到了工作流自动加载的Secret值,最直接的方式是对要打印的字符串做简单变形,破坏和掩码列表里字符串的完全匹配关系,参考示例:
- name: Temp Debug Token run: | # 保留你原有的token获取逻辑 accessToken=$(curl -k --request POST https://$LB_URL/auth \ --header 'Host: some.url.com' \ --header 'Content-Type: application/json' \ --data-raw '{ "type": "something", "payload": { "address": "sdfsdfsdfsdfsdfsdfsd", "signature": "sdfsdfsdfsdfsdfsdfsdfsd", "time": "2021-01-08 06:42:57 UTC" } }' | jq -r '.accessToken') # 方式1:每4个字符插入一个空格,破坏完整字符串匹配 echo $accessToken | sed 's/.\{4\}/& /g' # 方式2:打印base64编码后的值,本地解码即可拿到原文 echo $accessToken | base64
- 不要尝试直接开启Step Debug日志绕过掩码:只要值在掩码列表里,debug级别的日志依然会对对应字符串做替换,必须配合上述字符串变形的方式才能拿到真实值。
内容的提问来源于stack exchange,提问作者Kostas Demiris
相关产品推荐
相关产品推荐

