J'installe quelques boîtes ubuntu
et j'utilise chef
d'opscode comme 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 disposer des privilèges Sudo
, qui nécessitent par défaut un mot de passe.
Si je souhaite utiliser les clés publiques des utilisateurs comme méthode de gestion des accès et accorder les privilèges utilisateurs Sudo
, cela signifie-t-il que je devrais également configurer les utilisateurs avec NOPASSWD: ALL
dans visduo
, ou existe-t-il un moyen pour un utilisateur de changer son propre mot de passe s'il n'a que l'authentification par clé publique?
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 programme passwd
le vérifie (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 disposant des pouvoirs Sudo peut modifier son propre mot de passe sans le saisir à l'invite passwd
en exécutant Sudo passwd $USER
. Si Sudo
est configuré pour exiger le mot de passe de l'utilisateur, alors l'utilisateur doit avoir tapé le mot de passe sur Sudo
de toute 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 dans /etc/pam.d
. Pour désactiver l'authentification par mot de passe, mettez en commentaire le auth … pam_unix.so
faire la queue /etc/pam.d/common-auth
. De plus, assurez-vous d'avoir PasswordAuthentication no
dans /etc/ssh/sshd_config
pour désactiver l'authentification par mot de passe intégrée de 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.
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 entrées auth
(ou include
) dans /etc/pam.d/Sudo
et
Defaults env_keep += "SSH_AUTH_SOCK"
à /etc/sudoers
(via visudo
).
Désormais, chaque utilisateur peut s'authentifier auprès de Sudo
via un agent SSH (transféré ou local) ou son mot de passe. Il peut être judicieux de demander à vos utilisateurs d'utiliser ssh-add -c
de telle sorte que chaque Sudo
appel nécessite au moins une confirmation.
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 un exemple de ce que pas à faire.
#% 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 Shell aucune communication de l'administrateur (root) à l'utilisateur réel est requis.
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 .profile
ou .login
ou quelque chose de tel qu'il nécessite un nouveau mot de passe lors de leur première connexion. Il pourrait se désactiver une fois terminé, et vous pourriez utiliser expect
pour entrer le mot de passe existant afin qu'ils n'aient jamais à le connaître.