如何安全地清理子树的权限

如何安全地清理子树的权限

在我们的服务器上,允许多个(当前为两个,预计为三个或四个)用户部署我们的应用程序的新版本。此过程包括从受信任的源 git 存储库下载一些文件并启动应用程序(非特权进程)。

这一切都可以使用单个脚本完成,只需几秒钟。除非另一个用户留下了具有错误权限或组的文件或目录。

然后部署失败,我们执行

sudo chgrp -R sudo      /our/root/directory
sudo chmod -R g=u,o-rwx /our/root/directory &&

我想让我们无需输入密码即可执行此操作。

我知道这setuid不适用于 shell 脚本(有充分的理由)。我想过使用 setuid perl 脚本,但它不再受支持。我可以编写一个 C 包装器和一个脚本,但是拥有两个文件听起来既不舒服也不安全。我可以使用系统调用用 C 语言编写所有内容,但这需要我很长时间。

所以我问:有什么简单而安全的方法可以实现这一目标?编写一些简短的 C 代码就可以了。

如果重要的话,它是 Ubuntu 16.04。


(*) 我们正在使用组sudo和权限rwxrwx---rw-rw---- 整个树。

答案1

编写 shell 脚本并授予适用的用户使用 sudo 调用它的权限。NOPASSWD如果您不希望用户必须输入密码,请使用该指令(请注意顺序很重要,请参阅如何在没有密码提示的情况下以 root 身份运行特定程序?)。

确保 sudo 设置为从环境中删除除一些安全变量(例如LC_*LANG)之外的所有变量。无论如何,Ubuntu 上默认情况就是这种情况,因此在 Ubuntu 上Defaults,除非更改了设置,否则不需要该行env_reset

Defaults!/usr/local/bin/fix-our-permissions env_reset
%our-app-maintainers ALL = NOPASSWD: /usr/local/bin/fix-our-permissions

或者,让人们通过施加固定所有权和权限的文件系统访问部署区域,例如绑定文件系统。看写入文件夹时自动更改文件权限目录中创建的所有文件应归 bob 所有


但实际上,没有人应该手动部署。部署应该是触发的手动,但应该是执行的通过在系统用户帐户中运行的自动化服务,从 CI 获取版本,下载它并重新启动守护进程。

答案2

我认为你可以做一个程序来监视你的文件夹,如果他发现一些麻烦,他会更改文件夹或内容的权限,你可以在 Crontab(root)中执行此操作,或者将其作为服务(root)运行。这是一个替代方案。

答案3

您可以更改这些用户的 umask 以使用您想要的确切 chmod,这样他们进入系统的每个存档都将以该定义的权限集开始

留下链接给你这里

答案4

您可以使用 ACL ( setfacl);这可以防止出现问题。

另一种方法是将文件下载到新的空文件夹中,然后替换旧文件夹。这可以通过覆盖此文件夹的符号链接 ( ) 以原子方式完成ln -sf

相关内容