Pytanie 1
Moje pytanie brzmi: w jaki sposób mogę ograniczyć polecenie tylko do tego transferu SFTP w generowanym kluczu publicznym?
Można to zrobić na 2 sposoby.
1. - Ograniczanie przez sshd
Metoda ta polega na skonfigurowaniu funkcji SFTP w swoim demona SSH sshd
. Jest to kontrolowane przez /etc/ssh/sshd_config
plik konfiguracyjny. UWAGA: Ograniczy to użytkownika, backup
aby zezwolono tylko na SFTP na serwerze.
# /etc/ssh/sshd_config
Subsystem sftp internal-sftp
## You want to put only certain users (i.e users who belongs to sftpusers
## group) in the chroot jail environment. Add the following lines at the end
## of /etc/ssh/sshd_config
Match User backup
ForceCommand internal-sftp
2. - Ograniczanie za pomocą uprawnionych kluczy
Ta metoda nie wymaga żadnych zmian w sshd_config
pliku. Możesz ograniczyć użytkownika + klucz SSH do pojedynczego polecenia za pomocą command=
funkcji, o której już wspomniałeś w swoim pytaniu. Sztuka polega na tym, jakie polecenie zawierasz. Możesz umieścić serwer SFTP w tym command=
wierszu, co ma taki sam efekt jak ustawienie serwera SFTP w sshd_config
pliku.
# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host
UWAGA: jeśli użytkownik ma dostęp do zapisu ~/.ssh/authorized_keys
, może go odczytać i / lub zmodyfikować. Na przykład mogliby go pobrać, edytować i ponownie załadować, usuwając go commmand=...
, zapewniając mu nieograniczony dostęp do poleceń, w tym powłoki. Jeśli użytkownik ma dostęp do zapisu ~/.ssh
, może również po prostu odłączyć i ponownie utworzyć plik lub chmod
dostęp do zapisu. Istnieje wiele możliwych rozwiązań, takich jak odkładanie ~/.ssh/authorized_keys
plików w miejsce, w którym nie można zapisać użytkownika, na przykład:
Match Group sftponly
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
Pytanie 2
A skoro korzystam z dynamicznego adresu IP, w jaki sposób mogę rozwiązać problem „brakującego znanego hosta” przy każdej zmianie adresu IP?
Jest to trudniejsze, ale wykonalne przy użyciu from=
funkcji w authorized_keys
pliku. Tutaj mamy ograniczenie dostępu wyłącznie z przyjmującym, somehost.dyndns.org
.
from = "somehost.dyndns.org", polecenie = "/ usr / libexec / openssh / sftp-server", przekierowanie bez portu, przekierowanie bez X11, przekierowanie bez agenta, bez pty ssh-dss AAAAC8ghi9ldw == backup @ host
Dodatkowe ustawienia po command=
są równie ważne, ponieważ jeszcze bardziej ograniczą użycie klucza SSH.
podział funkcji
from='hostname1,hostname2,''
- Ogranicza dostęp z określonych wzorców adresów IP lub nazw hostów
command='command'
- Uruchamia określone polecenie po uwierzytelnieniu
no-pty
- Nie przydziela pty (nie pozwala na interaktywne logowanie)
no-port-forwarding
- Nie zezwala na przekierowanie portów
no-X11-forwarding
- użytkownik nie będzie w stanie usunąć wyświetlanych GUI X11
no-agent-forwarding
- użytkownik nie będzie mógł przekazywać za pośrednictwem tego hosta do innych hostów wewnętrznych
Aby pozbyć się wiadomości o „brakujących znanych hostach”, możesz dodać tę opcję SSH do klienta, gdy łączy się w następujący sposób:
$ ssh -o StrictHostKeyChecking=no ....
Zobacz stronę podręcznika, ssh_config
aby uzyskać szczegółowe informacje o tym przełączniku.
Ograniczanie powłoki użytkownika
W przypadku obu powyższych rozwiązań prawdopodobnie będziesz chciał zablokować backup
użytkownika, ograniczając również jego powłokę w /etc/passwd
pliku. Zazwyczaj chcesz to ustawić scponly
, ale istnieją również inne możliwości. Zobacz pytania i odpowiedzi U&L zatytułowane: „ Potrzebujesz powłoki SCP? ”, Aby dowiedzieć się, jak to zrobić.
Z opcji /sbin/nologin
można także skorzystać, jeśli zdecydujesz się na użycie funkcji chroot sshd_config
zgodnie z opisem w punkcie 1 powyżej. Jeśli jednak zdecydujesz się użyć metody opisanej w punkcie 2 , prawdopodobnie będziesz musiał użyć scponly
innej powłoki powłoki użytkownika /etc/passwd
.
BONUS - rozszerzenie nr 2 powyżej
Jeśli chcesz udostępnić zestaw poleceń dla tego użytkownika, możesz to zrobić. Utwórz skrypt w ten sposób /home/backup/commands.sh
:
#!/bin/sh
case $SSH_ORIGINAL_COMMAND in
"diskspace")
df -h
;;
"dirlist")
ls -1
;;
"apache_restart")
/etc/init.d/apache restart
;;
*)
echo "Unknown command"
esac
Następnie ustaw authorized_keys
plik tak:
command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host
backup
Użytkownik może następnie uruchomić tych poleceń tak:
# diskspace
$ ssh -q user@remote_host diskspace
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/dev-root 39G 2.2G 35G 6% /
# dirlist
$ ssh -q remote_host dirlist
commands.sh
dump.sql
Bibliografia