我有一个Python模块,由于它的具体需要有一个MySQL数据库连接。现在,此连接的详细信息(主机,数据库,用户名和连接密码)以明文形式存储在/etc/mymodule.conf中,这显然不是一个好主意。
据说,安装模块后,root用户会编辑/etc/mymodule.conf文件,因为Unix系统的所有用户都可以使用该模块及其数据库。
我应该如何安全地存储密码?
答案 0 :(得分:4)
您的约束设置了一个非常棘手的问题:系统上的每个用户都必须能够访问该密码(因为这是用户访问该数据库的唯一方法)......但他们必须不能(除非在运行该脚本时,并且可能只有在没有例如python -i
会话的情况下运行它时才会让它们在连接调用之前设置断点并查看整个内存,所以绝对能够查看密码。)
你可以编写一个以root身份运行的守护进程(这样可以读取你只能由root读取的mymodule.conf)并接受请求,以某种方式验证请求来自一个“好”的进程(一个是运行有问题的确切模块而不是交互式),然后才提供密码。这很脆弱,主要是因为需要确定一个进程是否可能在执行的关键点设置断点。
或者,您可以通过让守护程序返回而不是密码来进一步提高技术赌注,而是准备好包装在符合DB-API的包装器中的开放式套接字;一些Unix系统允许在不相关的进程之间发送打开的文件描述符(这种方法的先决条件) - 当然,您必须对基于MySQL的数据库API进行大量修改,以允许在已经打开的套接字周围打开连接。而不是新鲜的。请注意,经过验证的请求流程恰好是交互式的仍然能够获取连接对象,一旦构建,并发送完全任意请求 - 他们将无法看到密码,从技术上讲,但这并不是什么安慰。因此,这里所需的大量工作是不可能的。
所以下一个可能的架构是通过验证守护进程调解所有数据库交互:进程将“登录”守护进程,获得验证,如果一切正常,则获得与(例如)XMLRPC服务器公开的代理连接数据库连接和功能(守护程序可能会在从只读可读文件读取密码后立即分叉每个此类代理进程,并立即删除权限,仅在一般安全的基础上)。
除了可能更容易实现之外,上一个替代方案的优点是代理还可以查看即将发送到MySQL数据库的每个SQL请求,并能够验证和审查这些请求好吧(大概是在默认拒绝的基础上,再次针对一般安全原则),因此严重限制了“流氓”客户端进程(与调试器交互运行)可以做的损害量......希望; - )。
是的,这里没有简单的解决方案 - 但是,你的约束带来的问题远非那么容易接近自相矛盾的不可能性;-)。顺便说一下,这个问题并不是特别与Python相关,它主要是关于选择一个接近“平方圈”的安全架构 - 对访问权限的严格矛盾限制! - )
答案 1 :(得分:1)
为什么不创建具有受限权限的默认MySQL用户帐户?您 可以设置它,以便它只能读取特定的数据库。你也可以 限制默认用户只能进行SELECT,无法INSERT,UPDATE或 删除。您应该设置的特定权限当然取决于您的情况。
此处介绍了限制/授予权限的语法: http://dev.mysql.com/doc/refman/5.1/en/grant.html
通过创建默认的受限MySQL用户,您可以输入密码 在纯文本文件中没有造成任何伤害。
同时,如果将user
和password
作为可选参数添加到模块的连接函数中,则更多特权用户可以提供自己的密码,以便能够以更高的权限与数据库进行交互。
当然,这只是质疑你帖子的原始前提。 如果这个方向不可行,请随意忽略! :)
此致 unutbu