存储linux守护程序所需的密码

时间:2011-05-18 01:00:43

标签: linux encryption passwords daemon root

我编写了一个linux守护程序,它将(并且必须)以root身份运行。 当它运行时,不一定会有任何人登录,因为它是由cron启动的。 该守护进程需要在连接时存储一些URL,uid和密码 到其他服务器(如Dropbox,谷歌,Windows服务器等)。

问:存储这些密码的最佳位置和方法是什么。

我无法存储哈希值,因为我需要原始的url / uid / pwd来连接 远程服务。

我只能看到两个选项:

a)gnome-keyring-daemon
据我所知,这需要登录用户/会话。我已经尝试从我的守护进程(以root身份)启动它,收集返回的环境变量并尝试连接到它。到目前为止,这已经失败了 b)root拥有的只读文件 这也可以使用(例如)hostid加密,但是底部加密 问题在于,这种方法依赖于默默无闻和根访问。

还有其他选择吗?
非常感谢。

6 个答案:

答案 0 :(得分:1)

那些想要窃取密码的人知道如何根据操作系统依赖文件权限。这就像说“请不要读这个文件。好吗?”

你需要加密那些东西。 Android有一个密钥环(搜索api),你可以使用它,但它确实需要密码。在代码中 NOT 硬编码密码,请用户提供密码。

当您处理用户密码时,您有责任。如果你避免这种责任,他们有一天会诽谤你。

编辑:哇,抱歉,我完全认为这是一个安卓问题。但是,仍然使用密钥环和强大的加密。

答案 1 :(得分:1)

您可以查看ManageEngine Password Manager Pro中提供的应用程序到应用程序密码管理功能。

基础架构中使用密码与其他应用程序通信的应用程序和脚本可以安全地查询Password Manager Pro,以便在需要时检索密码。

Password Manager Pro(PMP)为此提供了两种API:

  1. 基于XML-RPC over HTTPS和
  2. 的综合应用程序API
  3. 安全shell(SSH)上脚本的命令行界面
  4. 两种表单都使用PKI身份验证来允许通过API访问PMP应用程序。 XML-RPC API还附带了一个Java Wrapper API,可以轻松地将其与Java应用程序集成。

    您可以使用此功能达到您的要求。

    欲了解更多信息:

    http://www.manageengine.com/products/passwordmanagerpro/help/application-to-application-password-management.html

答案 2 :(得分:1)

我多次遇到这个问题,因为人们常常对企业安全建议感到困惑。

当必须为SSL实施客户端证书身份验证并且读取允许的NO SELF-SIGNED证书时,人们通常会感到困惑,因为拥有由任何外部机构签署的您自己的CA证书都不会添加任何内容。

人们也对使用SALTED HASH算法存储用户的建议感到困惑,需要存储守护进程的凭据以访问数据库服务器或消息代理等服务。

我总是看到使用密码加密凭据的天真解决方案,密钥以明文形式存储在软件的任何其他位置,这只会给系统管理员带来问题,但对入侵者则不会造成问题。一段时间后,我看到一个软件开发人员需要散列生成的密钥,将该散列存储在文本文件中,并使用该散列字符串作为加密/解密包含凭证的文件的密钥,架构师不满意,直到实际的密钥是看起来像哈希密码的字符串。你能相信吗?

您不能依赖守护进程的密钥环/密钥链,因为守护进程不应该代表用户进行身份验证,如果他们冒充用户他们应该是代理,并且应该使用每个OS环境中可用的密钥环/密钥链。

答案 3 :(得分:0)

root拥有的只读文件几乎是推荐的解决方案:openssh等重要服务使用该选项。

答案 4 :(得分:0)

为特权身份管理产品开发Google。一些例子是Cyber​​-Ark的套件:

http://www.cyber-ark.com/

或Password Manager Pro:

http://www.manageengine.com/products/passwordmanagerpro/download.html

这些工具的优势在于,如果服务器被破解,则攻击者需要确定如何从密码存储区检索密码(或将其从内存中取出)。这将更耗时,并希望能让您更好地发现它们的入侵。还应该可以确定它是交叉检查中密码存储的欺诈性请求,因为它没有链接到事务。

另一种选择是在磁盘上对其进行加密,并让用户输入解锁密码的GPG密钥的密码短语。如果你能找到一个可以读/写数据库的好API,那么pwman,passwordsafe和其他工具可能会支持这样的东西。

答案 5 :(得分:0)

  1. 为什么需要以root身份运行?
  2. 为什么不能以非root用户身份输入密码?
  3. 您是否考虑过创建一个长时间运行的进程来读取密钥(使用密钥环),然后在UNIX域套接字上休眠,等待'时间做你的东西'信号?您的cron作业可以通过写入UNIX域套接字来简单地唤醒这个长时间运行的进程,而无需实际完成工作。 (因此你的钥匙一直留在记忆中)。此外,您可以始终使fork()成为子进程,并将其权限升级为root进程,以执行需要root访问权限的单个活动(而不是始终处于该升级状态),而不是给予长时间运行的进程root访问权限。如果你把它设为'setuid'进程(chown root:root,chmod u + s),那么它可以根据需要升级到根级别访问,即使是普通用户执行。