Bestimmten Befehl in Linux für bestimmten Benutzer blockieren

27

Wie blockiere ich einen Befehl, zum Beispiel mkdirfür einen bestimmten Benutzer?

Was ich gerade erstellt habe, ist eine Nur-Lese-Funktion, die im Benutzerprofil gespeichert wird ~/.bashrc

/bin/mkdir() {
        echo "mkdir command not allow for you"

}

mkdir() {
        echo "mkdir command not allow for you"

}
./mkdir() {

        echo "mkdir command not allow for you"
}

readonly -f /bin/mkdir
readonly -f mkdir
readonly -f ./mkdir

Prüfung:

rahul@ubuntu:~$ cd /bin/
rahul@ubuntu:/bin$ ./mkdir /home/rahul/ggg
mkdir command not allow for you
rahul@ubuntu:/bin$ cd
rahul@ubuntu:~$ mkdir testing
mkdir command not allow for you
rahul@ubuntu:~$ /bin/mkdir testing
mkdir command not allow for you

Meine Frage ist also, wie dies erreicht werden kann. Gibt es ein Werkzeug dafür?

Update 1 # Wenn der Benutzer jedoch schlau ist, kann er mkdir binary kopieren und umbenennen und verwenden. Wie kann man das erreichen?

Rahul Patil
quelle
7
Ihr Beispiel schlägt fehl, weil der Benutzer sein eigenes kompilieren mkdirund umbenennen oder sogar die vorhandene Binärdatei kopieren und umbenennen kann. Es gibt auch eine Shell zum Überschreiben von Aliasen und Funktionen.
Strugee
hmm das stimmt also gibt es sowieso
Rahul Patil
Auch Benutzer müssen nicht kompilieren, er kann leicht kopieren und cp /bin/mkdir mkdir2dann verwenden :(
Rahul Patil
Das Erstellen eines Verzeichnisses ist eine so häufige / grundlegende Aufgabe, dass es mehrere Möglichkeiten gibt, dies zu tun, und es fast unmöglich ist, alle zu blockieren (es sei denn, der Benutzer darf keine Dateien erstellen, dh alle Verzeichnisse sind schreibgeschützt). Beispielsweise cp -r /usr/local/lib gggwird ein Verzeichnis mit dem Namen erstellt ggg(das eine Kopie des Inhalts von /usr/local/lib, falls vorhanden, enthält, die der Benutzer dann einfach löschen kann). Mit können find / -type d -emptySie ein leeres Verzeichnis zum Kopieren suchen.
G-Man sagt, dass Monica

Antworten:

21

Ich weiß nicht, wie man es mit bash macht, aber ich kenne eine andere Shell, die die Benutzerumgebung einschränkt: lshell (eingeschränkte Shell) .

Ein schneller Überblick über die Konfiguration

Lshell wird über eine INI-Datei konfiguriert. Standardmäßig enthält es eine Whitelist mit zulässigen Befehlen, kann jedoch problemlos so konfiguriert werden, dass der Benutzer keinen bestimmten Befehl verwenden kann.

Diese Konfiguration (Standardeinstellung conf /etc/lshell.conf) untersagt dem Benutzer die fooVerwendung von mkdir:

[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']

Um ein Benutzerkonto so zu konfigurieren, dass es standardmäßig lshell verwendet, müssen Sie:

 chsh -s /usr/bin/lshell foo

Lshell kann mehr:

  • 3 Stufen der Granularität: Benutzer, Gruppe, alle.
  • Kann den Zugriff auf bestimmte Pfade im System einschränken.
  • Kann die Verwendung bestimmter Zeichen (zB |) einschränken .
  • Kann die Verwendung bestimmter Befehle nur über SSH einschränken.

Und mehr.

Update 1 # Hinzugefügtes Testergebnis:

rahul:~$ which bash
/bin/bash
rahul:~$ dd if=$(which bash) of=my_bash
*** forbidden syntax: dd if=$(which bash) of=my_bash
rahul:~$ bash
*** forbidden command: bash
rahul:~$ cp /bin/bash my_bash
*** forbidden path: /bin/bash
rahul:~$ /bin/bash
*** forbidden command: /bin/bash
rahul:~$ sh
*** forbidden command: sh
rahul:~$ dash
*** forbidden command: dash
rahul:~$ env bash
*** forbidden command: env
rahul:~$ cp /bin/mkdir mycreatedir
*** forbidden path: /bin/mkdir
rahmu
quelle
3
mit allowed = 'all' - ['mkdir'], kannst du nicht einfach ausführen bashund wieder frei sein?
Dawud
3
Nur umständlich, sorry, aber es gibt immer noch viele Möglichkeiten, die durch diese Liste auferlegten Einschränkungen zu umgehen, z dd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bash. Ich denke, das Problem ist das Fehlen einer restriktiven Standardrichtlinie, dh in diesem Szenario gewähren Sie Berechtigungen standardmäßig, dann verweigern Berechtigungen basierend auf einer Liste, wenn es umgekehrt sein sollte: standardmäßig verweigern, dann gewähren basierend auf Richtlinie .
Dawud
1
@dawud: Ich bin damit einverstanden, dass es besser ist, eine Whitelist mit zulässigen Befehlen zu führen, als eine schwarze Liste zu haben und zu hoffen, dass der Benutzer sie nicht umgeht, indem er den Administrator überlistet.
Rahmu
2
@Marco, überprüfe das Beispiel in meiner Antwort. Ich stelle eine Whitelist mit zulässigen Befehlen zur Verfügung, und in diesem Szenario kann der Benutzer nicht nur cpeine Binärdatei zu seinem / ihrem PATH ( rootbesessenes Verzeichnis rxfür den Benutzer) rbasherstellen und die Ausführung verhindern ./executables. Beantwortet es Ihre Frage?
Dawud
2
@dawud Tatsächlich. Ich habe das schreibgeschützte bin-Verzeichnis verpasst.
Marco
15

Die Art und Weise, wie ich diese Art von Einschränkungen normalerweise umsetze, setzt voraus, dass mehrere Bedingungen erfüllt sind. Andernfalls kann die Einschränkung leicht umgangen werden:

  • Der Benutzer gehört nicht zu der wheelGruppe, die nur zur Verwendung berechtigt ist su(erzwungen über PAM).
  • Der Benutzer erhält einen ordnungsgemäß gesicherten rbashschreibgeschützten Pfad, der auf einen privaten Pfad verweist ~/bin. Dieses ~/bin/Verzeichnis enthält Links zu einfachen Dienstprogrammen:

    $ 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  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 rvim -> /usr/bin/rvim*
    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*
    
  • der Benutzer eine eingeschränkte, read-only - Umgebung gegeben (man denkt an Sachen wie LESSSECURE, TMOUT, HISTFILEVariablen).

  • Der Benutzer wird dem SELinux-Benutzer zugeordnet staff_uund erhält die Berechtigung, Befehle als anderer Benutzer wie erforderlich über auszuführen sudo.
  • der Benutzer /home, /tmpund möglicherweise /var/tmpsind polyinstantiert ü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
    

    /etc/security/namespace.initLegt außerdem fest, dass alle Skelettdateien nur für den Benutzer lesbar sind und Eigentum von sind root.

Auf diese Weise können Sie auswählen, ob $USERdie Ausführung mkdirin eigenem 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 erfolgen soll.

Dawud
quelle
4

Fügen Sie eine Dummy - Gruppe, fügen Sie den Benutzer zu dieser Gruppe chown root:somegroup /bin/mkdir, chmod g-x /bin/mkdir. Beachten Sie, dass dies davon abhängt, dass der Benutzer seine Gruppen nicht ändern kann. IIRC Dies gilt für GNU / Linux, jedoch nicht für einige andere Unices.

strugee
quelle
2
Auf den meisten Dateisystemen können Sie auch erweiterte ACLs für eine genauere Steuerung verwenden. Die Anzahl der benötigten Gruppen würde mit der Anzahl der Benutzer (aufgrund möglicher Kombinationen) exponentiell zunehmen, ganz zu schweigen von den Benennungsproblemen.
Peterph
2
füge noch einen Punkt hinzu, entferne auch die Leseberechtigung von anderen Benutzern 710, so dass der Benutzer diese Binärdatei nicht kopieren und umbenennen konnte, nicht wahr?
Rahul Patil
1
@RahulPatil ja, und natürlich müssen Sie auch die Verwendung eines Compilers einschränken.
Peterph
1

Das Beste, was ich getestet habe, ist die beste und sicherste Methode, Profile.d zu verwenden

Schritt 1 (Erstellen einer Aliasdatei)

[root@newrbe ~]# vim /etc/customalias.sh

Unten stehende Zeilen hinzufügen:

alias rm="echo remove contenet is restricted"
alias poweroff="echo Poweroff is restricted"
alias chmod="echo Change Permission is restristed"

Speichern und beenden

Schritt 2 (Profillader erstellen)

/etc/profile.d/ Dieser Speicherort enthält Dateien für die Bash-Vervollständigung

[root@newrbe ~]# vim /etc/profile.d/customsource.sh

Fügen Sie unter den Dateien folgende Zeilen ein: Diese Zeilen blockieren die genannten Befehle für Benutzer unter ""

if [ `whoami` == "user1" ] && [ `whoami` == "user2" ]; then
    source /etc/customalias.sh
fi

speichern und Beenden

Jetzt beenden und neu anmelden

Grüße, -Mansur

Mansur Ali
quelle
/etc/profile.d/nicht ist bashAbschluss , ist es , wo wir Platz Anmeldesitzung Anpassungen für Benutzer mit POSIX-wie Login - Shells, es ist so typisch nicht , wo bashalias Anpassung (die eher würden in /etc/bash.bashrcwürden) gehen und es sollte eine POSIX - Shell - Syntax (so typisch, hat .stattdessen von sourceund =statt ==).
Stéphane Chazelas
-1

installiere sudoers und versuche dort zu konfigurieren wessen benutzer und welchen befehl.

mark.praktisero
quelle
4
Willkommen bei SX. Bitte fügen Sie Ihrer Antwort Details hinzu. Dem OP oder anderen, die diese Frage in Zukunft lesen, ist dies möglicherweise nicht bekannt sudo.
Joseph R.
Diese Antwort ist einfach falsch
Kiltek