Eingeschränkte Shell zum Verwalten von Dateien und Git-Repositorys

8

Stellen Sie sich ein Webhosting-Unternehmen vor, mit dem Benutzer Dateien und Git-Repositorys über ssh verwalten können. Das beinhaltet:

  • sichere Kopie (scp)
  • Erstellen, Kopieren, Verschieben / Umbenennen und Löschen von Dateien
  • Ausführen einer engen Teilmenge von Befehlen zur Quellcodeverwaltung und Textbearbeitung (git, vim, nano)

Wir möchten das umsetzen und haben folgende Optionen geprüft:

Diese würden den scp-Teil zulassen, aber die Verwendung von git scheint nicht möglich zu sein. Es gibt einen Patch in Launchpad , aber ich bin mir nicht sicher, was ich davon halten soll. Es gibt auch Git-Shell , aber es scheint keine Editoren zu erlauben. Vielleicht ist vim sogar zu viel, weil es verwendet werden könnte, um mehr Code auszuführen, also könnten wir das (vim oder Texteditoren, wenn nötig) komplett löschen, wenn es zu viel ist.

Grundsätzlich möchten wir die Shell sperren, damit der Benutzer Dateien und Git-Repositorys verwalten (und bearbeiten) kann, aber der Benutzer sollte keine anderen Programme auf dem System ausführen können. Das größte Problem wäre der Missbrauch von Netzwerk- und Computerressourcen, aber auch die Verwendung des Systems als Proxy. Sie nennen es. Gibt es eine Möglichkeit, dies zu tun, oder haben wir vielleicht sogar den falschen Ansatz für dieses Problem?

Phillipp
quelle

Antworten:

8

Sie haben zwei komplementäre Möglichkeiten, dies umzusetzen:

Gewähren von Benutzerberechtigungen zur gitRemote- Verwendung von Repositorys

Verwenden Sie gitolite3diese Option , um ein Hub-Live-Repositorys-Schema bereitzustellen (dies wird hier ausführlich beschrieben ), für das Sie grundsätzlich ein bareRepository (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 gitolite3das 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 . gitolite3kann eine feinkörnige Steuerung bis auf die Verzweigungsebene ermöglichen.

Es ist auch eine gute Praxis, die Fähigkeiten des gitolite3Benutzers über sudoeinzuschränken und die Hooks mittels sudoAufrufen zu handhaben . Dies ist ein funktionierendes Beispiel für die Verwendung von gitolite3Haken (Sie können sie jederzeit an Ihre Bedürfnisse anpassen oder verbessern / reparieren):

  • Der relevante Inhalt des /etc/sudoersoder /etc/sudoers.d/gitolite3wä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-updateHaken:

    #!/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 wheelGruppe, 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 rbashmit 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, HISTFILEVariablen). Dies dient dazu, das shellEntkommen von Befehlen wie zu vermeiden lessund die Überprüfbarkeit sicherzustellen.

  • Der einzig erlaubte Editor ist rvimaus dem gleichen Grund. Benutzer können nur sudoeditFolgendes ausführen , das für die Ausführung rvimin der sudoKonfiguration 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_uund erhalten die Berechtigung, Befehle wie erforderlich über andere Benutzer auszuführen sudo. Die spezifischen sudoruleszulä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, /tmpund möglicherweise /var/tmpsind 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_namespacestandardmäßig verwendet, aber die Standardkonfiguration unter /etc/security/namespace.confaktiviert keine Polyinstantiation. Außerdem /etc/security/namespace.initsollten 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 ~/binVerzeichnis, bereitgestellt über /etc/skel, wie oben erläutert), im Namen eines anderen Benutzers (über sudo) oder überhaupt nicht ausführen können .

dawud
quelle