Tengo dos usuarios y una carpeta compartida en mi servidor Ubuntu:
Usuario
writer
que tiene acceso de escritura a/var/shared
. Es una aplicación que realiza periódicamente cambios en los archivos de esta carpeta de forma remota, con una clave SSH.El usuario
reader
es utilizado por varios clientes con una clave SSH, una clave que pueden obtener sin mi permiso, es por eso que necesito restringir los comandos disponibles en este shell.
Pregunta:
Necesito restringir los comandos accesibles para el reader
usuario para que pueda usar solo los protocolos sftp y rsync (no comandos estándar como ,,,, mkdir
... ). Sólo el directorio debe ser legible y debe ser una ruta raíz; por ejemplo, no es necesario ingresar a él, ya está en sftp o rsync.ls
top
/var/shared
cd
/
¿Cómo escribo un script de shell para poder aplicarlo al usermod -s
usuario reader
que dará ese comportamiento?No puedo encontrar ninguna muestra. ¿Cómo hago para que writer
también permanezca "encarcelado" para /var/share
que los caminos sean los mismos?
Notas:
Ya he probado las
sshd_config
directivas y . Esto requiere que sea propiedad de root y que no se pueda escribir (755 o menos), y no admite archivos .Match
ForceCommand internal-sftp
ChrootDirectory
ChrootDirectory
rsync
Lo he intentado
rssh
, pero simplemente no funciona para directorios fuera del directorio de inicio del usuario que ha iniciado sesión. Entonces no podía hacer chroot a los usuarios al mismo directorio con diferentes permisos.Intenté usarlo
command=".." ssh-rsa....
en elauthorized_keys
archivo, pero no entendí cómo puedo habilitar el comportamiento que necesito, solo verificorrsync
el script de los documentos de rsync. Este método no tiene ningunachroot
característica que necesito.
¿Puedo tener una muestra al menos de esos proyectiles? ¿Es esto posible con guiones?
Bash y C++ (si es necesario) son bienvenidos. Salida de ldd /bin/bash
:
linux-vdso.so.1 => (0x00007fff7e9d1000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f79dfd8b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f79dfb87000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f79df7bd000)
/lib64/ld-linux-x86-64.so.2 (0x000055bd0767c000)
Respuesta1
En primer lugar, ChrootDirectory
debe ser propiedad de root y otros usuarios no pueden escribirlo. Por lo tanto, /var/shared
en su caso no puede ser ChrootDirectory
valor.
Recomendaría crear un directorio en el que solo el root pueda escribir y que sea /var/shared
accesible dentro de este directorio, ya sea a través del montaje de enlaces de Linux o algún tipo de solución alternativa de enlaces simbólicos.
Si necesita restringir sftp
o rsync
, debe verificar SSH_ORIGINAL_COMMAND
la variable de entorno en el servidor con la ayuda de un "contenedor" aplicado mediante ForceCommand
o mediante command
la clave pública ssh, esta variable se completa después de que el usuario se autentica y contiene información sobre qué tipo de conexión están realizando los clientes. para establecer. Porque sftp
tendría sftp-server
dentro, rsync
tendría rsync
, solo para ssh
sesión tendría, IIRC, la variable vacía, porque ssh date
sería date
. SSH_ORIGINAL_COMMAND
¡Se ejecuta con un usuario autenticado en el servidor!
Este podría ser el comienzo del contenedor:
#!/usr/bin/env bash
set -eu
set -o pipefail
[[ -z "${SSH_ORIGINAL_COMMAND:-}" ]] && exit 1
case "${SSH_ORIGINAL_COMMAND}" in
"/usr/libexec/openssh/sftp-server")
exec /usr/libexec/openssh/sftp-server
;;
"rsync --server"*)
exec ${SSH_ORIGINAL_COMMAND}
;;
*)
exit 1
;;
esac
Como puede ver, ssh -v
le brinda información sobre qué comando ejecutaría el servidor. Por lo tanto /tmp
, también puedes cambiar a otra cosa en tu contenedor.
$ rsync -a -e "ssh -v" bin localhost:/tmp/ 2>&1 | grep '^debug.*Sending command:'
debug1: Sending command: rsync --server -logDtpre.iLsfxC . /tmp/