- Creé el usuario 'git-server'
- Instalado
openssh-server
- Modificado
/etc/ssh/sshd_config
agregadoPasswordAuthentication no
- Agregado al
.ssh/authorized_keys
caso público de mis colegas.
Preguntas:
- ¿El usuario 'git-server' es seguro para mi sistema? ¿Cuál es el peor escenario para el sistema si el malhechor obtiene acceso a 'git-server', siempre que 'git-server' sea
sudoer
- ¿Cómo puedo prohibir 'git-server' todas las operaciones aparte de
git
los comandos?
Respuesta1
Debe cambiar el shell predeterminado del usuario git-server a git-shell.
https://git-scm.com/docs/git-shell.html
Este es un shell de inicio de sesión para cuentas SSH para proporcionar acceso restringido a Git. Permite la ejecución solo de comandos Git del lado del servidor que implementan la funcionalidad pull/push, además de comandos personalizados presentes en un subdirectorio llamado git-shell-commands en el directorio de inicio del usuario.
Respuesta2
Bueno, veamos cómo configuras esa cuenta de git-server en el sistema.
Modificado /etc/ssh/sshd_config agregado ContraseñaAuthentication no
Debido a que configura la autenticación de contraseña en no, intentar iniciar sesión en el sistema con ese nombre de forma remota es prácticamente imposible sin una clave SSH válida. Hasta donde yo sé, no creo que las claves ssh hayan sido descifradas, ya que depende del cifrado y la complejidad del cifrado que esté utilizando para determinarlo.
Así que ahora ese hecho queda fuera del camino, si alguien logró obtener acceso a esa cuenta. Lo más probable es que signifique que alguien que ya tenía acceso a su sistema y al que se le otorgaron privilegios para usar su lo habría hecho, o de alguna manera, si bloqueó su sistema correctamente, alguien obtuvo acceso a la raíz, lo cual es más imposible que obtener acceso al cuenta del servidor git. Pero si ese no es el caso e iniciaron sesión en esa cuenta de forma remota usando SSH, entonces todos los que usan SSH están en problemas, ya que eso significaría que cualquier sistema que use ssh sería vulnerable. Ahora el mayor daño que se puede hacer es la misma cantidad de daño que puedes causar con tu cuenta normal con privilegios de sudo.
Respuesta3
Algunas variables para configurar si es necesario seguirlas junto con sugerencias...
_git_user='git-user'
_git_group='git-devs'
_git_home_base="/srv/${_git_group}"
_client_certs_root='/home/admin/client-certs'
... que se escribirá desde la perspectiva de su cuenta de administrador del servidor.
- Creé el usuario 'git-server'
¿Por casualidad lo bloqueaste y lo convertiste en una cuenta del sistema?
sudo adduser\
--system\
--disabled-password\
--gecos ''\
--shell "$(which git-shell)"\
--home "${_git_home_base,,}/${_git_user,,}"\
--ingroup "${_git_group}"\
"${_git_user}"
Tenga en cuenta que si
$(which git-shell)
se resuelve en una ruta de archivo pero--shell
la opción muestra errores, entonces...
if [ -e "$(which git-shell)" ] && ! grep -q -- "$(which git-shell)" /etc/shells; then
sudo tee -a /etc/shells 1>/dev/null <<<"$(which git-shell)"
fi
... puede ser útil agregar la
git-shell
ruta al/etc/shells
archivo
- Instalado
openssh-server
- Modificado
/etc/ssh/sshd_config
agregadoPasswordAuthentication no
¿Tienes inhabilitado?root
¿Autenticación de contraseña a través de SSH?
/etc/ssh/sshd_config
cosas que pueden ser de ayuda...
permitrootlogin without-password
## Additionally consider locking-down other unneeded features
Match Group git-devs
AllowTcpForwarding no
AllowStreamLocalForwarding no
PermitOpen none
- Agregado al
.ssh/authorized_keys
caso público de mis colegas.
¿Dónde exactamente agregaste sus claves públicas?
Aquí hay algunos comandos de ejemplo para configurar tres cuentas de Git...
declare -a _accounts_keys=(
["name-one"]="${_client_certs_root}/${_git_group}/name-one/ssh.pub"
["name-two"]="${_client_certs_root}/${_git_group}/name-two/ssh.pub"
["name-three"]="${_client_certs_root}/${_git_group}/name-three/ssh.pub"
)
for _name in "${!_accounts_keys[@]}"; do
sudo su --login "${_name}" --shell /bin/bash <<EOF
mkdir .ssh
tee -a .ssh/authorized_keys 1>/dev/null <<<"$(<"${_accounts_keys[${_name}]}")"
chmod 600 .ssh/authorized_keys
EOF
done
¿El usuario 'git-server' es seguro para mi sistema? ¿Cuál es el peor escenario para el sistema si el malhechor obtiene acceso a 'git-server', siempre que 'git-server' sea
sudoer
No, y si ha agregado las claves de todos a la misma cuenta y esa cuenta es sudoer
, entonces la cantidad decombustible de pesadillaPodría apagar esta situación con casi ilimitado...
¿Cómo puedo prohibir 'git-server' todas las operaciones aparte de los comandos git?
Agregue git-shell-commands/no-interactive-login
script a cada cuenta de Git...
for _name in "${!_accounts_keys[@]}"; do
sudo su --login "${_name}" --shell /bin/bash <<EOC
tee 'git-shell-commands/no-interactive-login' 1>/dev/null <<'EOF'
#!/usr/bin/env bash
printf 'Hi %s, you have successfully authenticated!\n' "${USER}"
printf 'However, there is not an interactive shell here.\n'
exit 128
EOF
chmod u+x 'git-shell-commands/no-interactive-login'
EOC
done
... siempre que no haya otros archivos ejecutables dentro del git-shell-command
directorio, la cuenta se limitará a comandos git no interactivos; siempre que el shell de la cuenta también esté configurado correctamente.
Lo anterior no es lo más seguro pero está equilibrado con la conveniencia;
git-devs
El grupo debe ser diferente para cada cuenta si no se desea la clonación cruzada, por ejemplo,name-one
podría (cuando el grupo principal se comparte entre cuentas),git clone name-two@server:/srv/git-devs/name-two/project-name
si supieran cómo estaban estructuradas las cosas en el lado del servidor.
Tenga en cuenta que si los permisos
600
podrían deshabilitarse por proyecto dentro de una cuenta individual, y si los permisos660
permitirían al grupo compartidopush
así comopull
a un repositorio... personalmente creo640
que es elmejorde ambas opciones, ya que esto permite que un grupo comparta código entre sí sin mucho temor de que un extraviadogit push -f
de otra cuenta arruine las cosas.
- Para ver ejemplos de otros
git-shell-commands
scripts, considere consultar elgit-utilities/git-shell-commands
repositorio, de donde se adaptaron los consejos anteriores, aunque eso seríaconsejolas cosas aún más hacia la conveniencia.
En brevenoagregue los scripts vinculados anteriormente si no puede confiar en que los clientes no lo intentenpop-ah-shellporque tales cosas están diseñadas para que elnecesidadpara un shell interactivo no es tan frecuente.
Puntos extra
Consulte
man --pager='less -p "ChrootDirectory"' sshd_config
las sugerencias sobre lo que se puede hacer para proteger aún más el servidor SSH.verificar
man git-shell
yman git-daemon
obtener documentación relacionada; Habrá algunas opciones útiles para bloquear cosas y/o hacer que sea un poco más fácil comunicarse con el servidor, por ejemplo.--strict-paths
,--base-path=<path>
y--listen=<host_or_ipaddr>
podría valer la pena investigar más
Si hay algo cuestionable sobre lo anterior, considere comentar para que se pueda mejorar esta respuesta.