it-swarm.com.de

So beschränken Sie die Benutzerbefehle in Linux

Ich habe einen Benutzer in einer Gruppe: "Demo".

Ich möchte die Richtlinie festlegen, dass diese Benutzer nur 10 Befehle ausführen können, wie "vim", "nano", "cd" usw.

Sie können auch festlegen, dass die Richtlinie auf alle Befehle mit Ausnahme der Befehle "ssh" und "cat" zugreifen kann.

Vielen Dank

12
mortezaipo

Es gibt viele Möglichkeiten, dies zu erreichen. Ich werde eine von mehreren möglichen Lösungen auflisten.

Ich würde vorschlagen, mehrere verschiedene Schutzebenen zu verwenden, um zu verhindern, dass Benutzer die Befehle ausführen, auf die sie nicht zugreifen dürfen. In allen hier beschriebenen Anweisungen wird davon ausgegangen, dass Benutzer über ein eigenes /home/[username] -Verzeichnis verfügen, dass ihre Shell /bin/bash ist, und Sie möchten, dass sie die bash-Shell verwenden, wenn sie sich beim System anmelden. 

1) Ändern Sie die Bash des Benutzers in den eingeschränkten Bash-Modus, sodass sie das Verzeichnis nicht ändern können (wenn Sie keinen eingeschränkten Bash-Modus auf Ihrem System haben, hilft dieser Link Ihnen, weitere Informationen zu erhalten) chsh -s/bin/rbash [Benutzername]

2) Ändern Sie die Verzeichnisberechtigungen, sodass nur der Benutzer den Inhalt des Basisverzeichnisses bearbeiten kann 

chmod 755 /home/[username] 

3) Entfernen Sie die .bashrc -Datei des Benutzers 

rm /home/[username]/.bashrcDiese Site enthält weitere Informationen, warum es sinnvoll sein kann, .bashrc in dieser Situation zu löschen. 

4) Erstellen Sie einen .bash_profile und fügen Sie für alle Befehle, die Sie deaktivieren möchten, "sichere" Aliase hinzu 

./bash_profile datei beispiel 

alias apt-get="printf ''"  
alias aptitude="printf ''"  
[...]  
alias vi="vi -Z" #this is vi's safe mode and Shell commands won't be run from within vi
alias alias="printf ''"  

Bitte überprüfen Sie die vollständige Liste der Bash-Befehle für weitere Informationen. Sie müssen sicherstellen, dass der Befehl alias alias="printf ''" der letzte Befehl in der Liste ist. Andernfalls verlieren Sie die Möglichkeit, alle Befehle als Aliasnamen zu verwenden. 

5) Deaktivieren Sie Shell-Befehle in vi, indem Sie den vi-Befehl in den eingeschränkten Modus aliasieren
Die Syntax lautet alias vi="vi -Z". Weitere Informationen finden Sie jedoch unter diese Site

6) Ändern Sie das Eigentum an .bash_profile des Benutzers in root
chown root:root /home/[username]/.bash_profile 

7) Entfernen Sie schließlich die Schreibberechtigungen für .bash_profile des Benutzers.
chmod 755 /home/[username/.bash_profile] 

Wenn sich die Benutzer jetzt anmelden, können sie kein Verzeichnis wechseln. Alle Befehle, die Sie nicht verwenden sollen, geben dieselben Informationen aus, als wenn der Benutzer die Taste [ENTER] gedrückt hätte, ohne dass ein Befehl angegeben wurde und Ihre /bin/bash - Funktionen bleiben erhalten. 

Abhängig davon, welche Funktionen Sie auf diese Weise als Alias ​​verwenden möchten oder nicht, können Benutzer möglicherweise einige der von Ihnen implementierten Steuerelemente umgehen. Da wir jedoch einige Sicherheitspuffer implementiert haben, müsste der Benutzer wirklich über Computersysteme Bescheid wissen, um gefährliche Aktionen durchzuführen. 

Wenn Sie diese Aliasnamen direkt in jeden .bash_profile eines jeden Benutzers einfügen, haben Sie Schwierigkeiten, die Funktionen zu pflegen, die nicht als Alias ​​verwendet werden dürfen und sollten, und wenn Sie dies benötigen Ändern Sie den Alias ​​für alles, was Sie alle einzeln ändern müssten. Da Benutzer vim oder vi zum Anzeigen von Dateien verwenden können, können sie auch den Inhalt ihres .bash_profile sehen und wissen, welche Einschränkungen sie haben und welche nicht. 

Um dies zu umgehen, würde ich vorschlagen. 

1) Alle Aliase in einem Verzeichnis ablegen, auf das die Benutzer keinen Zugriff haben (fügen Sie den Inhalt von .bash_profile hier ein). 

/[path_to_file]/startup_functions_for_beginners.sh 

2) Beschaffung der Aliase in ihren .bash_profile 

verbessertes ./bash_profile datei beispiel 

if [[ -f /[path_to_file]/startup_functions_for_beginners.sh ]]; then
    . /[path_to_file]/startup_functions_for_beginners.sh
fi

Dies sollte Sie auf den Weg bringen, aber denken Sie daran, dass es fast immer Möglichkeiten gibt, Einschränkungen zu umgehen. 

Fühlen Sie sich frei, die Informationen in dieser Antwort an Ihre Bedürfnisse anzupassen. Diese können auf jeden Fall auch mit einer Reihe anderer Einschränkungen kombiniert werden.

F: Ich brauche Benutzer, die Zugriff auf fg und bg haben, aber ich möchte nicht, dass sie auf aptitude oder bash zugreifen können. 

alias apt-get="printf ''"  #the user won't be able to run this  
alias aptitude="printf ''"  #the user won't be able to run this  
alias bash="printf ''"  #the user won't be able to run this  
#alias fg="printf ''" #this will run as a bash built-in  
#alias bg="printf ''" #you actually don't need to include these in your script  

Liste der gebräuchlichsten Befehle gemäß dieser Harvard-Website (NICHT VERBESSEREND)

Bei Editoren ist Vorsicht geboten, da einige es ermöglichen, Shell-Befehle aus dem Programm heraus auszuführen. 

nano
emacs
pico
sed
vi
vim  

Alles andere 

exit
logout
passwd
rlogin
ssh
slogin
yppasswd
mail
mesg
pine
talk
write
as
awk
bc
cc
csh
dbx
f77
gdb
gprof
kill
ld
Lex
lint
make
maple
math
Nice
Nohup
pc
Perl
prof
python
sh
yacc
xcalc
apropos
find
info
man
whatis
whereis
cd
chmod
chown
chgrp
cmp
comm
cp
crypt
diff
file
grep
gzip
ln
ls
lsof
mkdir
mv
pwd
quota
rm
rmdir
stat
sync
sort
tar
tee
tr
umask
uncompress
uniq
wc
cat
fold
head
lpq
lpr
lprm
more
less
page
pr
tail
zcat
xv
gv
xpdf
ftp
rsync
scp
alias
chquota
chsh
clear
echo
pbm
popd
pushd
script
setenv
stty
netstat
rsh
ssh
bg
fg
jobs
^y
^z
clock
date
df
du
env
finger
history
last
lpq
manpath
printenv
ps
pwd
set
spend
stty
time
top
uptime
w
who
whois
whoami
gimp
xfig
xv
xvscan
xpaint
kpaint
mplayer
realplay
timidity
xmms
abiword
addbib
col
diction
diffmk
dvips
explain
grap
hyphen
ispell
latex
pdfelatex
latex2html
lookbib
macref
ndx
neqn
nroff
pic
psdit
ptx
refer
roffbib
sortbib
spell
ispell
style
tbl
tex
tpic
wget
grabmode
import
xdpyinfo
xkill
xlock
xterm
xwininfo
html2ps
latex2html
lynx
netscape
sitecopy
weblint
16
Dodzi Dzakuma

Ich weiß, dass ich zu spät auf die Party komme, tatsächlich 2 Jahre zu spät, aber ich bin gerade auf einen Workaround für Ihre Situation gestoßen ... Ich hatte einen Benutzer, nennen wir ihn "test1", der einige Befehle einschränken musste. wie "su", aber der Rest sollte verfügbar sein . Um diese Einschränkung anzuwenden, habe ich nur ACL (vorausgesetzt, Sie haben acls auf Ihrem FS aktiviert) für die Binärdatei hinter dem Befehl selbst verwendet:

setfacl -m u: test1: r/bin/su

Der obige Befehl ändert die Berechtigungen für diese bestimmte Binärdatei, bei der es sich tatsächlich um den Befehl "su" handelt, um dem Benutzer "test1" nur Lesezugriff auf diese Datei zu gewähren. Wenn der Benutzer "test1" versucht, den Befehl "su" auszuführen, kann er das dahinterliegende Skript nicht ausführen und erhält "Berechtigung verweigert".

Führen Sie einfach "which command_you_want_restricted" aus, um die dahinterliegende Datei anzuzeigen.

Ich habe diese Methode auf Red Hat 6.5 & 7 getestet und betrifft nur den Benutzer "test1". Alle anderen Benutzer können weiterhin "su" nach Belieben ausführen.

Für Ihre spezifische Anfrage:

"Oder setzen Sie die Richtlinie so, dass sie auf alle Befehle außer" ssh "und" cat "-Befehle zugreifen kann."

Sie können dasselbe mit ACLs für die Gruppe "demo" für die gewünschten Befehls-Binärdateien tun, aber ich habe dies nicht mit Gruppen getestet und ich empfehle Ihnen, es bei einem Test VM oder einem anderen Test zu testen.

Grüße,

7
AnythingIsFine

Die Standardantwort wäre, eine eingeschränkte Shell zu verwenden, die für Benutzer dieser Gruppe der letzte Eintrag in der Kennwortdatei ist. Da Sie externe Befehle von vim ausführen können: http://web.physics.ucsb.edu/~pcs/apps/editors/vi/vi_unix.html

dies scheint keine gute Idee zu sein, wenn Sie versuchen, eine eingeschränkte Umgebung zu schaffen. Das erste, was ein Benutzer tun kann, ist, die Befehle im obigen Link zu verwenden, um /bin/bash auszuführen, und er befindet sich außerhalb der eingeschränkten Umgebung.

Eine bessere Idee wäre, das Login jedes Benutzers in ein Chroot-Gefängnis oder einen leichtgewichtigen Container zu setzen (wenn also irgendetwas kaputt ist, dann ist es ihr eigener Container). Schauen Sie sich Docker - http://docker.io an.

5
abligh

Die @Dodzi Dzakuma-Lösung ist ideal, wenn Sie nur wenige Befehle haben, die Sie deaktivieren möchten.

Wenn Sie jedoch nur zulassen möchten, dass der Benutzer mehrere Befehle ausführt, finden Sie hier eine bessere Lösung:

  1. Ändern Sie die Benutzer-Shell in eine eingeschränkte Bash

    chsh -s /bin/rbash <username>
    
  2. Erstellen Sie ein bin-Verzeichnis unter dem Benutzerverzeichnis

    Sudo mkdir /home/<username>/bin
    Sudo chmod 755 /home/<username>/bin
    
  3. Ändern Sie den Standardpfad des Benutzers in das bin-Verzeichnis

    echo "PATH=$HOME/bin" >> /home/<username>/.bashrc
    echo "export PATH >> /home/<username>/.bashrc
    
  4. Erstellen Sie Symlinks der Befehle, die der Benutzer benötigt

    Sudo ln -s /bin/<command> /home/<username>/bin/
    
  5. Beschränken Sie den Benutzer auf das Ändern von ~/.bashrc

    chattr +i /home/<username>/.bashrc
    

Dies ist besser, wenn Sie nur zulassen möchten, dass der Benutzer mehrere Befehle ausführt. Statt Aliasnamen aller möglichen Befehle festzulegen, um sie zu deaktivieren, setzen Sie nur einen symbolischen Link der Befehle, die Sie zulassen möchten. 

2
Victor Wong

Ich bin ein bisschen überrascht, dass noch niemand die native SSH-Funktionalität in seiner Antwort verwendet hat ... Ich weiß, dass ich 4 Jahre zu spät komme, aber es könnte trotzdem nützlich sein :)

Bei der Verwendung von SSH sollten Sie Schlüssel zum Anmelden verwenden. Da wir über die Sicherung eines Servers sprechen, sollte das Deaktivieren der Kennwortanmeldung eines der ersten Dinge sein, die Sie tun sollten. Bei der Verwendung von Schlüsseln können Sie also nur einen einzigen Befehl pro Schlüssel zulassen, indem Sie diesen in die Datei authorized_keys hinzufügen:

command="only" ssh-rsa AAABBBCC....

Der Befehl only ist eine Whitelisting-Funktion, mit der der Benutzer nur diese Befehle ausführen kann. Sie müssen auf Ihrem System/Ihren Systemen keine Ausnahmen machen, indem Sie die standardmäßigen binären Berechtigungen ändern (was eine Administrator-Hölle ist ...). Stellen Sie sicher, dass Sie die authorized_keys-Datei für den Benutzer als nicht schreibbar festgelegt haben.

Der einzige Befehl ist ein Skript, das in /usr/bin/ mit 775-Berechtigungen installiert werden muss.

Lesen Sie alles darüber: Der Only - Weg für erzwungene SSH-Befehle

Jetzt wissen Sie, wie es funktioniert. Sie können einfach alle Befehle auf die weiße Liste setzen, die Sie dem Benutzer erlauben:

command="only cal cowsay factor figlet fortune" ssh-rsa AAABBBCC....

Oder verwenden Sie eine .onlyrules-Datei mit der richtigen Syntax. Achten Sie darauf, keine gierigen Regex zu verwenden.

  ----------------------
  <   I'm restricted   >
  ----------------------
         \   ^__^ 
          \  (oo)\_______
             (__)\       )\/\
                 ||----w |
                 ||     ||
1
Robbert

In meiner Organisation war ich mit einer ähnlichen Situation konfrontiert, in der ich den Zugriff auf bestimmte Befehle beschränken musste.

Bisher habe ich 2 verschiedene Wege gefunden, um es zu tun.

  1. Der nur Ansatz
  2. Insgesamt eine andere Shell haben, nämlich. rbash , lshell , dockersh

Hier sind meine Gedanken dazu.

  1. Gehen Sie nur so vor, wenn Sie möchten, dass sich die Benutzer anmelden, einen bestimmten Befehl ausführen und dann die Shell vollständig beenden. Es ist besser, wenn Sie es mit Rbash koppeln.

  2. Von den drei Shells ist lshell meiner Meinung nach am einfachsten zu implementieren, insbesondere wenn Sie Ubuntu und seine Derivate verwenden. Sie müssen lediglich ein Paket über apt installieren und dann die Konfiguration bearbeiten. Es ist das einfachste.

Das rbash ist gut für grundlegende Dinge wie das Blockieren der Umleitung und bestimmte Zeichen auf dem CLI, aber um die fortgeschrittenen Dinge wie das Whitelisten bestimmter Befehle zu erledigen, müssten Sie die Extrameile gehen.

Dockersh ist ein völlig frischer und moderner Ansatz zur Einschränkung von Muscheln. Hier erlauben Sie alles, aber Sie beschränken die Aktion des Benutzers auf einen Container.

In meinem Anwendungsfall musste ich meine Benutzer auf einen einzigen Befehl beschränken, bei dem Shell-basierte Umleitung, Piping usw. deaktiviert waren. Daher entschied ich mich für lshell . Die Konfiguration dauerte kaum 5 Minuten. Finden Sie Details hier .

1
Shammi Shailaj