【问题标题】:Store passwords required by a linux daemon存储 linux 守护进程所需的密码
【发布时间】:2011-08-27 16:24:38
【问题描述】:

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

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

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

我只能看到两个选项:

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

还有其他选择吗?

【问题讨论】:

  • 忘记选项 a)。不要将其他软件混入其中。只需像选项 b) 一样存储数据。您可以对其进行加密,但它不会提供更高的安全性 - 好吧,可能有点但不可数。我的意思是,如果攻击者可以访问文件(以 root 身份),他也可以访问任何密钥环。

标签: linux encryption passwords daemon root


【解决方案1】:

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

【讨论】:

  • 我开始认为你是对的。 “正确”的方式是让操作系统来管理它(就像 windows 和 Mac 一样)。如果操作系统不支持密钥存储,则下一个最佳解决方案是只读文件。谢谢。
  • 嗯,密钥环或多或少是一种解决方法,但除非复杂,否则具有受限权限的文件通常没问题。
【解决方案2】:

希望窃取密码的人知道如何 root 操作系统。不要依赖文件权限。这就像说“请不要阅读这个文件。漂亮吗?”

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

当您处理用户密码时,您有责任。如果你逃避这个责任,他们总有一天会私刑处死你。

编辑:哇,对不起,我完全认为这是一个 android 问题。但是,请使用密钥环和强加密。

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    更多信息:

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

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

        【解决方案5】:

        在 google 上搜索 Privilege Identity Management 产品。一些例子是 Cyber​​-Ark 的套件:

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

        或 Password Manager Pro:

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

        这些工具的优势在于,如果服务器被破解,攻击者需要弄清楚如何从密码存储中检索密码(或从内存中获取密码)。这将更加耗时,并希望为您提供更好的机会来检测他们的入侵。还应该可以在交叉检查中识别出它是对密码存储的欺诈性请求,因为它没有链接到交易。

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

        【讨论】:

        • 这些工具似乎更专注于用户密码管理。我有一个守护进程,它可能会在很少登录的服务器上运行。

        • Cyber​​Ark 就是为这个用例而构建的。它用于应用程序到应用程序的密码管理。 PMP 可以做到,但它并不是真正为它设计的。 Cyber​​Ark 有竞争产品,我不推荐它本身只是为您指明此类产品的方向。
        【解决方案6】:
        1. 为什么需要以 root 身份运行?
        2. 为什么不能以非 root 用户身份输入密码?

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

        【讨论】:

        • 它需要是根用户,因为它需要广泛访问文件系统。它可以在任何用户登录之前运行(它是一个系统服务)。它可能在用户从不登录(或很少登录)的无头机器上运行。所以我无法从用户那里获取任何密码。
        猜你喜欢
        • 1970-01-01
        • 2011-03-06
        • 2013-08-28
        • 2021-08-29
        • 1970-01-01
        • 2015-06-08
        • 2014-12-05
        • 2011-06-19
        • 2013-07-31
        相关资源
        最近更新 更多