Korrigieren Sie Benutzernamen, wenn Sie / etc / im Git-Repository nachverfolgen und als Root festlegen

13

Wir verwenden git, um Änderungen /etc/auf unseren Servern nachzuverfolgen.

Administratoren arbeiten als Root, wenn sie Dateien in / etc / ändern, und daher haben ihre Commits Autor

root <root@machinename>

Dies ist nicht sehr befriedigend, da Sie nicht sehen können, welcher Administrator die Änderung tatsächlich vorgenommen hat.

Was können wir tun, um die echten Admin-Namen in das Git-Protokoll aufzunehmen? Ich denke nicht, dass es machbar ist, einen lokalen Klon des Repositorys zu behalten, da wir häufig interaktiv wechseln, bis etwas funktioniert, und ein Change-Commit-Push-SeeError-Repeat-Zyklus hier nicht hilfreich wäre.

Cweiske
quelle
Als eigentlicher root oder sudo als root?
Decado
Derzeit als eigentliche root (ssh root @ oder "su", kein sudo)
cweiske
Verwenden Sie etckeeper, es kümmert sich um die seltsamen Fallstricke wie diese in Versionierung / etc. Beginnen Sie auch mit der Verwendung von Benutzerkonten und sudo.
Caleb

Antworten:

12

Der git Autor und Committer Name kann mit den Umgebungsvariablen beeinflusst werden GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL, GIT_AUTHOR_NAMEund GIT_AUTHOR_EMAIL.

Der Trick besteht nun darin, diese Variablen beim Herstellen einer Verbindung über SSH an den Remoteserver zu senden:

  1. Definieren und exportieren Sie die Variablen in Ihrer ~/.bashrcDatei:

    export GIT_AUTHOR_NAME="Christian Weiske"
    
  2. Senden Sie sie automatisch mit einer SSH-Verbindung, indem Sie Folgendes einstellen ~/.ssh/config:

    SendEnv LANG LC_* GIT_*
    

    LANGund LC_*sind nicht notwendig, aber Debian hat dann in ihrer Standardeinstellung ssh_config, also dachte ich, ich sollte sie auch einreichen

  3. Passen Sie auf dem Remote-Server die sshd- Konfiguration an /etc/ssh/sshd_config, um GIT_*Umgebungsvariablen zu akzeptieren :

    AcceptEnv LANG LC_* GIT_*
    

Voila - git commitals root in /etc/führt zu:

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

Für den Fall, dass in Zukunft ein Serverfehler auftritt: http://cweiske.de/tagebuch/carry-git-settings.htm

Cweiske
quelle
5

Erstens, und nicht im Zusammenhang mit Ihrer Frage, möchte ich Sie dringend auffordern, die Verwendung von rootAnmeldungen und suund Benutzeranmeldungen und sudostattdessen einzustellen . Beschränken Sie Ihre rootAnmeldungen nur auf die Konsole oder nicht einmal auf diese.

Das heißt, git commithat eine --authorOption, die Ihnen dort helfen kann:

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

Sie können Umgebungsvariablen pro Benutzer auch sorgfältig zum Festlegen GIT_AUTHOR_NAMEund GIT_AUTHOR_EMAILVariabeln verwenden. Im Protokoll werden verschiedene Autoren und derselbe Commiter ( root@host) angezeigt , Sie erhalten jedoch mehr Überwachungsmöglichkeiten . Das bedeutet natürlich, dass Sie darauf vertrauen, dass Ihre Administratoren die Variablen intakt halten. Da jeder Benutzer eine bestimmte Shell verwendet, kann sudoer eine Datei mit ihren spezifischen gitVariablen als Root und Quelle verwenden , wobei jeder bei den Commits unterschiedlich identifiziert wird. Nicht sehr praktisch, aber Sie können dies sogar mit Skripten automatisieren.

BEARBEITEN: Ein noch besserer Ansatz als von @ScottPack vorgegeben wäre natürlich, ein Konfigurationsmanagementsystem wie Puppet oder Chef zu verwenden und die Änderungen mit git auf dem zentralen Server und nicht auf den realen Servern zu verfolgen, sodass jeder Administrator eine Arbeitskopie haben könnte der Konfiguration.

Core-Dump
quelle
--authorDas ist natürlich möglich, aber die Leute verwenden das nicht in ihrem normalen Arbeitsablauf, da es zu viel ist, um es zu schreiben. Zu Ihrer zweiten Idee, sudo zu verwenden: Ich gehöre zu den Leuten, die sudo als schädlich betrachten und den SSH-Root-Zugriff eher nur mit SSH-Schlüsseln verwenden. Und ja, wir vertrauen unseren Admins.
Cweiske
5
@cweiske warum hältst du sudo für schädlich?
Coredump
1
@cweiske Haben Sie ein Wrapper-Skript in Betracht gezogen, das den Committer nach wichtigen Informationen abfragt (wer sind sie, was haben sie geändert, warum wurde die Änderung vorgenommen, Ticketnummer, falls zutreffend)? Mein letzter Angestellter hatte ein ähnliches System (CVS-basiert) für DNS-Änderungen, mit Wrappern zur Durchsetzung von Richtlinien - funktioniert überraschend gut.
Voretaq7
4
@cweiske Ich bin mit Ihrer Einschätzung kein bisschen einverstanden. Sie können einen ssh - Agenten verwenden, um das ssh - Schlüsselkennwort zwischenzuspeichern und sich gedankenlos bei einem Root - Computer anzumelden, oder einfach eine einfache Passphrase oder dasselbe Passwort auf Ihrem Computer wie die Root - Passphrase verwenden, während sudoSie den Benutzer zwingen , ein Passwort (gerade) einzugeben Wenn er einen SSH-Schlüssel verwendet, um sich als Benutzer anzumelden, können Sie steuern, was der Benutzer ausführen kann, und vor allem können Sie nachvollziehen, wer was getan hat. Aber jeder hat Anspruch auf seine eigene Meinung.
Coredump
2
Sie können auch festlegen sudo, dass ein Benutzer gezwungen wird, für jeden Befehl ein Kennwort einzugeben ( timestamp_timeout = 0). Vielleicht nicht für Entwicklungs- und Staging-Boxen geeignet, aber durchaus für die Produktion geeignet. IMHO, basierend auf dem SF-Konsens, sollten Sie Ihre Ansichten überdenken sudo. Eines der großartigen Dinge an SF ist, dass es eine Community von Gleichgesinnten gibt, die sich wirklich auskennen :-).
Belmin Fernandez
3

Mit putty können Sie dies unter "Verbindung -> Daten -> Umgebungsvariablen" einstellen.

Sie sind auch nach " suroot" vorhanden.

Cybot
quelle
3

Wenn Sie Benutzerkonten auf Ihren Servern mithilfe von SSH-Schlüsseln bereitstellen, können Sie Umgebungsvariablen zum Zeitpunkt der Einrichtung an die autorisierten Schlüssel anhängen, z. B. in ~ bob / .ssh / authorized_keys

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

Auf diese Weise müssen Benutzer, die sich in SSH befinden, diese Envs automatisch einrichten. Sie müssen sie nicht vom lokalen Client weiterleiten. Bonuspunkte, wenn Sie bereits über diese Informationen verfügen und "authorized_keys" -Konfigurationen von einem Konfigurationsverwaltungssystem generieren.

Hinweis: PermitUserEnvironment yesDies ist in sshd_config erforderlich

Minaguib
quelle
1

Wenn Sie verwenden sudound Ihr Nicht-Root-Benutzer sein Basisverzeichnis angehängt hat:

git -c include.path=<file>beinhaltet die Konfiguration in <file>.

Um die Konfigurationsdateien meines Nicht-Root-Benutzers automatisch abzurufen, verwende ich den bashAlias:

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

Dann benutze ich gsudostatt gitzu beiden:

  • Als root ausführen
  • Greifen Sie auf alle Nicht-Root-Benutzer-Git-Konfigurationen zu

Überprüfen Sie, ob die Konfiguration tatsächlich importiert wird:

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

Zusätzlich zur Antwort von coredump können Sie diese Optionen auch in der .git/configDatei in Ihrer Arbeitskopie des Repositorys festlegen (von Hand oder mit dem git configBefehl).

Siehe man git-configfür weitere Informationen über den Befehl und die coolen Dinge , die man damit machen kann.

voretaq7
quelle
Dies funktioniert nur, wenn ein Administrator das Repo auf diesem Computer festschreibt, aber bei mehreren Administratoren ein Fehler auftritt.
Cweiske
Richtig - es ist besser für eine Situation geeignet, in der Sie ein zentrales Repository haben und die Leute auf dieses Repo klonen und ziehen / schieben.
Voretaq7