¿Hay alguna forma de configurar un usuario en una caja de Linux (Centos 5.2 en este caso) para que pueda usar scp para recuperar archivos, pero en realidad no puede iniciar sesión en el servidor usando SSH?
¿Hay alguna forma de configurar un usuario en una caja de Linux (Centos 5.2 en este caso) para que pueda usar scp para recuperar archivos, pero en realidad no puede iniciar sesión en el servidor usando SSH?
Respuestas:
rssh shell ( http://pizzashack.org/rssh/ ) está diseñado precisamente para este propósito.
Dado que RHEL / CentOS 5.2 no incluye un paquete para rssh, puede buscar aquí para obtener un RPM: http://dag.wieers.com/rpm/packages/rssh/
Para usarlo, simplemente configúrelo como un shell para un nuevo usuario como este:
useradd -m -d /home/scpuser1 -s /usr/bin/rssh scpuser1
passwd scpuser1
..o cambie el shell por uno existente como este:
chsh -s /usr/bin/rssh scpuser1
..y edite /etc/rssh.conf
para configurar el shell rssh, especialmente la allowscp
línea de comentarios para habilitar el acceso SCP para todos los usuarios rssh
(También es posible que desee utilizar chroot para mantener a los usuarios contenidos en sus hogares, pero esa es otra historia).
Llegué tarde a esto, pero podría usar las teclas ssh y especificar el comando exacto permitido en su archivo ~ / .ssh / Authorised_keys, por ejemplo
no-port-forwarding, no-pty, command = "scp source target" ssh-dss ...
Es posible que deba usar ps to en el objetivo para establecer la configuración de comando correcta.
PD: Si ejecuta un comando de prueba scp con "-v", puede ver algo como esto
debug1: Sending command: scp -v -t myfile.txt
Notará que "-t" es una opción scp no documentada, utilizada por el programa en el otro extremo. Esto le da la idea de lo que necesita poner en claves_autorizadas.
EDITAR: puede encontrar más información (con varios enlaces) en esta pregunta de StackOverflow .
Aquí hay un ejemplo práctico de esto, para un usuario nombrado backup_user
en el lado del servidor.
~backup_user/.ssh/authorized_keys
contenido en el lado del servidor (con algunas restricciones de seguridad más):
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="scp -v -r -d -t ~/CONTENT" ssh-rsa AAAAMYRSAKEY...
Cree un enlace en ~ backup_user / que enlace al directorio donde el contenido debe ser accesible.
$ ln -s /path/to/directory/with/accessible/content ~backup_user/CONTENT
Ahora, desde el lado del cliente, el siguiente comando debería funcionar:
scp -v -r -P 2222 -i .ssh/id_rsa_key_file path/to/data backup_user@SERVER:~/CONTENT
Qué hace este comando:
-v
tanto el comando como el archivo autorizado_claves)-r
tanto el comando como el archivo de claves autorizadas si no desea realizar una copia recursiva)-P 2222
del comando)-i .ssh/id_rsa_key_file
path/to/data
se copiará en/path/to/directory/with/accessible/content/
Para hacer una copia de un archivo (o varios) del servidor al cliente, debe crear un script de shell que maneje esto como se describe aquí
chmod 400 ~/.ssh/authorized_keys
.
~/.bashrc
(y cualquier otra cosa que Bash ejecute) y ~/.ssh/rc
solo lectura. Pero si el usuario malintencionado tiene acceso a rsync o sftp, aún puede eliminar ~/.bashrc
y cargar uno nuevo. Como es difícil de proteger, recomiendo este método ( command="..."
).
Llego un poco tarde a la fiesta, sin embargo, te sugiero que eches un vistazo a la ForceCommand
directiva de OpenSSH.
Subsystem sftp internal-sftp
Match group sftponly
ForceCommand internal-sftp
De acuerdo, esto es SFTP y no SCP, pero alcanza el mismo objetivo, de manera más segura que con un shell restringido. Además, puede modificar el usuario si lo desea.
chrootDirectory %h
y AllowTcpForwarding no
después de la partida para obligar a los usuarios de sftponly a pasar a su casa. tenga en cuenta que la coincidencia debería (¡debe!) ser la última sección en la configuración de ssh y las opciones posteriores son opciones solo para los usuarios coincidentes
ForceCommand internal-sftp -u 0077 -d /uploaddir
puede endurecerlo aún más, forzando una umask en un directorio de carga. Junto con 'ChrootDirectory`, crea un entorno de carga muy controlado y aislado. Nota adicional: el directorio predeterminado y la máscara de usuario deben establecerse ForceCommand
en la Subsystem
directiva, no en la directiva, si desea que funcionen.
Recomiendo usar scponly.
Es un shell restringido que permite a los usuarios hacer exactamente lo que suena, archivos SCP al servidor, pero no iniciar sesión realmente. La información y las descargas de código fuente para el software están disponibles aquí y los paquetes RPM precompilados están disponibles a través de Repositorios EPEL YUM .
Una vez instalado, deberá configurar cada cuenta de usuario, a la que desea restringir el acceso, para usar el shell restringido recién instalado. Puede hacer esto manualmente a través de / etc / passwd o usar el siguiente comando: usermod -s /usr/bin/scponly USERNAME
scponly
está DISEÑADO exactamente para este propósito.
Yo uso MySecureShell para hacer esto. También puede configurar otras restricciones.
https://github.com/mysecureshell/mysecureshell
Limita las conexiones a SFTP / SCP solamente. Sin acceso a shell.
He descubierto que una buena manera es usar la función command = "..." del archivo autorizado_claves. (Sugerido para mí por esta página )
El comando que ejecutaría sería uno que pruebe los argumentos que comienzan con scp (y rsync).
Aquí está el archivo Authorized_keys:
# authorized_keys
command="/usr/local/bin/remote-cmd.sh" ssh-rsa.....== user@pewpew
Aquí está el contenido de remote-cmd.sh:
#!/bin/bash
# /usr/local/bin/remote-cmd.sh
case $SSH_ORIGINAL_COMMAND in
'scp'*)
$SSH_ORIGINAL_COMMAND
;;
'rsync'*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Access Denied"
;;
esac
Supongo que probablemente todavía necesite proteger el archivo de claves autorizadas del usuario, pero mi propósito era tener una clave sin contraseña que pudiera usar para hacer copias de seguridad, sin tener que crear un usuario completamente nuevo, y que la clave no le diera un shell (ok, fácilmente)
~/.ssh/authorized_keys
, ~/.bashrc
(y cualquier otra cosa que Bash ejecute) y ~/.ssh/rc
solo lectura para el usuario. Pero si el usuario malintencionado tiene acceso a rsync o sftp, aún puede eliminar ~/.bashrc
y cargar uno nuevo. Como es difícil de proteger, recomiendo este método ( command="..."
).
Cambie el shell de inicio de sesión del usuario a algo restrictivo, que le permita al usuario ejecutar solo scp , sftp-server y rsync , y también verifica que los argumentos inseguros no estén permitidos (por ejemplo, scp -S ... y rsync -e .. . son inseguros, ver aquí: http://exploit-db.com/exploits/24795 ). Ejemplo para un shell de inicio de sesión tan restrictivo:
Es posible que desee ejecutar uno de estos en un chroot o en otro entorno restringido (por ejemplo, nsjail en Linux), para deshabilitar el acceso a la red y para un control más fácil (en la lista blanca) de qué directorios se pueden leer y / o escribir.
No recomiendo usar command="..."
in ~/.ssh/authorized_keys
, porque sin una protección adicional cuidadosa (como chmod -R u-w ~
para el usuario) un usuario malintencionado puede cargar una nueva versión de ~/.ssh/authorized_keys
, ~/.ssh/rc
o ~/.bashrc
, y por lo tanto puede incluir y ejecutar comandos arbitrarios.
No es la solución más elegante, pero podría lanzar algo como esto a los usuarios .bashrc
if [ "$TERM" != "dumb" ]; then
exit
fi
Descubrí que los usuarios de SCP obtienen un TÉRMINO de 'tonto', y otros generalmente obtienen vt100.
Me imagino que el usuario probablemente podría explorar un nuevo .bashrc, lo que hace que esta no sea la mejor solución, pero para una solución rápida y sucia, esto funcionará
~/.bashrc
). También es descabellado en el sentido de que quizás las versiones más nuevas de OpenSSH establecerían la TERM
variable de manera diferente, o algunas configuraciones de configuración sshd pueden afectar TERM
.
ssh -o SetEnv TERM=dumb yourserver bash
??