API 网关作为云原生时代进入公司 API 生态系统的入口,其安全性至关重要。本文重点分析了 APISIX 和 Kong 两个流行的 API 网关,发现超过 600 个 APISIX 实例和成百上万的 Kong 网关存在配置错误、在线可访问且未受到攻击保护等问题。
API 网关的风险建模:
- 配置错误: 例如,API 网关具有需要 API 密钥的路由,但后端服务不进行身份验证,导致服务器端请求伪造(SSRF)攻击风险。
- TLS 终止: TLS 终止虽然可以提高性能,但也可能导致密钥以明文形式传输,增加数据泄露风险。
- 授权和身份验证: API 网关需要支持安全的身份验证机制和授权方法,例如多因素认证(MFA)和基于角色的访问控制(RBAC)。
APISIX API 网关的安全问题:
- 默认密码: APISIX 管理界面存在静态主密码,容易导致未经授权的访问。
- 秘密管理: APISIX 默认依赖 etcd 存储配置,且未进行加密存储,导致敏感信息泄露风险。
- 插件风险: 社区插件可能存在安全问题,需要谨慎使用。
Kong API 网关的安全问题:
- 管理 API 暴露: Kong 管理 API 可能会暴露在公共网络上,导致整个系统面临风险。
- 配置错误: 例如,转发 Admin API 和缺少防火墙规则等配置错误。
- 秘密存储: Kong 默认将所有密钥存储在数据库中明文形式,存在泄露风险。
- 插件风险: Kong 的功能主要通过插件提供,插件的安全性需要特别关注。
容器注册表的安全问题:
- 开放注册表: 开放的私有注册表允许恶意行为者下载大量镜像,其中包含敏感信息。
- 敏感信息泄露: 镜像中可能包含 CSP 访问密钥、S3 密钥、数据库凭据、应用程序凭据、JSON Web 令牌 (JWT) 等敏感信息。
内部 API 的安全问题:
- Azure WA 代理和 Service Fabric: 漏露的证书和敏感信息可能导致特权提升和集群控制。
- Azure Managed Identity: 环境变量的信息泄露可能导致令牌泄露和未经授权的访问。
- Azure DevOps 服务器: 未加密的 HTTP 请求可能导致敏感信息泄露和远程代码执行。
安全建议:
- 避免在容器镜像内硬编码密钥。
- 使用密钥库存储密钥,并引用它们。
- 不要将环境变量存储在 Dockerfile 或 .env 文件中。
- 确保私有容器注册表不可公开访问。
- 加密容器镜像。
- 定期检查配置错误,并持续扫描漏洞、恶意软件和敏感信息。
- 使用无基础镜像(distroless)方式,并使用秘密管理器将秘密注入到容器运行时。
研究结论:
API 安全不仅涉及 API 的身份验证或授权,还涉及到源代码、构建脚本、部署、持续集成和持续交付/持续部署(CI/CD)链、第三方使用以及密钥存储。一个简单的错误就可能使整个 API 部署面临风险。企业需要采取全面的安全措施,确保 API 系统的安全性。