您可以通过两种补充方式来实现此目的:
授予用户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*
用户都给予了限制,只读环境(想一样的东西LESSSECURE
,TMOUT
,HISTFILE
变量)。这是为了避免shell
逃避类似命令,less
并确保可审核性。
rvim
出于相同的原因,唯一允许的编辑器是。用户只能执行sudoedit
,whic在配置为运行rvim
在sudo
配置:
Defaults editor=/usr/bin/rvim
如果存在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
目录的多实例化不是一个新功能,它已经存在了很长时间。作为参考,请参阅2006年的这篇文章。实际上,pam_namespace
默认情况下已经使用了许多模块,但是默认配置位于/etc/security/namespace.conf
不会启用多实例化。另外,/etc/security/namespace.init
应使所有骨骼文件对用户只读,并由拥有root
。
这样,您可以选择用户是否可以代表其他用户(通过)~/bin
通过私有目录(通过私有目录中的链接,通过/etc/skel
,通过设置sudo
)执行命令,或者完全不执行。