Tiene dos formas complementarias de implementar esto:
Conceder a los usuarios permisos para usar git
repositorios de forma remota
Úselo gitolite3
para proporcionar un esquema de repositorios de hub-live (esto se describe en detalle aquí ), que básicamente requiere que tenga un bare
repositorio (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 gitolite3
para 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. gitolite3
puede proporcionar control de grano fino hasta el nivel de sucursal.
También es una buena práctica limitar las capacidades del gitolite3
usuario a través de sudo
, y manejar los ganchos por medio de sudo
llamadas. Este es un ejemplo de trabajo que utiliza gitolite3
ganchos (siéntase libre de adaptarlos, o mejorarlos / arreglarlos) para satisfacer sus necesidades:
El contenido relevante de /etc/sudoers
o /etc/sudoers.d/gitolite3
serí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-update
gancho 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
wheel
grupo, el único autorizado para usar su
(impuesto a través de PAM). Por lo general, sysadm
existe 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 rbash
con 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
, HISTFILE
las variables). Esto es para evitar shell
escapes de comandos como less
y 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 rvim
en la sudo
configuració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_u
y se les otorgan derechos para ejecutar comandos como otro usuario según sea necesario sudo
. La sudorules
necesidad 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
, /tmp
y posiblemente /var/tmp
son 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_namespace
de manera predeterminada, pero la configuración predeterminada en /etc/security/namespace.conf
no habilita la poliinstanciación. Además, /etc/security/namespace.init
debe 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 ~/bin
directorio privado , provisto a través de /etc/skel
, como se explicó anteriormente), en nombre de otro usuario (a través de sudo
) o ninguno.