Qu'est-ce qu'une bonne configuration qui permet l'exécution automatique d'une commande ou d'un script sur un serveur distant avec root
privilèges utilisant ssh?
Je suis au courant (seulement vaguement pour certaines options) des options suivantes:
root
( PermitRootLogin
) (et éventuellement forçant l'authentification clé).Sudo
_ Ne pas nécessiter de mot de passe (NOPASSWD
indicateur dans sudoers
) et tty (requiretty
drapeau).Sudo
Pour permettre une exécution de commandes/scripts spécifiques, lorsqu'il est authentifié avec une clé privée spécifique.root
et réglage autorisation SETUID .Mais d'abord, je ne suis pas sûr de ce qui concerne les conséquences de la sécurité. Par exemple, je sais que l'autorisation de root
login est fronçée sur. Mais je ne suis pas sûr, si ce n'est pas un point de vue obsolète. De ce que j'ai compris, il semble que une authentification par mot de passe est le danger. Avec l'authentification de clé publique, le login Direct root
peut être correct. Et pour certaines des options, en particulier le Sudo
, je ne suis pas sûr même sur la configuration nécessaire. Pendant que je suis capable de google tout cela, il pourrait y avoir des considérations de sécurité que je me manquerai, c'est pourquoi je demande l'opinion des experts.
Remarque, que je demande un fichier côté serveur Configuration. L'exécution sera déclenchée par un programme, pas un outil comme ssh
, donc je ne cherche pas de choses comme automatique client authentification.
Contexte: Être actif dans ssh
étiquette sur la pile débordement , une des questions fréquentes qui se posent, concerne divers hacks que les gens tentent, tout en essayant d'exécuter une commande/script (ou même un serveur SFTP) sur un SSH sur un serveur de serveur UNIX/Linux distant à l'aide d'un compte root
utilisant divers langages de programmation (C #, Java, VB.Net, Python, etc.) et Bibliothèques SSH (SSH.NET, JSCH, PARAMIIKO, etc.).
Les implémentations, que les gens tentent, essaient généralement d'utiliser su
ou Sudo
. Ceux-ci alors invitent un mot de passe. Les implémentations tentent donc d'alimenter le mot de passe à l'entrée de commande. Comme su
et Sudo
nécessitent souvent émulation de terminal pour l'invite de mot de passe, la mise en œuvre doit nécessiter une PTY. Qui, à son tour, provoque des problèmes supplémentaires, les sessions avec l'émulation du terminal utilisent souvent des caractéristiques interactives, comme codes d'échappement ANSI , pagination, etc. Tous ces conduits à des charges de hacks plus fiables qui tentent d'éliminer ou même d'interpréter Les codes d'échappement ANSI ou simulent un terminal assez important pour éviter la pagination.
Quelques exemples sur plusieurs:
Bien que je puisse généralement fournir une aide pour la mise en œuvre de ces hacks, j'ajoute également une suggestion selon laquelle il existe de meilleurs moyens que d'automatiser Sudo
/su
. Mais je ne suis pas vraiment confiant quant à la fourniture de détails sur ces prétendues "meilleurs moyens". Une question connexe: est Sudo
presque inutile?
Donc, je cherche A Canonical Réponse d'une perspective super utilisatrice, qui peut ensuite être référée et adaptée à des fins de débordement de pile.
Je crois une solution appropriée pour une majorité de cas simples [c.-à-d. Si un cadre comme la marionpette/chef/cfengine/ansile est surchargé], mais un niveau de contrôle élevé du système distant est nécessaire pour
(a) Exiger une authentification basée sur la clé (B) Verrouillez les emplacements pouvant être utilisés par SSH - en particulier pour verrouiller les adresses IP que les utilisateurs racines peuvent utiliser (C) garantissent que les machines avec cette relation de fiducie sont correctement sécurisées.
Je ne crois pas que "la connexion en tant que root est fronçée sur", autant que "se connecter à la racine de faire des choses qui ne nécessitent pas les autorisations de racine" est fronçée. Avoir un mot de passe devinable permet au compte d'être forcé brute, de sorte que c'est un problème de lutter avec, et en permettant aux gens de se connecter en tant que root, ils peuvent faire des erreurs stupides avec une portée plus large et faire des choses discutables qui cachent Activité malveillante - mais en fonction de l'architecture, cela peut ne pas être significatif.
Ceci xkcd émanant souligne que, selon l'environnement, cela peut ne pas comporter si un compte root est compromis.
Probablement la solution SIMPIST et la solution la plus efficace pour le cas général est de limiter exactement qui peut se connecter en tant que root en contrôlant les clés en conjonction avec la spécification d'une ligne d'allaiteurs appropriée dans/etc/ssh /sshd.conf. Une ligne appropriée pour permettre aux utilisateurs normaux mais verrouiller l'accès racine à la racine pourrait ressembler à:
AllowUsers normaluser1 normaluser2 [email protected]
De bien sûr, il est important que la connexion basée sur le mot de passe soit interdite, ou que le compte root ne possède pas de mot de passe (c'est-à-dire un "!" Ou "*" dans le champ Mot de passe du fichier de mot de passe.)
Comme vous avez postulé, si seulement un seul (ou petit nombre de) programme (s) (s) doit être exécuté, vous risquez peut-être mieux de mettre en place un utilisateur spécifique avec une authentification basée sur la clé et permettant d'accéder à SUDO approprié aux commandes requises.
Il y a, de bien sûr, beaucoup de choses qui peuvent être faites pour "verrouiller" l'accès en outre, en fonction de la valeur des données - SELINUX, une journalisation à distance, une coque limitée, des contraintes de temps de jour, des notifications immédiatement sur les connexions La surveillance des journaux actifs tels que Fail2Ban [en plus des restrictions de réseau que je vois comme non facultatif] peut tous faire partie d'une solution. Cela dit, si vous maîtrisez simplement un système qui peut être époustouflé et recréé facilement, une grande partie de cela est probablement survenue.
N'oubliez pas que la sécurité est construite en couches, afin de pouvoir obtenir un accès root, un compte doit avoir besoin de passer par un certain nombre de couches. Verrouiller l'accès, les clés privées SSH, les pare-feu, les restrictions du temps de jour [et le principe du moindre accès, c'est-à-dire qu'à fournir un accès à ce qui est nécessaire, plus, la journalisation, les sauvegardes] ne doit toutes fonctionner dans le cadre de la bonne sécurité.
supplémentaire - ACCÈS SUDO
Sudo est un mécanisme permettant à un utilisateur régulier d'exécuter certaines commandes avec un accès élevé et est assez flexible et de portée variée. Tandis qu'une exécution de sudo n'est pas éventuelle ici (mais est bien documentée si vous tapez homme sudo Dans la plupart des distributions, les étapes appropriées pourraient être -
Modifier/etc/sudoers - La plupart des variantes de Linux ont un programme spécial pour le faire appelé "Visudo" qui doit être exécuté en tant que root, et à peu près équivalente à l'utilisation de l'éditeur système pour éditer/etc/sud-sud (ce qui est une autre façon de faire ceci - bien que probablement franchement) sur)
Ajouter/modifier les lignes appropriées pour laisser un utilisateur donné faire des choses particulières. Si, par exemple, vous vouliez qu'ils puissent monter des annuaires, par exemple et sans avoir à entrer un mot de passe, vous entrez une ligne comme:
username ALL=/sbin/mount NOPASSWD: ALL
Pour exécuter cette commande, l'utilisateur approprié exécuterait quelque chose comme
Sudo mount /dev/xxx /path/to/mount
Vous pouvez répertorier plusieurs lignes pour plusieurs commandes, utilise plutôt des groupes d'utilisations - Sudoers est un sous-système assez flexible. Dans de nombreuses distributions, il est également possible d'ajouter des fichiers avec des commandes à un sous-répertoire comme /etc/sudoers.d
Ce qui suit est une réponse du post Unix Stackexchange
Comment exécuter à distance exécuter SSH commande une commande sudo sans mot de passe .
Cette méthode permet à l'administrateur du serveur de permettre à votre compte d'exécuter une commande comme Sudo
sans spécifier le mot de passe. La commande est probablement l'appel à votre script et il n'est autorisé que lorsqu'il est exécuté sous votre compte. Comme la commande autorisée est entièrement spécifiée, y compris les arguments, je pense que cette méthode est assez sécurisée.
vous pouvez dire au sudo de sauter le mot de passe pour une commande.
par exemple. dans
/etc/sudoers
archemar ALL = (www-data) NOPASSWD: /bin/rm -rf /var/www/log/upload.*
cela me permettez d'utiliser
Sudo -u www-data /bin/rm -rf /var/www/log/upload.*
comme Archemar sans mot de passe.
Notez que
Sudo -u www-data rm -rf /var/www/log/upload.*
ne fonctionnera pas (demandera un mot de passe) comme
rm
diffère de/bin/rm
.Assurez-vous de modifier
/etc/sudoers
Utilisation de la commandevisudo
.Une fois que vous avez atteint le niveau avancé, vous voudrez peut-être avoir vos propres fichiers
Sudo
dans/etc/sudoers.d
.
Voici une réponse sur les considérations de sécurité, que je pense n'avons pas été abordées dans les autres réponses.
Quelle est une bonne configuration qui permet une exécution automatique d'une commande ou d'un script sur un serveur distant avec des privilèges root utilisant ssh?
Il y a plusieurs parties à ceci: permettant l'exécution d'un script unique ou d'une commande avec des privilèges élevés (racine) et d'utiliser SSH. Ce ne sont pas nécessairement dépendants.
- Permettant une connexion directe par root (PerformionLogin) (et éventuellement forçant l'authentification clé).
Cela permettra à quiconque d'avoir des privilèges root complets (non limité à votre seule commande/script). Il permettra également à quiconque d'essayer de se casser à distance dans votre système, en essayant des mots de passe, etc.
- Configuration sudo ne doit pas nécessiter de mot de passe (NOPASSWD Drapeau dans les Sudoers) et TTY (pavillon requisty).
Cela permettra à n'importe quel utilisateur d'avoir des privilèges root complets, tant qu'il est connecté. En termes de sécurité, ce n'est pas beaucoup mieux que de permettre la connexion de la racine, bien qu'il y aura des tentatives moins automatisées de casser dans d'autres comptes d'utilisateur.
- Configuration de sudo pour permettre une exécution de commandes/scripts spécifiques, lorsqu'il est authentifié avec une clé privée spécifique.
Je ne sais pas comment cela serait mis en œuvre - sudo ne sait rien sur les clés SSH, au moins les variantes sudo que je connais.
Configuration de SUDO Pour permettre que l'exécution de commandes/scripts spécifiques est bien meilleure d'un point de vue de sécurité (car il est plus restrictif).
- Réglage du propriétaire de script/commande en tant que root et définissez la permission de setuid.
Cela permettra à n'importe quel utilisateur d'exécuter ce script en tant que root. Vous ne pouvez pas restreindre cela à des utilisateurs particuliers, et les bits sécurisés ont leurs propres faiblesses de sécurité potentielles.
En fin de compte, je ne pense pas qu'il y ait une réponse simple canonique - la meilleure solution dépend de votre situation et de vos exigences. Donc, comme dans toutes les choses liées à la sécurité, vous vous asseyez d'abord et sortez les exigences: comment permissive et flexible voulez-vous être? Quel est le cas d'utilisation réelle? À quel point devez-vous bien attacher le système? Etc.
Cela dit, permettez-moi d'ajouter une alternative très restrictive que vous n'avez pas mentionnée:
Créez un compte d'utilisateur spécifique qui n'est utilisé que pour exécuter ce script/commande particulière. Autoriser uniquement la connexion SSH dans cet utilisateur avec une paire de touches (désactivez les mots de passe). Configurez Sudo pour permettre à cet utilisateur d'exécuter la commande particulière/script en tant que root.
Qui a les conséquences de sécurité suivantes:
Les pirates externes ne peuvent pas craquer le mot de passe du compte spécifique à l'aide de la force brute.
Toute personne gagnant accès à ce compte ne pourra exécuter que le script/la commande unique.
Les autres utilisateurs ne reçoivent pas de privilèges élevés à travers cette construction.
Pas de faiblesses séduides.