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

我已经写了一个Linux守护进程,它将(并且必须)以root身份运行。 当它运行时,不会有任何人login,因为它是由cron启动的。 该守护进程需要存储一些url,用户名和密码,因为它连接到其他服务器(如保pipe箱,谷歌,Windows服务器等)。

问:什么是最好的地方和方法来存储这些密码。

我不能存储散列,因为我需要原始的url / uid / pwd连接到远程服务。

我只能看到两个选项:

a)gnome-keyring-daemon
据我所知,这需要login用户/会话。 我已经尝试从我的守护进程(作为根)启动它,收集返回的环境variables并尝试连接到它。 迄今为止这已经失败了。
b)由root拥有的只读文件。
这也可以使用(例如)hostid进行encryption,但底线是这种方法依赖于默认和根访问。

还有其他的select吗?
非常感谢。

那些正在寻找窃取密码的人知道如何根植操作系统 。 不要依赖文件权限。 这就好像在说“请不要看这个文件,好吗?”

你需要加密这些东西。 Android有一个钥匙圈(搜索API),你可以使用它,但它确实需要密码。 不要在代码中对密码进行硬编码,请向用户提供一个密码。

当你处理你的用户密码时,你有责任。 如果你避免了这个责任,那么他们总有一天会私下里闲聊。

编辑:哇,对不起,我完全认为这是一个机器人问题。 但是,仍然使用密钥环和强密码。

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

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

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

  1. 一个基于HTTPS和XML-RPC的综合应用程序API
  2. 用于安全shell(SSH)脚本的命令行界面

这两种形式都使用PKI身份验证来允许通过API访问PMP应用程序。 XML-RPC API还带有一个Java Wrapper API,以便于将其与Java应用程序集成。

您可以使用此功能来实现您的要求。

欲了解更多信息:

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

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

人们通常会在为SSL执行客户端证书认证时感到困惑,并且读取不允许的自签名证书,因为由任何外部授权签名的您自己的CA证书不会添加任何内容。

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

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

守护进程不能依赖钥匙圈/钥匙串,因为守护程序不应该代表用户进行身份验证,如果他们冒充用户,他们应该是代理,并且应该使用每个操作系统环境中可用的钥匙圈/钥匙串。

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

有一个谷歌周围的特权身份管理产品。 Cyber​​-Ark的套件就是一些例子:

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

或密码管理器专业版:

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

这些工具的优点是,如果服务器被破解,攻击者就需要弄清楚如何从密码存储中获取密码(或者将其从内存中取出)。 这样会比较费时,希望能给你一个更好的机会来检测他们的入侵。 因为它没有链接到一个事务处理,所以也应该可以确定它是在交叉检查中对密码存储的欺诈请求。

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

  1. 为什么需要以root身份运行?
  2. 为什么不能以非root用户身份输入密码?

您是否考虑过创建一个长时间运行的进程来读取密钥(使用密钥环),然后睡在UNIX域套接字上,等待一段时间来处理您的信号? 您的cron作业可以通过写入UNIX域套接字来简单地唤醒这个长时间运行的进程,而无需执行任何工作。 (因此,您的密钥在整个时间内都保留在内存中)。 而且,不是给予长时间运行的进程root访问权限,而是始终使fork()成为一个子进程,并将其权限提升到子进程中的root权限,以执行需要root访问权限的单个活动(而不总是处于升级状态)。 如果将它设置为“setuid”进程(chown root:root,chmod u + s),那么即使由普通用户执行,它也可以根据需要升级到根级访问。