我开发了一项服务 (Service),它可以自动执行用户可以在另一个第三方站点 (3rd Party Site) 上执行的某些操作。
我的服务为用户提供以下功能:
用户在服务中注册
- 用户向服务提供他/她的第 3 方站点用户名/密码
- 服务使用该凭据代表用户登录到第 3 方站点
- 该服务将由第 3 方网站发布的 cookie 存储在其数据库中
- 从现在开始,服务开始使用之前存储的cookie(第三方站点的用户名/密码没有保存在任何地方)代表用户定期(cron)登录到第三方站点,并对第三方站点执行一些操作。代表第 3 方网站的用户
笔记:
- 在注册服务之前,会向用户提供描述服务与第 3 方网站之间交互的完整信息
- 自动化用户登录到第 3 方站点具有一定的价值,并且用户有兴趣在第 3 方站点上自动登录和执行某些操作,即他们有兴趣在第 3 方站点上为他们做一些工作的服务
- 第 3 方站点上没有 OAuth 功能
- 第 3 方站点上没有任何用户身份验证令牌功能
我在 Stack Exchange 进行了研究,但没有找到任何解决方案:
- https://security.stackexchange.com/questions/1335/storing-third-party-auth-info-securely
- 如何在我的应用程序中保存第三方应用程序的密码以与 api 一起使用?
- 如何安全地存储用于登录第三方网站的密码
- Rails 存储第三方凭据..有人知道最佳实践吗?
- http://12factor.net/config
- https://security.stackexchange.com/questions/31535/need-to-ephemerally-store-third-party-password
- 我*必须*将第三方凭据存储在我的数据库中。最好的办法?
- 如何在 django 中安全地存储 3rd 方服务的密码?
- 当 API 调用需要以纯文本形式发送密码时,将密码存储在数据库中的最佳方法是什么?
- django & facebook:代表用户执行第三方登录的 facebook webapp 的安全性和设计
此外,通过阅读提供的问题和答案,我倾向于认为没有办法保护用户的登录数据(密码或 3rd Party Site cookie)。即,如果攻击者获得对服务服务器的访问权,则攻击者也获得对第三方站点上用户帐户的访问权。
如果我尝试将第 3 方站点的 cookie 存储在加密的服务数据库中,那么它们将仅对解密它们的脚本有用。因此,要访问第 3 方站点用户帐户,攻击者不仅需要访问服务的机器,还需要修改脚本(步骤 4)。
在服务上为第 3 方站点存储 cookie 与 OAuth 非常相似,但在这种情况下使用 cookie 而不是令牌(不存储密码)。
设计安全模型/架构以将用户的登录数据安全地存储在服务中以允许服务定期代表用户登录到第三方站点而无需与用户进行手动交互的方式是什么?
PS我使用Django,但我猜安全模型/架构不依赖于某个技术栈。