Corriger les noms d'utilisateur lors du suivi de / etc / dans le référentiel git et de la validation en tant que root

13

Nous utilisons git pour suivre les changements /etc/sur nos serveurs.

Les administrateurs travaillent en tant que root lors de la modification de fichiers dans / etc /, et donc leurs validations ont un auteur

root <root@machinename>

Ce n'est pas très satisfaisant car vous ne pouvez pas voir quel administrateur a réellement effectué le changement.

Que pouvons-nous faire pour obtenir les vrais noms d'administrateur dans le journal git? Je ne pense pas qu'il soit possible de conserver un clone local du référentiel car nous changeons souvent de manière interactive jusqu'à ce que quelque chose fonctionne, et un cycle change-commit-push-seeError-repeat ne serait pas utile ici.

cweiske
la source
Comme racine réelle, ou sudo'd pour rooter?
Decado
Actuellement en tant que root réel (racine ssh @ ou "su", pas de sudo)
cweiske
Utilisez etckeeper, il s'occupe des étranges accrochages comme celui-ci dans le versioning / etc. Commencez également à utiliser les comptes par utilisateur et sudo.
Caleb

Réponses:

12

L'auteur git et nom de la peut être influencée par les variables d'environnement GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL, GIT_AUTHOR_NAMEet GIT_AUTHOR_EMAIL.

Maintenant, l'astuce consiste à soumettre ces variables au serveur distant lors de la connexion via SSH:

  1. Définissez et exportez les variables de votre ~/.bashrcfichier:

    export GIT_AUTHOR_NAME="Christian Weiske"
    
  2. Envoyez-les automatiquement avec une connexion SSH en ajustant ~/.ssh/config:

    SendEnv LANG LC_* GIT_*
    

    LANGet LC_*ne sont pas nécessaires, mais Debian a ensuite dans leur ssh_config par défaut, donc j'ai pensé que je devrais aussi les soumettre

  3. Sur le serveur distant, ajustez la configuration sshd dans /etc/ssh/sshd_configpour accepter GIT_*les variables d'environnement:

    AcceptEnv LANG LC_* GIT_*
    

Voila - un git commitcomme racine dans /etc/mène à:

commit 8a4654f13241f05361283a88ce041a0fc24b8ac6
Author: Christian Weiske <[email protected]>

En cas de défaillance du serveur dans le futur: http://cweiske.de/tagebuch/carry-git-settings.htm

cweiske
la source
5

Tout d'abord, et sans rapport avec votre question, je vous exhorte à arrêter d' urgence d'utiliser les rootconnexions suet d'utiliser les connexions utilisateur et à la sudoplace. Limitez vos rootconnexions à la console uniquement, ou même pas à cela.

Cela dit, git commita une --authoroption qui peut vous y aider:

# git commit --author='Author Name <[email protected]>' -a

Vous pouvez également utiliser soigneusement les variables d'environnement par utilisateur pour définir les variables GIT_AUTHOR_NAMEet GIT_AUTHOR_EMAIL. Dans le journal, il apparaîtra différents auteurs et le même commiter ( root@host), mais cela vous donnera plus d'audits. Bien sûr, cela signifie que vous faites confiance à vos administrateurs pour garder les variables intactes. Comme chacun utilise un shell spécifique, ils peuvent sudorooter et source un fichier avec leurs gitvariables spécifiques , identifiant chacun différemment sur les validations. Pas très pratique, mais vous pouvez même automatiser cela avec des scripts.

EDIT: Bien sûr, une approche encore meilleure telle que désignée par @ScottPack serait d'utiliser un système de gestion de configuration comme Puppet ou Chef et d'utiliser git pour suivre les modifications sur le serveur central et non sur les serveurs réels afin que chaque administrateur puisse avoir une copie de travail de la configuration.

coredump
la source
--authorest possible bien sûr, mais les gens ne l'utilisent pas dans leur flux de travail normal car c'est trop à écrire. Sur votre deuxième idée d'utiliser sudo: je fais partie de ceux qui considèrent sudo comme nuisible et utilisent plutôt l'accès root ssh avec les clés ssh uniquement. Et oui, nous faisons confiance à nos administrateurs.
cweiske
5
@cweiske pourquoi considérez-vous que sudo est dangereux?
coredump
1
@cweiske Avez-vous envisagé un script wrapper qui interroge le committer pour des informations vitales (qui ils sont, ce qu'ils ont changé, pourquoi le changement a été effectué, le numéro de ticket le cas échéant)? Mon dernier lieu de travail avait un système similaire (basé sur CVS) pour les modifications DNS, avec des wrappers pour appliquer la politique - fonctionne étonnamment bien.
voretaq7
4
@cweiske Je ne suis pas du tout d'accord avec votre évaluation. Vous pouvez utiliser un agent ssh pour mettre en cache le mot de passe de clé SSH et stupidement se connecter à une machine de racine, ou tout simplement utiliser une passphrase simple , ou le même mot de passe sur votre machine que le mot de passe root, alors qu'avec sudovous forcer l'utilisateur à saisir un mot de passe (même s'il utilise une clé ssh pour se connecter en tant qu'utilisateur) et vous pouvez contrôler ce que l'utilisateur peut exécuter et vous disposez principalement d'une piste d'audit de qui a fait quoi. Mais chacun a droit à sa propre opinion.
coredump
2
Vous pouvez également configurer sudopour forcer un utilisateur à entrer un mot de passe pour chaque commande ( timestamp_timeout = 0). Peut-être pas adapté pour le développement et les boîtes de mise en scène mais certainement adapté à la production. À mon humble avis, sur la base du consensus SF, vous devriez repenser votre point de vue sudo. L'une des grandes choses à propos de SF est d'avoir une communauté de pairs qui connaissent vraiment leur sh * t :-).
Belmin Fernandez
3

Avec putty, vous pouvez définir cela sous "Connexion -> Données -> Variables d'environnement".

Ils sont également présents après ' su' pour rooter.

Cybot
la source
3

S'il vous arrive de provisionner des comptes d'utilisateurs sur vos serveurs à l'aide de clés ssh, vous pouvez réellement attacher des variables d'environnement aux clés autorisées au moment de la configuration - par exemple dans ~ bob / .ssh / authorized_keys

environment="GIT_AUTHOR_NAME=Bob Smith",environment="[email protected]" ssh-rsa AAAA.... [email protected]

De cette façon, lorsque les utilisateurs SSH ont automatiquement configuré ces envs, il n'est pas nécessaire de les transférer depuis le client local. Des points bonus si vous disposez déjà de ces informations et que vous générez des configurations author_keys depuis un système de gestion de configuration

Remarque: ce qui précède nécessite PermitUserEnvironment yesdans sshd_config

minaguib
la source
1

Si vous utilisez sudoet que votre utilisateur non root a son répertoire personnel monté:

git -c include.path=<file>inclura la configuration dans <file>.

Pour extraire automatiquement les fichiers de configuration de mon utilisateur non root, j'utilise l' bashalias:

alias gsudo='sudo git -c "include.path='"${XDG_CONFIG_DIR:-$HOME/.config}/git/config\" -c \"include.path=$HOME/.gitconfig\""

Ensuite, j'utilise gsudoau lieu de gitdeux:

  • Exécuter en tant que root
  • Avoir accès à toutes les configurations git des utilisateurs non root

Vérifiez que la configuration est bien importée:

gsudo config --list --show-origin --includes | less
Tom Hale
la source
0

En plus de la réponse de coredump, vous pouvez également définir ces options dans le .git/configfichier de votre copie de travail du référentiel (à la main ou à l'aide de la git configcommande).

Voir man git-configpour plus d'informations sur la commande et les choses intéressantes que vous pouvez en faire.

voretaq7
la source
Cela ne fonctionne que si un administrateur s'engage dans ce dépôt sur cette machine, mais il échoue avec plusieurs administrateurs.
cweiske
Vrai - il convient mieux à une situation où vous avez un référentiel central et des personnes clonent et tirent / poussent vers ce référentiel.
voretaq7