65 votes

Est-il ok de configurer un `sudo` sans mot de passe sur un serveur cloud ?

J'adore l'idée d'accéder aux serveurs via des clés, de sorte que je n'ai pas à taper mon mot de passe à chaque fois que je me connecte en ssh sur une machine, j'ai même verrouillé le mot de passe de mon utilisateur (pas root) (passwd -l nom_utilisateur) pour que ce soit impossible de se connecter sans clé.

Mais tout cela est compromis si je dois entrer un mot de passe pour les commandes sudo. Je suis tenté de mettre en place sudo sans mot de passe pour harmoniser avec la connexion sans mot de passe.

Cependant, j'ai toujours le pressentiment que cela pourrait me nuire de manière inattendue, cela semble quelque peu insécurisé. Y a-t-il des inconvénients à une telle configuration? Recommanderiez-vous ou déconseilleriez-vous de le faire pour un compte utilisateur sur un serveur?

Clarifications

  1. Je parle ici de l'utilisation de sudo dans une session utilisateur interactive, pas pour des services ou des scripts d'administration
  2. Je parle de l'utilisation d'un serveur cloud (donc je n'ai pas d'accès physique local à une machine et je ne peux me connecter que à distance)
  3. Je sais que sudo a un délai après lequel je n'ai pas à retaper mon mot de passe. Mais mon souci n'est pas vraiment de perdre du temps supplémentaire à taper un mot de passe. Mon idée était en réalité de ne pas avoir à gérer un mot de passe du tout, car je pars du principe que :
    • Si je dois le mémoriser, il est très probablement trop court pour être sécurisé ou réutilisable
    • Si je génère un mot de passe long et unique pour mon compte distant, je devrai le stocker quelque part (dans un programme de gestion de mots de passe local ou un service cloud) et le récupérer à chaque fois que je veux utiliser sudo. J'espérais éviter cela.

Ainsi, avec cette question, je souhaitais mieux comprendre les risques, les inconvénients et les compromis d'une configuration possible par rapport aux autres.

Suite 1

Toutes les réponses disent que sudo sans mot de passe est insécurisé car cela permet une élévation "facile" des privilèges si mon compte utilisateur personnel est compromis. Je comprends cela. Mais d'un autre côté, si j'utilise un mot de passe, nous courons tous les risques classiques liés aux mots de passe (trop courts ou courants, répétés sur différents services, etc.). Mais je suppose que si je désactive l'authentification par mot de passe dans /etc/ssh/sshd_config de sorte que vous devez toujours avoir une clé pour vous connecter, je peux utiliser un mot de passe plus simple juste pour sudo qui est plus facile à taper? Est-ce une stratégie valide?

Suite 2

Si j'ai également une clé pour me connecter en tant que root via ssh, si quelqu'un accède à mon ordinateur et vole mes clés (elles sont tout de même protégées par le mot de passe du trousseau de l'OS!), ils pourraient tout aussi bien avoir un accès direct au compte root, contournant le chemin sudo. Quelle devrait être la politique pour accéder au compte root alors?

2 votes

Je ne le recommanderais pas du tout, car il y a souvent des moyens d'obtenir un shell en tant qu'utilisateur (puisque tous les services sont sujets à des violations de sécurité, mais ils fonctionnent généralement en tant qu'utilisateur pour éviter un accès complet au système), mais disposer d'un mot de passe pour se connecter en tant que root empêche les personnes non autorisées d'obtenir un accès root. S'il n'y en a pas, pensez que quiconque accède à votre compte utilisateur de quelque manière que ce soit a un accès complet au serveur. Définir un mot de passe pourrait ne pas être grand-chose, mais cela aide.

0 votes

Veuillez consulter mes questions de suivi.

1 votes

Sudo ne doit jamais être sans mot de passe. root devrait être désactivé pour les connexions distantes via SSH, le port ssh ne doit pas être par défaut (pour se débarrasser des robots stupides), et tout compte nécessitant sudo devrait être limité aux pouvoirs sudo strictement nécessaires pour ce dont ils ont besoin (redémarrer un service uniquement, etc.), et également avoir des mots de passe très forts.

49voto

Samat Jain Points 165

J'aime l'idée d'accéder aux serveurs via des clés, donc je n'ai pas à taper mon mot de passe à chaque fois que je me connecte en ssh sur une machine, j'ai même verrouillé le mot de passe de mon utilisateur (pas root) (passwd -l nom_utilisateur) pour qu'il soit impossible de se connecter sans clé ... Recommanderiez-vous de le faire / de ne pas le faire pour un compte utilisateur sur un serveur?

Vous désactivez les connexions basées sur les mots de passe de la mauvaise manière. Au lieu de verrouiller le compte d'un utilisateur, définissez PasswordAuthentication no dans votre /etc/ssh/sshd_config.

Avec cela, l'authentification par mot de passe est désactivée pour ssh, mais vous pouvez toujours utiliser un mot de passe pour sudo.

La seule fois où je recommande de définir NOPASSWD dans sudo est pour les comptes de service, où les processus doivent pouvoir exécuter des commandes via sudo de manière programmable. Dans ces circonstances, assurez-vous de spécifier explicitement seulement les commandes spécifiques dont le compte a besoin d'exécuter. Pour les comptes interactifs, vous devriez toujours laisser les mots de passe activés.

Réponses à vos questions de suivi:

Mais je suppose que si je désactive l'authentification par mot de passe dans /etc/ssh/sshd_config de sorte que vous devez toujours avoir une clé pour vous connecter, je peux utiliser un mot de passe plus simple juste pour sudo qui est plus facile à taper? Est-ce une stratégie valable?

Oui, c'est correct. Je recommande toujours d'utiliser des mots de passe de compte local relativement forts, mais pas excessivement forts. Environ 8 caractères, générés de manière aléatoire, sont suffisants.

Si j'ai également une clé pour me connecter en tant que root via ssh, si quelqu'un obtient accès à mon ordinateur et vole mes clés (elles sont toujours protégées par le mot de passe du trousseau de l'OS !), ils pourraient aussi bien obtenir un accès direct au compte root, contournant le chemin sudo.

L'accès root via ssh devrait être désactivé. Point. Définissez PermitRootLogin no dans votre sshd_config.

Quelle devrait être la politique pour accéder au compte root alors?

Vous devriez toujours avoir un moyen d'obtenir un accès de secours à la console de votre serveur. Plusieurs fournisseurs de VPS le proposent, tout comme les fournisseurs de matériel dédié. Si votre fournisseur ne propose pas un accès réel à la console (par exemple, EC2 par exemple), vous pouvez généralement toujours restaurer l'accès en utilisant un processus comme celui que je décris dans cette réponse.

2 votes

+1 devrait laisser les mots de passe...

6 votes

+1 le mot de passe sudo n'est pas vraiment là pour la sécurité (du moins c'est ce que je vois) mais plutôt comme un contrôle pour les idiots. Ne pas l'avoir pourrait causer des ravages inimaginables.

0 votes

Merci d'avoir clarifié sur PasswordAuthentication! Cela signifie cependant que cette politique serait appliquée pour TOUS les comptes du système, n'est-ce pas? De cette façon, je pourrais me verrouiller hors de la boîte (y compris le compte root!) si je perds mes clés... que devrais-je faire à ce sujet? De plus, veuillez consulter les mises à jour de ma question

14voto

obscurerichard Points 171

Vous pouvez avoir le meilleur des deux mondes : l'authentification SSH à la fois pour la connexion et pour sudo. Si vous intégrez le module pam_ssh_agent_auth, vous pouvez utiliser des clés SSH pour vous authentifier sans donner de mot de passe lorsque vous utilisez sudo.

J'utilise cette méthode en production depuis plus de cinq ans.

Pour le configurer, installez le module PAM, puis ajoutez une ligne à /etc/pam.d/sudo ou l'équivalent sur votre système :

auth    sufficient     pam_ssh_agent_auth.so file=~/.ssh/authorized_keys

Si vous le faites, assurez-vous de protéger vos clés sur votre ordinateur avec un mot de passe. De cette façon, quelqu'un devrait pirater votre ordinateur et voler les clés pour y accéder. Ils pourraient le faire en les extrayant de la mémoire lorsqu'elles sont déverrouillées s'ils ont accès à votre compte, en craquant votre mot de passe, ou en volant votre mot de passe via un enregistreur de frappe (keylogger) ou en l'observant par-dessus votre épaule lorsque vous le tapez (regardez derrière vous!).

Vous pouvez utiliser la même clé SSH que celle que vous utilisez pour vous connecter, ou vous pouvez configurer une clé distincte que vous n'ajoutez qu'à votre agent lorsque vous utilisez sudo. Donc, si vous voulez être particulièrement prudent, vous pouvez maintenir un fichier authorized_keys distinct qui contient une clé SSH séparée que vous n'ajoutez qu'à votre agent lorsque vous avez besoin de sudo :

auth    sufficient     pam_ssh_agent_auth.so file=~/.ssh/authorized_keys_sudo

0 votes

Wow, cela semble génial! Donc, dois-je générer une clé séparée pour exécuter les commandes sudo ou utiliser la même que celle qui a été utilisée pour l'authentification SSH?

1 votes

C'est incroyable. Je vous voterais plusieurs fois si je le pouvais.

0 votes

Vous pouvez utiliser la même clé que celle que vous utilisez pour l'authentification SSH normale, ou pour une sécurité accrue, vous pouvez temporairement ajouter une clé que vous utilisez pour sudo-ing à votre agent d'authentification SSH. Cela nécessiterait que vous spécifiiez un fichier différent de ~/.ssh/authorized_keys, vous pourriez gérer un autre fichier, par exemple ~/.ssh/authorized_keys_sudo ou /etc/ssh/authorized_keys_sudo.

13voto

BillThor Points 27096

Je restreins généralement l'utilisation de NOPASSWORD aux commandes exécutées par un processus automatisé. Il est préférable d'avoir un compte de service pour ces commandes et de restreindre l'utilisation de sudo aux commandes requises.

Permettre NOPASSWORD pour des commandes générales permet à quiconque accède à votre identifiant d'utilisateur d'exécuter n'importe quelles commandes. Cela pourrait résulter d'une compromission de vos identifiants, mais pourrait être aussi simple que quelqu'un assis à votre bureau pendant que vous vous éloignez un instant.

Je trouve que je n'ai pas besoin d'entrer mon mot de passe si souvent. Une fois que vous avez saisi votre mot de passe, vous pouvez exécuter plusieurs commandes si vous n'attendez pas trop longtemps entre elles. Le délai d'expiration est configurable.

8voto

David Spillett Points 22424

Je n'utiliserais ceci que dans deux circonstances :

  • Lorsque c'est absolument nécessaire pour un script automatisé qui s'exécute en tant qu'utilisateur spécifique
  • Pour des tâches d'administration spécifiques (des tâches d'administration en lecture seule, pas celles qui prennent des mesures pour modifier le système) et alors seulement pour des utilisateurs spécifiques bien sûr

Par défaut, la plupart des configurations de sudo ne vous demanderont pas à nouveau pendant un certain temps dans la même session (si vous ouvrez un nouveau shell, cela n'a aucun effet). Vous pouvez contrôler ce comportement dans une certaine mesure avec le paramètre timestamp_timeout.

Un sudo sans mot de passe n'est pas aussi dangereux qu'une clé ssh sans phrase secrète, car un attaquant distant a besoin de vos identifiants pour entrer en premier lieu, mais s'ils ont réussi à compromettre votre clé privée (ou s'ils sont physiquement proches de vous et que vous vous êtes laissé connecté et déverrouillé en étant loin de la machine), la demande de mot de passe est une défense supplémentaire précieuse entre eux et l'accès privilégié.

En ce qui concerne le suivi 2 :

Si j'ai aussi une clé pour me connecter en tant que root via ssh

Cela est également préférable d'éviter, pour exactement la raison que vous décrivez. Si une connexion distante doit avoir un accès privilégié, faites-la se connecter via un compte de service et donnez-lui juste assez de contrôle pour faire son travail via sudo. Cela est bien sûr plus fastidieux à configurer, donc beaucoup ne prennent pas la peine de le faire (ce qui fonctionne en votre faveur si vous le faites, car il y a beaucoup de cibles plus faciles pour les attaquants sur lesquelles dépenser leur temps!), donc cela revient au compromis ancestral entre sécurité et commodité (astuce professionnelle : choisissez la sécurité!).

0 votes

Merci d'avoir pris en compte mon suivi n°2. Je suis toujours confus cependant : j'essaie effectivement d'éviter de me connecter en tant que root directement mais j'ai besoin D'UN moyen d'accéder au compte, n'est-ce pas? Alors comment faire? Avec un mot de passe, pas une clé SSH? Mais les clés ne sont-elles pas meilleures que les mots de passe?

0 votes

Vous pouvez toujours vous connecter localement en tant que root, mais il est recommandé de désactiver complètement les connexions directes en tant que root à partir d'hôtes distants (via ssh ou similaire). Si vous avez un compte qui peut devenir root via sudo (avec mot de passe bien sûr), alors vous ne perdez jamais tout accès au compte.

7voto

AntonTheGreat Points 341

Comme vous l'avez demandé, voici mes conseils généraux sur la manière de traiter le problème sudo.

Sudo n'a pas été conçu pour fournir plus de sécurité (bien qu'il puisse le faire dans une certaine mesure)... mais plutôt pour fournir une bonne piste de vérification de qui fait quoi sur votre système avec quels privilèges.

Un Sudo correctement configuré n'utilisera pas le paramètre ALL=(ALL) ALL, mais plutôt quelque chose de plus limité selon ce dont l'utilisateur a spécifiquement besoin. Par exemple, si vous avez besoin qu'un utilisateur puisse se connecter et redémarrer un service bloqué, il n'a probablement pas besoin de pouvoir installer de nouveaux logiciels ou arrêter votre serveur, changer les règles du pare-feu, etc.

Il est parfois courant que les gens utilisent sudo pour s'élever au compte root, c'est-à-dire sudo su -. Une fois qu'ils font cela, vous cessez de voir qui fait quoi à partir du compte root (root peut être connecté plusieurs fois simultanément). Parfois, les gens veulent donc désactiver la commande sudo su - également. Mais, pour des raisons pratiques, si vous avez besoin d'un compte entièrement privilégié root pour l'administration, au minimum, le fait que quelqu'un émette la commande sudo su - enregistrera qui s'est élevé au rang de root et quand.

Comment je sécurise mes boîtes :

Changer le port SSH pour quelque chose d'autre que la valeur par défaut. Cela permet d'éviter les "bots" stupides qui cherchent des numéros de port puis tentent de se connecter jusqu'à ce qu'ils réussissent (ou non).

Interdire la connexion Root via SSH en utilisant le paramètre AllowRootLogin no dans votre sshd_config. Cela empêche quelqu'un de forcer l'entrée dans votre compte root. Il est généralement recommandé de ne jamais permettre à quelqu'un de se connecter directement au compte root/administrateur pour des raisons de vérification et de sécurité. Si vous autorisez la connexion directe de root, vous ne savez pas qui s'est connecté, d'où il a obtenu le mot de passe, etc. Mais, si quelqu'un se connecte avec le compte de Jimmy, puis élève ses permissions à root, vous avez une meilleure idée de par où commencer la recherche d'audit (et dont le compte réinitialiser).

Permettre uniquement aux utilisateurs nécessitant SSH d'y accéder Utilisez le paramètre AllowUsers et spécifiez explicitement les comptes qui ont besoin d'un accès SSH. Cela bloquera par défaut tous les autres comptes de SSH.

Éditez Sudoers via visudo et n'autorisez que les commandes nécessaires à l'utilisateur. Il existe de nombreux guides approfondis sur la manière de le faire, donc je ne vais pas détailler ici. Voici un début : http://ubuntuforums.org/showthread.php?t=1132821

L'idée principale est d'empêcher un compte compromis de compromettre votre machine. Par exemple, si le compte de Sally est compromis, et que Sally peut uniquement utiliser sudo pour redémarrer le serveur web, eh bien l'attaquant pourrait s'amuser à redémarrer votre serveur web en boucle, mais au moins il ne pourra pas rm -rf /votre/dossier/serveurweb ou ouvrir tous vos ports de pare-feu, etc.

Établir de bonnes règles de pare-feu qui ne permettent que les ports nécessaires pour le fonctionnement de votre boîte. En général, vous voulez tout bloquer et n'autoriser explicitement que ce dont vous avez besoin. Il existe de nombreux exemples de bonnes configurations iptables et autres pare-feu en ligne, en voici un que j'utilise (c'est un début de base) :

# Generated by iptables-save v1.4.7 on Mon Mar  3 17:55:02 2014
*filter
:INPUT DROP [4528:192078]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [39845:27914520]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4254 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8080 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8443 -m state --state NEW -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Mon Mar  3 17:55:02 2014

Un mot de passe fort est également essentiel. Même si vous utilisez des clés SSH pour votre accès distant, vous devriez toujours exiger un mot de passe pour l'utilisation de Sudo. C'est un cas où sudo pourrait fournir une sécurité supplémentaire. Si quelqu'un venait à voler vos clés SSH, il serait tout de même empêché de faire quelque chose de significatif sur votre boîte s'il doit toujours forcer le mot de passe de votre compte pour utiliser sudo. Les mots de passe ne doivent pas être un mot, mais plutôt une phrase de passe. Pensez à une phrase, et utilisez-la. Généralement, cela vous donnera quelque chose de plus de 8 caractères, offrant beaucoup d'entropie, mais aussi plus facile à retenir qu'un mot de passe aléatoire. Bien sûr, de bonnes pratiques en matière de mot de passe recommandent d'utiliser un mot de passe aléatoire généré par une machine pour tromper des outils de craquage comme John the Ripper, qui passera à travers la plupart des phrases de passe et des mots de passe. Non, changer E en 3 ne fonctionne pas, John détecte également ces permutations.

0 votes

Merci pour une réponse complète! J'ai certainement besoin d'utiliser tous ces conseils pour sécuriser mes boîtes. Je vais quand même accepter la réponse d'EEAA car elle est un peu plus spécifique à ce que je demandais.

1 votes

@DmitryPashkevich c'est bien, EEAA a une bonne réponse appropriée. Tu m'as demandé de détailler mon commentaire ci-dessus, donc je l'ai fait. Pas de soucis :)

0 votes

En ce qui concerne sudo su - et ses variantes, sudoreplay pourrait être utile.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X