代码之家  ›  专栏  ›  技术社区  ›  Hongli

用/dev/urandom生成的秘密令牌是否是保护守护进程的好方法?

  •  4
  • Hongli  · 技术社区  · 15 年前

    我有一个生成子进程的守护进程。有时,这些子进程需要与守护进程通信。我想确保只有这些子进程被授权与守护进程通信。

    我想实现如下:

    • 在启动期间,守护进程通过读取/dev/urandom生成一个随机的128字节的秘密令牌。/dev/random不好,因为它可能会阻塞读卡器任意时间。
    • 守护进程监听一个Unix域套接字。
    • 守护进程将秘密令牌和套接字的文件名放入环境变量中。它生成的每个子进程都可以使用文件名和秘密令牌连接到守护进程。
    • 除非秘密令牌正确,否则守护进程将拒绝连接。

    问题:

    • 我知道/dev/random的熵比/dev/urandom高。但是/dev/urandom足够好吗?如果没有,我应该使用什么?
    • 令牌的大小是否足够大?
    • 我应该锁定存储令牌的内存吗?我不认为这是必要的,因为守护进程每次启动时都会生成不同的令牌,所以当攻击者试图窃取硬盘并从交换文件中提取令牌时,它应该已经没有用处了。
    • 我应该在关闭期间使存储令牌的内存无效吗?
    • 我还需要做什么?

    由于各种需求,我不能使用匿名管道来允许守护进程和子进程之间的通信。

    4 回复  |  直到 15 年前
        1
  •  1
  •   TS    15 年前

    是的,/dev/urandom提供的安全性已经足够好了。许多软件都将其用于随机性(用于SSL、身份验证等)。几乎唯一的时间/dev/random是一个好主意,当生成某种需要多年安全性的令牌时,例如证书的私钥。

    有人提到,如果您有相同的uid,则可以查看进程的内存。您可以通过让内核认为它是setuid进程来避免这种情况,即,如果主进程作为根进程运行,则可以将fork、exec和setuid()转发给非特权用户。其他具有相同uid的进程将无法查看该进程的内存。

    凭证查找方法也适用于命名的Unix套接字,而不仅仅是SocketPair。

        2
  •  3
  •   mark4o    15 年前

    最简单的方法是在服务器中为每个子进程创建一个管道/插座对。给子流程一端,另一端保持不变。该管道/套接字上的任何内容都必须来自该子进程。

    另一种方法是从Unix套接字向操作系统请求凭据(PID、uid、gid)。在Linux上,您将使用 getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &cr, &cr_len) ( man 7 socket )索拉利斯 getpeerucred .不幸的是,这是不可移植的,但许多系统对Unix套接字具有类似的功能。虽然很复杂, D-Bus 包含 code that does this on a number of different systems .

        3
  •  2
  •   Jim    15 年前

    好吧,如果您要将令牌放入环境变量中,那么具有与这些进程相同或更高权限(即uid)的任何人都将能够读取,然后使用令牌!这使得问题的其余部分成为了一个无意义的问题!?如果您担心同一个框上的进程之间的安全性(您提到了本地IPC),那么不要使用环境变量来存储令牌-很容易检查这些(EV)。

        4
  •  1
  •   Vatine    15 年前

    如果您要分叉(但不是exec()ing),只将它们保存在本地内存中就足够了。如果您也是exec()ing,那么(如您在对Jim的注释中所述)可能需要通过管道传递令牌(和域套接字路径)。

    如果您在没有头的服务器上运行它,/dev/random可能有点饿,所以使用/dev/urandom(可能)是一个更好的选择,除非您有一个合适的噪声源供/dev/random使用。