Serverless 供应链最小权限实战

21 人参与

我见过不少 Serverless 函数,代码其实写得不差,问题却出在权限上:一个本来只该处理对象通知的函数,顺手拿到了读取更多数据、写入更多资源,甚至调用无关服务的能力。平时感觉“省事”,一旦事件入口或依赖出了问题,这种方便就会变成放大器。

Serverless 的麻烦在于,函数常常不只接 HTTP 请求。消息、对象存储、邮件或其他云服务事件,都可能把内容送进同一段业务逻辑。只要其中一个入口校验宽松,攻击者就可能借由文件名、对象路径或消息字段,把不可信数据推进后续流程。此时,函数拥有什么权限,决定了风险能走多远。

权限要按动作拆,不要按项目打包

我更倾向于把每个函数当成一张独立的“授权清单”。它需要读什么资源、写什么资源、允许调用谁,都应当能说清楚。只读的处理函数,不该同时拥有删除和写入权限;只消费消息的函数,也没理由默认访问全部数据存储。

尤其要留意输入会影响资源标识的地方。若对象路径、文件名或消息字段能够决定函数访问哪个资源,权限范围就必须更窄,同时先做来源、类型和结构校验。否则,代码里看似正常的一次读取,可能被恶意输入带去不该碰的位置。

部署身份、构建身份和运行身份也别混成一个。构建链路能接触依赖和产物,运行身份能接触业务资源;把两者分开,至少能避免一次构建侧失陷直接延伸到生产数据。

最小权限不是一次配置

权限收紧后,我会顺着函数真实执行路径再检查一遍:它加载了哪些依赖,是否会发起外部请求,异常信息会不会把敏感数据写进日志,跨函数调用是否真的只允许必要动作。发现一项多余授权,就删一项,而不是等“以后可能用到”。

供应链防护当然离不开依赖、构建产物和镜像检查,但最小权限提供的是最后一道刹车。输入被绕过、组件被污染时,函数依然可能失陷;可它拿不到多余资源,能造成的影响就会被压在更小的范围里。这种克制,往往比给函数塞进一大堆权限更让人睡得着。

参与讨论

21 条评论
  • 鬼影迷

    权限按动作拆确实更安全,不能图省事

    回复
  • 青冥剑

    构建和运行身份分开这点太重要了

    回复
  • 灵光尘

    以前真没想过文件名能决定访问范围

    回复
  • 天蝎深不可测

    最小权限是最后一道刹车,这比喻到位

    回复
  • 孤梦随风

    输入校验做不好,权限再严也没用

    回复
  • PathfinderNomad

    部署身份混在一起风险太大了

    回复
  • 社牛新干线

    依赖检查加上最小权限才完整

    回复
  • 墨意深深

    每次更新都要重新检查一遍权限清单

    回复
  • 订书机

    函数只给必要权限,出事影响也小

    回复
  • 憨厚大熊猫

    很多项目就是默认给了太多权限

    回复
  • 蓝海动力

    异常日志别泄露敏感数据,这点要留意

    回复
  • 幻影蛇

    这种克制比塞一堆权限让人安心

    回复
  • 绯红女巫旺达

    构建身份和运行身份分开这条最容易被省掉

    回复
    1. Mercurial Bloom

      @ 绯红女巫旺达 太真实了,图省事就一个身份跑到底,等出事才想起来构建那条链啥都能碰😅

      回复
  • 愤怒的雷霆

    文件名能决定读哪个资源,这块最容易踩坑

    回复
    1. 摩羯座的坚韧

      @ 愤怒的雷霆 是啊,动态路径拼接要是没校验好,分分钟越权读到不该碰的数据,太危险了。

      回复
  • Tranquil Ripple

    权限收紧之后,怎么快速排查哪些是多余的?

    回复
  • 孔雀翩翩

    想起以前给函数瞎配 * 权限,现在想想后背发凉

    回复
    1. 季夏

      @ 孔雀翩翩 这种后知后觉最让人警醒,权限真不能靠“先给了再说”,还是得按函数实际动作逐项收紧。

      回复
  • 孤峰独影客

    异常日志也别把敏感参数顺手打出来

    回复
    1. 孤灯灭

      @ 孤峰独影客 对,日志也该按敏感级别做脱敏和访问控制,不然排查问题时反而把数据暴露得更广。

      回复