Você tem duas maneiras complementares de implementar isso:
Concedendo Permissões aos Usuários para Usar git
Repositórios Remotamente
Use gitolite3
para fornecer um esquema de repositórios ativos no hub (isso é descrito em detalhes aqui ), que basicamente exige que você tenha um bare
repositório (um repositório de hub ) para permitir que seus usuários enviem / retirem e retirem uma versão com check-out do mesmo repositório (a vivo repo), localizado no caminho apropriado, digamos /srv/www/html
, por exemplo.
Eu gosto de usar gitolite3
para lidar com o repositório do hub , mas isso não é um requisito, embora seja bastante conveniente ter um controle de acesso refinado vinculado ao seu LDAP de sua escolha, se necessário. gitolite3
pode fornecer controle refinado até o nível da ramificação.
Também é uma boa prática limitar os recursos do gitolite3
usuário via sudo
e manipular os ganchos por meio de sudo
chamadas. Este é um exemplo de trabalho usando gitolite3
ganchos ( fique à vontade para adaptá-los - ou aprimorá-los / corrigi-los - para atender às suas necessidades):
O conteúdo relevante do /etc/sudoers
ou /etc/sudoers.d/gitolite3
seria algo parecido com:
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
gancho de recompra do cubo :
#!/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
roteiro:
#!/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
Limitando a capacidade de executar comandos não autorizados em um shell de login
O que você precisa implementar é um método reproduzível e auditável de limitar a capacidade do usuário de executar ações diferentes das estritamente permitidas.
Não é necessário, mas ajuda se você possui seus usuários registrados no LDAP e já implementou os mecanismos para executar a autenticação LDAP, seja por meio de um módulo PAM ou usando o freeIPA e sssd
.
Para implementar esse cenário, o que eu faço atualmente é o seguinte (esteja ciente de que esse tipo de restrição exige que várias condições sejam atendidas, caso contrário, a restrição poderá ser facilmente contornada):
- Os usuários não pertencem ao
wheel
grupo, o único autorizado a usar su
(imposto via PAM). Normalmente, um usuário não LDAP ( sysadm
) existe para permitir que administradores confiáveis executem ações em casos de recuperação de desastre ou indisponibilidade de LDAP.
Os usuários recebem um adequadamente protegido rbash
com um PATH somente leitura apontando para um privado ~/bin
; esse ~/bin/
diretório contém links para todos os comandos permitidos, por exemplo:
$ 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*
os usuários recebem um, somente leitura ambiente restrito (pense em coisas como LESSSECURE
, TMOUT
, HISTFILE
variáveis). Isso é para evitar shell
escapes de comandos como less
e garantir a auditabilidade.
o único editor permitido é rvim
, pelo mesmo motivo. Os usuários podem executar apenas sudoedit
, que estão configurados para serem executados rvim
na sudo
configuração:
Defaults editor=/usr/bin/rvim
se houver restrições de MAC (a distribuição específica do GNU / Linux que você está usando tem o SELinux ativado), os usuários serão mapeados para o usuário do SELinux staff_u
e terão direitos para executar comandos como outro usuário, conforme necessário sudo
. O específico sudorules
permitido precisa ser cuidadosamente revisado para evitar que o usuário contorne essas limitações e também pode ser implantado em sua infraestrutura LDAP existente (esse é um dos recursos do freeIPA).
dos usuários e /home
, /tmp
possivelmente, /var/tmp
são instintivados via /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
A polinstantiação de diretórios não é um recurso novo, está disponível há bastante tempo. Como referência, consulte este artigo de 2006 . Por uma questão de fato, muitos módulos já usam pam_namespace
por padrão, mas a configuração padrão em /etc/security/namespace.conf
não permite a polinstanciação. Além disso, /etc/security/namespace.init
deve tornar todos os arquivos esqueléticos somente leitura para os usuários e de propriedade de root
.
Dessa forma, você pode escolher se os usuários podem executar qualquer comando em seu próprio nome (por meio de um link no ~/bin
diretório privado , provisionado por /etc/skel
, como explicado acima), em nome de outro usuário (por sudo
) ou nenhum.