Serverless 供应链最小权限实战
Serverless 函数多源输入导致的供应链安全风险及防护最佳实践
我见过不少 Serverless 函数,代码其实写得不差,问题却出在权限上:一个本来只该处理对象通知的函数,顺手拿到了读取更多数据、写入更多资源,甚至调用无关服务的能力。平时感觉“省事”,一旦事件入口或依赖出了问题,这种方便就会变成放大器。
Serverless 的麻烦在于,函数常常不只接 HTTP 请求。消息、对象存储、邮件或其他云服务事件,都可能把内容送进同一段业务逻辑。只要其中一个入口校验宽松,攻击者就可能借由文件名、对象路径或消息字段,把不可信数据推进后续流程。此时,函数拥有什么权限,决定了风险能走多远。
权限要按动作拆,不要按项目打包
我更倾向于把每个函数当成一张独立的“授权清单”。它需要读什么资源、写什么资源、允许调用谁,都应当能说清楚。只读的处理函数,不该同时拥有删除和写入权限;只消费消息的函数,也没理由默认访问全部数据存储。
尤其要留意输入会影响资源标识的地方。若对象路径、文件名或消息字段能够决定函数访问哪个资源,权限范围就必须更窄,同时先做来源、类型和结构校验。否则,代码里看似正常的一次读取,可能被恶意输入带去不该碰的位置。
部署身份、构建身份和运行身份也别混成一个。构建链路能接触依赖和产物,运行身份能接触业务资源;把两者分开,至少能避免一次构建侧失陷直接延伸到生产数据。
最小权限不是一次配置
权限收紧后,我会顺着函数真实执行路径再检查一遍:它加载了哪些依赖,是否会发起外部请求,异常信息会不会把敏感数据写进日志,跨函数调用是否真的只允许必要动作。发现一项多余授权,就删一项,而不是等“以后可能用到”。
供应链防护当然离不开依赖、构建产物和镜像检查,但最小权限提供的是最后一道刹车。输入被绕过、组件被污染时,函数依然可能失陷;可它拿不到多余资源,能造成的影响就会被压在更小的范围里。这种克制,往往比给函数塞进一大堆权限更让人睡得着。

参与讨论
权限按动作拆确实更安全,不能图省事
构建和运行身份分开这点太重要了
以前真没想过文件名能决定访问范围
最小权限是最后一道刹车,这比喻到位
输入校验做不好,权限再严也没用
部署身份混在一起风险太大了
依赖检查加上最小权限才完整
每次更新都要重新检查一遍权限清单
函数只给必要权限,出事影响也小
很多项目就是默认给了太多权限
异常日志别泄露敏感数据,这点要留意
这种克制比塞一堆权限让人安心
构建身份和运行身份分开这条最容易被省掉
@ 绯红女巫旺达 太真实了,图省事就一个身份跑到底,等出事才想起来构建那条链啥都能碰😅
文件名能决定读哪个资源,这块最容易踩坑
@ 愤怒的雷霆 是啊,动态路径拼接要是没校验好,分分钟越权读到不该碰的数据,太危险了。
权限收紧之后,怎么快速排查哪些是多余的?
想起以前给函数瞎配 * 权限,现在想想后背发凉
@ 孔雀翩翩 这种后知后觉最让人警醒,权限真不能靠“先给了再说”,还是得按函数实际动作逐项收紧。
异常日志也别把敏感参数顺手打出来
@ 孤峰独影客 对,日志也该按敏感级别做脱敏和访问控制,不然排查问题时反而把数据暴露得更广。