Es posible habilitar SSH y deshabilitar SFTP tanto globalmente como por usuario / grupo.
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.
Globalmente
Puede deshabilitar SFTP para todos los usuarios de dos maneras.
El subsistema faltante
El demonio SFTP utilizado por SSH se puede configurar a través de la Subsystem
palabra clave. Del sshd_config(5)
manual:
Subsystem
Configures an external subsystem (e.g. file transfer daemon).
Arguments should be a subsystem name and a command (with optional
arguments) to execute upon subsystem request.
The command sftp-server(8) implements the “sftp” file transfer
subsystem.
Alternately the name “internal-sftp” implements an in-process
“sftp” server. This may simplify configurations using
ChrootDirectory to force a different filesystem root on clients.
By default no subsystems are defined.
La última línea sugiere que debería ser suficiente para no definir ningún subsistema para "sftp".
Una mentira falsa
También puede desactivar SFTP configurando el demonio SFTP utilizado por SSH en algo inutilizable. Por ejemplo, configure el subsistema "sftp" para /bin/false
:
Subsystem sftp /bin/false
Cuando algo intentara iniciar sesión a través de SFTP, el demonio SSH intentaría generar el "demonio sftp" /bin/false
. El /bin/false
programa solo hace una cosa, y es devolver un código de error. El intento de conexión SFTP se niega efectivamente.
Por usuario / grupo
También es posible deshabilitar SFTP por usuario, grupo o un par de otros criterios.
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.
Pareo
Para hacer coincidir un conjunto de usuarios, puede configurar SSH con la Match
palabra 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 ForceCommand
palabra 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”.
Por lo tanto, 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