【问题标题】:Subversion sudo svn update changes file ownership and rwxSubversion sudo svn update 更改文件所有权和 rwx
【发布时间】:2016-04-05 16:11:12
【问题描述】:

我在我的 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。由于settings.py 的权限有限,它将无法执行普通的svn commitsvn update。如果非特权用户尝试这样做,svn 会发出一条消息,指出工作副本已锁定。但是我注意到,当我执行sudo svn update 时,unprivileged_user 正在以root 身份更新,因此从svn 存储库更新的文件现在由root:root 拥有,具有644 权限。这与我试图让settings.pywww-data:www-data 拥有的想法背道而驰。我该怎么做才能使 www-data 始终是所有者并且 rwx 权限保持不变?

【问题讨论】:

  • 我认为问题的根源在于你试图对在它所在的 repo 中工作的用户保密文件。如果你可以避免这样做,那么你就避免了你的问题.
  • @skyler 但这是我在这里要做的主要事情。但即使我将它分开,每当我 svn updatesvn 更改文件所有权和权限时......我想我需要阅读 umask 和 apache 的 uid。
  • 问题是你的权限在svn中不存在,所以不能更改。此外,通过允许任何人执行sudo svn commit,您实际上已经失去了所有安全性,因为有人可以使用它以 root 身份生成编辑器,从而允许他们读取和写入系统上的任何文件。
  • svn commit 生成一个编辑器来编辑提交消息。
  • 如果我们不再关注svn commit,不如想办法让svn update 在不更改所有者/权限的情况下发生?

标签: linux ubuntu svn version-control permissions


【解决方案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

【讨论】:

  • 一个坚定的攻击者可以通过在执行chown -R www-data. .之前中止svnupdate.sh来破坏它。
  • 这种方法还是不安全的。用户可以获得root shell,因为他们可以使用sudo svn commit ...以root身份打开编辑器,然后覆盖/usr/local/bin/svnupdate.sh以仅包含bash,然后运行sudo /usr/local/bin/svnupdate.sh
  • 感谢提示。但满足我对环境的担忧。希望我的代码+您的安全提示也对 OP 有所帮助。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这就是我现在所拥有的。我正在使用 post svn update 挂钩,但我不知道它有多安全。这仅适用于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 将由具有 400 个权限的 www-data:www-data 拥有。你们有什么感想?这里有任何安全漏洞吗?谢谢。

    【讨论】:

    • 这不安全。您的非特权用户现在可以拥有系统上的任何文件的所有权,如下所示:touch "www-data"; sudo /bin/chown www-data --reference myfile.txt /etc/passwd /etc/shadow ./test_svn/settings.py。正如您所看到的,这符合您的规则,但是通过创建一个名为 www-data 的文件,我已经获取了我想要的任何内容。您的方法变得过于复杂,并且您已将用户锁定在他们自己的 .bashrc 文件之外。您需要以不同的方式思考问题并采取不同的方法。为什么不像我之前建议的那样使用符号链接?
    • 我尝试了您的符号链接想法,但是当我尝试从符号链接导入变量时,它不起作用。你写的第二条命令sudo /bin/chown www-data --reference myfile.txt /etc/passwd /etc/shadow ./test_svn/settings.py 不允许使用我拥有的sudo visudo 规则,所以也许我没事?我可以将用户锁定在他们的 .bashrc 文件之外。我只需要稍后为他们编辑。
    猜你喜欢
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2014-07-13
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    相关资源
    最近更新 更多