Un utilisateur Linux peut-il changer son mot de passe sans connaître le mot de passe actuel?

25

ubuntuJ'installe quelques boîtes et j'utilise l'opscode chefcomme outil de configuration. Il serait assez facile d'installer des clés publiques pour chaque utilisateur sur chacun de ces serveurs et de désactiver l'authentification par mot de passe.

Cependant, les utilisateurs doivent également avoir des sudoprivilèges, qui nécessitent par défaut un mot de passe.

Si je veux utiliser les clés publiques des utilisateurs comme méthode de gestion des accès et autoriser les sudoprivilèges des utilisateurs , cela signifie-t-il que je devrais également configurer les utilisateurs avec NOPASSWD: ALLin visduoou existe-t-il un moyen pour un utilisateur de changer son propre mot de passe s'il avoir uniquement l'authentification par clé publique?

cwd
la source
@sr - il ne semble pas que ce soit une façon courante de le faire ...
cwd
Pourquoi voulez-vous que vos utilisateurs bénéficient de privilèges sudo? J'espère que vous savez que vous donnez un accès root par cela. Il pourrait y avoir une chance ici d'investir un peu de temps et de n'autoriser qu'un sous-ensemble de commandes à utiliser avec sudo (ce qui serait peut-être moins dangereux). Go man sudoersdonnera des informations sur l'exécution de certaines commandes avec sudo sans mot de passe utilisateur nécessaire. Vous pouvez même ajouter un shellscript à / etc / sudoers qui autoriserait un paramètre "self-password" par utilisateur sans avoir besoin d'un mot de passe préalable.
humanANDpeace
@humanityANDpeace - Je m'en rends compte. Les membres de notre équipe ont tous besoin d'un accès root aux serveurs cloud que nous entretenons. Nous utilisons maintenant chef pour gérer les clés publiques des utilisateurs et nous avons un groupe sysadmin avec NOPASSWD: ALLlequel les membres de l'équipe font partie. Si vous pouvez suggérer une meilleure solution, veuillez la poster comme réponse.
cwd

Réponses:

21

Sudo, dans sa configuration la plus courante, oblige l'utilisateur à taper son mot de passe. En règle générale, l'utilisateur a déjà utilisé son mot de passe pour s'authentifier dans le compte, et taper à nouveau le mot de passe est un moyen de confirmer que l'utilisateur légitime n'a pas abandonné sa console et a été détourné.

Dans votre configuration, le mot de passe de l'utilisateur serait utilisé uniquement pour l'authentification à sudo. En particulier, si la clé SSH d'un utilisateur est compromise, l'attaquant ne pourrait pas élever ses privilèges root sur le serveur. L'attaquant pourrait planter un enregistreur de frappe dans le compte, mais cet enregistreur de frappe serait détectable par d'autres utilisateurs, et pourrait même être surveillé automatiquement.

Un utilisateur doit normalement connaître son mot de passe actuel pour le changer en un mot de passe différent. Le passwdprogramme vérifie cela (il peut être configuré pour ne pas le faire, mais ce n'est pas utile ou du tout souhaitable dans votre scénario). Cependant, root peut changer le mot de passe de n'importe quel utilisateur sans connaître l'ancien; par conséquent, un utilisateur doté de pouvoirs sudo peut modifier son propre mot de passe sans le saisir à l' passwdinvite en exécutant sudo passwd $USER. Si sudoest configuré pour exiger le mot de passe de l'utilisateur, l'utilisateur doit avoir tapé le mot de passe de sudotoute façon.

Vous pouvez désactiver l'authentification par mot de passe de manière sélective. Dans votre cas, vous devez désactiver l'authentification par mot de passe dans ssh, et éventuellement dans d'autres services. La plupart des services sur les unités les plus modernes (y compris Ubuntu) utilisent PAM pour configurer les méthodes d'authentification. Sur Ubuntu, les fichiers de configuration PAM vivent /etc/pam.d. Pour désactiver l'authentification par mot de passe, mettez la auth … pam_unix.soligne en commentaire /etc/pam.d/common-auth. De plus, assurez- vous que vous avez PasswordAuthentication nodans /etc/ssh/sshd_configla intégré l'authentification par mot de passe de désactiver sshd.

Vous souhaiterez peut-être autoriser certains utilisateurs administratifs à se connecter avec un mot de passe ou autoriser l'authentification par mot de passe sur la console. C'est possible avec PAM (c'est assez flexible), mais je ne pourrais pas vous dire à quel point je suis au sommet de ma tête; posez une question distincte si vous avez besoin d'aide.

Gilles 'SO- arrête d'être méchant'
la source
une façon pratique d'utiliser PAM en combinaison avec l'authentification par clé SSH est via pam_ssh_agent_auth , qui a l'avantage de remplacer l'invite de mot de passe par l'authentification par clé (théoriquement encore plus sécurisée) que SSH peut utiliser de toute façon
Tobias Kienzler
vous dites donc que sudo passwdcela changerait le mot de passe de l'utilisateur actuel, pas celui de sudo?
still_dreaming_1
1
@ still_dreaming_1 Non, je dis qu'un utilisateur qui peut exécuter des commandes avec sudopeut changer son propre mot de passe. La commande exacte n'a pas vraiment d'importance, mais pour aller plus en détail, ce serait sudo passwd boboù se bobtrouve le nom de l'utilisateur, ou quelque chose d'équivalent. Sans aucun argument, sudo passwdchangerait en effet le mot de passe de root.
Gilles 'SO- arrête d'être méchant'
7

Vous pouvez utiliser le module pam_ssh_agent_auth . C'est assez simple à compiler, puis il suffit d'ajouter l'entrée

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

avant les autres auth(ou include) entrées/etc/pam.d/sudo

et

Defaults    env_keep += "SSH_AUTH_SOCK"

à /etc/sudoers(via visudo).

Désormais, chaque utilisateur peut s'authentifier sudovia un agent SSH (transféré ou local) ou son mot de passe. Il peut être judicieux de demander à vos utilisateurs d'utiliser de ssh-add -ctelle sorte que chaque sudoappel nécessite au moins une confirmation.

Tobias Kienzler
la source
Sur un sujet connexe, il y a pam_ssh , qui permet d'utiliser votre phrase de passe SSH au lieu de celle d'unix pour la connexion, en démarrant automatiquement un agent et en ajoutant la clé - vous offrant ainsi une possibilité de connexion unique.
Tobias Kienzler
1

Oui, c'est incroyablement peu sûr et permet également à un utilisateur d'accéder aux mots de passe des autres utilisateurs, mais comme ils ont sudo, vous ne pouvez pas faire grand-chose.

Fondamentalement, vous procédez comme suit:

$ sudo -i

Maintenant, nous sommes root. Nous avons accès à tout.

# passwd $username

$ username peut être le nom d'utilisateur de n'importe qui.

Entrez le nouveau mot de passe UNIX:

Retapez le nouveau mot de passe UNIX: passwd: le mot de passe a été mis à jour avec succès

Boom, le mot de passe a changé. Encore une fois, incroyablement précaire car vous pouvez changer n'importe qui, mais cela fonctionne, mais cela fonctionne. Je ne le recommande pas, mais offre plutôt cette réponse comme exemple de ce qu'il ne faut pas faire.

jrg
la source
semble bon, mais pouvez-vous expliquer ce qui se passe ici?
cwd
4
Il n'est pas possible de se passer du sudo -imot de passe utilisateur actuel.
kravemir
@Miro. C'est comme tu dis. Un sudo bashpourrait encore être sans mot de passe étant donné cette configuration dans le /etc/sudoersfichier. Je pense que @jrg est comme dit plus en se concentrant sur le problème d'insécurité avec sudo ici
humanANDpeace
1
Honnêtement, vous n'avez pas à le faire sudo -i, vous pouvez passer directement à sudo passwd $username@Miro, vous n'avez pas besoin de connaître le mot de passe utilisateur actuel. Il vous suffit de connaître le mot de passe root pour utiliser sudo
Antony
0

Le but du mot de passe est de garantir que les pirates qui obtiennent la clé d'un utilisateur ou trouvent un terminal sans surveillance ne peuvent pas accéder à la racine. Pour cette raison, je ne recommanderais aucune solution impliquant sudo sans mot de passe.

Je vous suggère de rester simple: peut-être envoyer à un utilisateur le mot de passe par défaut avec des instructions strictes pour le changer dès que possible, ou bien insérer un script dans leur .profileou .loginou quelque chose de tel qu'il exige un nouveau mot de passe lors de leur première connexion. Il pourrait se désactiver une fois terminé, et vous pourriez utiliser expectpour entrer le mot de passe existant afin qu'ils n'aient jamais à le connaître.

ams
la source
0
#% useradd -g somegroup someuser
#% usermod -p "" someuser
#% chage -d 0 someuser
#% sed -i "s/^.*PasswordAuthentication .*/PasswordAuthentication no/" /etc/sshd/sshd_config
#% /sbin/service sshd restart
#% cp -r ~/.ssh `echo ~someuser`
#% chown -R someuser `echo ~someuser`/.ssh
#% chgrp -R somegroup `echo ~someuser`/.ssh
#% echo "%somegroup  ALL=(ALL)   ALL" >> /etc/sudoers

> Cela devrait vous permettre d'avoir des utilisateurs qui ne peuvent se connecter qu'en utilisant des clés publiques et ne peuvent pas utiliser de mots de passe pour se connecter. Cependant, il sera obligé de changer le mot de passe la première fois qu'il se connectera ... mais sans avoir à lui dire un mot de passe fictif à l'avance ... Les utilisateurs seront simplement invités à réinitialiser le mot de passe et par la suite ils ne pourront l'utiliser que pour sudo mais ne pourra pas se connecter (ssh) en utilisant ce mot de passe. Notez que l'astuce ici est de ne pas avoir dit aux utilisateurs un mot de passe factice qu'ils seraient ensuite tenus de saisir au moment de la connexion une fois qu'ils sont tenus de changer leur mot de passe ... En bref, aucune communication de l'administrateur (root) à l'utilisateur réel est requis.

hardeep
la source