在我们的产品中,我们使用 daemontools 创建了服务。我的一项服务如下所示,
/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.
为此,我必须更改“log”目录下的“run”文件。此外,我还需要更改其下“main”目录的权限。
请注意,“/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
在一些文章中,他们建议在“log/main”下重新创建“lock”文件。有没有其他更简洁的方法可以做到这一点而不移动“main”目录?如果没有,按照上述步骤操作是否安全?
答案1
1. Service should run in non-root user.
很简单。您可以将服务定义复制到“用户”主目录中的服务目录中。例如,假设您创建了一个用户,我们将其称为niftyuser
。我们还假设您的服务名为niftyservice
。因此,您可以将服务定义复制到该用户控制的目录中;为了讨论的方便(不一定是您想这样做),假设您将使用niftyuser
的主目录。所以,
cp -Rav /etc/service/niftyservice /home/niftyuser/service/niftyservice
将创建服务定义。然后,您必须在该用户的目录上启动服务扫描,但使用用户的凭据启动。如果您将其编写为脚本,它看起来有点像:
#!/bin/sh
exec setuidgid niftyuser svscan /home/niftyuser/service
结果将是由该用户控制的服务树。请注意,通过将其制作成脚本,您可以将用户控制的进程的子树楔入主进程树……您可以查看 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。这将允许任何人读取文件,但只有用户或组可以写入文件。