Une approche cohérente et sûre pour les counts sans mot de passe avec SSH

Je dois admettre que j'aime les servers sans passwords dans certains cas. Un server typique est vulnérable à quiconque y a access physiquement. Dans certains cas, il est donc pratique de le verrouiller physiquement et de faire confiance à tout access physique.

Concepts de base

En théorie, lorsque j'atteins physiquement un tel server, je devrais être en mesure d'effectuer des tâches d'administration sans mot de passe en saisissant simplement root comme identifiant et ne pas requestr de mot de passe. La même chose peut s'appliquer aux counts d'user, mais on ne pourrait pas y accéder physiquement. Par conséquent, aucun mot de passe système n'est nécessaire pour un access local (occasionnel).

Lorsque j'accède au server à distance, que ce soit pour l'administration ou pour un count d'user, j'utilise toujours une key privée SSH. Il est très facile de configurer une key SSH pour un count juste créé et donc aucun mot de passe système n'est nécessaire pour un access distant (régulier).

 # user=... # # useradd -m "$user" # sudo -i -u "$user" $ keyurl=... $ $ mkdir -p .ssh $ curl -o .ssh/authorized_keys "$keyurl" 

La conclusion est que, en théorie, nous n'utiliserons aucun mot de passe système pour les cas d'utilisation comme celui-ci. La question est donc la suivante: comment pouvons-nous configurer le système et les counts d'users pour que cela se produise de manière cohérente et sécurisée?

Détails de l'access local

Comment pouvons-nous nous assurer que le count root peut être accédé localement sans mot de passe? Je ne pense pas que nous puissions utiliser passwd -d car cela rendrait l'access root trop permissif et un user sans privilèges pourrait passer à la racine gratuitement, ce qui est faux. Nous ne pouvons pas utiliser passwd -l car il nous empêche de nous connecter.

Notez que l'access local concerne exclusivement l'access à l'aide du keyboard local. Par conséquent, une solution valide ne doit permettre aucun changement d'user (que ce soit en utilisant su ou sudo ).

Détails de l'access à distance

Jusqu'à récemment, la solution ci-dessus fonctionnerait mais maintenant, SSH a commencé à vérifier les counts d'users verrouillés. Nous ne pouvons probablement pas utiliser passwd -d pour les mêmes raisons. Nous ne pouvons pas utiliser passwd -u car il se plaint simplement que cela conduirait à ce que passwd -d fait.

Il y a une solution de contournement avec le mot de passe factice pour cette partie.

 user=... echo -ne "$user:`pwgen 16`\n" | chpasswd 

Il pourrait également être possible de désactiver la vérification de count verrouillé dans SSH entièrement, mais il serait plus agréable de conserver le support des counts 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 au count root localement et à tous les counts, y compris la racine, à distance, sans mot de passe. D'un autre côté, une solution ne doit pas avoir d'impact sur la security, sauf de manière explicitement décrite, notamment en permettant aux users distants d'accéder au count racine ou au count d'autres users. La solution doit être suffisamment robuste pour ne pas causer indirectement des problèmes de security.

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 keys pour atteindre les objectives déclarés. Notez que cela ne peut probablement pas être résolu par l'utilisation conventionnelle d'outils comme passwd , ssh , su , sudo et autres.

Je suis prêt à améliorer la structure de la question si cela aide.

Plus d'idées après avoir lu les premières réponses

Juste une idée – l'access root local pourrait être atteint en lançant des shells root au lieu des process de connection. Mais il est toujours nécessaire de verrouiller uniquement l'authentification par mot de passe, pas l'authentification par key publique.

Exigences pour lesquelles j'offrirai des solutions, en tant que puces:

  1. login de la console racine sans mot de passe
  2. login à distance racine sans mot de passe des users pré-autorisés
  3. login à distance sans mot de passe pour les counts spécifiques d'users pré-autorisés
  4. login à distance sans mot de passe pour tout count d'users pré-autorisés

Les exemples suivants sont basés sur Debian, puisque c'est ce que j'ai ici pour les tests. Cependant, je ne vois aucune raison pour laquelle les principes ne peuvent être appliqués à aucune dissortingbution (ou à aucun dérivé PAM * *).

login de la console racine sans mot de passe

Je pense que la façon dont je voudrais aborder ce serait de tirer parti de PAM et le file de configuration /etc/securetty .

En tant que pré-requirejs, un mot de passe root "suffisamment sécurisé" doit être défini. Ceci n'est pas nécessaire pour la connection à la console mais existe pour rendre les tentatives de création de force brute irréalists. Le count est par ailleurs un count root parfaitement normal.

Dans /etc/pam.d/login j'ai l'set de lignes standard pour l'authentification suivant (ceux commençant par mot-key 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 requirejsite pam_nologin.so @include common-auth auth optional pam_group.so 

Le file d'inclusion common-auth référencé contient les lignes pertinentes suivantes:

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

Le file common-auth request à PAM de sauter une règle (le refus) si un «login UNIX» réussit. Typiquement, cela signifie une correspondance dans /etc/shadow .

La ligne auth ... pam_securetty.so est configurée pour empêcher les connections root sauf sur les périphériques tty spécifiés dans /etc/securetty . (Ce file inclut déjà tous les périphériques de la console.)

En modifiant légèrement cette ligne d' auth , il est possible de définir une règle autorisant une connection racine sans mot de passe à partir d'un périphérique tty spécifié dans /etc/securetty . Le paramètre success=ok doit être modifié de sorte que l' ok soit remplacé par le nombre de lignes d' auth à ignorer en cas de correspondance réussie. Dans la situation montrée ici, ce nombre est 3 , qui descend jusqu'à la ligne auth ... pam_permit.so :

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

login à distance racine sans mot de passe des users pré-autorisés

Ceci est une inclusion directe des keys ssh pour les users autorisés ajoutés au file root authorized_keys .

login à distance sans mot de passe pour les counts spécifiques d'users pré-autorisés

Il s'agit également d'une inclusion directe des keys ssh pour les users autorisés ajoutés au file .ssh/authorized_keys l'user correspondant. (L' user distant typique de chris veut une connection sans mot de passe au scénario chris de l'user local .)

Notez que les counts peuvent restr dans l'état verrouillé par défaut après la création (c'est-à-dire avec juste ! Dans le champ du mot de passe pour /etc/shadow ) mais autoriser la connection SSH. Cela nécessite que root place la key dans le file .ssh/authorized_keys du nouvel user. Ce qui n'est pas si évident, c'est que cette approche est uniquement disponible lorsque UsePAM Yes est défini dans /etc/ssh/sshd_config . PAM se différencie ! comme "count verrouillé pour le mot de passe mais d'autres methods d'access peuvent être autorisées" et !... "count verrouillé. (Si UsePAM No est défini, OpenSSH considère toute présence de ! Démarrage du champ de mot de passe pour représenter un count verrouillé.)

login à distance sans mot de passe pour tout count d'users pré-autorisés

Ce n'était pas tout à fait clair pour moi si vous vouliez cette installation ou non. À savoir, certains users autorisés pourraient se connecter sans mot de passe à n'importe quel count 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, ce qui permet de définir plusieurs files authorized_keys dans /etc/ssh/sshd_config . Editez le file de configuration pour inclure un second file appelé /etc/ssh/authorized_keys . Ajoutez les keys publiques de vos users autorisés sélectionnés à ce file, en veillant à ce que les droits appartiennent à root et qu'ils ne soient accessibles qu'en écriture (0644).

On dirait que vous voulez de vrais counts d'users (non-root) avec des keys ssh et un access complet à NOPASSWD via sudo (qui est disponible par défaut dans la plupart des dissortingbutions Linux ces jours-ci et est aussi facile à installer manuellement). Vous pouvez avoir des passwords vides pour chaque count user (qui ne fonctionnera pas à distance), puis l'user exécute sudo -s ou le ~/.bash_profile l'user contient simplement cette command.

Sudo

Ajoutez chaque user au groupe sudo UNIX (par exemple usermod -a -G sudo USERNAME , bien que les systèmes plus anciens auront des façons less intuitives de le faire, au pire, vous éditerez /etc/groups directement).

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

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

Si vous souhaitez un access root automatique, ajoutez-le au profil de l'user. Pour bash , ce serait ~/.bash_profile :

 sudo -s 

Cela vous permettra de voir qui est connecté (essayez who ou last ) et laissera les logs dans /var/log/auth.log .

login sans mot de passe

Sur les systèmes beaucoup plus anciens, vous pouvez simplement éditer /etc/passwd (ou sur des systèmes légèrement plus anciens, /etc/shadow ) et supprimer le hachage, par exemple bob:$1$salt$hash:12345:0:99999:7::: devient juste bob::12345:0:99999:7::: . C'était tout ce dont tu avais besoin. Les systèmes modernes n'aiment pas cela. Il y a probablement d'autres façons de le faire, mais la façon dont je viens de vérifier est la suivante (source: Les Trucs Aléatoires de Leo ) :

Ouvrez /etc/shadow et observez un count avec des informations réelles. Cela inclura 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 

(Ceci utilise le MD5 comme mécanisme de hachage, c'est un mot de passe vide, donc ça ne vous dérange pas.) Lorsque vous êtes invité à entrer un mot de passe, appuyez sur Entrée. Sauvegardez cette string, y compris les points de fin, et collez-la après les deux-points de la ligne de cet user dans /etc/shadow (cela devrait replace tout contenu préexistant entre le premier et le deuxième). (S'il vous plaît ne pas utiliser littéralement le sel comme votre sel!)

SSH

Votre configuration de démon ssh trouve dans /etc/sshd_config ou /etc/ssh/sshd_config . Pour une security adéquate, je recommand d'inclure ces lignes:

 PermitRootLogin no PermitEmptyPasswords no 

Reportez-vous à la section Secure Secure Shell writeup pour des mesures de security supplémentaires que vous pouvez append à votre configuration ssh pour mieux la renforcer contre les attaquants sophistiqués.

Désormais, vos users ne peuvent pas se connecter via ssh raison de passwords vides (c'est une mesure de security nécessaire). Cela signifie qu'ils ne peuvent se connecter qu'avec les keys ssh.

Chaque user, pour chacun de ses systèmes clients, doit créer une paire de keys 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 key privée à $HOME/.ssh/id_rsa et une key publique à $HOME/.ssh/id_rsa.pub . Demandez à cet user de vous envoyer ses keys publiques et de les append au file $HOME/.ssh/authorized_keys de ce server (notez que $HOME/.ssh doit être en mode 700, par exemple mkdir -p ~user/.ssh && chmod 700 ~user/.ssh ).

Les users qui ne veulent pas de keys ssh peuvent être dirigés vers le système physique. Là, leur mot de passe vide les connecte, à quel point ils peuvent taper passwd depuis le shell et définir un mot de passe, leur permettant ainsi un access distant.

(J'ai utilisé cette technique pour donner aux gens l'access à une collection de systèmes quand je dirigeais un service informatique.Il a forcé les users à utiliser des keys ssh et je n'avais pas à leur donner des mots de ~/.bash_profile initial avait deux lignes en bas: passwd puis mv ~/.bash_profile.real ~/.bash_profile afin qu'ils définissent un nouveau mot de passe lors de la première connection.)

Risques

Vous faites entièrement confiance à vos users. Rien n'empêche un user de jouer avec le file ~/.ssh/authorized_keys d'un autre user et de modifier ainsi votre capacité à révoquer et à vérifier l'access, mais cela est inévitable si vous donnez un access root complet.

Conclusion

Chaque user est maintenant membre du groupe sudo et dispose d'un access sans mot de passe à un shell racine. Ces users n'ont pas de mot de passe pour leurs counts et peuvent se connecter à distance en utilisant les keys ssh.

Si vous perdez un de vos employés, vous pouvez retirer son count. Si l'un des ordinateurs portables de l'un de vos employés est volé, vous pouvez retirer la key ssh de cet ordinateur du file authorized_keys de cet user. Si vous avez une violation de security, vous avez des journaux indiquant qui s'est connecté.