Comment utiliser SFTP sur un système qui nécessite sudo pour l'accès root et l'authentification basée sur la clé ssh?

26

Je veux pouvoir utiliser SFTP pour modifier des fichiers qui nécessitent des autorisations root.

J'utilise l'authentification basée sur la clé SSH - clé rsa sur la carte à puce.

Si le système nécessite sudo pour exécuter des commandes de niveau racine, comment puis-je contourner ce problème?

Puis-je créer un moyen de contourner sudo pour SFTP uniquement?

Existe-t-il un moyen de conserver l'authentification sudo et la clé.

J'utilise Windows pour me connecter à Ubuntu. J'ai besoin de cela pour que Mac fonctionne également avec Ubuntu.

Je comprends comment faire le tunneling SSH pour administrer les services système. Actuellement, j'utilise directement la connexion de l'utilisateur root, mais la connexion par mot de passe est désactivée. Je n'ai pas compris comment utiliser sudo et SFTP en même temps. Il semble être une meilleure pratique d'exiger une connexion en tant qu'utilisateur non root, puis d'exiger l'utilisation de sudo, car les journaux enregistreront à qui ont été accordés des privilèges élevés pour chaque commande.

Dois-je m'en préoccuper lorsque j'utilise l'authentification par clé ou s'agit-il d'une différence triviale en matière de sécurité / journalisation? Il semble que l'authentification basée sur les clés enregistre le numéro de série de l'utilisateur dans les journaux, et vous pouvez avoir plusieurs clés pour que l'utilisateur root identifie chaque utilisateur. Cela semble être le même effet que l'utilisation de sudo pour moi. Ai-je tort?

Bruce Kirkpatrick
la source
2
Je voudrais simplement utiliser le compte root avec une authentification par clé directement et sauter sudo.
Martin von Wittich
1
"Il semble être une bonne pratique d'exiger une connexion en tant qu'utilisateur non root, puis d'exiger l'utilisation de sudo car les journaux enregistreront à qui ont été accordés des privilèges élevés pour chaque commande." - mais cela ne vaut pas grand-chose, car quelqu'un qui a acquis les privilèges root peut de toute façon altérer les journaux.
Martin von Wittich
Combien de fichiers?
Nils
1
Juste pour noter qu'il y a une réponse correcte de sftp -s "sudo / usr / lib / openssh / sftp-server" targethost.fqdn ci-dessous. Si sudo nécessite un mot de passe, vous pouvez ajouter à la liste blanche cette commande particulière pour nopasswd.
Mikko Ohtamaa

Réponses:

7

SFTP est une commande d'accès aux opérations sur les fichiers, avec les restrictions du compte que vous utilisez. Vous devez utiliser ssh pour effectuer plus d'opérations administratives, rendant impossible l'utilisation de sudo et SFTP en même temps. Si vous avez besoin d'accéder à l'intégralité du disque sans restriction à l'aide de SFTP, faites-le à l'aide du compte root. Quoi qu'il en soit, vous pouvez faire une connexion avec root sur sftp et ssh en même temps, bien sûr, en utilisant deux sessions différentes.

Les clés de sécurité améliorent la sécurité et facilitent la journalisation, ne nécessitant pas de saisie au clavier. Aide uniquement à se connecter, vous pouvez avoir plusieurs mots de passe pour chaque utilisateur du compte et avoir le même effet.

EDIT: J'ai oublié: vous pouvez créer un autre compte avec le même effet que root si vous attribuez l'ID utilisateur à 0, mais n'a aucun sens, étant dangereux de la même manière. Pourrait donner un peu d'obscurcissement si quelqu'un essaie de se connecter comme root, mais à part cela, cela n'avait pas beaucoup de sens.

gabrign
la source
12

L'appel du sous-système avec sudo a fonctionné pour moi.

À un hôte Ubuntu par exemple:

sftp -s "sudo /usr/lib/openssh/sftp-server" targethost.fqdn
kiwi
la source
2
Cela ne fonctionne que si vous n'avez pas besoin d'un mot de passe pour sudo, ou si vous avez déjà un ticket sudo et que tty_tickets est désactivé. Sur la plupart des installations modernes, la valeur par défaut n'est pas non plus.
Cheetah
C'est parfait pour les connexions aux systèmes Amazon Linux par défaut, où vous vous connectez en tant qu'utilisateur ec2-user, et vous pouvez utiliser sudo sans mot de passe. +1, merci! (Notez que sur Amazon Linux, la commande est légèrement différente sudo /usr/libexec/openssh/sftp-server
:.
J'utilise largement cette solution pour me connecter en tant qu'autre utilisateur où la connexion directe est désactivée (à des fins d'audit et de journalisation). C'est une petite chose que des outils comme fourmi n'exposent pas ce sous-système. Cependant, je conseillerais de ne jamais sudo à root, mais à un autre utilisateur avec suffisamment de privilèges pour faire ce dont vous avez besoin. Le problème à résoudre est que tous les environnements Unix ne sont pas identiques, et le sous-système sftp peut être situé à différents endroits, comme indiqué par @MarnixKlooster
YoYo
Pour Amazon Linux, la commande entière est: "sftp -s 'sudo / usr / libexec / openssh / sftp-server' targethost.fqdn"
johntellsall
7

Au-delà de ce que @MartinVonWittich a suggéré dans les commentaires ci-dessus, vous pouvez configurer une paire de clés SSH dédiée uniquement pour cette activité et les ajouter au /root/.ssh/authorized_keysfichier de l'utilisateur racine en limitant leur portée à une seule commande.

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

Cela permettrait à un autre système avec la clé correspondante à cette paire de SFTP dans ce système en tant que root. Vous auriez toujours un enregistrement de cette connexion dans vos fichiers sysloget / ou secure.log(en supposant que votre distribution fournit ce niveau de journalisation).

REMARQUE: quiconque accède au serveur dans cette méthode aurait un accès cartes blanches, alors utilisez-le judicieusement. Mieux encore, continuez à lire et combinez cette capacité avec un accès en chroot et en lecture seule, pour créer des restrictions plus strictes et un accès ciblé à des emplacements spécifiques en tant que root.

chroot & readonly

L'autre technique que vous pourriez exploiter ici serait de limiter la connexion SFTP afin qu'elle soit chrootée dans des emplacements spécifiques en tant que root, en fonction de la clé SSH utilisée. Voir ma réponse à cette Q&R U&L intitulée: " Restreindre la sauvegarde sans mot de passe avec SFTP " pour plus de détails.

Vous pouvez également contrôler sftp-servervia ses commutateurs -Ret -d.

 -d start_directory
         specifies an alternate starting directory for users.  The pathname 
         may contain the following tokens that are expanded at runtime: %%
         is replaced by a literal '%', %h is replaced by the home directory
         of the user being authenticated, and %u is replaced by the user‐
         name of that user.  The default is to use the user's home 
         directory.  This option is useful in conjunction with the 
         sshd_config(5) ChrootDirectory option.

 -R      Places this instance of sftp-server into a read-only mode.  
         Attempts to open files for writing, as well as other operations 
         that change the state of the filesystem, will be denied.
slm
la source
Hmm, mais limiter la commande à sftp-serverne la rend pas plus sûre, n'est-ce pas? Si un attaquant accède à ce compte, il peut facilement se donner un shell root en utilisant SFTP. La limitation de commande est donc assez inutile du point de vue de la sécurité :)
Martin von Wittich
@MartinvonWittich - non pas dans l'exemple que j'ai inclus. C'était plus pour montrer le potentiel. Sans connaître les cas d'utilisation exacts, il est difficile de montrer un exemple réel. Donner un rootaccès SFTP sous n'importe quelle forme est juste un problème, surtout lorsqu'il n'est pas chrooté.
slm
3

L'approche simple que j'ai suivie était de simplement sftp et de placer les fichiers sur une zone de scène ( mkdirnouveau répertoire où vous avez des autorisations sur le serveur), puis de nouveau ssh pour déplacer les fichiers de là vers leur destination avec sudo cpou sudo mv.

Akshay Rathod
la source
1

J'ai eu un problème similaire en ce sens que je voulais utiliser vimdiff pour éditer des fichiers de configuration sur un groupe d'hôtes pour la plupart similaires, avec cssh et sudo et vous pourrez peut-être adapter ma solution à votre flux de travail.

sudoedit (qui fait partie de sudo) vous permet d'utiliser n'importe quel éditeur en tant qu'utilisateur normal pour éditer un fichier pour lequel vous n'avez pas l'autorisation d'écriture et vous pouvez spécifier l'éditeur avec une variable d'environnement. sudoedit copie le (s) fichier (s), appelle l'éditeur avec le nom de la ou des copie (s) et attend la fermeture de l'éditeur, puis copie la copie modifiée à son emplacement d'origine. J'ai donc créé un «éditeur» qui ne modifie pas, note simplement le fichier pour une utilisation ultérieure et attend et un wrapper autour de vimdiff qui utilise ce marqueur.

le premier fichier est ~ / .bin / redit

#!/usr/bin/perl -w
use strict;
use warnings;
use Sys::Hostname;
my $file = $ENV{HOME}.'/.var/redit/'.hostname();
sub cmkdir($){
    my $_=shift;
    mkdir $_ unless -d $_;
}
cmkdir $ENV{HOME}.'/.var/';
cmkdir $ENV{HOME}.'/.var/redit/';
foreach (@ARGV){
    my $fh;
    open $fh, '>', $file.'na' or warn;
    print {$fh} $_;
    close $fh;
    symlink $_, $file or die;
    print;
    <STDIN>;
    unlink $file or die;
    unlink $file.'na' or die;
}

le second est ~ / .bin / redit1

#!/usr/bin/perl -w
use strict;
use warnings;
use Sys::Hostname;
my $h=hostname();
@ARGV=qw(host1 host2 host3 host4) unless @ARGV;
print join " ", qw(gvimdiff), $ENV{HOME}.'/.var/redit/'.$h, map {'scp://'.$_.'/.var/redit/'.$_} grep {$_ ne $h} @ARGV;
exec qw(gvimdiff), $ENV{HOME}.'/.var/redit/'.$h, map {'scp://'.$_.'/.var/redit/'.$_} grep {$_ ne $h} @ARGV;

La façon dont je les utilise est d'utiliser cssh pour ouvrir une connexion aux quatre hôtes, puis utiliser une commande comme EDITOR=~/.bin/redit sudoedit /etc/conf/file, puis dans une autre fenêtre ~/.bin/redit1, effectuez mes modifications, enregistrez et quittez, revenez à cssh et appuyez sur entrée pour valider les modifications et quittez sudoedit (sauf si je modifie plusieurs fichiers, auquel cas redit passe au fichier suivant dans la liste et que vous exécutez à nouveau redit1 pour le fichier suivant.)

Puisque ce que vous faites est moins compliqué, vous n'avez pas besoin de redit1 car vous ne travaillez qu'avec un seul hôte distant, vous pouvez simplement pointer votre éditeur sftp sur host: .var / redit / host ou équivalent.

hildred
la source
1

Ce que je fais, c'est utiliser scp au lieu de ftp ftp, et changer le shell sudo su -en WinSCP c'est dans Advanced \ SCP \ Shell, mais cela ne fonctionne qu'avec le protocole scp.

SilentVoid
la source
0

Pour sftp: si vous disposez d'un accès sudsh shell ssh, vous pouvez ajouter votre nom d'utilisateur au groupe d'utilisateurs racine dans / etc / group, puis accorder à ce groupe des autorisations rx pour les dossiers auxquels vous souhaitez accéder.

physicsgeekn
la source
C'était ma première tentative et cela ne fonctionne pas. J'ai créé un utilisateur et l'ai ajouté au rootgroupe, je me connecte via sftp mais cela ne me permet toujours pas de télécharger des fichiers à partir d'emplacements comme '/ etc' et ainsi de suite. Je ne sais pas si je fais quelque chose de mal, mais je soupçonne que cette réponse ne fonctionne pas.
Pere
0

Vous pouvez insérer dans votre fichier sshd_config côté serveur:

Subsystem sftp sudo -n true && sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server

De cette façon, quiconque a le droit de NOPASSWD sudo obtiendra un accès sftp enraciné.

János Konkoly
la source
Quelle est la Subsystemcommande? Sur Ubuntu 16.04, je reçois "command not found"
inspirednz
Ce n'est pas une commande mais une entrée dans / etc / ssh / sshd_config
János Konkoly
0

L'ajout de cette ligne dans / etc / ssh / sshd_config était un correctif pour moi et commentait la ligne de sous-système existante Subsystem sftp sudo -n true && sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server

puis sudo systemctl sshd restart

Rakib Fiha
la source