应用程序以root用户身份运行,创build应该被任何人读取的日志

我有这个问题,希望看到行业的最佳实践。

我正在编写一个使用开源日志库的软件。 这个库的特点之一是能够创build旋转的日志文件。 例如,如果最大日志大小为2GB,则在达到限制时,会创build一个新文件,并重命名旧文件。

我的应用程序必须以root身份运行,因为它需要访问较低范围的端口号。 因此,应用程序正在创build的日志只能由root用户读取。

我希望日志可以被任何用户读取,而不只是由root用户读取。 我怎样才能做到这一点? 解决这个问题有没有行业标准?

可以给予非根进程特定的管理权限 – 就像绑定到特权端口的能力一样。 这比单纯以root用户身份运行应用程序的方法要安全得多,被认为是更好的解决方案。

在这种情况下,您可能希望为其提供CAP_NET_BIND_SERVICE功能。 这个答案是如何做到这一点的一个很好的起点。

主要的两种方法似乎是

  1. 创建一个以setuid身份运行的setuid包装程序,然后删除所需的所有功能,然后exec实际的程序
  2. 使用setcap在单个系统上设置可执行文件的功能。

有关功能的更多信息,请从Linux终端运行以下命令

 $ man 7 capabilities 

或者,访问这个网站: http : //linux.die.net/man/7/capabilities

在类Unix操作系统中,进程的umask控制新创建文件的权限。

你的进程显然已经把它的umask设置为077 (或类似),导致组和其他没有任何权限。 标准的解决方法是使用限制性较小的umask,如022 (组和其他不能写,但可以读取,如果适当的话,执行)。

请注意,更改您的umask可能会产生不必要的副作用:如果您希望由您的应用程序创建的文件只能被root用户读取,那么您需要弄清楚如何在日志记录时设置限制较少的umask,并设置更严格的umask创建其他文件。 有关umasks的更多信息,请参阅Wiki Ubuntu或此问题 。

其他更复杂的权限问题解决方案也是可能的。 例如:

  • 您可以使用root权限启动进程,绑定到低编号的端口,然后删除权限(假设您不需要在初始化后绑定到其他端口)。
  • 您应该可以使用setfacl在日志文件的目录上设置默认ACL,除了标准用户/组/其他位授予的权限之外,您还可以授予读者权限。

但检查你的umask是开始的地方。