我昨天花了很长时间配置我的 CouchDB 实例,以便创建一个小应用程序并让 CouchDB 为我管理身份验证和授权。
所以我最终得到了类似的结果:
最重要的是我有一个服务器管理员,他基本上是我 CouchBD 实例上的上帝。
然后我创建了一个名为“mydatabase”的数据库(例如),并将角色“mydatabase_dba”添加为管理员,并将角色“mydatabase_user”添加为读者。
我还创建了一个名为“_users”的数据库,其中包含所有数据库管理员和用户及其角色,还有一个名为“_auth”的设计文档,用于管理授权。
只有服务器管理员是这个数据库的管理员,我添加了角色为“mydatabase_dba”的用户作为读者。然后,对于那些知道这件事的人,我修改了“_auth”文档的“validate_doc_update”字段,使角色“mydatabase_dba”的用户只能与角色“mydatabase_user”的用户打交道。
所以,总结一下:
- 服务器管理员仍然是上帝
- 角色为“mydatabase_user”的用户可以连接到“mydatabase”,但他们只是读者
- 角色为“mydatabase_dba”的用户是“mydatabase”的管理员
- 具有“mydatabase_dba”角色的用户可以连接到他们是读者的数据库“_users”
- 角色为“mydatabase_dba”的用户只能管理“_users”中角色为“mydatabase_user”的用户
希望这是清楚的 :D
我现在能做的是创建一个应用程序,它本身不会管理用户,而是让用户直接(透明地)连接到 CouchDB。
当处理用户创建/更新/删除时,问题就来了。
因为只有角色为“mydatabase_dba”的用户才能访问“_users”数据库并处理角色为“mydatabase_user”的用户,所以我有时需要以这个数据库管理员的身份连接到 CouchDB。
我有两个解决方案:
- 在我的应用程序中创建一个用户界面,让管理员连接并执行他必须执行的操作
或
- 编写更多代码并让应用程序自动执行,这是我更喜欢的解决方案,但问题是:我必须存储管理员凭据...
抱歉,介绍太长了,但我必须先描述一下风景:)
我昨天发了一篇关于如何保护我的应用程序和 CouchDB 实例之间的连接的帖子:here
我得到的解决方案是使用 HTTP over SSL (/TLS) 来保护通信。我对此没有意见,但现在我有另一个顾虑,也许我有点偏执,但因为我的应用程序需要作为“mydatabase_dba”连接,所以我必须将其凭据存储在某个地方。
但是如何安全地存储它们呢?正如我在上一篇文章中所说,即使我存储的是散列密码而不是纯文本密码,如果攻击者访问我的应用程序源代码,他也会获得我的管理员凭据...
最佳答案
应用程序永远不应具有管理权限。它应该只被赋予它运行所需的最低限度的权限。如果应用程序需要一些管理权限,请确保它拥有的权限越少越好。除此之外,大多数情况下,这些凭据以纯文本形式存储在某些只有您的应用程序可以访问的文件中。
切勿将此文本文件提交到您的源代码管理器(Subversion、Git 等)!将文件放入正在运行的系统必须是安装过程中的一个步骤。
关于database - 如何安全地存储我的 CouchDB 管理员密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5107568/