Plusieurs administrateurs système Linux travaillant en tant que root

40

Notre équipe compte trois administrateurs système chevronnés chargés d'administrer quelques dizaines de serveurs Debian. Auparavant, nous travaillions tous en tant qu'utilisateur root en utilisant l'authentification par clé publique SSH. Mais nous avons discuté de la meilleure pratique pour ce scénario et n’avons pu nous entendre sur rien.

La clé publique SSH de tout le monde est placée dans ~ root / .ssh / allowed_keys2

  • Avantage: facile à utiliser, le transfert d’agent SSH fonctionne facilement, peu de frais généraux
  • Inconvénient: audit manquant (on ne sait jamais quelle "racine" a changé), les accidents sont plus probables

Utiliser des comptes personnalisés et sudo

Ainsi, nous nous connecterions avec des comptes personnalisés à l'aide de clés publiques SSH et utiliserons sudo pour effectuer des tâches uniques avec des autorisations root . De plus, nous pourrions nous attribuer le groupe "adm" qui nous permet de visualiser les fichiers journaux.

  • Avantage: bon audit, sudo nous empêche de faire des bêtises trop facilement
  • Inconvénient: le transfert d’agent SSH est interrompu, c’est un problème car presque rien ne peut être fait en tant que non-root

Utilisation de plusieurs utilisateurs UID 0

C'est une proposition très unique de l'un des administrateurs système. Il suggère de créer trois utilisateurs dans / etc / passwd ayant tous l’ID 0 mais des noms de connexion différents. Il affirme que ce n'est pas réellement interdit et permet à tout le monde d'être UID 0 mais tout en étant capable d'auditer.

  • Avantage: le transfert d’agent SSH fonctionne, l’audit peut fonctionner (non testé), pas de problème sudo
  • Inconvénient: se sent assez sale - impossible de le trouver documenté comme moyen permis

Que suggérerais-tu?

Signum
la source
2
A propos de votre déclaration "ne peut pas trouver documentée nulle part comme moyen autorisé": Consultez le -odrapeau dans la useraddpage de manuel. Cet indicateur est là pour permettre à plusieurs utilisateurs de partager le même uid.
Juin
6
Pouvez-vous expliquer ce que vous entendez par "pauses de transfert d’agent SSH" dans la deuxième option? Nous utilisons cela dans mon travail et le transfert d’agent ssh fonctionne très bien.
Patrick
4
Vous devriez vous déconnecter de votre compte non root plutôt que de sudo.
Random832
4
Autre conséquence de la méthode sudo: vous ne pouvez plus utiliser SCP / FTP en tant que root. Tout transfert de fichier devra d'abord être déplacé dans le répertoire personnel de la personne, puis copié dans le terminal. C'est un avantage et un inconvénient selon la perspective.
user606723
1
Pourquoi ne considère-t-on pas les systèmes de type marionnette / chef / ansible?
Alex Holst

Réponses:

64

La deuxième option est la meilleure à mon humble avis. Comptes personnels, accès sudo. Désactivez complètement l'accès root via SSH. Nous avons quelques centaines de serveurs et une demi-douzaine d'administrateurs système, c'est comme cela que nous procédons.

Comment se passe la transmission d'agent exactement?

De plus, si c’est si compliqué d’utiliser sudodevant chaque tâche, vous pouvez appeler un shell sudo avec sudo -sou basculer vers un shell racine avecsudo su -

thepearson
la source
10
Plutôt que de désactiver complètement l’accès root par SSH, je recommande de faire en sorte que l’accès root par SSH nécessite des clés, en créant une clé avec une phrase clé très forte et en la gardant verrouillée pour une utilisation urgente uniquement. Si vous avez un accès permanent à la console, cela est moins utile, mais dans le cas contraire, cela peut s'avérer très pratique.
EightBitTony
17
Je recommande de désactiver la connexion root sur SSH pour des raisons de sécurité. Si vous devez vraiment être connecté en tant que root, connectez-vous en tant qu'utilisateur non root et su.
Taz
+1 .. J'irais plus loin que de dire "La deuxième option est la meilleure". Je voudrais que ce soit la seule option raisonnable. Les options 1 et 3 diminuent considérablement la sécurité du système des attaques et des erreurs extérieures. De plus, le n ° 2 est la façon dont le système a été conçu pour être utilisé principalement.
Ben Lee
2
S'il vous plaît, élaborer sur sudo -s. Ai-je raison de comprendre qu'il sudo -in'y a aucune différence entre utiliser su -ou se connecter en tant que racine, à l'exception d'une entrée de journal supplémentaire, par rapport à une connexion en racine pure? Si tel est le cas, comment et pourquoi est-il préférable à la connexion en tant que root?
PF4Public
9

En ce qui concerne la 3ème stratégie suggérée, autre que la lecture useradd -o -u userXXXattentive des options recommandées par @jlliagre, je ne suis pas habitué à exécuter plusieurs utilisateurs avec le même identifiant utilisateur. (Par conséquent, si vous continuez avec cela, je serais intéressé si vous pouviez mettre à jour le message avec tout problème (ou succès) qui pourrait survenir ...)

Je suppose que ma première observation concernant la première option "La clé publique SSH de tout le monde est placée dans ~ root / .ssh / allowed_keys2" est la suivante: à moins que vous ne travailliez jamais sur aucun autre système;

  1. puis au moins une partie du temps , vous allez devoir travailler avec des comptes d'utilisateurs etsudo

La deuxième observation serait que, si vous travaillez sur des systèmes qui aspirent à la conformité HIPAA, PCI-DSS, ou à des logiciels tels que CAPP et EAL, vous devrez contourner les problèmes de sudo car:

  1. C’est une norme de l’industrie de fournir des comptes d’utilisateur individuels non root, pouvant être audités, désactivés, expirés, etc., généralement à l’aide d’une base de données d’utilisateurs centralisée.

Alors; Utiliser des comptes personnalisés et sudo

Il est regrettable qu'en tant qu'administrateur système, presque tout ce que vous aurez besoin de faire sur une machine distante va nécessiter des autorisations élevées. Cependant, il est ennuyeux que la plupart des outils et utilitaires basés sur SSH soient interrompus pendant votre séjour. sudo

Par conséquent, je peux vous transmettre certaines astuces que j’utilise pour contourner les inconvénients de ce sudoque vous avez mentionné. Le premier problème est que si la connexion root est bloquée à l'aide PermitRootLogin=noou si vous n'avez pas la racine à l'aide de la clé ssh, alors les fichiers SCP ressemblent à un PITA.

Problème 1 : Vous voulez scp des fichiers du côté distant, mais ils nécessitent un accès root, cependant vous ne pouvez pas vous connecter directement à la boîte distante en tant que root.

Solution ennuyeuse : copiez les fichiers dans le répertoire de base, chown et scp down.

ssh userXXX@remotesystem, sudo su -etc, cp /etc/somefilesto /home/userXXX/somefiles, chown -R userXXX /home/userXXX/somefilesutilisez scp pour récupérer des fichiers à distance.

Très ennuyeux en effet.

Solution moins ennuyeuse : sftp supporte le -s sftp_serverdrapeau, vous pouvez donc faire ce qui suit (si vous avez configuré sudo sans mot de passe /etc/sudoers);

sftp  -s '/usr/bin/sudo /usr/libexec/openssh/sftp-server' \
userXXX@remotehost:/etc/resolv.conf 

(Vous pouvez aussi utiliser ce bidouillage avec sshfs, mais je ne suis pas sûr que ce soit recommandé ... ;-)

Si vous ne possédez pas de droits sudo sans mot de passe, ou si, pour une raison quelconque, la méthode ci-dessus est rompue, je peux vous suggérer une méthode de transfert de fichier moins ennuyeuse pour accéder aux fichiers racine distants.

Méthode Ninja Port Forward :

Connectez-vous à l'hôte distant, mais spécifiez que le port distant 3022 (qu'il soit libre ou non réservé aux administrateurs, c'est-à-dire> 1024) doit être renvoyé au port 22 du côté local.

 [localuser@localmachine ~]$ ssh userXXX@remotehost -R 3022:localhost:22
Last login: Mon May 21 05:46:07 2012 from 123.123.123.123
------------------------------------------------------------------------
This is a private system; blah blah blah
------------------------------------------------------------------------

Obtenez racine de manière normale ...

-bash-3.2$ sudo su -
[root@remotehost ~]# 

Maintenant, vous pouvez scp les fichiers dans l'autre sens en évitant l'étape fastidieuse de faire une copie intermédiaire des fichiers;

[root@remotehost ~]#  scp -o NoHostAuthenticationForLocalhost=yes \
 -P3022 /etc/resolv.conf localuser@localhost:~
localuser@localhost's password: 
resolv.conf                                 100%  
[root@remotehost ~]#  

 

 

Problème 2: Transfert d’agent SSH : Si vous chargez le profil racine, par exemple en spécifiant un shell de connexion, les variables d’environnement nécessaires pour le transfert d’agent SSH telles que SSH_AUTH_SOCKréinitialisées, le transfert d’agent SSH est donc "interrompu" sudo su -.

Réponse à moitié cuite :

Tout ce qui charge correctement un shell root va réinitialiser correctement l'environnement. Cependant, il existe une légère solution de contournement que vous pouvez utiliser lorsque vous avez besoin à la fois de la permission root ET de la possibilité d'utiliser l'agent SSH, EN MÊME TEMPS.

Cela crée une sorte de profil de chimère, qui ne devrait vraiment pas être utilisé, car c’est un hack méchant , mais qui est utile lorsque vous avez besoin de fichiers SCP de l’hôte distant en tant que root, vers un autre hôte distant.

Quoi qu'il en soit, vous pouvez indiquer à votre utilisateur de conserver ses variables ENV en définissant les paramètres suivants dans sudoers:

 Defaults:userXXX    !env_reset

Cela vous permet de créer de mauvais environnements de connexion hybrides comme ceci;

connectez-vous normalement;

[localuser@localmachine ~]$ ssh userXXX@remotehost 
Last login: Mon May 21 12:33:12 2012 from 123.123.123.123
------------------------------------------------------------------------
This is a private system; blah blah blah
------------------------------------------------------------------------
-bash-3.2$ env | grep SSH_AUTH
SSH_AUTH_SOCK=/tmp/ssh-qwO715/agent.1971

créer un shell bash, qui s'exécute /root/.profileet /root/.bashrc. mais conserveSSH_AUTH_SOCK

-bash-3.2$ sudo -E bash -l

Donc, ce shell a les permissions root et root $PATH(mais un répertoire personnel encombré ...)

bash-3.2# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t
bash-3.2# echo $PATH
/usr/kerberos/sbin:/usr/local/sbin:/usr/sbin:/sbin:/home/xtrabm/xtrabackup-manager:/usr/kerberos/bin:/opt/admin/bin:/usr/local/bin:/bin:/usr/bin:/opt/mx/bin

Mais vous pouvez utiliser cette invocation pour effectuer des tâches qui requièrent une racine sudo distante, mais également l’accès de l’agent SSH comme tel;

bash-3.2# scp /root/.ssh/authorized_keys ssh-agent-user@some-other-remote-host:~
/root/.ssh/authorized_keys              100%  126     0.1KB/s   00:00    
bash-3.2# 
Tom H
la source
1
J'aime les hacks.
Sjbotha
2

La 3ème option semble idéale - mais avez-vous réellement essayé de voir ce qui se passait? Bien que vous puissiez voir les noms d'utilisateur supplémentaires à l'étape d'authentification, toute recherche inversée retournera la même valeur.

Autoriser l'accès ssh direct à la racine est une mauvaise idée, même si vos machines ne sont pas connectées à Internet / utilisez des mots de passe forts.

D'habitude, j'utilise 'su' plutôt que sudo pour l'accès root.

symcbean
la source
4
L'ajout de plusieurs utilisateurs avec le même UID ajoute des problèmes. Lorsque les applications vont rechercher le nom d'utilisateur pour un numéro UID, elles peuvent rechercher le mauvais nom d'utilisateur. Les applications qui s'exécutent sous root peuvent penser qu'elles s'exécutent en tant que mauvais utilisateur, et de nombreuses erreurs étranges vont commencer à apparaître (je l'ai déjà essayé une fois).
Patrick
8
La troisième option est juste une foutue mauvaise idée . Vous rompez essentiellement la relation 1: 1 entre les UID et les noms d'utilisateurs et, littéralement, tout ce qui est sous Unix s'attend à ce que cette relation soit vérifiée. Ce n’est pas parce qu’il n’ya pas de règle explicite de ne pas le faire que cela soit une bonne idée.
Shadur
Désolé, mais la troisième option est une idée horrible. Avoir plusieurs UID 0 connectés, c'est simplement demander que les problèmes soient multipliés. L'option numéro 2 est la seule qui soit saine.
Doug
La troisième option ne mérite pas autant de votes négatifs. À ma connaissance, il n’existe pas de commande sous Unix qui puisse être confuse par cette astuce; les gens peuvent l’être, mais les commandes ne devraient pas y tenir. Il s’agit simplement d’un nom de connexion différent, mais dès que vous êtes connecté, le prénom trouvé correspondant à l’identifiant de la base de données de mots de passe est utilisé. Assurez-vous donc que le nom d’utilisateur réel (ici root) apparaît en premier.
Juin
@ Patrick Avez-vous vu cela en pratique? Autant que j'ai testé, les applications choisissent l' rootutilisateur si l' rootutilisateur est le premier utilisateur /etc/passwdavec l'UID 0. J'ai tendance à être d'accord avec jlliagre. Le seul inconvénient que je vois, c’est que chaque utilisateur est un rootutilisateur et il peut parfois être déroutant de comprendre qui a fait quoi.
Martin
2

J'utilise (1), mais il m'est arrivé de taper

rm -rf / tmp *

un jour malheureux.Je peux voir assez pour être assez si vous avez plus d’une poignée d’admins.

(2) est probablement plus technique - et vous pouvez devenir une racine à part entière grâce à sudo su -. Les accidents sont toujours possibles.

(3) Je ne toucherais pas avec un poteau de chaland. Je l'ai utilisé sur Suns, afin d'avoir un compte root non-barebone-sh (si je me souviens bien), mais il n'a jamais été robuste - de plus, je doute que ce soit très vérifiable.

Forme de vie extraterrestre
la source
2

Répondre définitivement 2.

  1. Cela signifie que vous autorisez l'accès SSH en tant que root. Si cette machine est en aucun cas publique, c'est juste une idée terrible; Lorsque j’exécutais SSH sur le port 22, mon VPS avait plusieurs tentatives d’authentification par heure. J'avais un IDS de base configuré pour enregistrer et interdire les IP qui faisaient plusieurs tentatives infructueuses, mais elles n'arrêtaient pas d'arriver. Heureusement, j'avais désactivé l'accès SSH en tant qu'utilisateur root dès que j'avais mon propre compte et configuré sudo. En outre, vous ne disposez pratiquement d'aucun journal d'audit.

  2. Fournit un accès root au besoin. Oui, vous n’avez pratiquement aucun privilège en tant qu’utilisateur standard, mais c’est exactement ce que vous voulez; si un compte est compromis, vous voulez que ses capacités soient limitées. Vous souhaitez que tout accès super utilisateur nécessite une nouvelle saisie du mot de passe. De plus, l'accès sudo peut être contrôlé par le biais de groupes d'utilisateurs et limité à des commandes particulières si vous le souhaitez, ce qui vous permet de mieux contrôler qui a accès à quoi. En outre, les commandes exécutées en tant que sudo peuvent être consignées, ce qui permet une meilleure piste d'audit en cas de problème. Oh, et ne lancez pas simplement "sudo su -" dès que vous vous connectez. C'est terrible, pratique terrible.

  3. L'idée de votre administrateur système est mauvaise. Et il devrait se sentir mal. Non, les machines * nix ne vous empêcheront probablement pas de le faire, mais votre système de fichiers et pratiquement toutes les applications existantes prévoient que chaque utilisateur possède un UID unique. Si vous commencez dans cette voie, je peux vous garantir que vous rencontrerez des problèmes. Peut-être pas tout de suite, mais finalement. Par exemple, malgré l’affichage de noms conviviaux, les fichiers et les répertoires utilisent des numéros UID pour désigner leurs propriétaires; Si vous rencontrez un programme qui a un problème avec des UID en double sur toute la ligne, vous ne pouvez pas changer un UID dans votre fichier passwd ultérieurement sans avoir à effectuer un nettoyage manuel sérieux du système de fichiers.

sudoest la voie à suivre. Cela peut causer des problèmes supplémentaires avec les commandes en cours d’exécution en tant que root, mais cela vous fournit une boîte plus sécurisée, à la fois en termes d’accès et d’audit.

Rohaq
la source
1

Certainement l'option 2, mais utilisez des groupes pour donner à chaque utilisateur autant de contrôle que possible sans avoir besoin d'utiliser sudo. sudo devant chaque commande perd la moitié de l'avantage parce que vous êtes toujours dans la zone de danger. Si vous faites en sorte que les répertoires pertinents soient accessibles en écriture aux administrateurs système sans sudo, vous renvoyez sudo à l'exception, ce qui permet à chacun de se sentir plus en sécurité.

julien
la source
1

Auparavant, le sudo n'existait pas. En conséquence, avoir plusieurs utilisateurs UID 0 était la seule alternative disponible. Mais ce n'est toujours pas très bon, notamment avec une journalisation basée sur l'UID pour obtenir le nom d'utilisateur.

De nos jours, sudo est la seule solution appropriée. Oublie autre chose.

Ploc
la source
0

C'est documenté admissible par les faits. Les bureaux de BSD ont leur compte principal depuis longtemps, et les utilisateurs de base sont généralement acceptés sur les systèmes où csh est standard (faute professionnelle reconnue;)

rackandboneman
la source
0

Je suis peut-être bizarre, mais la méthode (3) est aussi ce qui m’a le plus marqué. Avantages: vous auriez le nom de chaque utilisateur dans les journaux et vous sauriez qui fait quoi en tant que root. Inconvénients: ils seraient chacun racine tout le temps, donc les erreurs peuvent être catastrophiques.

Je voudrais demander pourquoi vous avez besoin que tous les administrateurs aient un accès root. Les trois méthodes que vous proposez présentent un inconvénient distinct: une fois qu'un administrateur a exécuté une opération sudo bash -lou une action sudo su -similaire, vous perdez votre capacité à déterminer qui fait quoi et par la suite, une erreur peut être catastrophique. De plus, en cas de mauvaise conduite, cela pourrait même devenir bien pire.

Au lieu de cela, vous voudrez peut-être envisager une autre solution:

  • Créez vos utilisateurs administrateurs en tant qu'utilisateurs réguliers
  • Décidez qui doit faire quel travail (gestion d'Apache / gestion de postfix, etc.)
  • Ajouter des utilisateurs à des groupes liés (tels que ajouter "martin" à "postfix" et "mail", "amavis" si vous l'utilisez, etc.)
  • Autorisations de réparation (chmod -R g + w postfix: postfix / etc / postfix)
  • ne donne que des pouvoirs sudo relatifs: (visudo -> laissez martin utiliser /etc/init.d/postfix, / usr / bin / postsuper, etc.)

De cette façon, martin serait capable de gérer postfixe en toute sécurité, et en cas d'erreur ou de comportement déplacé, vous ne perdriez que votre système postfixé, pas tout le serveur.

La même logique peut être appliquée à n'importe quel autre sous-système, tel qu'apache, mysql, etc.

Bien sûr, ceci est purement théorique à ce stade et pourrait être difficile à mettre en place. Cela ressemble à une meilleure façon d’y aller. Au moins pour moi. Si quelqu'un essaie cela, dites-moi s'il vous plaît comment ça s'est passé.

Tuncay Göncüoğlu
la source
Je devrais ajouter que la gestion des connexions SSH est assez basique dans ce contexte. Quelle que soit la méthode utilisée, n'autorisez pas les connexions root sur SSH, laissez les utilisateurs individuels ssh avec leurs propres informations d'identification et gérez sudo / nosudo / etc à partir de là.
Tuncay Göncüoğlu