Linux Subversion sudo svn更新更改文件所有权和rwx

Linux Subversion sudo svn更新更改文件所有权和rwx,linux,ubuntu,svn,version-control,permissions,Linux,Ubuntu,Svn,Version Control,Permissions,我正在限制对我的svn链接目录中某个文件settings.py的权限,以便它只能由sudo用户和apache读取,而apache的用户名是www-data。因此,在settings.py上,我设置了sudo chmod 640 settings.py和sudo chown www-data:www-data-settings.py。我仍然希望我的非特权用户能够svn更新和svn提交,因此我已经设置了sudo visudo unprivileged_user ALL = /usr/bin/svn

我正在限制对我的svn链接目录中某个文件
settings.py
的权限,以便它只能由sudo用户和apache读取,而apache的用户名是www-data。因此,在settings.py上,我设置了
sudo chmod 640 settings.py
sudo chown www-data:www-data-settings.py
。我仍然希望我的非特权用户能够
svn更新
svn提交
,因此我已经设置了
sudo visudo

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

这样该用户仍然可以执行
sudo svn提交
sudo svn更新
。由于
settings.py
上的权限有限,它将无法执行普通的
svn提交
svn更新
。如果非特权用户尝试这样做,将有一条来自svn的消息说工作副本已锁定。但是,我注意到,当我执行
sudo svn update
时,未经授权的用户正在以root用户身份更新,因此,从svn存储库更新的文件现在由
root:root
拥有
644
权限。这与我试图制作
www-data:www-data
拥有的
settings.py的做法背道而驰。如何使
www data
始终是所有者,并且rwx prvileges保持不变?

使用脚本来更新和重置权限

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

www-data
用户在其所在的每个系统上都有一个不同的UID,使其成为每个系统上的一个新用户。您无法预测这将是哪个用户,因此无法正确设置所有者。无论谁检查它都将是它的所有者


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

以下是我现在拥有的权限。我使用的是post svn更新挂钩,我不知道它有多安全。这仅适用于svn更新。请随时发表你的意见

usr/local/bin
中,我基于以下内容创建了
ssh action.sh

我实际的
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
alias svn = /usr/local/bin/ssh-action.sh
接下来,
cd/home/unprivileged_user
,打开
.bashrc
,并将其添加到底部:

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
alias svn = /usr/local/bin/ssh-action.sh
之后,我需要使
.bashrc
不可变,这样没有特权的人就不能编辑它来绕过我的svn钩子。我是通过
sudo chattr+I.bashrc


有了这一点,无论何时无特权的用户试图更新
svn
test\u svn
working copy,
settings.py
将由
www-data:www-data
拥有400个权限。你们觉得怎么样?这里有安全漏洞吗?谢谢。

一个坚定的攻击者可以在执行
chown-R www-data.之前中止
svnupdate.sh
来破解此漏洞。这种方法仍然不安全。用户可以获得根shell,因为他们可以使用
sudo svn commit…
以root身份打开编辑器,然后覆盖
/usr/local/bin/svnupdate.sh
以仅包含
bash
,然后运行
sudo/usr/local/bin/svnupdate.sh
。感谢您的提示。但要满足我对环境的担忧。希望我的代码加上你的安全提示也能对OP有所帮助。我认为问题的根源在于你试图对在回购中工作的用户保密。如果你可以避免这样做,那么你就可以避免你的问题。@skyler但这是我在这里要做的主要事情。但是,即使我将它分开,只要我
svn update
svn更改文件所有权和权限。。。我想我需要了解umask和apache的uid。问题是你的权限在svn中不存在,所以你不能更改它们。此外,通过允许任何人执行
sudo svn commit
操作,实际上您已经失去了所有安全性,因为有人可以使用它生成一个编辑器作为root用户,允许他们读取和写入系统上的任何文件。
svn commit
生成一个编辑器来编辑提交消息。如果我们不再查看
svn commit
,想办法让
svn更新
在不更改所有者/权限的情况下进行,怎么样?这是不安全的。您的非特权用户现在可以按如下方式拥有系统上的任何和每个文件:
触摸“www-data”;sudo/bin/chown www-data——参考myfile.txt/etc/passwd/etc/shadow./test\u svn/settings.py
。正如您所看到的,这符合您的规则,但通过创建一个名为www-data的文件,我已经获取了我想要的任何内容。您的方法变得太复杂,并且您已将用户锁定在他们自己的.bashrc文件之外。你需要以不同的方式思考问题,采取不同的方法。为什么不像我之前建议的那样使用符号链接呢?我尝试了你的符号链接想法,但是当我尝试从符号链接导入变量时,它不起作用。您编写的第二个命令
sudo/bin/chown www-data--reference myfile.txt/etc/passwd/etc/shadow./test\u svn/settings.py
不允许与我的
sudo-visudo
规则一起使用,所以我可能没事吧?将用户从.bashrc文件中锁定对我来说没问题。我以后只需要为他们编辑它。