É possível ativar o SSH e desativar o SFTP globalmente e por usuário / grupo.
Eu pessoalmente preciso disso porque quero dar acesso a alguns repositórios git
sobre SSH, e eu gostaria de desativar os sistemas que não são necessários. Nesse caso, o SFTP não é necessário.
Globalmente
Você pode desativar o SFTP para todos os usuários de várias maneiras.
O subsistema ausente
O daemon SFTP usado pelo SSH pode ser configurado através da palavra-chave Subsystem
.
Do manual sshd_config(5)
:
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.
A última linha sugere que deve ser suficiente não definir nenhum subsistema para
"sftp".
Uma falsa mentira
Você também pode desabilitar o SFTP configurando o daemon SFTP usado pelo SSH para algo
inutilizável. Por exemplo, configure o subsistema "sftp" para /bin/false
:
Subsystem sftp /bin/false
Quando algo tentaria efetuar login via SFTP, o daemon SSH tentaria gerar
o "daemon sftp" /bin/false
. O programa /bin/false
faz apenas uma coisa,
e isso é retornar um código de erro. A tentativa de conexão SFTP é efetivamente
negado.
Por usuário / grupo
Também é possível desativar o SFTP por usuário, grupo ou alguns outros
critérios.
Isso não funciona se você quiser que seu usuário receba um prompt de shell regular. Nor
isso faz sentido, já que você pode contornar a maioria das coisas se tiver acesso ao shell.
Ele só funcionará se você quiser apenas dar acesso a um programa específico.
Correspondente
Para corresponder a um conjunto de usuários, você pode configurar o SSH com a palavra-chave Match
. De
o manual sshd_config(5)
:
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).
...
Alguns exemplos:
-
Match User eva
corresponde ao usuário "eva"
-
Match User stephen,maria
corresponde aos usuários "stephen" e "maria"
-
Match Group wheel,adams,simpsons
corresponde à "roda", "adams", "simpsons"
grupos
Se você quiser mais informações, há cargas no manual sshd_config(5)
.
Comando forçado
Normalmente, você obtém o shell de login do usuário quando se conecta via SSH, mas o SSH pode ser
configurado para forçar um determinado comando. O comando é forçado para qualquer SSH
conexão, incluindo SFTP e, portanto, você pode ter a opção de forçar o
comando que você quer.
O comando forçar pode ser configurado com a palavra-chave ForceCommand
. De
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”.
Assim, você pode forçar o comando restrito desejado usando ForceCommand <your command>
.
Por exemplo:
Match User kim
ForceCommand echo 'successful login man, congrats'
Exemplo
No meu caso, onde eu quero dar acesso ao git, eu só preciso que o usuário tenha acesso
codificar%. Esta é a seção que desabilita o SFTP para meus usuários do git, junto
com algumas opções de segurança:
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