我们正在构建一个只能从一组已知服务器访问的 REST API。我的问题是,如果没有任何基于浏览器的客户端直接访问,需要什么安全机制。
目前拥有:
- 显然是通过 HTTPS
- 启用 HTTP 身份验证,API 使用者有密钥和密码
是否有必要:
- 创建一些更改密钥,例如
md5(timestamp + token)
为请求形成并在端点验证? - 使用 OAuth(2 腿身份验证)?
没关系 - 是否来自浏览器。
是否有必要:
创建一些更改密钥,例如为请求形成并在端点验证的 md5(timestamp + token)?
使用 oauth(2 腿授权)?
使用 OAuth,它解决了这两个问题。OAuth 的使用很好,因为:
你不是在重新发明轮子
已经有很多依赖于技术堆栈的库和方法
您还可以使用 JWT 令牌在服务之间传递一些带有自定义声明的安全上下文。
作为参考,您可以查看不同的提供商如何解决问题。例如,Azure Active Directory 代表此目的流 https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-on-behalf-of-flow
在您的服务之间使用 OAuth2/OpenID Connect 不是强制性的,还有其他协议和替代方案,甚至是自定义的。一切都取决于哪些关系是服务,或者它们都处于完全信任的环境中。
您可以使用任何您喜欢的东西,但主要思想是不要在服务之间共享敏感信息,例如服务帐户凭据或用户凭据。
如果 REST API 安全是主要要求 - OAuth2/OpenID Connect 可能是最佳选择,如果您只需要以最简单的方式在完全信任环境中安全(在身份验证意义上)调用 - Kerberos,如果您需要它们之间的加密自定义隧道对于传输中的数据加密 - 其他选项,如 VPN。实现某些自定义是没有意义的,因为如果您有服务 A 和服务 B,并且希望确保它们之间的调用经过身份验证,那么为了避免耦合和共享敏感信息,您将始终需要一些中央服务 C 作为身份提供者. 因此,如果您从 tis pov 考虑,OAuth2/OIDC 并不过分
无论您的 API 使用者是 Web 浏览器还是您无法控制的服务器,都不会改变安全状况。
如果您使用的是 HTTPS 并且客户端已经拥有密钥/密码,那么不清楚任何其他机制可以防止哪种攻击。
无论如何,客户端的任何妥协都会暴露一切。
首先 - 用户代理(例如浏览器)是否参与呼叫很重要。
如果只有 S2S 调用,那么 1 路 SSL HTTPS(用于网络加密)和某种签名机制(SHA-256)应该足以保证您的安全。
但是,如果您在 api 响应中返回敏感信息,最好接受 2 路 ssl HTTPS 连接(以验证客户端)。
OAuth2 不会在服务器到服务器调用中添加任何值(在没有用户同意且没有任何用户代理存在的情况下发生)。
对于服务器之间的身份验证:
已知服务器:
开放的服务器集: