¿Cómo deshabilitar sftp para algunos usuarios, pero mantener ssh habilitado?

12

Mi proyecto necesita que desactive sftp para algunos usuarios, pero esos usuarios aún necesitan conectarse a través de ssh. ¿Alguien sabe cómo implementar esto?

He visto sugerencias para cambiar el archivo en /etc/ssh/sshd_config, pero no estoy seguro de qué cambiar.

Shaobo Wang
fuente
La única forma en que podría imaginarme haciendo esto sería usar una política MLS en SELinux y restringir exactamente a qué archivos, directorios y sockets puede acceder, ejecutar, etc. Lo haría en combinación con una política de iptables altamente restrictiva que usa módulo ownerpara acceso saliente. Esto supone que un equipo rojo te hará una prueba de la pluma. Si todos los que acceden a su sistema siempre obedecen las reglas y nunca tienen malas intenciones, entonces mi enfoque sería duro y excesivamente complejo.
Aaron

Respuestas:

7

En general, hacer esto es una mala práctica de seguridad por razones que otros han enumerado. Sin embargo, el punto de su tarea, creo, es enseñarle que puede tener secciones de configuración condicionales basadas en varios criterios.

La forma de hacerlo es usando un Matchbloque condicional *.

Match User bob
Subsystem   sftp  /bin/false

Consulte sshd_config(5)en la Matchsección para obtener más información y hacer coincidir Group.

* Hay más de una forma de hacerlo.

bahamat
fuente
77
No está funcionando para mi. Error: la directiva 'Subsistema' no está permitida dentro de un bloque Match
chrw
Respuesta incorrecta porque el subsistema no está permitido en el bloque de partidos
mikep
6

Esto no tiene ningún sentido, es seguridad a través de la oscuridad inútil. Cualquier usuario que pueda usar SSH podrá transferir cualquier archivo que pueda leer a través de la sesión SSH. También podrá escribir, si tiene permisos para hacerlo.

Como ejemplo, puede descargar / etc / passwd a través de ssh utilizando el siguiente método (no se requiere sesión scp / sftp): ssh [email protected] "cat / etc / passwd"> passwdcopy

Si puede verlo en su pantalla a través de SSH, puede copiarlo fácilmente como un archivo.

La única forma en que esto tendría sentido es si tiene un shell restringido personalizado que aplica una política de seguridad.

Sin embargo, lo inverso de esto tiene sentido (deshabilitar ssh shell pero dejando scp / sftp habilitado) porque no puede ejecutar comandos arbitrarios a través de sftp / scp que puede hacerlo a través de un ssh shell.

PD: Supongo que el shell SSH que está otorgando es un shell estándar que permite la ejecución arbitraria. Si este no es el caso, vea esto: ¿Cómo deshabilitar el subsistema sftp para un usuario o grupo específico? y eche un vistazo a la opción de configuración del subsistema de sshd_config.

Nathan
fuente
4
Match Group nosft
Subsystem   sftp  /bin/false

Prefiero usar un grupo para esto.

Es útil en combinación con usuarios que tienen shells restringidos. A veces le doy acceso ssh a un cliente para que pueda acceder a un volcado de sql de su base de datos configurando su shell en un script que descarga sus datos. Separarlos de scp también parece ser una idea inteligente. No tienen acceso a la ejecución catpara transferir un archivo a través de ssh.

Singlow
fuente
3
Directive 'Subsystem' is not allowed within a Match block
Patryk
Respuesta equivocada porque Subsistema no está permitido en el bloque de ajuste
Mikep
4

Es posible habilitar SFTP globalmente y deshabilitar SFTP solo para algunos usuarios.

Esto no funciona si desea que su usuario obtenga un indicador de shell normal. Tampoco tiene sentido, ya que podría eludir la mayoría de las cosas si tiene acceso de shell. Solo funcionará si solo desea dar acceso a un programa específico.

Personalmente necesito esto porque quiero dar acceso a algunos repositorios git a través de SSH, y me gusta deshabilitar los sistemas que no son necesarios. En ese caso, no se necesita SFTP.

Pareo

Para hacer coincidir un conjunto de usuarios, puede configurar SSH con la Matchpalabra clave. Del sshd_config(5)manual:

Match
        ...

        The arguments to Match are one or more criteria-pattern pairs or the
        single token All which matches all criteria.  The available criteria
        are User, Group, Host, LocalAddress, LocalPort, and Address.  The
        match patterns may consist of single entries or comma-separated
        lists and may use the wildcard and negation operators described in
        the PATTERNS section of ssh_config(5).

        ...

Un par de ejemplos:

  • Match User eva coincide con el usuario "eva"
  • Match User stephen,maria coincide con los usuarios "stephen" y "maria"
  • Match Group wheel,adams,simpsons coincide con los grupos "rueda", "adams", "simpsons"

Si desea más información, hay cargas en el sshd_config(5)manual.

Comando forzado

Normalmente obtiene el shell de inicio de sesión del usuario cuando se conecta a través de SSH, pero SSH se puede configurar para forzar un determinado comando. El comando es forzado para cualquier conexión SSH, incluido SFTP, y por lo tanto puede tener la opción de forzar el comando que desee.

El comando forzar se puede configurar con la ForceCommandpalabra clave. Del sshd_config(5)manual:

ForceCommand
        Forces the execution of the command specified by ForceCommand,
        ignoring any command supplied by the client and ~/.ssh/rc if
        present.  The command is invoked by using the user's login shell
        with the -c option.  This applies to shell, command, or subsystem
        execution.  It is most useful inside a Match block.  The command
        originally supplied by the client is available in the
        SSH_ORIGINAL_COMMAND environment variable.  Specifying a command of
        “internal-sftp” will force the use of an in-process sftp server that
        requires no support files when used with ChrootDirectory.  The
        default is “none”.

Entonces puede forzar el comando restringido que desea usar ForceCommand <your command>. Por ejemplo:

Match User kim
        ForceCommand echo 'successful login man, congrats'

Ejemplo

En mi caso donde quiero dar acceso a git, solo necesito que el usuario tenga acceso git-shell. Esta es la sección que deshabilita SFTP para mis usuarios de git, junto con algunas opciones de seguridad:

Match Group git

        # have to do this instead of setting the login shell to `git-shell`,
        # to disable SFTP
        ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

        # disable stuff we don't need
        AllowAgentForwarding no
        AllowTcpForwarding no
        AllowStreamLocalForwarding no
        PermitOpen none
        PermitTunnel no
        PermitTTY no
        X11Forwarding no
aude
fuente
1
Esto no responde a la pregunta del OP, pero fue muy útil para mí lograr lo que quiero lograr en mi propio caso de uso
Kidburla
No estoy de acuerdo La pregunta de OP es "¿Cómo deshabilitar sftp para algunos usuarios, pero mantener ssh habilitado?", Y esta respuesta explica una forma de hacerlo. Me alegro de que te haya resultado útil de todos modos!
aude
Por su propia admisión, "no funciona si desea que su usuario obtenga un indicador de shell normal". así que esto no cumple con el requisito del OP de "mantener ssh habilitado"
Kidburla
Ese es un buen punto. Supongo que llegué a un acuerdo con esta solución debido a "Tampoco tiene sentido, ya que podría eludir la mayoría de las cosas si tiene acceso de shell". Pero no encontré una manera de exactamente lo que OP pregunta, estoy de acuerdo ahora.
aude
Aquí hay una versión más completa de esta respuesta: serverfault.com/a/817482
aude
1
Match User bob
MaxSessions 0

Probado y trabajando en CentOS 6.6. Tenga en cuenta que Subsystem no está permitido con Match al menos en las versiones más recientes de CentOS. La página de manual de sshd_config enumera las palabras clave limitadas que están permitidas con la condición Match.

Jeff
fuente
0

Puede mirar scponly para hacer lo contrario, permitir solo scp / sftp pero no acceso de shell.

Estoy de acuerdo con @Nathan arriba, esto no tiene mucho sentido. Si no está configurado, intente editar su archivo / etc / ssh / sshd_config y elimine / comente la siguiente línea:

Subsistema sftp / usr / libexec / openssh / sftp-server

dmourati
fuente
0

no dar directorio de inicio para el usuario

usermod username -d /bin/false

Cambie el Subsistema sftp / usr / libexec / openssh / sftp-server en el archivo / etc / ssh / sshd_config a Subsystem sftp / dev / null / usr / libexec / openssh / sftp-server

Luego reinicie el ssh

service ssh restart

A mí me funciona, Debian.

Yusufmm
fuente
-2

En ~/authorized_keyconfigurar la clave de usuario de la siguiente manera:

command="/bin/bash" ssh-rsa AAAAB3Nz.........
Kazek
fuente