web-dev-qa-db-fra.com

Comment limiter les commandes utilisateur sous Linux

J'ai un utilisateur dans un groupe: "démo".

Je veux définir la politique selon laquelle cet utilisateur peut exécuter 10 commandes, telles que "vim", "nano", "cd", etc.

Ou, configurez la stratégie pour avoir accès à toutes les commandes sauf les commandes "ssh" et "cat".

Merci

12
mortezaipo

Vous pouvez y parvenir de nombreuses façons. Je vais énumérer l'une des solutions possibles.

Je proposerais d'utiliser plusieurs couches de protection différentes pour empêcher les utilisateurs d'exécuter les commandes auxquelles ils ne devraient pas être autorisés à accéder. Toutes les instructions ici supposent que les utilisateurs ont leur propre répertoire /home/[username], que leur shell est /bin/bash et que vous souhaitez qu'ils utilisent le shell bash lorsqu'ils se connectent au système.

1) Changez le bash de l'utilisateur en mode bash restreint pour qu'il ne puisse pas changer de répertoire (si vous n'avez pas de mode bash restreint sur votre système , ce lien vous aidera et vous donnera plus d’informations) chsh -s/bin/rbash [nom d'utilisateur]

2) Modifier les autorisations du répertoire afin que seul l'utilisateur puisse modifier le contenu de son répertoire de base

chmod 755 /home/[username]

3) Supprimer le fichier .bashrc de l'utilisateur

rm /home/[username]/.bashrcCe site explique plus en détail pourquoi il peut être judicieux de supprimer le .bashrc dans cette situation.

4) Créez un .bash_profile et ajoutez des alias "sûrs" pour toutes les commandes que vous souhaitez désactiver.

./ Exemple de fichier bash_profile

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 ''"  

A s'il vous plaît vérifier la liste complète des commandes bash pour plus d'informations. Vous devez vous assurer que la commande alias alias="printf ''" est la dernière commande de la liste, sinon vous perdez votre capacité à créer un alias pour toutes ces commandes.

5) Désactiver les commandes Shell dans vi en créant un alias de la commande vi en mode restreint
La syntaxe est alias vi="vi -Z", mais veuillez consulter ce site pour plus d'informations.

6) Changez la propriété de l'utilisateur .bash_profile en root
chown root:root /home/[username]/.bash_profile

7) Enfin, supprimez les autorisations d'écriture sur l'utilisateur .bash_profile
chmod 755 /home/[username/.bash_profile]

Désormais, lorsque les utilisateurs se connecteront, ils ne pourront plus modifier les répertoires. Toutes les commandes que vous ne souhaitez pas utiliser produiront les mêmes informations que si l'utilisateur appuyait sur la touche [ENTER] sans qu'aucune commande ne soit spécifiée. et vos fonctions /bin/bash restent intactes.

Selon les fonctions que vous choisissez ou non d'alias de cette façon, les utilisateurs peuvent toujours être en mesure de contourner certains des contrôles que vous avez mis en œuvre. Cependant, depuis que nous avons implémenté quelques tampons de sécurité, l’utilisateur aurait vraiment besoin de connaître les systèmes informatiques pour faire tout ce qui est dangereux.

Sur une note connexe et sur quelque chose que vous voudrez peut-être prendre en compte, si vous placez directement ces alias dans le .bash_profile de chaque utilisateur, vous auriez de la difficulté à gérer les fonctions qui devraient et ne devraient pas être alias, et si vous en avez besoin changez le pseudonyme sur tout ce que vous auriez à changer individuellement. De plus, étant donné que les utilisateurs peuvent utiliser vim ou vi pour afficher des fichiers, ils peuvent voir le contenu de leur .bash_profile et comprendre quelles restrictions ils ont et n'ont pas.

Pour contourner cela, je suggérerais.

1) Mettre tous les alias dans un répertoire non accessible aux utilisateurs (collez le contenu du .bash_profile ici)

/[path_to_file]/startup_functions_for_beginners.sh

2) Rechercher les alias dans leur .bash_profile

exemple amélioré de fichier ./bash_profile

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

Cela devrait vous mettre sur la bonne voie, mais souvenez-vous qu’il existe presque toujours des moyens de contourner les restrictions.

Aussi, n'hésitez pas à remixer les informations contenues dans cette réponse pour répondre à vos besoins. Celles-ci peuvent très certainement être combinées à un certain nombre d'autres restrictions.

Q: J'ai besoin que les utilisateurs aient accès à fg et bg, mais je ne veux pas qu'ils puissent accéder à aptitude ou bash

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 des commandes courantes selon ce site Web de Harvard (NON EXHAUSTIVE)

les éditeurs doivent faire preuve de prudence, car certains permettent l’exécution de commandes Shell à partir du programme

nano
emacs
pico
sed
vi
vim  

Tout le reste

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

Je sais que je suis en retard à la fête, avec 2 ans de retard en fait, mais je suis tombé sur une solution de contournement pour votre situation tout à l'heure ... J'ai un utilisateur, appelons-le "test1" qui nécessitait la limitation de certaines commandes comme "su", mais le reste devrait être disponible . Pour appliquer cette restriction, je viens d'utiliser ACL (en supposant que vous avez activé acls sur votre système de fichiers) sur le fichier binaire derrière la commande, comme suit:

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

La commande ci-dessus modifie les autorisations pour ce fichier binaire spécifique, qui est en fait la commande "su", pour accorder à l'utilisateur "test1" uniquement un accès en lecture à ce fichier. En tant que tel, lorsque l'utilisateur "test1" tente d'exécuter la commande "su", il ne peut pas exécuter le script qu'il contient et obtient le message "Autorisation refusée".

Il suffit d’exécuter "which command_you_want_restricted" pour voir le fichier derrière.

J'ai testé cette méthode sur Red Hat 6.5 et 7 et cela n'affecte que l'utilisateur "test1". Tous les autres utilisateurs peuvent continuer à exécuter "su" à volonté.

Quant à votre demande spécifique:

"Ou bien, configurez la stratégie pour avoir accès à toutes les commandes sauf les commandes" ssh "et" cat "."

Vous pouvez faire la même chose avec les ACL pour le groupe "démo" sur les binaires de commande de votre choix, mais je n'ai pas testé cela avec des groupes et je vous suggère de l'essayer sur un test VM ou autre chose à l'avance.

Cordialement,

7
AnythingIsFine

La réponse standard serait d'utiliser un shell restreint, ce qui en fait la dernière entrée du fichier de mots de passe pour les utilisateurs de ce groupe. Comme vous pouvez exécuter des commandes externes telles que vim: http://web.physics.ucsb.edu/~pcs/apps/editors/vi/vi_unix.html

cela ne semble pas une bonne idée si vous essayez de créer un environnement restreint. La première chose qu’un utilisateur puisse faire est d’utiliser les commandes du lien ci-dessus pour exécuter /bin/bash et il se trouverait en dehors de l’environnement restreint.

Une meilleure idée serait de mettre les identifiants de connexion de chaque utilisateur dans une prison chroot ou peut-être un conteneur léger (ainsi, s’ils cassent quelque chose, c’est leur propre conteneur). Regardez Docker - http://docker.io .

5
abligh

La solution @Dodzi Dzakuma est excellente si vous ne souhaitez désactiver que quelques commandes.

Toutefois, si vous souhaitez uniquement autoriser l'utilisateur à exécuter plusieurs commandes, voici une meilleure solution:

  1. Changer le shell utilisateur en bash restreint

    chsh -s /bin/rbash <username>
    
  2. Créer un répertoire bin sous le répertoire de base de l'utilisateur

    Sudo mkdir /home/<username>/bin
    Sudo chmod 755 /home/<username>/bin
    
  3. Changer le PATH par défaut de l'utilisateur dans le répertoire bin

    echo "PATH=$HOME/bin" >> /home/<username>/.bashrc
    echo "export PATH >> /home/<username>/.bashrc
    
  4. Créer des liens symboliques des commandes dont l'utilisateur a besoin

    Sudo ln -s /bin/<command> /home/<username>/bin/
    
  5. Empêcher l'utilisateur de modifier ~/.bashrc

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

Cela est préférable si vous souhaitez uniquement autoriser l'utilisateur à exécuter plusieurs commandes car au lieu de définir des alias de TOUTES les commandes possibles pour les désactiver, vous ne définissez qu'un lien symbolique des commandes à autoriser. 

2
Victor Wong

Je suis un peu surpris que personne n'ait encore utilisé la fonctionnalité SSH native dans sa réponse ... Je sais que j'ai 4 ans de retard, mais ça pourrait quand même être pratique :)

Lorsque vous utilisez SSH, vous devez utiliser des clés pour vous connecter. comme nous parlons de sécuriser un serveur, la désactivation de la connexion par mot de passe devrait être l'une des premières choses à faire. Donc, comme vous utilisez des clés, vous avez maintenant la possibilité de n'autoriser qu'une seule commande par clé en l'ajoutant dans le fichier allowed_keys:

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

La commande only est une fonction de liste blanche qui permet à l'utilisateur de n'exécuter que ces commandes. Il n'est pas nécessaire de faire des exceptions sur votre système en modifiant les autorisations binaires par défaut (ce qui est un enfer d'administrateur ..). Assurez-vous que le fichier authorized_keys est non inscriptible pour l'utilisateur.

La seule commande est un script qui doit être installé dans /usr/bin/ avec les autorisations 775.

Lisez tout sur elle: La seulement voie pour les commandes forcées SSH

Maintenant que vous comprenez comment cela fonctionne, vous pouvez simplement ajouter à la liste blanche toute commande que vous autorisez l'utilisateur à exécuter:

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

Ou utilisez un fichier .onlyrules avec la syntaxe appropriée, veillez à ne pas utiliser de regex glouton.

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