在我们的产品中,我们使用daemontools创build了服务。 我的一个服务是这样的,
/service/test/run /service/test/log/run (has multilog command to log into ./main dir) /service/test/log/main/..
所有进程及其目录都由root用户拥有。 现在有这样一个安全要求的变化,
1. Service should run in non-root user. 2. Log main directory should be readable only to user and groups.
为此,我必须更改“日志”目录下的“运行”文件。 另外我需要更改它下面的“主”目录的权限。
请注意,“/ service”下的所有这些文件都由test-1.0-0.rpm拥有。 当我更新我的rpm,它覆盖了现有的运行文件,并得到这样的错误,
multilog: fatal: unable to lock directory ./main: access denied
我知道我们不应该在运行时重写“运行”文件。 我计划在我的rpm脚本%post部分按照这些步骤,
//Stop service svc -d /service/test/log //Moving the main directory mv /service/test/log/main /service/test/log/main_old //Updated run file has code to create main with limited permissions. //Start service svc -u /service/test/log
在一些文章中,他们build议在“log / main”下重新创build'lock'文件。 有没有其他更干净的方式做到这一点,而不移动“主”目录? 如果没有,那么采用上述步骤是否安全?
1. Service should run in non-root user.
很简单。 您可以将您的服务定义复制到“用户”家中的服务目录中。 例如,假设您创build一个用户,我们将其niftyuser
。 我们也说你的服务叫做niftyservice
。 所以,你可以将你的服务定义复制到该用户控制的目录中; 为了讨论(不一定是你想要这样做),假设你将使用niftyuser
的主目录。 所以,
cp -Rav /etc/service/niftyservice /home/niftyuser/service/niftyservice
将创build服务定义。 然后,您将不得不在该用户的目录上启动服务扫描,而是使用用户的凭据启动。 如果你把它写成一个脚本,它会看起来有点像:
#!/bin/sh exec setuidgid niftyuser svscan /home/niftyuser/service
结果将是由该用户控制的服务树。 请注意,通过将其作为脚本,您可以将用户控制的进程的子树embedded到主进程树中…您可以看到runit的例子,因为runit受到daemontools的启发。
2. Log main directory should be readable only to user and groups.
坦率地说,我只是把/service/(service-name)/log/main
一个符号链接到一个实际的目录,即/service/niftyservice/log/main
指向/var/log/niftyservice
。 在日志目录的运行脚本中,指向./main
作为目标; 这意味着您可以根据需要设置定义一次,并根据需要移动日志,只需更改符号链接即可。 最后,为了解决问题(2),您可以根据需要为/var/log/niftyservice
设置用户和组权限,并将模式设置为775.这将允许任何人读取文件,但只能读取用户或组写给他们。