Shell restringido para administrar archivos y repositorios git

8

Piense en una empresa de alojamiento web que quiere permitir a los usuarios administrar archivos y repositorios git a través de ssh. Esto incluye:

  • copia segura (scp)
  • crear, copiar, mover / renombrar y eliminar archivos
  • Ejecutar un subconjunto limitado de comandos para control de fuente y edición de texto (git, vim, nano)

Nos gustaría implementar eso y analizar las siguientes opciones:

Esto permitiría la parte scp, pero no parece posible usar git. Hay un parche en Launchpad , pero no estoy seguro de qué hacer con él. También hay git-shell , pero no parece permitir editores. Quizás vim es incluso demasiado, porque podría usarse para ejecutar más código, por lo que podríamos descartarlo (vim, o editores de texto por completo, si es necesario) si es demasiado.

Básicamente queremos bloquear el shell, para que el usuario pueda administrar (y editar) archivos y repositorios git, pero el usuario no debería poder ejecutar ningún otro programa en el sistema. El mayor problema sería el abuso de la red y los recursos informáticos, pero también el uso del sistema como proxy. Tu dilo. ¿Hay alguna manera de hacer esto o quizás tengamos un enfoque equivocado sobre este problema?

Phillipp
fuente

Respuestas:

8

Tiene dos formas complementarias de implementar esto:

Conceder a los usuarios permisos para usar gitrepositorios de forma remota

Úselo gitolite3para proporcionar un esquema de repositorios de hub-live (esto se describe en detalle aquí ), que básicamente requiere que tenga un barerepositorio (un repositorio de concentrador ) para permitir a sus usuarios empujar / extraer y una versión extraída del mismo repositorio (un repositorio en vivo ) ubicado en la ruta adecuada /srv/www/html, por ejemplo, por ejemplo.

Me gusta usar gitolite3para manejar el repositorio del concentrador , pero eso no es un requisito, aunque es bastante conveniente tener un control de acceso específico vinculado a su LDAP de elección si es necesario. gitolite3puede proporcionar control de grano fino hasta el nivel de sucursal.

También es una buena práctica limitar las capacidades del gitolite3usuario a través de sudo, y manejar los ganchos por medio de sudollamadas. Este es un ejemplo de trabajo que utiliza gitolite3ganchos (siéntase libre de adaptarlos, o mejorarlos / arreglarlos) para satisfacer sus necesidades:

  • El contenido relevante de /etc/sudoerso /etc/sudoers.d/gitolite3sería algo similar a:

    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 repositorio de 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 guión:

    #!/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
    

Limitar la capacidad de ejecutar comandos no autorizados en un shell de inicio de sesión

Lo que necesitaría implementar es un método reproducible y auditable para limitar la capacidad del usuario para realizar acciones distintas a las estrictamente permitidas.

No es obligatorio, pero ayuda si tiene sus usuarios registrados en LDAP, y ya ha implementado los mecanismos para realizar la autenticación LDAP, ya sea mediante un módulo PAM, o usando freeIPA y sssd.

Para implementar este escenario, lo que hago actualmente es lo siguiente (tenga en cuenta que este tipo de restricciones requiere que se cumplan varias condiciones; de lo contrario, la restricción se puede eludir fácilmente):

  • Los usuarios no pertenecen al wheelgrupo, el único autorizado para usar su(impuesto a través de PAM). Por lo general, sysadmexiste un usuario que no es LDAP ( ) para permitir que administradores confiables realicen acciones en casos de recuperación ante desastres o indisponibilidad de LDAP.
  • Los usuarios reciben una seguridad adecuada rbashcon una RUTA de solo lectura que apunta a un privado ~/bin, este ~/bin/directorio contiene enlaces a todos los comandos permitidos, por ejemplo:

    $ 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*
    
  • los usuarios se les da una, de sólo lectura entorno restringido (piensa en cosas por el estilo LESSSECURE, TMOUT, HISTFILElas variables). Esto es para evitar shellescapes de comandos como lessy garantizar la auditabilidad.

  • El único editor permitido es rvim, por la misma razón. Los usuarios solo pueden ejecutar sudoedit, que están configurados para ejecutarse rvimen la sudoconfiguración:

    Defaults editor=/usr/bin/rvim
    
  • Si existen restricciones MAC (la distribución GNU / Linux específica que está utilizando tiene SELinux habilitado), los usuarios se asignan al usuario SELinux staff_uy se les otorgan derechos para ejecutar comandos como otro usuario según sea necesario sudo. La sudorulesnecesidad específica debe revisarse cuidadosamente para evitar que el usuario eluda estas limitaciones, y también puede implementarse en su infraestructura LDAP existente (esta es una de las características de freeIPA).

  • los usuarios /home, /tmpy posiblemente /var/tmpson poliinstantiados a través de /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
    

    Polyinstantiation de directorios no es una característica nueva, ha estado disponible durante bastante tiempo. Como referencia, vea este artículo de 2006 . De hecho, muchos módulos ya se usan pam_namespacede manera predeterminada, pero la configuración predeterminada en /etc/security/namespace.confno habilita la poliinstanciación. Además, /etc/security/namespace.initdebe hacer que todos los archivos esqueléticos sean de solo lectura para los usuarios y que sean propiedad de ellos root.

De esta manera, puede elegir si los usuarios pueden ejecutar cualquier comando en su propio nombre (a través de un enlace en el ~/bindirectorio privado , provisto a través de /etc/skel, como se explicó anteriormente), en nombre de otro usuario (a través de sudo) o ninguno.

Dawud
fuente