在设计REST API或服务时,是否有处理安全性(身份验证、授权、身份管理)的最佳实践?

在构建SOAPAPI时,您可以将WS-Security作为指南,并且有许多关于该主题的文献。我发现关于保护REST端点的信息较少。

虽然我理解REST故意没有类似于WS-*的规范,但我希望已经出现了最佳实践或推荐的模式。

如有任何讨论或相关文件的链接,我们将不胜感激。如果重要的话,我们将使用WCF和POX/JSON序列化消息,用于使用.NET Framework v3.5构建的REST API/服务。


当前回答

Github上有一个很棒的清单:

身份验证

不要在身份验证、令牌生成和密码存储方面另起炉灶。使用标准。使用登录中的最大重试和监禁功能。对所有敏感数据使用加密。

JWT(JSON Web令牌)

使用随机复杂密钥(JWT Secret)使暴力强制令牌变得非常困难。不要从有效载荷中提取算法。在后端强制算法(HS256或RS256)。使令牌过期(TTL、RTTL)尽可能短。不要将敏感数据存储在JWT有效载荷中,它很容易被解码。

OAuth(身份验证)

始终验证redirect_uri服务器端,以仅允许白名单URL。始终尝试交换代码而不是令牌(不允许response_type=token)。使用带有随机哈希的状态参数来防止OAuth身份验证过程中的CSRF。定义默认范围,并验证每个应用程序的范围参数。

通道

限制请求(限制)以避免DDoS/暴力攻击。在服务器端使用HTTPS以避免MITM(中间人攻击)将HSTS标头与SSL一起使用以避免SSL Strip攻击。

输入

根据操作使用正确的HTTP方法:GET(读取)、POST(创建)、PUT/PATCH(替换/更新)和DELETE(删除记录),如果请求的方法不适合请求的资源,则使用405 method Not Allowed(不允许方法)进行响应。验证请求的内容类型Accept标头(content Negotiation),以仅允许您支持的格式(例如application/xml、application/json等),如果不匹配,则使用406 Not Acceptable响应进行响应。按您接受的方式验证发布数据的内容类型(例如application/x-wwww-form-urlencoded、multipart/form-data、application/json等)。验证用户输入以避免常见漏洞(例如XSS、SQL注入、远程代码执行等)。不要在URL中使用任何敏感数据(凭据、密码、安全令牌或API密钥),而是使用标准的授权标头。使用API网关服务启用缓存、速率限制策略(例如配额、峰值阻止、并发速率限制)并动态部署API资源。

处理

检查所有端点是否在身份验证后受到保护,以避免身份验证过程中断。应避免使用用户自己的资源ID。使用/me/orders而不是/user/654321/orders。不要自动增加ID。请改用UUID。如果您正在解析XML文件,请确保未启用实体解析以避免XXE(XML外部实体攻击)。如果您正在解析XML文件,请确保未启用实体扩展,以避免通过指数级实体扩展攻击造成Billion Laughs/XML爆炸。使用CDN进行文件上载。如果您正在处理大量数据,请使用Workers和Queues在后台处理尽可能多的数据,并快速返回响应以避免HTTP阻塞。不要忘记关闭调试模式。

输出

发送X-Content-Type-Options:nosniff标头。发送X-Frame-Options:拒绝标头。发送内容安全策略:默认src“none”标头。删除指纹标头-X-Powered-By、Server、X-AspNet-Version等。强制响应的内容类型,如果返回application/json,则响应内容类型为application/json。不要返回敏感数据,如凭据、密码和安全令牌。根据完成的操作返回正确的状态代码。(例如200 OK、400 Bad Request、401 Unauthorized、405 Method Not Allowed等)。

其他回答

OWASP(开放Web应用程序安全项目)有一些涉及Web应用程序开发各个方面的备忘单。本项目是非常有价值和可靠的信息来源。关于REST服务,您可以检查:https://www.owasp.org/index.php/REST_Security_Cheat_Sheet

这已经有一段时间了,但这个问题仍然相关,尽管答案可能有点改变。

API网关将是一个灵活且高度可配置的解决方案。我测试并使用了KONG,非常喜欢我所看到的。KONG提供了自己的管理REST API,您可以使用它来管理用户。

Express-gateway.io是最新的,也是一个API网关。

Github上有一个很棒的清单:

身份验证

不要在身份验证、令牌生成和密码存储方面另起炉灶。使用标准。使用登录中的最大重试和监禁功能。对所有敏感数据使用加密。

JWT(JSON Web令牌)

使用随机复杂密钥(JWT Secret)使暴力强制令牌变得非常困难。不要从有效载荷中提取算法。在后端强制算法(HS256或RS256)。使令牌过期(TTL、RTTL)尽可能短。不要将敏感数据存储在JWT有效载荷中,它很容易被解码。

OAuth(身份验证)

始终验证redirect_uri服务器端,以仅允许白名单URL。始终尝试交换代码而不是令牌(不允许response_type=token)。使用带有随机哈希的状态参数来防止OAuth身份验证过程中的CSRF。定义默认范围,并验证每个应用程序的范围参数。

通道

限制请求(限制)以避免DDoS/暴力攻击。在服务器端使用HTTPS以避免MITM(中间人攻击)将HSTS标头与SSL一起使用以避免SSL Strip攻击。

输入

根据操作使用正确的HTTP方法:GET(读取)、POST(创建)、PUT/PATCH(替换/更新)和DELETE(删除记录),如果请求的方法不适合请求的资源,则使用405 method Not Allowed(不允许方法)进行响应。验证请求的内容类型Accept标头(content Negotiation),以仅允许您支持的格式(例如application/xml、application/json等),如果不匹配,则使用406 Not Acceptable响应进行响应。按您接受的方式验证发布数据的内容类型(例如application/x-wwww-form-urlencoded、multipart/form-data、application/json等)。验证用户输入以避免常见漏洞(例如XSS、SQL注入、远程代码执行等)。不要在URL中使用任何敏感数据(凭据、密码、安全令牌或API密钥),而是使用标准的授权标头。使用API网关服务启用缓存、速率限制策略(例如配额、峰值阻止、并发速率限制)并动态部署API资源。

处理

检查所有端点是否在身份验证后受到保护,以避免身份验证过程中断。应避免使用用户自己的资源ID。使用/me/orders而不是/user/654321/orders。不要自动增加ID。请改用UUID。如果您正在解析XML文件,请确保未启用实体解析以避免XXE(XML外部实体攻击)。如果您正在解析XML文件,请确保未启用实体扩展,以避免通过指数级实体扩展攻击造成Billion Laughs/XML爆炸。使用CDN进行文件上载。如果您正在处理大量数据,请使用Workers和Queues在后台处理尽可能多的数据,并快速返回响应以避免HTTP阻塞。不要忘记关闭调试模式。

输出

发送X-Content-Type-Options:nosniff标头。发送X-Frame-Options:拒绝标头。发送内容安全策略:默认src“none”标头。删除指纹标头-X-Powered-By、Server、X-AspNet-Version等。强制响应的内容类型,如果返回application/json,则响应内容类型为application/json。不要返回敏感数据,如凭据、密码和安全令牌。根据完成的操作返回正确的状态代码。(例如200 OK、400 Bad Request、401 Unauthorized、405 Method Not Allowed等)。

谢谢你的忠告。我们最终使用了一个定制的HTTP头将身份令牌从客户端传递给服务,为将RESTful API和微软即将推出的Zermatt identity框架集成做准备。我已经在这里描述了问题和我们的解决方案。我还采纳了tweet的建议,购买了RESTfulWebServices——如果你正在构建任何类型的RESTfulAPI,这是一本非常好的书。

对于Web应用程序安全,您应该看看OWASP(https://www.owasp.org/index.php/Main_Page)它为各种安全攻击提供了欺骗单。您可以采用尽可能多的措施来保护您的应用程序。关于API安全(授权、身份验证、身份管理),有多种方式(基本、摘要和OAuth)。OAuth1.0中存在循环漏洞,因此可以使用OAuth1.0a(由于对规范的担忧,OAuth2.0没有被广泛采用)