- Ich habe den Benutzer „git-server“ erstellt.
- Eingerichtet
openssh-server
- Geändert
/etc/ssh/sshd_config
hinzugefügtPasswordAuthentication no
.ssh/authorized_keys
Zum öffentlichen Fall meiner Kollegen hinzugefügt
Fragen:
- Ist der Benutzer „git-server“ für mein System sicher? Was ist das schlimmste Szenario für das System, wenn ein Angreifer Zugriff auf „git-server“ erhält, vorausgesetzt, dass „git-server“
sudoer
- Wie kann ich dem „Git-Server“ alle Operationen außer
git
Befehlen verbieten?
Antwort1
Sie sollten die Standard-Shell des Benutzers „Git-Server“ in „Git-Shell“ ändern.
https://git-scm.com/docs/git-shell.html
Dies ist eine Login-Shell für SSH-Konten, die eingeschränkten Git-Zugriff bietet. Sie erlaubt nur die Ausführung von serverseitigen Git-Befehlen, die die Pull/Push-Funktionalität implementieren, sowie benutzerdefinierte Befehle, die in einem Unterverzeichnis namens git-shell-commands im Stammverzeichnis des Benutzers vorhanden sind.
Antwort2
Sehen wir uns an, wie Sie dieses Git-Server-Konto auf dem System einrichten.
Geändert /etc/ssh/sshd_config hinzugefügt PasswordAuthentication nein
Da Sie die Kennwortauthentifizierung auf „Nein“ eingestellt haben, ist es ohne einen gültigen SSH-Schlüssel praktisch unmöglich, sich unter diesem Namen remote beim System anzumelden. Soweit ich weiß, glaube ich nicht, dass SSH-Schlüssel geknackt wurden, allerdings hängt es von der von Ihnen verwendeten Verschlüsselung und der Verschlüsselungskomplexität ab, um dies festzustellen.
Damit ist diese Tatsache geklärt. Wenn es jemandem gelingt, auf dieses Konto zuzugreifen, bedeutet dies höchstwahrscheinlich, dass es jemand getan hat, der bereits Zugriff auf Ihr System hat und über die Berechtigung verfügt, su zu verwenden. Oder wenn Sie Ihr System ordnungsgemäß gesperrt haben, hat sich jemand irgendwie Zugriff auf Root verschafft, was noch unmöglicher ist, als auf das Git-Server-Konto zuzugreifen. Wenn dies jedoch nicht der Fall ist und sich die Person per Remote-Zugriff über SSH bei diesem Konto angemeldet hat, ist jeder, der SSH verwendet, in Schwierigkeiten, da das bedeutet, dass jedes System, das SSH verwendet, anfällig wäre. Der größte Schaden, der jetzt angerichtet werden kann, ist der gleiche, den Sie mit Ihrem normalen Konto mit Sudo-Berechtigungen anrichten können.
Antwort3
Einige Variablen müssen festgelegt werden, falls Vorschläge befolgt werden müssen …
_git_user='git-user'
_git_group='git-devs'
_git_home_base="/srv/${_git_group}"
_client_certs_root='/home/admin/client-certs'
... die aus der Perspektive Ihres Serveradministratorkontos geschrieben werden.
- Ich habe den Benutzer „git-server“ erstellt.
Hast du es zufällig gesperrt und zu einem Systemkonto gemacht?
sudo adduser\
--system\
--disabled-password\
--gecos ''\
--shell "$(which git-shell)"\
--home "${_git_home_base,,}/${_git_user,,}"\
--ingroup "${_git_group}"\
"${_git_user}"
Beachten Sie: Wenn
$(which git-shell)
die Auflösung zu einem Dateipfad erfolgt,--shell
die Option jedoch Fehler ausgibt, …
if [ -e "$(which git-shell)" ] && ! grep -q -- "$(which git-shell)" /etc/shells; then
sudo tee -a /etc/shells 1>/dev/null <<<"$(which git-shell)"
fi
git-shell
... kann hilfreich sein, den Pfad an die/etc/shells
Datei anzuhängen
- Eingerichtet
openssh-server
- Geändert
/etc/ssh/sshd_config
hinzugefügtPasswordAuthentication no
Haben Sie deaktiviertroot
Passwortauthentifizierung über SSH?
/etc/ssh/sshd_config
Teile, die hilfreich sein könnten …
permitrootlogin without-password
## Additionally consider locking-down other unneeded features
Match Group git-devs
AllowTcpForwarding no
AllowStreamLocalForwarding no
PermitOpen none
.ssh/authorized_keys
Zum öffentlichen Fall meiner Kollegen hinzugefügt
Wo genau haben Sie ihre öffentlichen Schlüssel hinzugefügt?
Hier sind einige Beispielbefehle zum Einrichten von drei Git-Konten …
declare -a _accounts_keys=(
["name-one"]="${_client_certs_root}/${_git_group}/name-one/ssh.pub"
["name-two"]="${_client_certs_root}/${_git_group}/name-two/ssh.pub"
["name-three"]="${_client_certs_root}/${_git_group}/name-three/ssh.pub"
)
for _name in "${!_accounts_keys[@]}"; do
sudo su --login "${_name}" --shell /bin/bash <<EOF
mkdir .ssh
tee -a .ssh/authorized_keys 1>/dev/null <<<"$(<"${_accounts_keys[${_name}]}")"
chmod 600 .ssh/authorized_keys
EOF
done
Ist der Benutzer „git-server“ für mein System sicher? Was ist das schlimmste Szenario für das System, wenn ein Angreifer Zugriff auf „git-server“ erhält, vorausgesetzt, dass „git-server“
sudoer
Nein, und wenn Sie alle Schlüssel zum selben Konto hinzugefügt haben und dieses Konto ein ist sudoer
, dann ist die Menge anAlptraum TreibstoffIch könnte diese Situation mit nahezu grenzenlosen Mitteln löschen ...
Wie kann ich dem „Git-Server“ alle Operationen außer Git-Befehlen verbieten?
Fügen Sie git-shell-commands/no-interactive-login
jedem Git-Konto ein Skript hinzu …
for _name in "${!_accounts_keys[@]}"; do
sudo su --login "${_name}" --shell /bin/bash <<EOC
tee 'git-shell-commands/no-interactive-login' 1>/dev/null <<'EOF'
#!/usr/bin/env bash
printf 'Hi %s, you have successfully authenticated!\n' "${USER}"
printf 'However, there is not an interactive shell here.\n'
exit 128
EOF
chmod u+x 'git-shell-commands/no-interactive-login'
EOC
done
... solange sich keine anderen ausführbaren Dateien im git-shell-command
Verzeichnis befinden, ist das Konto auf nicht-interaktive Git-Befehle beschränkt; vorausgesetzt, dass die Shell des Kontos auch richtig eingerichtet ist.
Das Obige ist nicht das Sicherste, aber mit Komfort im Gleichgewicht;
git-devs
Die Gruppe sollte für jedes Konto unterschiedlich sein, wenn kein Cross-Cloning erwünscht ist. Dies könnte beispielsweisename-one
möglich sein (wenn die primäre Gruppe zwischen Konten geteilt wird),git clone name-two@server:/srv/git-devs/name-two/project-name
wenn man wüsste, wie die Dinge serverseitig strukturiert sind.
Beachten Sie, wenn Berechtigungen vorhanden sind, bei denen
600
dies pro Projekt innerhalb eines einzelnen Kontos deaktiviert werden könnte, und wenn Berechtigungen vorhanden sind, bei denen dies der freigegebenen Gruppe sowie einem Repository660
ermöglicht würde ... persönlich finde ich das am bestenpush
pull
640
am bestenvon beiden Optionen, da dies einer Gruppe ermöglicht, Code untereinander auszutauschen, ohne allzu große Angst haben zu müssen, dass ein Abweichlergit push -f
von einem anderen Konto alles durcheinanderbringt.
- Beispiele für andere
git-shell-commands
Skripte finden Sie untergit-utilities/git-shell-commands
Repository, aus dem die obigen Tipps übernommen wurden, obwohl dasTippnoch mehr in Richtung Bequemlichkeit.
ZusamenfassendnichtFügen Sie die oben verlinkten Skripte hinzu, wenn Sie den Clients nicht vertrauen können, dass sie nicht versuchen,Pop-Ah-Muscheldenn solche Dinge sind so konzipiert, dass diebrauchenfür eine interaktive Shell ist nicht so weit verbreitet.
Bonuspunkte
Hier finden Sie
man --pager='less -p "ChrootDirectory"' sshd_config
Hinweise, wie Sie den SSH-Server noch sicherer machen können.Überprüfen Sie
man git-shell
undman git-daemon
die zugehörige Dokumentation. Es gibt einige nützliche Optionen, um Dinge zu sperren und/oder die Kommunikation mit dem Server etwas einfacher zu machen, z. B.--strict-paths
,--base-path=<path>
, und--listen=<host_or_ipaddr>
es könnte sich lohnen, sich näher damit zu befassen.
Wenn an den oben genannten Punkten etwas fragwürdig ist, hinterlassen Sie bitte einen Kommentar, damit die Antwort verbessert werden kann.