Możliwe jest włączenie SSH i wyłączenie SFTP zarówno globalnie, jak i dla użytkownika / grupy.
Potrzebuję tego osobiście, ponieważ chcę dać dostęp do niektórych repozytoriów git przez SSH i lubię wyłączać systemy, które nie są potrzebne. W takim przypadku SFTP nie jest potrzebne.
Globalnie
Możesz wyłączyć SFTP dla wszystkich użytkowników na kilka sposobów.
Brakujący podsystem
Demon SFTP używany przez SSH można skonfigurować za pomocą Subsystem
słowa kluczowego. Z sshd_config(5)
instrukcji:
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.
Ostatni wiersz sugeruje, że powinno wystarczyć, aby nie definiować żadnego podsystemu dla „sftp”.
Fałszywe kłamstwo
Możesz także wyłączyć SFTP, ustawiając demona SFTP używanego przez SSH na coś nieużytecznego. Na przykład skonfiguruj podsystem „sftp”, aby /bin/false
:
Subsystem sftp /bin/false
Gdy coś próbuje się zalogować przez SFTP, demon SSH próbuje odrodzić się „demon sftp” /bin/false
. /bin/false
Program robi tylko jedno, a to zwraca kod błędu. Próba połączenia SFTP została skutecznie odrzucona.
Na użytkownika / grupę
Możliwe jest również wyłączenie SFTP dla użytkownika, grupy lub kilku innych kryteriów.
To nie działa, jeśli chcesz, aby użytkownik otrzymywał regularne polecenia powłoki. Nie ma to również sensu, ponieważ można obejść większość rzeczy, jeśli masz dostęp do powłoki.
Działa to tylko wtedy, gdy chcesz dać dostęp do określonego programu.
Pasujący
Aby dopasować zestaw użytkowników, możesz skonfigurować SSH za pomocą Match
słowa kluczowego. Z sshd_config(5)
instrukcji:
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).
...
Kilka przykładów:
Match User eva
pasuje do użytkownika „eva”
Match User stephen,maria
pasuje do użytkowników „stephen” i „maria”
Match Group wheel,adams,simpsons
dopasowuje grupy „koło”, „adams”, „simpsonowie”
Jeśli chcesz uzyskać więcej informacji, w sshd_config(5)
instrukcji jest mnóstwo .
Wymuszone polecenie
Zwykle dostajesz powłokę logowania użytkownika, gdy łączysz się przez SSH, ale SSH można skonfigurować tak, aby wymuszał określone polecenie. Polecenie jest wymuszone dla dowolnego połączenia SSH, w tym SFTP, dlatego możesz mieć możliwość wymuszenia żądanego polecenia.
Polecenie wymuszenia można skonfigurować za pomocą ForceCommand
słowa kluczowego. Z
sshd_config(5)
instrukcji:
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”.
Możesz więc wymusić ograniczoną komendę, której chcesz użyć ForceCommand <your command>
. Na przykład:
Match User kim
ForceCommand echo 'successful login man, congrats'
Przykład
W moim przypadku, w którym chcę dać dostęp do git, potrzebuję tylko użytkownika git-shell
. To jest sekcja, która wyłącza SFTP dla moich użytkowników git, wraz z kilkoma opcjami bezpieczeństwa:
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