Postman是如何构建一个安全可靠的BFF

1,262 阅读5分钟

本文介绍Postman公司是如何构建安全可靠的BFF,可以作为参考来逐步完善的BFF安全建设。 主要是学习如何全局安全建设,具体实现的方式与工具可以选择适合项目情况的。

原文链接

打造一个安全的BFF需要考量的点

  • 单点故障和攻击
  • 面向公众的服务
  • 处理用户输入
  • 如何对API安全性进行量化

安全指标

一个安全的接口需要满足以下3点

保密性 完整性(一致性) 可用性
只有授权人员才能访问合适的数据 你的服务提供的数据不会被篡改 内容可供授权用户按需使用

BFF的数据流向

下图反应了BFF在一个完整数据流扮演的角色,涵盖从流入到流出中各个阶段关键点。 主要有以下3个阶段

  • 客户端发起数据流入BFF
  • BFF与服务间交互
  • BFF将服务结果整合流出给客户端

接下来我们从数据流入开始分析每个阶段需要的安全建设

数据流入时的安全建设

BFF接受到数据之后,首先要进行合法性校验

校验

BFF对于校验的力度

  • BFF 不需要完成所有校验
  • BFF 应该完成自己的生态范围检查
    • 认证
    • 请求头的检查
  • 特定于业务逻辑的检查将推送到下游服务

关键路径

关键路径指在请求到达业务逻辑之前要调用的服务。关键路径的长度是对判断BFF验证量的指标。关键路径最好短且有错误处理机制。 常见的两个关键路径

  • 身份验证服务
  • 访问验证服务

最小特权原则

关于权限,一般采用保守的最小特权原则

  • 用户只能访问必要的最小资源
  • 默认情况下,始终假定用户无权访问
  • 特定条件下才允许访问

示例

下图是Postman采用的BFF架构

他们将访问控制和校验从业务逻辑中分离。 使用yeoman的预定义安全设置进行堆栈安装。

依赖包的维护

在依赖包的维护上,对lockfile使用严格的版本控制。并使用工具检查CI管道中容易受到攻击的依赖包。 工具:nsp, npm audit, snyk

强制安全检查

采用以下强制方案来做安全检查

  • 配置安全检查lint
  • 系统测试阶段捕获有问题的配置项
  • 使用postman collection 集成到CI管道中完成E2E测试。

BFF与服务间通信的安全建设

经历关键路径后,BFF建立与微服务间的连接需要做以下几个方面的安全建设

服务内部的权限检查

  • BFF开发者与服务内部实现隔离
  • 防止身份验证信息在响应结果和日志中泄露
  • 允许秘钥轮换且不需要更改服务器端代码

标记请求

  • 将每个传入请求与用户令牌关联
  • 每个服务都可以利用此令牌来获取用户元数据并应用验证

越权漏洞排除

  • 避免IDOR
  • 所有用户发起的操作都必须具有基于用户令牌的验证。

日志

  • 敏感信息和用户信息过滤
  • 使用启发式的方法来防止意外记录。
  • 追踪BFF日志来预防用户个人身份信息偷取。

BFF与客户端通信时出站内容安全建设

BFF接收到微服务的请求结果后,融合处理后返回给客户端,完成数据流出,此阶段需要做的安全建设如下。

HTTPS / HSTS

  • 根据需要和所需的用户信任级别选择证书
  • 确保第三方调用和重定向通过HTTPS
  • 确认所有内容均通过HTTPS后,实施HSTS(+预加载)。

Content-Security-Policy

  • 减少由恶意代码注入引起的危害。
  • 首先使用report-only mode 以防止副作用
  • 防止数据泄露的理想方法:hrefs未涵盖。

其他请求头

  • CORS: 谁能访问你的资源
  • X-XSS: 在某些浏览器中检测并阻止XSS
  • X-Frame-Options: 允许或拒绝在iframe中显示网站。
  • HPKP: 允许HTTPS网站抵制假冒行为
  • SRI: 验证第三方资产
  • 参考链接:OWASP Secure Headers Project

注意事项

  • 所有header的支持取决于客户端浏览器
  • 不能仅仅依靠Header来确保BFF的安全性
  • 此阶段的安全建设不能替代输入验证和输出格式化

BFF层自身的基础架构安全建设

完成了数据流上的安全建设,还需要对BFF层自身的基础架构做安全建设

审核与自动化

  • 需要审核的内容

    • 开发人员的访问权限
    • 操作配置
    • 创建新的资源
  • Postman 的做法

    • 使用Postman collection 来完成资源可靠创建。
    • 使用Postman Monitors 对服务进行定期审核
    • 使用Postman collection 完成健康检查 Health check
      • 根据环境验证关键配置
      • 如果出现明显错误,请阻止部署。 例如 泄露私钥。
      • 这是一个安全保障,不是作为测试流程。

SDLC 系统开发周期的变化

完成数据流和BFF层自身的基础架构安全建设,我们站在系统开发周期上看看,postman是如何确保安全性。

明确安全KPI

  • 通过CVSS分数对漏洞进行分类。
  • 漏洞回归
  • 解决时间
    • -SLA
  • 外部安全报告

VAPT 漏洞评估和渗透测试

VAPT是开发后的步骤,用于评估软件版本的安全性。

  • 包含服务的黑盒和白盒测试。
  • 安全流程是自动化执行的。

总结

回顾安全指标

回顾开头的安全指标,Postman一共做了以下事情

保密性 完整性(一致性) 可用性
Validation 合法性校验 Request tagging 请求标记 Short critical path 短关键路径
PoLP 最小权限原则 Access control (IDOR) 访问控制 Platform audits 平台审核
Log scrubbing 日志清洗 Content security (HTTPS, SRI, CSP, etc.) 内容安全 Healthcheck 安全检查

要点

  • 建立BFF /公共API 时需要考量安全建设。
  • 建立安全的API是一个循序渐进的过程。
  • 安全是开发过程的一部分

示例代码

github.com/ankit-m/tal…