Sie haben zwei komplementäre Möglichkeiten, dies umzusetzen:
Gewähren von Benutzerberechtigungen zur git
Remote- Verwendung von Repositorys
Verwenden Sie gitolite3
diese Option , um ein Hub-Live-Repositorys-Schema bereitzustellen (dies wird hier ausführlich beschrieben ), für das Sie grundsätzlich ein bare
Repository (ein Hub- Repo) benötigen , damit Ihre Benutzer Push- / Pull-Vorgänge ausführen können, sowie eine ausgecheckte Version desselben Repos (ein Live- Repo), das sich beispielsweise auf dem entsprechenden Pfad befindet /srv/www/html
.
Ich verwende gerne gitolite3
das Hub- Repo, aber das ist keine Voraussetzung, obwohl es ziemlich praktisch ist, eine fein abgestimmte Zugriffskontrolle bei Bedarf an das LDAP Ihrer Wahl zu binden . gitolite3
kann eine feinkörnige Steuerung bis auf die Verzweigungsebene ermöglichen.
Es ist auch eine gute Praxis, die Fähigkeiten des gitolite3
Benutzers über sudo
einzuschränken und die Hooks mittels sudo
Aufrufen zu handhaben . Dies ist ein funktionierendes Beispiel für die Verwendung von gitolite3
Haken (Sie können sie jederzeit an Ihre Bedürfnisse anpassen oder verbessern / reparieren):
Der relevante Inhalt des /etc/sudoers
oder /etc/sudoers.d/gitolite3
wäre etwas in der Art von:
Cmnd_Alias GITOLITE_CMDS = /usr/bin/git, /bin/chown, /bin/find, /usr/bin/xargs, /bin/chmod, /sbin/restorecon, /usr/local/sbin/publisher-hub2live
Cmnd_Alias GITOLITE_APACHE_CMDS = /usr/sbin/apachectl graceful
Defaults:gitolite3 !requiretty
Defaults:gitolite3 lecture=never
gitolite3 ALL = (root)NOPASSWD: GITOLITE_CMDS
gitolite3 APACHE_HOSTS = (root)NOPASSWD: GITOLITE_APACHE_CMDS
Hub Repo post-update
Haken:
#!/bin/sh
echo "****"
echo "**** Calling publisher-hub2live script [Hub's post-update hook]"
echo "****"
sudo /usr/local/sbin/publisher-hub2live "/srv/www/html" "root:apache" "2750" "640"
exit 0
publisher-hub2live
Skript:
#!/bin/sh
echo "****"
echo "**** Pulling changes into Live [publisher-hub2live]"
echo "****"
cd "$1" || exit
umask 0022
unset GIT_DIR
/usr/bin/git pull hub master
# custom actions here
# e.g call grunt tasks
/bin/chown -R "$2" "$1"
/bin/find "$1" -type d -exec chmod "$3" {} +
/bin/find "$1" -type f -exec chmod "$4" {} +
/bin/chmod u+x "$1"/.git/hooks/post-commit
/sbin/restorecon -R -v "$1"
exec /usr/bin/git update-server-info
exit 0
Einschränkung der Möglichkeit, nicht autorisierte Befehle in einer Anmeldeshell auszuführen
Was Sie implementieren müssen, ist eine reproduzierbare, überprüfbare Methode, um die Fähigkeit des Benutzers einzuschränken, andere als die streng zulässigen Aktionen auszuführen.
Es ist nicht erforderlich, aber es hilft, wenn Sie Ihre Benutzer in LDAP registriert haben und die Mechanismen zur Durchführung der LDAP-Authentifizierung bereits bereitgestellt haben, sei es mithilfe eines PAM-Moduls oder mithilfe von freeIPA und sssd
.
Um dieses Szenario zu implementieren, gehe ich derzeit wie folgt vor (beachten Sie, dass für diese Art von Einschränkungen mehrere Bedingungen erfüllt sein müssen, andernfalls kann die Einschränkung leicht umgangen werden):
- Die Benutzer gehören nicht zur
wheel
Gruppe, der einzigen, die zur Verwendung berechtigt ist su
(erzwungen über PAM). Normalerweise ist ein Nicht-LDAP-Benutzer ( sysadm
) vorhanden, damit vertrauenswürdige Administratoren Aktionen im Falle einer Notfallwiederherstellung oder einer Nichtverfügbarkeit von LDAP ausführen können.
Die Benutzer erhalten einen ordnungsgemäß gesicherten Pfad rbash
mit einem schreibgeschützten Pfad, der auf einen privaten Befehl verweist ~/bin
. Dieses ~/bin/
Verzeichnis enthält Links zu allen zulässigen Befehlen, zum Beispiel:
$ ll ~/bin
total 0
lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear*
lrwxrwxrwx. 1 root dawud 7 Sep 17 08:58 df -> /bin/df*
lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep*
lrwxrwxrwx. 1 root dawud 8 Sep 17 08:58 env -> /bin/env*
lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep*
lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 git -> /usr/bin/git*
lrwxrwxrwx. 1 root dawud 9 Sep 17 08:58 grep -> /bin/grep*
lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview*
lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo*
lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit*
lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail*
lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
die Benutzer eine eingeschränkte, schreibgeschützte Umgebung gegeben werden (denken Sie an solche Sachen LESSSECURE
, TMOUT
, HISTFILE
Variablen). Dies dient dazu, das shell
Entkommen von Befehlen wie zu vermeiden less
und die Überprüfbarkeit sicherzustellen.
Der einzig erlaubte Editor ist rvim
aus dem gleichen Grund. Benutzer können nur sudoedit
Folgendes ausführen , das für die Ausführung rvim
in der sudo
Konfiguration konfiguriert ist:
Defaults editor=/usr/bin/rvim
Wenn MAC-Einschränkungen bestehen (für die von Ihnen verwendete spezifische GNU / Linux-Distribution ist SELinux aktiviert), werden die Benutzer dem SELinux-Benutzer zugeordnet staff_u
und erhalten die Berechtigung, Befehle wie erforderlich über andere Benutzer auszuführen sudo
. Die spezifischen sudorules
zulässigen Anforderungen müssen sorgfältig geprüft werden, um zu verhindern, dass der Benutzer diese Einschränkungen umgeht. Sie können auch in Ihrer vorhandenen LDAP-Infrastruktur bereitgestellt werden (dies ist eine der freeIPA-Funktionen).
die Benutzer /home
, /tmp
und möglicherweise /var/tmp
sind polyinstantiiert über /etc/security/namespace.conf
:
/tmp /tmp/.inst/tmp.inst-$USER- tmpdir:create root
/var/tmp /tmp/.inst/var-tmp.inst-$USER- tmpdir:create root
$HOME $HOME/$USER.inst/ tmpdir:create root
Die Polyinstantiation von Verzeichnissen ist keine neue Funktion, sie ist bereits seit geraumer Zeit verfügbar. Als Referenz siehe diesen Artikel aus dem Jahr 2006 . Tatsächlich werden viele Module bereits pam_namespace
standardmäßig verwendet, aber die Standardkonfiguration unter /etc/security/namespace.conf
aktiviert keine Polyinstantiation. Außerdem /etc/security/namespace.init
sollten alle Skelettdateien für die Benutzer schreibgeschützt und im Besitz von sein root
.
Auf diese Weise können Sie auswählen, ob die Benutzer einen Befehl in ihrem eigenen Namen (über einen Link im privaten ~/bin
Verzeichnis, bereitgestellt über /etc/skel
, wie oben erläutert), im Namen eines anderen Benutzers (über sudo
) oder überhaupt nicht ausführen können .