用于管理文件和 git 存储库的受限 shell

Phi*_*ipp 8 security linux

想想一家网络托管公司,它想让用户通过 ssh 管理文件和 git 存储库。这包括:

  • 安全副本 (scp)
  • 创建、复制、移动/重命名和删除文件
  • 执行用于源代码控制和文本编辑的一小部分命令(git、vim、nano)

我们想实现这一点,并研究了以下选项:

这些将允许 scp 部分,但似乎不可能使用 git。Launchpad 中有一个补丁,但我不知道该怎么做。也有git-shell,但它似乎不允许编辑器。也许 vim 太多了,因为它可以用来执行更多的代码,所以如果它太多,我们可以删除它(vim 或文本编辑器,如果必须的话)。

我们基本上是想锁定 shell,这样用户就可以管理(和编辑)文件和 git 存储库,但用户不应该能够在系统上执行任何其他程序。最大的问题是滥用网络和计算资源,但也将系统用作代理。你说出它的名字。有没有办法做到这一点,或者我们甚至可能对这个问题有错误的方法?

daw*_*wud 8

您有两种互补的方法来实现这一点:

授予用户git远程使用存储库的权限

使用gitolite3提供集线器活库模式(这是中详细描述这里),基本上需要你有一个bare仓库(一枢纽回购),可让使用者从推/拉和签出同一回购的版本(一个实时存储库)位于适当的路径中,/srv/www/html例如 。

我喜欢用来gitolite3处理集线器存储库,但这不是必需的,尽管如果需要,将细粒度的访问控制绑定到您选择的 LDAP 是相当方便的。gitolite3可以提供细粒度控制到分支级别。

通过 限制gitolite3用户的能力sudo并通过sudo调用处理钩子也是一种很好的做法。这是一个使用gitolite3钩子的工作示例(随意调整它们 - 或增强/修复它们 - 以满足您的需求):

  • /etc/sudoersor的相关内容/etc/sudoers.d/gitolite3大致如下:

    Cmnd_Alias        GITOLITE_CMDS = /usr/bin/git, /bin/chown, /bin/find, /usr/bin/xargs, /bin/chmod, /sbin/restorecon, /usr/local/sbin/publisher-hub2live
    Cmnd_Alias GITOLITE_APACHE_CMDS = /usr/sbin/apachectl graceful
    Defaults:gitolite3 !requiretty
    Defaults:gitolite3 lecture=never
    gitolite3                ALL = (root)NOPASSWD: GITOLITE_CMDS
    gitolite3       APACHE_HOSTS = (root)NOPASSWD: GITOLITE_APACHE_CMDS
    
    Run Code Online (Sandbox Code Playgroud)
  • 集线器回购post-update挂钩:

    #!/bin/sh
    
    echo "****"
    echo "**** Calling publisher-hub2live script [Hub's post-update hook]"
    echo "****"
    
    sudo /usr/local/sbin/publisher-hub2live "/srv/www/html" "root:apache" "2750" "640"
    
    exit 0
    
    Run Code Online (Sandbox Code Playgroud)
  • publisher-hub2live 脚本:

    #!/bin/sh
    
    echo "****"
    echo "**** Pulling changes into Live [publisher-hub2live]"
    echo "****"
    
    cd "$1" || exit
    umask 0022
    unset GIT_DIR
    /usr/bin/git pull hub master
    
    # custom actions here
    # e.g call grunt tasks
    /bin/chown -R "$2" "$1"
    /bin/find "$1" -type d -exec chmod "$3" {} +
    /bin/find "$1" -type f -exec chmod "$4" {} +
    /bin/chmod u+x "$1"/.git/hooks/post-commit
    /sbin/restorecon -R -v "$1"
    exec /usr/bin/git update-server-info
    
    exit 0
    
    Run Code Online (Sandbox Code Playgroud)

限制在登录 shell 中执行非授权命令的能力

您需要实施的是一种可重现的、可审计的方法,用于限制用户执行除严格允许之外的操作的能力。

这不是必需的,但如果您的用户已在 LDAP 中注册,并且您已经部署了执行 LDAP 身份验证的机制,无论是通过 PAM 模块,还是使用 freeIPA 和sssd.

为了实现这个场景,我目前做的是以下(注意这种限制需要满足几个条件,否则很容易绕过限制):

  • 用户不属于该wheel组,是唯一被授权使用的组su(通过 PAM 强制执行)。通常,存在非 LDAP 用户 ( sysadm) 以允许受信任的管理员在灾难恢复或 LDAP 不可用的情况下执行操作。
  • 为用户提供了一个正确保护rbash的只读 PATH 指向 private ~/bin,该~/bin/目录包含指向所有允许命令的链接,例如:

    $ ll ~/bin
    total 0
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear*
    lrwxrwxrwx. 1 root dawud  7 Sep 17 08:58 df -> /bin/df*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep*
    lrwxrwxrwx. 1 root dawud  8 Sep 17 08:58 env -> /bin/env*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep*
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 git -> /usr/bin/git*
    lrwxrwxrwx. 1 root dawud  9 Sep 17 08:58 grep -> /bin/grep*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo*
    lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail*
    lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
    
    Run Code Online (Sandbox Code Playgroud)
  • 给用户一个受限的只读环境(想想像LESSSECURE, TMOUT,HISTFILE变量之类的东西)。这是为了避免shell从类似命令中转义less并确保可审计性。

  • rvim出于同样的原因,唯一允许的编辑器是。用户只能执行sudoedit,whic在配置为运行rvimsudo配置:

    Defaults editor=/usr/bin/rvim
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果 MAC 限制到位(您使用的特定 GNU/Linux 发行版启用了 SELinux),则用户将映射到 SELinux 用户staff_u并通过sudo. 具体的sudorules允许需要仔细审查以防止用户规避这些限制,也可以部署在您现有的 LDAP 基础架构中(这是 freeIPA 的功能之一)。

  • 用户的/home/tmp并且可能/var/tmp通过/etc/security/namespace.conf以下方式进行多实例化:

    /tmp       /tmp/.inst/tmp.inst-$USER-     tmpdir:create   root
    /var/tmp   /tmp/.inst/var-tmp.inst-$USER- tmpdir:create   root
    $HOME      $HOME/$USER.inst/              tmpdir:create   root
    
    Run Code Online (Sandbox Code Playgroud)

    目录的多实例化并不是一个新功能,它已经存在很长时间了。作为参考,请参阅2006 年的这篇文章。其实很多模块已经pam_namespace默认使用了,但是at的默认配置/etc/security/namespace.conf并没有开启多实例化。此外,/etc/security/namespace.init应该使所有骨架文件对用户只读并归root.

通过这种方式,您可以选择用户是否可以代表他们自己(通过私有~/bin目录中的链接,通过 提供/etc/skel,如上所述),代表其他用户(通过sudo)或根本不执行任何命令。