Subversion sudo svn update更改了文件所有权和rwx

时间:2015-12-31 19:03:34

标签: linux ubuntu svn version-control permissions

我在svn链接目录中限制某个文件settings.py的权限,以便只能由sudo用户和apache读取,用户名为www-data。因此,在settings.py上,我设置了sudo chmod 640 settings.pysudo chown www-data:www-data settings.py。我仍然希望我的非特权用户能够svn updatesvn commit,因此sudo visudo我设置了

unprivileged_user ALL = /usr/bin/svn commit *, /usr/bin/svn update *, \
                        /usr/bin/svn update

这样该用户仍然可以sudo svn commitsudo svn update。由于svn commit的权限有限,它无法执行简单svn updatesettings.py。如果非特权用户尝试这样做,则会出现来自svn的消息,指出工作副本已被锁定。我注意到,当我执行sudo svn update时,unprivileged_user正在以root身份进行更新,因此从svn存储库更新的文件现在由root:root拥有644权限。这与我settings.py拥有www-data:www-data所拥有的内容相悖。我能做些什么来使www-data始终是所有者并且rwx prvileges保持不变?

3 个答案:

答案 0 :(得分:1)

使用脚本来执行更新并重置权限。

<强> svnupdate.sh:

#!/bin/bash
MY_PROJ_PATH=/home/.... # Put you path here
pushd $MY_PROJ_PATH
svn update $* && chown -R www-data. . && chmod 640 settings.py
popd

还要确保chmod 750 /usr/local/bin/svnupdate.sh以防止sudo命令出现安全问题 并更新sudoeres文件:

unprivileged_user ALL = /usr/bin/svn commit *, /usr/local/bin/svnupdate.sh

答案 1 :(得分:1)

www-data用户将在其所在的每个系统上拥有不同的UID,从而使其成为每个系统上的新用户。您无法预测这将是哪个用户,因此您无法正确设置所有者。检查出来的人将是所有者。

此外,svn不会跟踪权限。它只跟踪文件是否可执行。文件附带的权限由您的umask决定。

答案 2 :(得分:0)

这就是我现在所拥有的。我正在使用post svn update hook,我不知道它有多安全。这仅适用于svn update。请随时在此陈述您的意见。

usr/local/bin中,我根据此创建ssh-action.shhttp://top-frog.com/2009/04/23/client-side-pre-and-post-svn-hooks-with-unix-aliases/

我的实际ssh-action.sh看起来像这样:

#!/bin/bash
REAL_SVN='/usr/bin/svn';
BASE_PATH='/home/unprivileged_user/test_svn/';

$REAL_SVN $@;
wait;

# post-svn actions
if [ $1 = 'up' ] || [ $1 = 'update' ]; then
    find -L $BASE_PATH -type f -name 'settings.py' -exec bash -c 'sudo chmod 0400 $0 && sudo chown www-data $0; sudo chgrp www-data $0' '{}' \;
fi

然后在sudo visudo中,我将其添加到底部:

unprivileged_user ALL = NOPASSWD: /bin/chown www-data */test_svn/settings.py, /bin/chmod 0400 */test_svn/settings.py, /bin/chgrp www-data */test_svn/settings.py

接下来,cd /home/unprivileged_user,打开.bashrc,然后将其添加到底部:

alias svn = /usr/local/bin/ssh-action.sh

之后,我需要使.bashrc不可变,以便非特权者无法编辑它以绕过我的svn钩子。我使用sudo chattr +i .bashrc

执行此操作

希望每当unprivileged_user尝试svn update test_svn工作副本时,settings.py将拥有www-data:www-data拥有400个权限。你们有什么感想?这里有安全漏洞吗?感谢。