Restreindre la sauvegarde sans mot de passe avec SFTP

11

J'ai besoin d'effectuer une sauvegarde d'un serveur sur mon ordinateur en utilisant Duplicity:

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

Avant cela, je dois autoriser l'accès sans mot de passe en procédant comme suit:

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

Ma question est, comment puis-je restreindre la commande à ce transfert SFTP uniquement dans la clé publique générée?

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

Et puisque je suis sur une adresse IP dynamique, comment puis-je surmonter le problème de "l'hôte connu manquant" chaque fois que mon IP change?

Débordement de question
la source
1
"problème d'hôte connu manquant": utilisez l'option StrictHostKeyChecking = no pour ssh
Marki
@Marki, merci, le paramétrage de ssh_config fonctionne.
Débordement de questions le

Réponses:

15

Question 1

Ma question est, comment puis-je restreindre la commande à ce transfert SFTP uniquement dans la clé publique générée?

Il existe 2 méthodes pour ce faire.

1. - Restriction via sshd

Cette méthode implique la mise en place de la fonction SFTP au sein de votre démon SSH, sshd. Ceci est contrôlé via le /etc/ssh/sshd_configfichier de configuration. REMARQUE: cela restreindra l'utilisateur, backuppour qu'il ne soit autorisé à SFTP que sur le serveur.

# /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. - Restriction via les touches autorisées

Cette méthode n'implique aucune modification du sshd_configfichier. Vous pouvez limiter un utilisateur + une clé SSH à une seule commande via la command=fonctionnalité que vous avez déjà mentionnée dans votre question. L'astuce réside dans la commande que vous incluez. Vous pouvez placer le serveur SFTP dans cette command=ligne, ce qui a le même effet que la configuration du serveur SFTP dans votre sshd_configfichier.

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

REMARQUE: si l'utilisateur dispose d'un accès en écriture à ~/.ssh/authorized_keys, il peut le lire et / ou le modifier. Par exemple, ils pourraient le télécharger, le modifier et le re-télécharger en supprimant le commmand=..., lui accordant un accès sans entrave aux commandes, y compris le shell. Si l'utilisateur dispose d'un accès en écriture ~/.ssh, il peut également simplement dissocier et recréer le fichier, ou le chmodcréer pour accéder en écriture. Il existe de nombreuses solutions possibles, telles que ranger les ~/.ssh/authorized_keysfichiers dans un endroit non accessible en écriture, comme avec:

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

Question 2

Et puisque je suis sur une adresse IP dynamique, comment puis-je surmonter le problème de "l'hôte connu manquant" chaque fois que mon IP change?

C'est plus délicat mais réalisable en utilisant également la from=fonctionnalité dans le authorized_keysfichier. Ici, nous limitons l'accès à partir de l'hôte uniquement somehost.dyndns.org.

from = "somehost.dyndns.org", command = "/ usr / libexec / openssh / sftp-server", no-port-forwarding, no-X11-forwarding, no-agent-forwarding, no-pty ssh-dss AAAAC8ghi9ldw == sauvegarde @ hôte

Les paramètres supplémentaires après le command=sont également importants, car ils limiteront encore plus l'utilisation de la clé SSH.

ventilation des fonctionnalités

  • from='hostname1,hostname2,'' - Restreint l'accès à partir des modèles IP ou de nom d'hôte spécifiés
  • command='command' - Exécute la commande spécifiée après l'authentification
  • no-pty - N'attribue pas de pty (ne permet pas la connexion interactive)
  • no-port-forwarding - Ne permet pas la redirection de port
  • no-X11-forwarding - l'utilisateur ne pourra pas supprimer les interfaces graphiques d'affichage X11
  • no-agent-forwarding - l'utilisateur ne pourra pas transmettre via cet hôte à d'autres hôtes internes

Pour se débarrasser du message sur les "hôtes connus manquants", vous pouvez ajouter cette option SSH au client lorsqu'il se connecte comme ceci:

$ ssh -o StrictHostKeyChecking=no ....

Consultez la page de manuel ssh_configpour plus de détails sur ce commutateur.

Restreindre le shell de l'utilisateur

Pour les deux solutions ci-dessus, vous souhaiterez probablement verrouiller l' backuputilisateur en limitant également le shell de cet utilisateur dans le /etc/passwdfichier. En règle générale, vous souhaiterez le définir scponly, mais il existe également d'autres choix pour cela. Voir cette Q&R U&L intitulée: " Avez-vous besoin d'un shell pour SCP? " Pour savoir comment procéder.

L'utilisation de /sbin/nologinpeut également être utilisée si vous choisissez d'utiliser la fonction chroot sshd_configcomme indiqué au n ° 1 ci-dessus. Cependant, si vous choisissez d'utiliser la méthode décrite au # 2 , vous devrez probablement utiliser scponlyou autre chose pour le shell de l'utilisateur /etc/passwd.


BONUS - Prolonger # 2 ci-dessus

Si vous devez exposer un ensemble de commandes pour cet utilisateur, vous pouvez également le faire. Créez un script comme celui-ci /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

Vous configurez ensuite le authorized_keysfichier comme suit:

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

L' backuputilisateur peut ensuite exécuter ces commandes comme suit:

# 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

Les références

slm
la source
Faites attention aux commandes auxquelles vous autorisez l'utilisateur à accéder ou l'utilisateur peut avoir la possibilité d'obtenir un shell complet. Par exemple, si vous autorisez quelqu'un à accéder à vim, il pourrait facilement:! / Bin / bash ou:! / Bin / someotherprogram.
rking
@rking - oui cela va de soi ...
slm
Merci de m'avoir donné une réponse aussi détaillée. La restriction de commande fonctionne parfaitement. Mais il y a deux problèmes. 1) L'IP dynamique fait référence à mon ordinateur, pas au serveur. Les noms d'hôte dans le champ "de" du fichier authorized_keys restreignent uniquement l'adresse à partir de laquelle le serveur peut accéder à mon ordinateur et ne fait rien pour résoudre le problème "hôte manquant connu" sur mon ordinateur. 2) La désactivation de la connexion au shell pour l'utilisateur de sauvegarde sur mon ordinateur /sbin/nologinempêchera le serveur d'accéder à mon ordinateur avec SFTP. J'ai essayé ça.
Débordement de questions du
1
Désolé pour la confusion. Le serveur S devient le client lorsqu'il établit la connexion SFTP dorsale avec mon ordinateur C. Le problème «hôte connu manquant» se produit chaque fois que le serveur S effectuant la sauvegarde se connecte à un emplacement non répertorié dans son known_hostsfichier ssh . Marki a fourni la bonne solution dans son commentaire. Le fromparamètre dans le authorized_keysfichier sur mon ordinateur C restreint uniquement l'emplacement à partir duquel S peut se connecter à C.
Débordement de la question
Oui, veuillez procéder à la modification. Au fait, je me rends compte que cela /sbin/nologinfonctionne si j'utilise la commande force internal-sftpau lieu de celle /usr/libexec/openssh/sftp-serverque vous avez spécifiée sur le certificat. Je suppose que ce sont deux sous-systèmes différents. Et créer un répertoire chroot pour le premier est beaucoup plus simple.
Débordement de questions du
0

Shell restreint

Vous devez affecter un shell restreint tel scponly ou rssh.

Lorsque vous utilisez scp ou sftp, vous vous connectez au site distant via ssh, puis le shell distant exécute un processus scp ou sftp. Ce dont vous avez besoin est un shell restreint qui ne permet qu'à scp ou sftp de verrouiller la connexion.

rking
la source