Pregunta Linux: ¿creas una cuenta SSH "pública" que ejecuta un binario específico y luego se cierra?


He escrito una aplicación simple que se ejecuta en modo consola. Quiero permitir a las personas de Internet a SSH a este host y usar la aplicación en cuestión.

Cada vez que alguien SSH está en el servidor, quiero permitir que una instancia de la aplicación se ejecute en su sesión SSH. Trabajarán con el programa, y ​​luego de que se haya completado (es decir, salga) la sesión de SSH se debe cerrar.

Las advertencias son:

  1. No quiero usar un script de shell como .bash_profile. ¡Demasiadas oportunidades para que esto sea pirateado!
  2. Preferentemente, ni siquiera quiero que a la cuenta de usuario se le asigne un "shell" válido. En otras palabras, quiero que el shell del usuario sea algo como / bin / false, de modo que no se permita el FTP, SFTP, etc. Lo único que deseo de la cuenta es acceder a esta aplicación de consola específica, ejecutándose en modo no privilegiado como este usuario.
  3. Es posible que desee ofrecer más de una de estas aplicaciones en diferentes nombres de usuario. Entonces, por ejemplo, "búsqueda" presentará una aplicación de consola, mientras que "examinar" presentará otra, dependiendo de cómo el usuario inicie sesión.
  4. No es necesario requerir una contraseña para la sesión SSH. Sería bueno si simplemente ignorase la autenticación, pero tener que darles a los usuarios finales la contraseña SSH no es un factor decisivo. Lo único que hay aquí es, por supuesto, estar seguro: NO quiero que la cuenta pueda hacer nada más.
  5. El usuario no debería tener que hacer nada especial en su extremo. Deberían poder simplemente "ssh search@ip.of.host" y obtener el servicio.
  6. El programa que ejecuta puede necesitar argumentos de línea de comando. Estoy bien escribiendo un contenedor para hacer esto, pero ¿eso crea una inseguridad? p.ej. Si el comando es "/ usr / local / bin / myapp --mode = search", y escribo un script como:

    ! / bin / bash

    / usr / local / bin / myapp --mode = búsqueda

... ¿Esto crea una situación insegura? Supongamos que todos los permisos de archivos están configurados correctamente: el usuario no puede modificar el archivo.

¿Es posible hacer esto? De ser así, ¿cómo se puede hacer y, lo que es más importante, cómo se puede hacer de forma segura?

El servidor ya ofrece SSH al exterior para el inicio de sesión remoto, lo cual está bien. Todavía quiero que eso funcione, obviamente. Entonces, por ejemplo, si inicio sesión como mi propio usuario, quiero que me pidan una contraseña como de costumbre y luego presente un shell.

¡Gracias!

F


1


origen


Si configura el shell del usuario para el programa, entonces Linux ejecutará ese binario como el 'shell', que podría ser su search programa. ¿Has probado eso? - Lawrence


Respuestas:


Hay tres opciones:

  1. Establezca la aplicación (o envoltorio adecuado para ella) como el shell para la cuenta.

    De esta manera, la cuenta no tiene un shell. Cuando el usuario pasa el comando, se pasará como argumento de línea de comando al "shell" precedido por el -c bandera. Haz lo que quieras con eso.

  2. Utilice la autenticación de clave pública y defina lo que cada usuario puede ejecutar utilizando el command opción en .ssh/authorized_keys.

    Esto permite ejecutar diferentes comandos para diferentes claves y permite la revocación de permisos de usuarios individuales. Sin embargo, necesita que cada usuario le envíe su clave pública (las claves privadas nunca deben salir de la máquina en la que se generan, por lo que los usuarios deben generar claves y enviarle las partes públicas).

    El comando obtiene el comando pasado en la línea de comando ssh SSH_ORIGINAL_COMMAND variable de entorno, por lo que puede usarlo si lo desea.

    En este caso, la cuenta necesita un shell válido, porque ssh lo usa para ejecutar el comando configurado.

  3. ¿Realmente tiene que ser ssh? Usted menciona que no tiene que estar autenticado, en cuyo caso quizás directamente lo inicie desde inetd podría hacer. O telnet si necesita terminal en lugar de solo stdin / stdout. Tenga en cuenta que la opción 1 también funcionará con telnet.

Un script de envoltura es seguro si se toma la debida precaución al escribirlo. Si no acepta ninguna entrada, debería estar bien. Si desea utilizar la entrada (argumentos de línea de comando en 1., SSH_ORIGINAL_COMMAND envvar en 2.), debe desinfectarlo cuidadosamente y citarlo adecuadamente.

Por supuesto, dependiendo de cuánto confíe en la aplicación en sí, puede ponerla en chroot o separar el espacio de nombres.


0



Esto es un gran comienzo. Ya había considerado configurar el shell, y parece que esa puede ser la forma más rápida de hacerlo funcionar correctamente. Siempre que esto inhabilite el uso de SFTP y cualquier otro servicio, debe ser seguro. Además, SSH sigue siendo mejor porque eventualmente planeo expandir esto a un sistema donde las personas puedan iniciar sesión en un servicio a través de SSH, pero las cuentas de los usuarios se almacenarán en una base de datos; un gran ejemplo de esto es el uso de los MUD basados ​​en texto. Desea que la seguridad esté disponible para que la gente no tenga que enviar sus contraseñas sin cifrar (la aplicación, no el propio Linux, se autenticaría). - fdmillion
También debería haber sido más claro: los pares de claves públicas / privadas no serían apropiados porque, en teoría, un usuario de Internet aleatorio no confiable podría tener motivos para iniciar sesión. (De nuevo, por ejemplo, piense en MUD). Podría hacer algo donde tenga un sitio web y la gente tenga que subir su clave, pero eso termina siendo confuso para las personas que aún no "entienden" cómo SSH administra las claves. Básicamente, no estoy tan preocupado por el host autenticación como yo estoy a punto seguridad del transporte es decir, no olfatear paquetes de la sesión y obtener texto claro. No es algo muy sensible, simplemente no quiero que sea demasiado fácil. - fdmillion
@fdmillion: Ssh usa el shell para hacer todo, incluso para iniciar el servidor sftp. Entonces, restringir el shell lo desactiva. - Jan Hudec


Sí ... use un par de claves públicas / privadas. En el archivo authorized_key, si haces tu investigación notarás que puedes restringir una clave privada a una clave específica e incluso protegerla de solo ciertos números de IP.


0





Lo que quiere es usar ChrootDirectory en su archivo sshd_config. Aquí hay un buen tutorial en el proceso.


0