Beschränken Sie die kennwortlose Sicherung mit SFTP

11

Ich muss eine Sicherung eines Servers auf meinem Computer mit Duplicity durchführen:

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

Bevor dies durchgeführt werden kann, muss ich den passwortlosen Zugriff wie folgt zulassen:

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

Meine Frage ist, wie ich den Befehl auf nur diese SFTP-Übertragung im generierten öffentlichen Schlüssel beschränken kann.

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

Und wie kann ich das Problem "Fehlender bekannter Host" bei jeder Änderung meiner IP-Adresse überwinden, da ich eine dynamische IP-Adresse habe?

Fragenüberlauf
quelle
1
"fehlendes bekanntes Host-Problem": Verwenden Sie die Option StrictHostKeyChecking = no to ssh
Marki
@ Marki, danke, die Einstellung auf ssh_config funktioniert.
Frage Überlauf

Antworten:

15

Frage 1

Meine Frage ist, wie ich den Befehl auf nur diese SFTP-Übertragung im generierten öffentlichen Schlüssel beschränken kann.

Hierfür gibt es zwei Methoden.

1. - Einschränkung durch sshd

Bei dieser Methode wird die SFTP-Funktion in Ihrem SSH-Daemon eingerichtet sshd. Dies wird über die /etc/ssh/sshd_configKonfigurationsdatei gesteuert . HINWEIS: Dadurch wird der Benutzer darauf beschränkt, backupnur SFTP auf den Server zu übertragen.

# /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. - Einschränkung durch autorisierte_Tasten

Diese Methode beinhaltet keine Änderungen an der sshd_configDatei. Sie können einen Benutzer + einen SSH-Schlüssel über die command=Funktion, die Sie bereits in Ihrer Frage erwähnt haben, auf einen einzelnen Befehl beschränken . Der Trick besteht darin, welchen Befehl Sie einschließen. Sie können den SFTP-Server in diese command=Zeile einfügen. Dies hat den gleichen Effekt wie das Einrichten des SFTP-Servers in Ihrer sshd_configDatei.

# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host

HINWEIS: Wenn der Benutzer Schreibzugriff hat ~/.ssh/authorized_keys, kann er ihn lesen und / oder ändern. Zum Beispiel könnten sie es herunterladen, bearbeiten und erneut hochladen, indem sie das entfernen commmand=...und ihm uneingeschränkten Befehlszugriff gewähren, einschließlich der Shell. Wenn der Benutzer Schreibzugriff hat ~/.ssh, kann er auch einfach die Verknüpfung aufheben und die Datei neu erstellen oder chmodsie zum Schreiben verwenden. Es gibt viele mögliche Lösungen, z. B. das Ablegen der ~/.ssh/authorized_keysDateien an einem nicht vom Benutzer beschreibbaren Ort, z. B.:

Match Group sftponly
    AuthorizedKeysFile      /etc/ssh/authorized_keys/%u

Frage 2

Und wie kann ich das Problem "Fehlender bekannter Host" bei jeder Änderung meiner IP-Adresse überwinden, da ich eine dynamische IP-Adresse habe?

Dies ist schwieriger, aber auch mit der from=Funktion in der authorized_keysDatei möglich. Hier beschränken wir den Zugriff nur vom Host aus somehost.dyndns.org.

from = "somehost.dyndns.org", command = "/ usr / libexec / openssh / sftp-server", keine Portweiterleitung, keine X11-Weiterleitung, keine Agentenweiterleitung, keine pty ssh-dss AAAAC8ghi9ldw == backup @ host

Die zusätzlichen Einstellungen nach dem command=sind ebenso wichtig, da sie die Verwendung des SSH-Schlüssels noch weiter einschränken.

Aufschlüsselung der Funktionen

  • from='hostname1,hostname2,'' - Beschränkt den Zugriff über die angegebenen IP- oder Hostnamenmuster
  • command='command' - Führt den angegebenen Befehl nach der Authentifizierung aus
  • no-pty - Weist keine Pty zu (erlaubt keine interaktive Anmeldung)
  • no-port-forwarding - Ermöglicht keine Portweiterleitung
  • no-X11-forwarding - Der Benutzer kann die X11-GUIs für die Anzeige nicht entfernen
  • no-agent-forwarding - Der Benutzer kann diesen Host nicht an andere interne Hosts weiterleiten

Um die Meldung über die "fehlenden bekannten Hosts" zu entfernen, können Sie dem Client diese SSH-Option hinzufügen, wenn er eine Verbindung wie folgt herstellt:

$ ssh -o StrictHostKeyChecking=no ....

ssh_configAusführliche Informationen zu diesem Schalter finden Sie in der Manpage .

Einschränkung der Benutzer-Shell

Bei beiden oben genannten Lösungen möchten Sie den backupBenutzer wahrscheinlich sperren, indem Sie auch die Shell dieses Benutzers in der /etc/passwdDatei einschränken . Normalerweise möchten Sie es einstellen scponly, aber es gibt auch andere Möglichkeiten dafür. In diesem U & L-Q & A mit dem Titel " Benötigen Sie eine Shell für SCP? "

Die Verwendung von /sbin/nologinkann auch verwendet werden, wenn Sie die Chroot-Funktion sshd_configwie oben in Nr. 1 beschrieben verwenden . Wenn Sie sich jedoch für die in Nr. 2 beschriebene Methode entscheiden , müssen Sie wahrscheinlich scponlyoder etwas anderes für die Shell des Benutzers verwenden /etc/passwd.


BONUS - Erweiterung Nr. 2 oben

Wenn Sie eine Reihe von Befehlen für diesen Benutzer verfügbar machen müssen, können Sie dies auch tun. Erstellen Sie ein Skript wie folgt /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

Anschließend richten Sie die authorized_keysDatei folgendermaßen ein:

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

Der backupBenutzer kann diese Befehle dann folgendermaßen ausführen:

# 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

Verweise

slm
quelle
Achten Sie darauf, auf welche Befehle der Benutzer zugreifen kann, da der Benutzer sonst möglicherweise eine vollständige Shell erhalten kann. Wenn Sie beispielsweise jemandem Zugriff auf vim gewähren, kann er leicht :! / Bin / bash oder :! / Bin / ein anderes Programm.
rking
@rking - ja das versteht sich von selbst ...
slm
Vielen Dank für die ausführliche Antwort. Die Befehlsbeschränkung funktioniert einwandfrei. Es gibt jedoch zwei Probleme. 1) Die dynamische IP bezieht sich auf meinen Computer, nicht auf den Server. Die Hostnamen im Feld "von" der Datei "authorized_keys" beschränken nur die Adresse, von der aus der Server auf meinen Computer zugreifen kann, und lösen das Problem "fehlender bekannter Host" auf meinem Computer nicht. 2) Durch Deaktivieren der Shell-Anmeldung für den Sicherungsbenutzer auf meinem Computer /sbin/nologinwird verhindert, dass der Server mit SFTP auf meinen Computer zugreift. Das habe ich versucht.
Frage Überlauf
1
Entschuldigung für die Verwirrung. Der Server S wird zum Client, wenn er die SFTP-Backend-Verbindung zu meinem Computer C herstellt. Das Problem "Fehlender bekannter Host" tritt immer dann auf, wenn der Server S, der die Sicherung durchführt, eine Verbindung zu einem Speicherort herstellt, der nicht in seiner SSH- known_hostsDatei aufgeführt ist. Marki lieferte in seinem Kommentar die richtige Lösung. Der fromParameter in der authorized_keysDatei auf meinem Computer C beschränkt nur den Ort, von dem aus S eine Verbindung zu C herstellen kann.
Fragenüberlauf
Ja, bitte nehmen Sie die Bearbeitung vor. Übrigens ist mir klar, dass dies /sbin/nologinfunktioniert, wenn ich den Befehl force verwende, internal-sftpanstelle /usr/libexec/openssh/sftp-serverdessen Sie das Zertifikat angegeben haben. Ich denke, das sind zwei verschiedene Subsysteme. Und das Erstellen eines Chroot-Verzeichnisses für das erstere ist viel einfacher.
Frage Überlauf
0

Eingeschränkte Shell

Sie müssen eine eingeschränkte Shell wie scponly oder rssh zuweisen.

Wenn Sie scp oder sftp verwenden, stellen Sie über ssh eine Verbindung zum Remote-Standort her, und die Remote-Shell führt einen scp-Prozess oder einen sftp-Prozess aus. Was Sie brauchen, ist eine eingeschränkte Shell, mit der nur scp oder sftp die Anmeldung sperren können.

rking
quelle