安全模型 : log in to third-party site with user's credentials

标签 security authentication oauth passwords

我开发了一项服务 (Service),它可以自动执行用户可以在另一个第三方站点 (3rd Party Site) 上执行的某些操作。

我的服务为用户提供以下功能:

  • 用户在Service注册
  • 用户向服务提供他/她的第 3 方站点用户名/密码
  • 服务使用该凭据代表用户登录到第 3 方站点
  • 服务将第 3 方站点发出的 cookie 存储在其数据库中
  • 从现在开始,服务开始使用之前存储的cookie(第三方站点的用户名/密码未保存在任何地方)代表用户定期(cron)登录到第三方站点并执行一些操作代表第 3 方站点的用户

  • Use case diagram

    笔记:
  • 在服务上注册之前,向用户提供描述服务与第 3 方站点之间交互的完整信息
  • 自动化用户登录到第 3 方站点具有一定的值(value),并且用户有兴趣在第 3 方站点上自动化他们的登录和某些操作,即他们有兴趣在第 3 方站点为他们做一些工作的服务
  • 第 3 方站点上没有 OAuth 功能
  • 第 3 方站点上没有任何用户身份验证 token 功能

  • 我在 Stack Exchange 进行了研究,但没有找到任何解决方案:
  • https://security.stackexchange.com/questions/1335/storing-third-party-auth-info-securely
  • How save password of a third party application in my app for use with a api?
  • How to securely store passwords used to log in on third party websites
  • Rails storing third party credentials.. Anyone know best practice?
  • http://12factor.net/config
  • https://security.stackexchange.com/questions/31535/need-to-ephemerally-store-third-party-password
  • i *must* store third party credentials in my database. best way?
  • how to securely store a password for a 3rd party service in django?
  • What is the best way to store password in database when API call requires sending of password in plain text?
  • django & facebook: security & design for a facebook webapp that performs a third party login on behalf of the user

  • 此外,通过阅读提供的问题和答案,我倾向于认为没有办法保护用户的登录数据(密码或 3rd Party Site cookie)。 IE。如果攻击者获得对服务服务器的访问权限,则攻击者也获得对第三方站点上用户帐户的访问权限。

    如果我尝试将第 3 方站点的 cookie 存储在加密的服务数据库中,那么它们将仅对解密它们的脚本有用。因此,要访问第 3 方站点用户帐户,攻击者不仅需要访问服务的机器,还需要修改脚本(步骤 4)。

    在服务上为第 3 方站点存储 cookie 与 OAuth 非常相似,但在这种情况下使用 cookie 而不是 token (不存储密码)。

    设计安全模型/架构以在服务中安全存储用户登录数据以允许服务定期代表用户登录第三方站点而无需与用户进行手动交互的方式是什么?

    附言我使用 Django,但我想安全模型/架构不依赖于某个技术堆栈。

    最佳答案

    显而易见:这里重要的事情当然是不要让您网站上的攻击者访问所有 cookie。您无法完全避免这种情况,因为您的服务需要定期访问 cookie(未加密形式)。一个完全破坏了你的服务器的攻击者理论上可以做你的服务可以做的任何事情,所以如果你的服务可以访问 cookie,那么拥有所有权限的攻击者也将能够访问他们。

    如果你仍然想这样做,你应该

    1) 使攻击者更难访问 cookie

    举个例子说明如何思考这个问题:如果您的系统遭到入侵,攻击者很可能会访问您的文件系统。如果 cookie 以纯文本形式存储在文件中,那么攻击者就会很轻松。将它们存储在数据库中会更好(并且可能无论如何您都想做),但除非您以某种方式保护对数据库的访问,否则不会更好。如果数据库的密码存储在应用程序配置文件中,那么专门的攻击者将不会遇到困难。

    一个可以大大改善这种情况的解决方案是,如果 cookie 总是被加密,除非你需要它们。最好的解决方案是,如果加密 key 没有存储在应用程序日志中,而是由运算符(operator)在每次重新启动服务器时提供(输入)。为了打破这一点,攻击者必须读取应用程序的内存(并非不可能,但仍然更加困难)。

    另一种措施是将 cookie 存储在专用服务器上的单独数据库中,并将对该服务器的所有访问限制为所需的内容。

    一个完整的策略需要更深入地了解您的确切物理和逻辑设置。

    2) 创建机制,以便您可以检测 cookie 是否被泄露

    这几乎同样重要。如果发生这种情况,您想知道并能够立即采取行动。当然也有可以使用的标准 IDS 系统。您还可以创建适用于您的特定应用程序的更有针对性的系统。系统可以即检测是否有人正在运行使用 cookie 扫描整个数据库表的 sql。由于您知道自己的应用程序的正常行为方式,因此您还可以创建一个监控系统来检测是否发生了不正常的事情。

    3) 准备一个系统,以便在检测到所有 cookie 被盗时快速失效

    第三方服务可能确实可以选择注销并使 cookie 无效。您应该为您可以轻松激活的所有存储的 cookie 准备一个执行此操作的作业。想想在您禁用所有 cookie 之前告诉您的用户有人可能在 10 分钟内访问了他们的服务和告诉他们有人仍然可以访问第三方服务并且您不知道如何阻止他们的区别。

    除此之外,您的用户了解他们在授予您访问权限时所做的事情以及第三方服务提供商对此的批准当然很重要。第三方服务提供商是否会允许这种访问并不明显。如果他们这样做了,他们还可以帮助您创建一个特殊的 session cookie,即绑定(bind)到您的 IP 地址。

    关于安全模型 : log in to third-party site with user's credentials,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18595611/

    相关文章:

    android - Facebook Android 登录屏幕 WebViewCoreThread 由于未捕获的异常而退出

    oauth - 如何验证资源服务器的 OAuth 2.0 访问 token ?

    security - 如果允许 unsafe-inline,CSP 会保护我们什么

    linux - 安全、私密、本地

    javascript - 如何为从移动和 JavaScript Web 应用程序访问的 rest API 实现基于 token 的 OAuth 2.0 身份验证

    java - @WithMockUser 不带注释

    ios - 仅使用密码而非 TouchID 在设备上进行本地身份验证

    使用 MySQL 的 ASP.NET 4.5 OAuth

    ios - 您可以更新 iPhone 上我自己的应用程序文件夹中数据文件的文件访问权限吗

    security - 隐藏 key 的最佳位置?