Ogranicz tworzenie kopii zapasowych bez hasła za pomocą SFTP

11

Muszę wykonać kopię zapasową serwera na moim komputerze za pomocą Duplicity:

duplicity /etc sftp://[email protected]//home/backup

Zanim będzie to możliwe, muszę zezwolić na dostęp bez hasła, wykonując następujące czynności:

$ ssh-keygen
$ ssh-copy-id [email protected]
$ ssh [email protected]

Moje pytanie brzmi: w jaki sposób mogę ograniczyć polecenie tylko do tego transferu SFTP w generowanym kluczu publicznym?

command="restrict to sftp",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAA…

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?

Przepełnienie pytania
źródło
1
„brak znanego problemu z hostem”: użyj StrictHostKeyChecking = brak opcji ssh
Marki
@Marki, dzięki, ustawienie tego na ssh_config działa.
Pytanie Przepełnienie

Odpowiedzi:

15

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_configplik konfiguracyjny. UWAGA: Ograniczy to użytkownika, backupaby 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_configpliku. 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_configpliku.

# 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 chmoddostęp do zapisu. Istnieje wiele możliwych rozwiązań, takich jak odkładanie ~/.ssh/authorized_keysplikó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_keyspliku. 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_configaby 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ć backupużytkownika, ograniczając również jego powłokę w /etc/passwdpliku. 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/nologinmożna także skorzystać, jeśli zdecydujesz się na użycie funkcji chroot sshd_configzgodnie 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ć scponlyinnej 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_keysplik tak:

command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host

backupUż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

slm
źródło
Uważaj na polecenia, do których zezwalasz użytkownikowi na dostęp, ponieważ może mieć on możliwość uzyskania pełnej powłoki. Na przykład, jeśli dasz komuś dostęp do vima, może on łatwo:! / Bin / bash lub:! / Bin / someotherprogram.
rking
@rking - tak, to oczywiste ...
slm
Dzięki za udzielenie mi tak szczegółowej odpowiedzi. Ograniczenie polecenia działa idealnie. Ale są dwa problemy. 1) Dynamiczny adres IP odnosi się do mojego komputera, a nie serwera. Nazwy hostów w polu „z” pliku Author_keys ograniczają tylko adres, z którego serwer może uzyskać dostęp do mojego komputera i nie robi nic, aby rozwiązać problem „brakującego znanego hosta” na moim komputerze. 2) Wyłączenie logowania do powłoki dla użytkownika kopii zapasowej na moim komputerze /sbin/nologinuniemożliwi serwerowi dostęp do mojego komputera za pomocą SFTP. To próbowałem.
Przepełnienie pytania
1
Przepraszam za zamieszanie. Serwer S staje się klientem, gdy wykonuje połączenie SFTP zaplecza z moim komputerem C. Problem „brakującego znanego hosta” występuje, ilekroć serwer S wykonujący kopię zapasową łączy się z lokalizacją niewymienioną w known_hostspliku ssh . Marki podał prawidłowe rozwiązanie w swoim komentarzu. fromParametr w authorized_keyspliku na komputerze C ogranicza tylko lokalizację, z której można podłączyć do S C
Pytanie przepełnieniem
Tak, proszę przejść do edycji. Nawiasem mówiąc, zdaję sobie sprawę, że /sbin/nologindziała, jeśli użyję polecenia force internal-sftpzamiast tego, /usr/libexec/openssh/sftp-serverktóry podałeś w certyfikacie. Sądzę, że są to dwa różne podsystemy. A utworzenie katalogu chroot dla tego pierwszego jest znacznie prostsze.
Przepełnienie pytania
0

Ograniczona powłoka

Musisz przypisać ograniczoną powłokę, taką jak scponly lub rssh.

Kiedy używasz scp lub sftp, łączysz się ze zdalną witryną przez ssh, a następnie zdalna powłoka wykonuje proces scp lub sftp. Potrzebujesz ograniczonej powłoki, która pozwala tylko scp lub sftp zablokować logowanie.

rking
źródło