Shell restrito para gerenciar arquivos e repositórios git

8

Pense em uma empresa de hospedagem na web que deseja permitir que os usuários gerenciem arquivos e repositórios git via ssh. Isso inclui:

  • cópia segura (scp)
  • criando, copiando, movendo / renomeando e excluindo arquivos
  • executando um subconjunto restrito de comandos para controle de origem e edição de texto (git, vim, nano)

Gostaríamos de implementar isso e analisamos as seguintes opções:

Isso permitiria a parte scp, mas o uso do git não parece ser possível. Há um patch no Launchpad , mas não sei ao certo o que fazer. Também existe o git-shell , mas não parece permitir editores. Talvez o vim seja até demais, porque poderia ser usado para executar mais código, para que pudéssemos eliminá-lo (vim, ou editores de texto completamente, se necessário) se for demais.

Basicamente, queremos bloquear o shell, para que o usuário possa gerenciar (e editar) arquivos e repositórios git, mas o usuário não poderá executar outros programas no sistema. O maior problema seria o abuso de recursos de rede e de computação, mas também o uso do sistema como proxy. O que você disser. Existe uma maneira de fazer isso ou talvez tenhamos a abordagem errada sobre esse problema?

Phillipp
fonte

Respostas:

8

Você tem duas maneiras complementares de implementar isso:

Concedendo Permissões aos Usuários para Usar gitRepositórios Remotamente

Use gitolite3para fornecer um esquema de repositórios ativos no hub (isso é descrito em detalhes aqui ), que basicamente exige que você tenha um barerepositó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 gitolite3para 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. gitolite3pode fornecer controle refinado até o nível da ramificação.

Também é uma boa prática limitar os recursos do gitolite3usuário via sudoe manipular os ganchos por meio de sudochamadas. Este é um exemplo de trabalho usando gitolite3ganchos ( fique à vontade para adaptá-los - ou aprimorá-los / corrigi-los - para atender às suas necessidades):

  • O conteúdo relevante do /etc/sudoersou /etc/sudoers.d/gitolite3seria 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-updategancho 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 wheelgrupo, 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 rbashcom 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, HISTFILEvariáveis). Isso é para evitar shellescapes de comandos como lesse 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 rvimna sudoconfiguraçã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_ue terão direitos para executar comandos como outro usuário, conforme necessário sudo. O específico sudorulespermitido 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, /tmppossivelmente, /var/tmpsã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_namespacepor padrão, mas a configuração padrão em /etc/security/namespace.confnão permite a polinstanciação. Além disso, /etc/security/namespace.initdeve 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 ~/bindiretório privado , provisionado por /etc/skel, como explicado acima), em nome de outro usuário (por sudo) ou nenhum.

dawud
fonte