住酒店时,前台确认你是谁,再给你一张只能打开自己房间的卡。这其实是两道判断:身份对不对,能进哪扇门。
软件里的“登录”和“权限”,也有类似区别。登录回答访问者是谁,权限决定他能看哪份文件、操作哪个账户。知道姓名,并不意味着整栋楼的门都该打开。
设想一个给多家门店使用的报表工具。用户确实登录了,也能查看自己的文件;但如果换一个链接编号,就能看到另一家店的报表,问题就出在后面的权限判断。
OWASP 的授权指南明确区分身份认证与访问授权,并强调按必要范围给权限、默认拒绝未经允许的访问,以及在每次请求中检查权限。资料:OWASP 授权指南
这件事和界面好不好看关系不大。把导出按钮藏起来,并不自动阻止其他入口发起导出;普通用户看不到管理菜单,也不能证明相关数据已经受到正确保护。真正处理请求的系统,仍需要做出判断。
小团队还容易遇到另一种情况:为了方便,给兼职客服一个全能管理员账号。客服只需要查订单,却连数据库、密钥和备份都能动。这不只是担心对方做坏事,更因为误操作或账号泄露时,影响范围会跟着权限一起扩大。
所谓安全基线,可以理解成产品正常经营所需的基本保护。重要账号加强登录保护,密钥不随意散落,权限跟实际工作相配,合作结束后能收回访问。这些措施各管一段,不能靠其中一项替代全部。
也不能把“权限越少越好”机械执行到没人能工作。若正常任务没有合适入口,大家可能转而共享账号,结果反而更难追溯。清楚的权限,应该让必要工作做得成,也让不必要的访问被挡住。
产品安全听起来很大,有时却落在一个朴素问题上:这位用户打开这份文件,系统究竟凭什么认为他有权看?