在设置了组 suid/sgid 的存储库上运行 svnsync 无法执行钩子

在设置了组 suid/sgid 的存储库上运行 svnsync 无法执行钩子

我有一台 Linux 服务器,我正尝试svnsync根据存储库列表来运行镜像/备份。

我创建了一个文件夹/srv/backups并将其设置为具有 的组 gsid admchmod g+s以便在此目录中创建的任何项目或文件夹都保留 adm 组所有权。

失败

然后我:

  • svnadmin create blah在下创建一个存储库/srv/backups
  • pre-revprop-change钩子脚本复制到blah/hooks/
  • 确保钩子是可执行的chmod +ax blah/hooks/pre-revprop-change
  • 尝试svnsync init针对 blah 和远程存储库运行。无论以我本人还是 root 身份运行,都会失败,并出现 pre-revprop-change 脚本的 255 错误消息。

svnsync:E165001:Revprop 更改被 pre-revprop-change 钩子阻止(退出代码 255),没有输出。

成功

如果我重复上述相同的步骤,将相同的pre-revprop-change钩子复制到目标镜像,但是:

  1. 以我自己的身份运行我主目录下的文件夹,
  2. 或者以 root 身份运行,但/srv/svnmirrors该目录下root:adm有所有权,但 gsid 未设置,

然后它正确执行,允许我初始化并稍后同步。

假设

因此,我很确定这是 gsid 的问题,并且 svnsync 没有权限运行该钩子。

我的理解是设置 gsid 会告诉针对此目录运行的程序使用这些凭据运行;因此添加文件夹是以 myself:adm 的身份完成的,并且我希望运行 svnsync 能够以 myself:adm 或 root:adm 的身份运行,并且应该具有足够的权限。

权限

以下是失败和成功/srv下的主要文件夹:backupssvnmirrors

drwxrwsr-x 11 root adm 4096 9月 16 17:09 备份
drwxrwxr-x 2 root adm 4096 9月 16 17:24 svnmirrors

以下是两个位置的挂钩:

执行失败的钩子;以 root 和 myuser 身份尝试:

-rwxr-xr-x 1 myuser adm 2794 9月 16 16:54 backups/blah/hooks/pre-revprop-change
- 或 -
-rwxr-xr-x 1 root adm 2794 9月 16 16:54 backups/blah/hooks/pre-revprop-change

接下来的一个

-rwxr-xr-x 1 myuser myuser 2794 9月 16 16:45 svnmirrors/blah/hooks/pre-revprop-change

想法:

  1. 是不是svnsync没有在adm组下运行?
  2. 如果可以,是否可以将 svnsync 添加到 adm?
  3. 或者我需要在文件夹上设置不同的组并确保我在该组中?
  4. 通过设置 gsid,我是否会暴露服务器上的漏洞?参考本章主要讨论安全性。

答案1

已解决 - 无需noexec选项即可挂载分区

确保您已经挂载了没有该选项的目录noexec

我不知道是什么让我看进去/etc/fstab(或者为什么我没有早点想到这一点)但这/srv/backups是一个单独的分区并且我已经用选项声明了它noexec

这使得钩子无法运行;将其移除并重新安装,一切正常。

但是,我将从文件夹中删除 gsid,将分区更改为nosuid,并允许执行。

答案2

如果还没有,pre-revprop-change除了将其复制到位之外,您还需要修改钩子——svn:log默认情况下,它会阻止 revprop 更改(对除 之外的所有属性)。您需要添加类似以下内容的内容:

if [ "$USER" = "svnsync" ]; then exit 0; fi

这里了解更多信息。

答案3

我是否可以建议使用 Chris Knight 的 svnbackup.pl 和 svnrestore.pl 脚本来备份您的 Repo?我们使用它并且效果很好。

相关内容