4

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

我想按如下方式实现:

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

问题:

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

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

4

4 回答 4

3

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

另一种方法是向操作系统询问来自 Unix 套接字的凭据(pid、uid、gid)。在 Linux 上,您将使用getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &cr, &cr_len)( man 7 socket)。Solaris 有getpeerucred. 不幸的是,这不是可移植的,但许多系统对 Unix 套接字具有类似的功能。尽管它很复杂,但D-Bus包含在许多不同系统上执行此操作的代码

于 2009-05-29T19:05:38.477 回答
2

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

于 2009-05-29T09:21:52.417 回答
1

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

如果你在无头服务器上运行它,/dev/random 可能会有点饿,所以使用 /dev/urandom 将(可能)是一个更好的选择,除非你有合适的噪音源来喂 /dev/随机搭配。

于 2009-05-29T09:47:03.037 回答
1

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

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

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

于 2009-05-30T22:05:27.657 回答