svnserve 似乎以 root 身份写入文件。如何通过 svnserve 和 apache 授予对同一存储库的访问权限?

svnserve 似乎以 root 身份写入文件。如何通过 svnserve 和 apache 授予对同一存储库的访问权限?

目的是设置具有 svnserve 和 apache/webdav 访问权限的 subversion。

当用户通过 http/apache 提交时,文件将写入文件系统并属于 apache 用户。

当用户通过 svn/svnserve 提交时,文件被写入文件系统并属于 root 用户。

我尝试以 svnserve 用户身份设置 apache,但没有任何效果:


cat /pathto/repo/conf/passwd
[users]
apache = XxXxXxX

 cat /pathto/repo/conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd


[sasl]
use-sasl = false

svn: Commit failed (details follow):
svn: Can't move '/pathto/repo/db/txn-protorevs/1091-ux.rev' 
to '/pathto/repo/db/revs/1/1092': Permission denied

确实,root 是目录的所有者,我想要 apache。


ls -ld /pathto/repo/db/revs/1/
drwxr-s--- 2 root svn 4096 Jul 17 15:25 /pathto/repo/db/revs/1/

现在我使用以下解决方法:


chown -R apache /pathto/repo/db/

有人有干净的运行 svnserve 的解决方案?

更新1:svnserve 作为独立服务运行

更新2:这是 /etc/sysconfig/svnserve 内容:


OPTIONS="--threads --root /pathto "

更新3:我同意 JvO 的观点:使用 http/apache/webdav 作为唯一访问系统会简单得多。不幸的是,第三方软件只有 svn:// 绑定,没有 http:// 绑定。

更新4:修改 svnserve init 脚本应该可行,但是有人有其他想法吗?

更新 5:增加赏金:寻找一个优雅的解决方案

答案1

显然,您的 svnserve 进程以 root 身份运行。因此,请更改配置,以某个非特权用户身份运行该进程(从您的描述中不清楚 svnserve 究竟是如何启动的;可能是 xinetd 或其他东西)。

从安全角度来看,我认为最好的方法是将 apache 和 snvserve 用户添加到一个公共组(如“svn”),并将存储库的权限更改为 drwxrws---(即,组权限是“粘性的”)

答案2

您应该能够修改 svnserv 启动脚本以作为其他用户运行。看一下 https://gist.github.com/dexterbt1/905615 相关部分是

start() {
        echo -n $"Starting $desc ($prog): "
    daemon --user $USER $prog -d $OPTIONS
    RETVAL=$?
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
    echo
}

然后你应该能够将 USER 设置/etc/sysconfig/subversion为你想要运行的用户。我也会回应@JVQ关于以具有共同组的用户身份运行的建议(即创建 svn 用户,使用 svn 组使守护进程以用户 svn 身份运行,然后将 apache 用户添加到 svn 组)

相关内容