想想一个虚拟主机公司,想让用户通过SSHpipe理文件和git仓库。 这包括:
我们想要实现这一点,并考虑了以下选项:
这些将允许scp部分,但使用git似乎不可能。 在Launchpad中有一个补丁,但我不知道该怎么做。 还有git-shell ,但是它似乎不允许编辑。 也许vim甚至太多了,因为它可能被用来执行更多的代码,所以如果它太多的话,我们可以放弃(vim,或者文本编辑器,如果必须的话)。
我们基本上想lockingshell,所以用户可以pipe理(和编辑)文件和git存储库,但用户不应该能够在系统上执行任何其他程序。 最大的问题是滥用networking和计算资源,但是也使用该系统作为代理。 你把它命名。 有没有办法做到这一点,或者我们甚至可能在这个问题上有错误的做法?
你有两个互补的方式来实现这一点:
git存储库的权限 使用gitolite3提供一个hub-live存储库模式( 这里详细描述),基本上需要你有一个bare仓库(一个hub repo)来让你的用户从推送/取出的版本相同的回购(一个活的回购)位于适当的path,例如/srv/www/html 。
我喜欢使用gitolite3来处理集线器回购,但这不是必需的,但是如果需要的话,将精细的访问控制绑定到您select的LDAP是相当方便的。 gitolite3可以向分支级别提供细粒度的控制。
通过sudo限制gitolite3用户的function也是一个好习惯,并且通过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 # eg 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
你需要实现的是一个可重复的,可审计的限制用户执行除严格允许的操作之外的能力的方法。
这不是必需的,但是如果您的用户已在LDAP中注册,并且您已经部署了执行LDAP身份validation的机制(无论是通过PAM模块还是使用freeIPA和sssd , sssd 。
为了实现这个场景,我现在做的是以下几点(注意这种限制要求满足几个条件,否则限制可以很容易的避开):
wheel组,唯一一个被授权使用su (通过PAM强制执行)。 通常情况下,存在一个非LDAP用户( sysadm ),允许受信任的pipe理员在灾难恢复或LDAP不可用情况下执行操作。 用户被赋予一个安全的rbash ,只读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*
给用户一个受限制的只读环境(像LESSSECURE , TMOUT , HISTFILEvariables等)。 这是为了避免shell从命令中逃逸,并确保可审计性。
唯一允许的编辑器是rvim ,出于同样的原因。 用户只能执行sudoedit ,configuration为在sudoconfiguration中运行rvim :
Defaults editor=/usr/bin/rvim
如果有MAC限制(您使用的特定GNU / Linux分发版本启用了SELinux),那么用户将被映射到SELinux用户staff_u并被授予以其他用户身份通过sudo执行命令的权限。 为了防止用户绕开这些限制,需要仔细检查特定的sudorules ,并且还可以将其部署在现有的LDAP基础结构(这是freeIPAfunction之一)中。
用户的/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
目录的多实例化不是一个新function,现在已经有了相当长的时间。 作为参考,请参阅2006年的这篇文章 。 事实上,很多模块默认已经使用了pam_namespace ,但是/etc/security/namespace.conf中的默认configuration不支持多实例化。 而且,/ /etc/security/namespace.init应该使所有骨架文件只读为用户所有,并由root拥有。
这样,您可以select用户是否可以代表自己执行任何命令(通过私人~/bin目录中的链接,通过/etc/skel ,如上所述),代表其他用户(通过sudo )一个都没有。