Je dois admettre que j'aime les serveurs sans mot de passe dans certains cas. Un serveur typique est vulnérable à quiconque y a un accès physique. Dans certains cas, il est donc pratique de le verrouiller physiquement et de faire confiance à tout accès physique depuis lors .
Concepts de base
En théorie, lorsque j'atteins physiquement un tel serveur, je devrais pouvoir effectuer des tâches d'administration sans mot de passe en tapant simplement le root
nom de connexion et on ne devrait pas me demander de mot de passe. La même chose peut s'appliquer aux comptes d'utilisateurs, mais on n'y aurait pas vraiment accès physiquement. Par conséquent, aucun mot de passe système n'est nécessaire pour un accès local (occasionnel).
Lorsque j'accède au serveur à distance, soit pour l'administration, soit pour le compte utilisateur, je m'attends à toujours utiliser une clé privée SSH. Il est très facile de configurer une clé SSH pour un compte récemment créé et donc aucun mot de passe système n'est nécessaire pour un accès à distance (normal).
# user=...
#
# useradd -m "$user"
# sudo -i -u "$user"
$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"
La conclusion est qu'en théorie, nous n'aurions pas besoin de mots de passe système pour des cas d'utilisation comme celui-ci. La question est donc de savoir comment configurer le système et les comptes d'utilisateurs pour que cela se produise de manière cohérente et sécurisée.
Détails d'accès local
Comment s'assurer que le compte root est accessible localement sans mot de passe? Je ne pense pas que nous puissions l'utiliser passwd -d
car cela rendra l'accès root trop permissif et un utilisateur non autorisé pourrait passer à root gratuitement, ce qui est faux. Nous ne pouvons pas l'utiliser passwd -l
car cela nous empêche de nous connecter.
Notez que l'accès local concerne exclusivement l'accès à l'aide du clavier local. Par conséquent, une solution valide ne doit autoriser aucun changement d'utilisateur (que ce soit avec su
ou sudo
).
Détails de l'accès à distance
Jusqu'à récemment, la solution ci-dessus fonctionnait, mais maintenant SSH a commencé à vérifier les comptes d'utilisateurs verrouillés. Nous ne pouvons probablement pas utiliser passwd -d
pour les mêmes raisons. Nous ne pouvons pas l'utiliser passwd -u
car il se plaint simplement que cela conduirait à ce qui se passwd -d
passe.
Il existe une solution de contournement avec un mot de passe factice pour cette partie.
user=...
echo -ne "$user:`pwgen 16`\n" | chpasswd
Il pourrait également être possible de désactiver entièrement la vérification des comptes verrouillés dans SSH, mais il serait plus agréable de conserver la prise en charge des comptes verrouillés et de pouvoir simplement les déverrouiller.
Notes finales
Ce qui m'intéresse, c'est une solution qui vous permettrait de vous connecter localement au compte root et à tous les comptes y compris root à distance, sans mot de passe. D'un autre côté, une solution ne doit pas avoir d'incidence sur la sécurité, sauf de manière explicitement décrite, en particulier en n'autorisant pas les utilisateurs distants à accéder au compte racine ou au compte d'autres utilisateurs. La solution doit être suffisamment robuste pour ne pas causer indirectement de problèmes de sécurité.
Une réponse acceptée et récompensée peut ou non décrire la configuration détaillée des outils individuels mais doit contenir les points clés pour atteindre les objectifs énoncés. Notez que ce ne peut probablement pas être résolu par l' utilisation d'outils classiques comme passwd
, ssh
, su
, sudo
et autres.
Plus d'idées après avoir lu les premières réponses
Juste une idée - l'accès root local pourrait être réalisé en démarrant des shells root au lieu de processus de connexion. Mais il reste nécessaire de verrouiller uniquement l'authentification par mot de passe, pas l'authentification par clé publique.
Réponses:
Exigences pour lesquelles je proposerai des solutions, sous forme de puces:
Les exemples suivants sont basés sur Debian, car c'est ce que j'ai ici pour tester. Cependant, je ne vois aucune raison pour laquelle les principes ne peuvent être appliqués à aucune distribution (ni à aucun dérivé basé sur PAM * ix).
Connexion à la console racine sans mot de passe
Je pense que la façon dont j'aborderais ce serait de tirer parti de PAM et du
/etc/securetty
fichier de configuration.Au préalable, un mot de passe root "suffisamment sécurisé" doit être défini. Ceci n'est pas requis pour la connexion à la console mais existe pour rendre les tentatives de craquage par force brute irréalistes. Le compte est par ailleurs un compte root parfaitement normal.
Dans
/etc/pam.d/login
J'ai l'ensemble de lignes standard suivant pour l'authentification (celles commençant par un mot-cléauth
):Le
common-auth
fichier include référencé contient les lignes pertinentes suivantes:Le
common-auth
fichier demande à PAM d'ignorer une règle (le refus) si une "connexion UNIX" réussit. Cela signifie généralement une correspondance/etc/shadow
.La
auth ... pam_securetty.so
ligne est configurée pour empêcher les connexions root sauf sur les périphériques tty spécifiés dans/etc/securetty
. (Ce fichier comprend déjà tous les périphériques de la console.)En modifiant
auth
légèrement cette ligne, il est possible de définir une règle qui autorise une connexion root sans mot de passe à partir d'un périphérique tty spécifié dans/etc/securetty
. Lesuccess=ok
paramètre doit être modifié afin que leok
soit remplacé par le nombre deauth
lignes à ignorer en cas de correspondance réussie. Dans la situation illustrée ici, ce nombre est3
, qui passe à laauth ... pam_permit.so
ligne:Connexion à distance root sans mot de passe d'utilisateurs pré-autorisés
Il s'agit d'une simple inclusion de clés ssh pour les utilisateurs autorisés ajoutés au
authorized_keys
fichier racine .Connexion à distance sans mot de passe pour les comptes spécifiés d'utilisateurs pré-autorisés
Il s'agit également d'une simple inclusion de clés ssh pour les utilisateurs autorisés ajoutés au
.ssh/authorized_keys
fichier de l'utilisateur approprié et correspondant . (L' utilisateur distant typique chris souhaite une connexion sans mot de passe au scénario utilisateur chris local .)Notez que les comptes peuvent rester dans l'état verrouillé par défaut après la création (c'est-à-dire avec juste
!
dans le champ de mot de passe pour/etc/shadow
) mais autorisez la connexion basée sur la clé SSH. Cela nécessite que root place la clé dans le.ssh/authorized_keys
fichier du nouvel utilisateur . Ce qui n'est pas si évident, c'est que cette approche n'est disponible que lorsqu'elleUsePAM Yes
est configurée/etc/ssh/sshd_config
. PAM se différencie!
comme «compte verrouillé pour le mot de passe mais d'autres méthodes d'accès peuvent être autorisées» et!...
«compte verrouillé. Période». (SiUsePAM No
est défini, OpenSSH considère toute présence de!
démarrage du champ de mot de passe pour représenter un compte verrouillé.)Connexion à distance sans mot de passe pour tout compte d'utilisateurs préautorisés
Il n'était pas tout à fait clair pour moi si vous vouliez cette installation ou non. A savoir, certains utilisateurs autorisés seraient en mesure de se connecter ssh sans mot de passe à n'importe quel compte local.
Je ne peux pas tester ce scénario mais je pense que cela peut être réalisé avec OpenSSH 5.9 ou plus récent, qui permet
authorized_keys
de définir plusieurs fichiers dans/etc/ssh/sshd_config
. Modifiez le fichier de configuration pour inclure un deuxième fichier appelé/etc/ssh/authorized_keys
. Ajoutez les clés publiques de vos utilisateurs autorisés sélectionnés à ce fichier, en vous assurant que les autorisations sont telles qu'il appartient à root et n'a accès en écriture que par root (0644).la source
.ssh/authorized_keys
fichier contienne la clé publique appropriée. est-ce que cela aide?!
dans le champ du mot de passe/etc/shadow
. Selon la page de manuel, cela indique un compte valide pour lequel aucun mot de passe ne peut correspondre.Il semble que vous souhaitiez de vrais comptes d'utilisateurs (non root) avec des clés ssh et un
NOPASSWD
accès complet viasudo
(qui est disponible par défaut dans la plupart des distributions Linux de nos jours et est également trivial à installer manuellement). Vous pouvez avoir des mots de passe vides pour chaque compte d'utilisateur (qui ne fonctionnera pas à distance), puis l'utilisateur s'exécutesudo -s
ou l'utilisateur~/.bash_profile
contient simplement cette commande.Sudo
Ajoutez chaque utilisateur au
sudo
groupe UNIX (par exempleusermod -a -G sudo USERNAME
, bien que les anciens systèmes aient des moyens moins intuitifs de le faire; dans le pire des cas, vous modifiez/etc/groups
directement).Dans
/etc/sudoers
ou/etc/sudoers.d/local
, vous voulez une ligne comme celle-ci:Si vous souhaitez un accès root automatique, ajoutez-le au profil de l'utilisateur. Car
bash
, ce serait~/.bash_profile
:Cela vous permettra de voir qui est connecté (essayez
who
oulast
) et laissera les connexions/var/log/auth.log
.Connexion sans mot de passe
Sur des systèmes beaucoup plus anciens, vous pouvez simplement modifier
/etc/passwd
(ou sur des systèmes légèrement plus anciens/etc/shadow
) et supprimer le hachage, par exemple, celabob:$1$salt$hash:12345:0:99999:7:::
devient justebob::12345:0:99999:7:::
. C'était tout ce dont vous aviez besoin. Les systèmes modernes n'aiment pas cela. Il existe probablement d'autres façons de le faire, mais la méthode que je viens de vérifier est la suivante (source: Leo's Random Stuff ) :Ouvrez
/etc/shadow
et observez un compte avec des informations réelles. Cela comprendra trois éléments délimités par des signes dollar ($
). Ceux-ci représentent le mécanisme de hachage, puis le sel , puis le hachage. Notez le sel, puis exécutez ceci:(Cela utilise MD5 comme mécanisme de hachage. C'est un mot de passe vide, donc cela ne vous dérange pas.) Lorsque vous êtes invité à entrer un mot de passe, appuyez sur Entrée. Enregistrez cette chaîne, y compris tous les points de fin, et collez-la après le premier deux-points sur la ligne de cet utilisateur
/etc/shadow
(cela devrait remplacer tout contenu préexistant entre le premier et le deuxième deux-points). (Veuillez ne pas utiliser littéralementSALT
comme sel!)SSH
Votre
ssh
configuration de démon réside dans/etc/sshd_config
ou/etc/ssh/sshd_config
. Pour une sécurité adéquate, je recommande d'inclure ces lignes:Consultez la publication Secure Secure Shell pour des mesures de sécurité supplémentaires que vous pouvez ajouter à votre configuration ssh pour mieux la renforcer contre les attaquants sophistiqués.
Désormais, vos utilisateurs ne peuvent pas se connecter via en
ssh
raison de mots de passe vides (c'est une mesure de sécurité nécessaire). Cela signifie qu'ils ne peuvent se connecter qu'avec des clés ssh.Chaque utilisateur, pour chacun de ses systèmes clients, doit créer une paire de clés ssh, par exemple
Cela produit une clé privée à
$HOME/.ssh/id_rsa
et une clé publique à$HOME/.ssh/id_rsa.pub
. Demandez à cet utilisateur de vous envoyer ses clés publiques et de les ajouter à ce serveur$HOME/.ssh/authorized_keys
(notez que chaque utilisateur$HOME/.ssh
doit être en mode 700, par exemplemkdir -p ~user/.ssh && chmod 700 ~user/.ssh
).Les utilisateurs qui ne veulent pas de clés ssh peuvent être dirigés vers le système physique. Là, leur mot de passe vierge les connectera, auquel cas ils pourront taper à
passwd
partir du shell et définir un mot de passe, leur permettant ainsi un accès à distance.(J'ai en fait utilisé cette technique pour permettre aux gens d'accéder à une collection de systèmes lorsque je dirigeais un service informatique. Cela obligeait les utilisateurs à utiliser des clés ssh et je n'avais pas à leur donner de mots de passe. Leur initiale
~/.bash_profile
avait deux lignes en bas:passwd
puismv ~/.bash_profile.real ~/.bash_profile
pour qu'ils définissent un nouveau mot de passe lors de la première connexion.)Des risques
Vous faites entièrement confiance à vos utilisateurs. Rien n'empêche un utilisateur de jouer avec le
~/.ssh/authorized_keys
fichier d' un autre utilisateur et de modifier ainsi votre capacité à révoquer et à auditer l'accès, mais cela est inévitable si vous donnez un accès root complet.Conclusion
Chaque utilisateur est maintenant membre du groupe sudo et dispose d'un accès complet sans mot de passe à un shell racine. Ces utilisateurs n'ont pas de mot de passe pour leurs comptes et peuvent se connecter à distance à l'aide des clés ssh.
Si vous perdez l'un de vos employés, vous pouvez supprimer son compte. Si l'un des ordinateurs portables de vos employés est volé, vous pouvez supprimer la clé ssh de cet ordinateur portable du
authorized_keys
fichier de cet utilisateur . Si vous avez une violation de sécurité, vous avez des journaux indiquant qui s'est connecté.la source
passwd -d
dans la question, permettantsu
de basculer vers cet utilisateur sans mot de passe. La section des risques décrit deux choses (jouer avec les données des autres utilisateurs et obtenir un accès root) dont la suppression est le point même de la question. Par conséquent, bien que les sections individuelles soient joliment écrites, ce n'est en aucun cas une réponse à la question.