Une approche cohérente et sûre des comptes sans mot de passe avec SSH

13

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 rootnom 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 -dcar 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 -lcar 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 suou 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 -dpour les mêmes raisons. Nous ne pouvons pas l'utiliser passwd -ucar il se plaint simplement que cela conduirait à ce qui se passwd -dpasse.

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, sudoet 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.

Pavel Šimerda
la source
Utilisez une configuration PAM personnalisée pour l'accès local sans mot de passe et faites de même pour les ouvertures de session sudo et SSH.
0xC0000022L

Réponses:

5

Exigences pour lesquelles je proposerai des solutions, sous forme de puces:

  1. Connexion à la console racine sans mot de passe
  2. Connexion à distance root sans mot de passe d'utilisateurs pré-autorisés
  3. Connexion à distance sans mot de passe pour les comptes spécifiés d'utilisateurs pré-autorisés
  4. Connexion à distance sans mot de passe pour tout compte d'utilisateurs préautorisés

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/securettyfichier 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/loginJ'ai l'ensemble de lignes standard suivant pour l'authentification (celles commençant par un mot-clé auth):

auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so

@include common-auth
auth       optional   pam_group.so

Le common-authfichier include référencé contient les lignes pertinentes suivantes:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
auth    optional                        pam_cap.so

Le common-authfichier 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.soligne 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 authlé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. Le success=okparamètre doit être modifié afin que le oksoit remplacé par le nombre de authlignes à ignorer en cas de correspondance réussie. Dans la situation illustrée ici, ce nombre est 3, qui passe à la auth ... pam_permit.soligne:

auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so

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_keysfichier 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_keysfichier 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_keysfichier du nouvel utilisateur . Ce qui n'est pas si évident, c'est que cette approche n'est disponible que lorsqu'elle UsePAM Yesest 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». (Si UsePAM Noest 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_keysde 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).

roaima
la source
Je vais devoir examiner plus attentivement # 1 et le tester. Cela semble très intéressant, même s'il nécessite toujours un mot de passe (fort) configuré. Le # 3 n'est pas complet car de nos jours un utilisateur nouvellement créé est verrouillé par défaut également à partir de la connexion SSH. Je n'ai pas vraiment demandé le point # 4 mais il semble quand même très intéressant et je pourrais avoir une utilité pour une telle méthode, en fait.
Pavel Šimerda
Le mot de passe fort pour root est requis mais jamais utilisé. J'ai supposé que vous saviez comment mettre en œuvre le n ° 3; faites-moi savoir si vous avez besoin de plus de détails. Sur les systèmes (Debian), il est possible d'accéder à un nouveau compte qui n'a pas encore défini de mot de passe, à condition que le .ssh/authorized_keysfichier contienne la clé publique appropriée. est-ce que cela aide?
roaima
Je pense que j'ai besoin d'un moyen agréable et standard pour récupérer le comportement que vous voyez sur Debian, c'est-à-dire qu'un compte nouvellement créé n'est verrouillé que pour l'authentification par mot de passe et non pour la clé publique.
Pavel Šimerda
Pour le compte d'utilisateur de test que j'ai créé pour confirmer la déclaration ssh dans mon commentaire précédent, j'en vois un !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.
roaima
1
C'est intéressant, ce n'est vraiment pas si évident au moins, merci.
Pavel Šimerda
1

Il semble que vous souhaitiez de vrais comptes d'utilisateurs (non root) avec des clés ssh et un NOPASSWDaccès complet via sudo(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écute sudo -sou l'utilisateur ~/.bash_profilecontient simplement cette commande.

Sudo

Ajoutez chaque utilisateur au sudogroupe UNIX (par exemple usermod -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/groupsdirectement).

Dans /etc/sudoersou /etc/sudoers.d/local, vous voulez une ligne comme celle-ci:

%sudo    ALL=(ALL:ALL) NOPASSWD: ALL

Si vous souhaitez un accès root automatique, ajoutez-le au profil de l'utilisateur. Car bash, ce serait ~/.bash_profile:

sudo -s

Cela vous permettra de voir qui est connecté (essayez whoou last) 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, cela bob:$1$salt$hash:12345:0:99999:7:::devient juste bob::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/shadowet 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:

openssl passwd -1 -salt SALT

(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éralement SALTcomme sel!)

SSH

Votre sshconfiguration de démon réside dans /etc/sshd_configou /etc/ssh/sshd_config. Pour une sécurité adéquate, je recommande d'inclure ces lignes:

PermitRootLogin no
PermitEmptyPasswords no

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 sshraison 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

ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -o -a 100 -C "Bob Roberts on his laptop"

Cela produit une clé privée à $HOME/.ssh/id_rsaet 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/.sshdoit être en mode 700, par exemple mkdir -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 à passwdpartir 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_profileavait deux lignes en bas: passwdpuis mv ~/.bash_profile.real ~/.bash_profilepour 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_keysfichier 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_keysfichier de cet utilisateur . Si vous avez une violation de sécurité, vous avez des journaux indiquant qui s'est connecté.

Adam Katz
la source
La partie sur sudo passe à côté de la question car elle concernait exclusivement les nouvelles connexions, pas le changement d'utilisateurs. A modifié la question pour la rendre plus claire. La partie sur la connexion sans mot de passe présente le même comportement incorrect que passwd -ddans la question, permettant sude 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.
Pavel Šimerda
J'ai supposé que vous ajouteriez l'utilisateur, puis restreindriez l'utilisateur.
Adam Katz