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


8

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

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

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

这些将允许使用scp部分,但似乎无法使用git。Launchpad中有一个补丁,但是我不确定该怎么做。也有git-shell,但似乎不允许编辑器。也许vim太多了,因为它可以用于执行更多代码,因此如果太多,我们可以删除它(如果需要,可以完全删除vim或文本编辑器)。

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

Answers:


8

您可以通过两种补充方式来实现此目的:

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

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

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

最好通过限制gitolite3用户的功能sudo,并通过sudo调用来处理挂钩。这是一个使用gitolite3钩子的工作示例(可以随意调整它们-或增强/固定它们-以适应您的需求):

  • 的相关内容/etc/sudoers/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
    
  • 集线器回购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
    
  • 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
    

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

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

它不是必需的,但是如果您已经在LDAP中注册了用户,并且已经部署了执行LDAP认证的机制(通过PAM模块或使用freeIPA和),则它会有所帮助sssd

为了实现此方案,我目前要做的是以下操作(请注意,这种限制要求满足多个条件,否则可以轻松地规避该限制):

  • 用户不属于该wheel组,而是唯一被授权使用的组su(通过PAM强制执行)。通常,存在非LDAP用户(sysadm),以允许受信任的管理员在灾难恢复或LDAP不可用的情况下执行操作。
  • 使用rbash指向priv的只读PATH为用户提供适当的保护~/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*
    
  • 用户都给予了限制,只读环境(想一样的东西LESSSECURETMOUTHISTFILE变量)。这是为了避免shell逃避类似命令,less并确保可审核性。

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

    Defaults editor=/usr/bin/rvim
    
  • 如果存在MAC限制(您正在使用的特定GNU / Linux发行版已启用SELinux),则将用户映射到SELinux用户,staff_u并具有通过要求以其他用户身份执行命令的权限sudosudorules需要仔细审查允许的特定内容,以防止用户绕过这些限制,并且还可以将其部署在您现有的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
    

    目录的多实例化不是一个新功能,它已经存在了很长时间。作为参考,请参阅2006年的这篇文章。实际上,pam_namespace默认情况下已经使用了许多模块,但是默认配置位于/etc/security/namespace.conf不会启用多实例化。另外,/etc/security/namespace.init应使所有骨骼文件对用户只读,并由拥有root

这样,您可以选择用户是否可以代表其他用户(通过)~/bin通过私有目录(通过私有目录中的链接,通过/etc/skel,通过设置sudo)执行命令,或者完全不执行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.