È possibile abilitare SSH e disabilitare SFTP sia a livello globale che per utente / gruppo.
Personalmente ne ho bisogno perché voglio dare accesso ad alcuni repository git su SSH e mi piace disabilitare i sistemi che non sono necessari. In tal caso, SFTP non è necessario.
A livello globale
È possibile disabilitare SFTP per tutti gli utenti in un paio di modi.
Il sottosistema mancante
Il demone SFTP utilizzato da SSH può essere configurato tramite la Subsystem
parola chiave. Dal sshd_config(5)
manuale:
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.
L'ultima riga suggerisce che dovrebbe essere sufficiente non definire alcun sottosistema per "sftp".
Una falsa bugia
Puoi anche disabilitare SFTP impostando il demone SFTP usato da SSH su qualcosa di inutilizzabile. Ad esempio, configurare il sottosistema "sftp" su /bin/false
:
Subsystem sftp /bin/false
Quando qualcosa tenta di accedere tramite SFTP, il demone SSH prova a generare il "demone sftp" /bin/false
. Il /bin/false
programma fa solo una cosa, ovvero restituire un codice di errore. Il tentativo di connessione SFTP viene effettivamente negato.
Per utente / gruppo
È anche possibile disabilitare SFTP per utente, gruppo o un paio di altri criteri.
Questo non funziona se si desidera che l'utente riceva un normale prompt della shell. Né ha senso, dato che potresti aggirare la maggior parte delle cose se hai accesso alla shell.
Funzionerà solo se si desidera dare accesso a un programma specifico.
accoppiamento
Per abbinare un set di utenti, è possibile configurare SSH con la Match
parola chiave. Dal sshd_config(5)
manuale:
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 paio di esempi:
Match User eva
corrisponde all'utente "eva"
Match User stephen,maria
corrisponde agli utenti "stephen" e "maria"
Match Group wheel,adams,simpsons
corrisponde ai gruppi "ruota", "adams", "simpsons"
Se vuoi maggiori informazioni, ci sono molti carichi nel sshd_config(5)
manuale.
Comando forzato
Normalmente si ottiene la shell di accesso dell'utente quando ci si connette tramite SSH, ma SSH può essere configurato per forzare un determinato comando. Il comando è forzato per qualsiasi connessione SSH, incluso SFTP, e quindi potresti avere la possibilità di forzare il comando che desideri.
Il comando per forzare può essere configurato con la ForceCommand
parola chiave. Dal
sshd_config(5)
manuale:
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”.
Quindi puoi forzare il comando vincolato che desideri utilizzare ForceCommand <your command>
. Per esempio:
Match User kim
ForceCommand echo 'successful login man, congrats'
Esempio
Nel mio caso in cui voglio dare accesso a Git, ho solo bisogno che l'utente abbia accesso git-shell
. Questa è la sezione che disabilita SFTP per i miei utenti git, insieme ad alcune opzioni di sicurezza:
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