Quelle est une bonne configuration permettant l'exécution automatique d'une commande ou d'un script sur un serveur distant avec root
privilèges en utilisant SSH ?
Je suis conscient (seulement vaguement pour certaines des options) des options suivantes :
- Permettre une connexion directe par
root
(PermitRootLogin
) (et éventuellement en forçant l'authentification des clés). - Configuration de
sudo
de ne pas exiger un mot de passe (NOPASSWD
le drapeau ensudoers
) et TTY (requiretty
drapeau). - Configuration de
sudo
pour permettre l'exécution de commandes/scripts spécifiques, lorsqu'ils sont authentifiés avec une clé privée spécifique. - Définition du propriétaire du script en tant que
root
et la mise en place permission setuid .
Mais d'abord, je ne suis pas sûr des conséquences de ces mesures sur la sécurité. Par exemple, je sais que le fait d'autoriser root
La connexion est désapprouvée. Mais je ne suis pas sûr que ce ne soit pas un point de vue obsolète. D'après ce que j'ai compris, il semble qu'une authentification par mot de passe soit le danger. Avec l'authentification par clé publique, le root
La connexion pourrait être correcte. Et pour certaines des options, notamment l'option sudo
Je ne suis même pas sûr de la configuration nécessaire. Bien que je sois capable de googler tout cela, il pourrait y avoir des considérations de sécurité que je pourrais manquer, c'est pourquoi je demande l'avis d'experts.
Notez, que je demande une côté serveur installation. L'exécution sera déclenchée par un programme, et non par un outil de type ssh
donc je ne cherche pas des choses comme l'automatique. client l'authentification.
Le contexte : Être actif dans ssh
tag sur Stack Overflow L'une des questions qui reviennent le plus souvent concerne les différents hacks que les gens tentent d'exécuter une commande/script (ou même un serveur SFTP) par SSH sur un serveur Unix/Linux distant en utilisant une clé USB. root
compte à l'aide de divers langages de programmation (C#, Java, VB.NET, Python, etc.) et de bibliothèques SSH (SSH.NET, JSch, Paramiko, etc.).
Les implémentations, que les gens tentent, essayent généralement d'utiliser su
o sudo
. Ces derniers demandent alors un mot de passe. Les implémentations essaient alors de transmettre le mot de passe à l'entrée de commande. Comme su
y sudo
exigent souvent émulation de terminal pour l'invite de mot de passe, l'implémentation doit exiger PTY. Ce qui, à son tour, cause d'autres problèmes, car les sessions avec l'émulation de terminal utilisent souvent des fonctions interactives, telles que Codes d'échappement ANSI la pagination, etc. Tout cela conduit à des tas d'autres bidouillages peu fiables qui tentent de supprimer ou même d'interpréter les codes d'échappement ANSI ou de simuler un terminal suffisamment grand pour éviter la pagination.
Quelques exemples parmi tant d'autres :
- La commande "sudo" exécutée avec JSch requiert un mot de passe, même si le mot de passe n'est pas requis dans une session SSH interactive
- Obtention de "must be run from a terminal" lors du passage à l'utilisateur root en utilisant le module Paramiko en Python
- Exécution de la commande "su -l" en SSH à l'aide de Python
- Utilisation de JSch pour SFTP quand on doit aussi changer d'utilisateur
Bien que je puisse généralement fournir une aide pour la mise en œuvre de ces astuces, j'ajoute généralement une suggestion selon laquelle il existe des moyens plus efficaces que l'automatisation. sudo
/ su
. Mais je ne suis pas vraiment sûr de pouvoir fournir des détails sur ces prétendues "de meilleurs moyens" . Une question connexe : です。 sudo
presque inutile ?
Donc je cherche un canonique du point de vue d'un super utilisateur, qui peut ensuite être consulté et adapté aux besoins de Stack Overflow.