Как ограничить пользовательские команды в Linux

У меня есть пользователь в группе: "demo".

Я хочу установить политику, согласно которой эти пользователи могут запускать 10 команд, таких как "vim", "nano", "cd" и т.д.

Или установите политику для доступа ко всем командам, кроме команд "ssh" и "cat".

Спасибо

Ответ 1

Есть много разных способов, которыми вы могли бы достичь этого. Я собираюсь перечислить одно из нескольких возможных решений.

Я бы предложил использовать несколько разных уровней защиты, чтобы запретить пользователям запускать команды, к которым им нельзя разрешить доступ. Все указания здесь предполагают, что у пользователей есть свой собственный каталог /home/[username], что их оболочкой является /bin/bash и вы хотели бы, чтобы они использовали оболочку bash при входе в систему.

1) Измените пользовательский bash на ограниченный режим bash, чтобы он не мог менять каталоги (если у вас нет ограниченного режима bash в вашей системе, эта ссылка поможет и предоставит вам больше информации) chsh -s/bin/rbash [username]

2) Измените права доступа к каталогу, чтобы только пользователь мог редактировать содержимое своего домашнего каталога.

chmod 755/home/[username]

3) Удалить пользовательский файл .bashrc

rm/home/[username]/.bashrc этом сайте есть больше информации о том, почему в такой ситуации было бы неплохо удалить .bashrc.

4) Создайте .bash_profile и добавьте "безопасные" псевдонимы для всех команд, которые вы хотите отключить.

Пример файла. /bash_profile

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

Пожалуйста, проверьте полный список команд bash для получения дополнительной информации. Вы должны убедиться, что команда alias alias="printf ''" является последней командой в списке, в противном случае вы утрачиваете способность создавать псевдонимы для всех этих команд.

Примечание. При выполнении приведенных ниже команд будет выполнен поиск почти всех доступных в вашей системе команд, а в готовом файле будут выведены все доступные команды с предварительным псевдонимом. Команда [ является test командой в bash. Так что, если вы видите это в файле, это не ошибка.

#search /bin and /usr/bin for any commands that exist on our system
ls /bin -1 > commands_on_system.txt && ls /usr/bin -1 >> commands_on_system.txt

#format and save this information to a bash variable
IFS=$'\n' GLOBIGNORE='*' command eval  'COMMANDS_ON_SYSTEM=($(cat ./commands_on_system.txt))'
IFS=$'\n' COMMANDS_ON_SYSTEM=($(sort <<<"${COMMANDS_ON_SYSTEM[*]}"))
unset IFS

#save these commands in aliased format for easy usage
for linux_command in "${COMMANDS_ON_SYSTEM[@]}"
do :
   #you can change how this works to automatically
   #setup the command file for you 
   echo "alias ${linux_command}=\"printf ''\"" >> ./startup_functions_for_beginners.sh
done

5) Отключите команды оболочки в vi, переведя команду vi в режим с ограничениями
Синтаксис alias vi="vi -Z", но, пожалуйста, посетите этот сайт для получения дополнительной информации.

6) Смена владельца пользователя .bash_profile на root
chown root:root/home/[username]/.bash_profile

7) Наконец, удалите права на запись для пользователя .bash_profile
chmod 755/home/[username/.bash_profile]

Теперь, когда пользователи входят в систему, они не смогут изменять каталоги, все команды, которые вы не хотите, чтобы они использовали, будут выводить ту же информацию, как если бы пользователь нажал [ENTER] без указания команды, и Ваши функции /bin/bash остаются неизменными.

В зависимости от того, какие функции вы выбираете или нет для псевдонима, пользователи могут обойти некоторые из реализованных вами элементов управления. Однако, поскольку мы внедрили несколько буферов безопасности, пользователю действительно нужно знать о компьютерных системах, чтобы делать какие-либо опасные действия.

Что касается связанной заметки и кое-что, что вы, возможно, захотите рассмотреть, если вы поместите эти псевдонимы непосредственно в каждый пользовательский .bash_profile вас будут трудности с поддержанием того, какие функции должны и не должны быть псевдонимами, и если вам нужно изменить псевдоним на что угодно вы должны будете поменять их все по отдельности. Кроме того, поскольку пользователи могут использовать vim или vi для просмотра файлов, они могут видеть содержимое своего .bash_profile и понимать, какие ограничения у них есть, а какие нет.

Чтобы обойти это, я бы предложил.

1) Поместить все псевдонимы в каталог, недоступный пользователям (вставьте содержимое .bash_profile здесь)

/[path_to_file]/startup_functions_for_beginners.sh

2) Извлечение псевдонимов в их .bash_profile

улучшен пример файла. /bash_profile

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

Это должно поставить вас на путь, но помните, что почти всегда есть способы обойти ограничения.

Кроме того, не стесняйтесь смешивать информацию в этом ответе, чтобы удовлетворить ваши потребности. Это, безусловно, может быть объединено с рядом других ограничений.

Q: Мне нужно, чтобы пользователи имели доступ к fg и bg, но я не хочу, чтобы они имели доступ к aptitude или 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  

Список общих команд согласно этому веб-сайту Гарварда (не исчерпывающий)

Когда вы устанавливаете программы в Linux, то, что у вас есть, меняется. Я предлагаю вам выполнить команды, перечисленные выше в шаге 4, чтобы помочь найти новые команды после их установки.

следует соблюдать осторожность с редакторами, поскольку некоторые из них позволяют выполнять команды оболочки из программы

nano
emacs
pico
sed
vi
vim  

Все остальное

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

Ответ 2

Я знаю, что опаздываю на вечеринку, на 2 года позже, но сейчас я наткнулся на обходной путь для вашей ситуации. У меня был пользователь, позвоните ему "test1", который должен был ограничить некоторые команды, например "su", но остальное должно быть доступно. Чтобы применить это ограничение, я просто использовал ACL (предположим, что вы активировали acls на вашем FS) в двоичном файле за самой командой:

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

Вышеупомянутая команда изменяет разрешения для этого конкретного двоичного файла, который на самом деле является командой "su", чтобы предоставить пользователю "test1" доступ только для чтения к этому файлу. Таким образом, когда пользователь "test1" пытается "выполнить" команду "su", он не может запустить script за ним и получает "Permission denied".

Просто запустите "which command_you_want_restricted", чтобы увидеть файл позади него.

Я тестировал этот метод на Red Hat 6.5 и 7, и он просто влияет на пользователя "test1", все остальные пользователи могут продолжать работать "su" по своему усмотрению.

Как для вас конкретный запрос:

"Или установите политику для доступа ко всем командам, кроме команд" ssh "и" cat ".

Вы можете сделать то же самое с ACL для группы "demo" в бинарных командах, которые вы хотите, но я НЕ ИСПЫТАЛ это с помощью групп, и я предлагаю вам попробовать его на тестовой виртуальной машине или что-то заранее.

Привет,

Ответ 3

Решение @Dodzi Dzakuma отлично подходит, если у вас есть только несколько команд, которые вы хотите отключить.

Однако, если вы хотите разрешить пользователю выполнять несколько команд, вот лучшее решение:

  1. Измените пользовательскую оболочку на bash с ограниченным доступом

    chsh -s /bin/rbash <username>
    
  2. Создайте каталог bin в домашнем каталоге пользователя

    sudo mkdir /home/<username>/bin
    sudo chmod 755 /home/<username>/bin
    
  3. Измените ПУТЬ пользователя по умолчанию на каталог bin

    echo "PATH=$HOME/bin" >> /home/<username>/.bashrc
    echo "export PATH >> /home/<username>/.bashrc
    
  4. Создайте символические ссылки на команды, которые требуются пользователю

    sudo ln -s /bin/<command> /home/<username>/bin/
    
  5. Запретить пользователю изменять ~/.bashrc

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

Это лучше, если вы хотите разрешить пользователю только запускать несколько команд, потому что вместо установки псевдонимов команд ALL для отключения вы устанавливаете только символическую ссылку команд, которые вы хотите разрешить.

Ответ 4

Стандартный ответ - использовать ограниченную оболочку, сделав последнюю запись в файле паролей для пользователей этой группы. Поскольку вы можете запускать внешние команды из таких вещей, как vim: http://web.physics.ucsb.edu/~pcs/apps/editors/vi/vi_unix.html

это не кажется отличной идеей, если вы пытаетесь создать ограниченную среду. Первое, что пользователь мог бы сделать, это использовать команды в приведенной выше ссылке для запуска /bin/bash, и он будет находиться за пределами ограниченной среды.

Лучшей идеей было бы ввести каждый пользователь в систему в тюрьму chroot или, возможно, в легкий контейнер (так что если они сломают что-либо, это их собственный контейнер). Посмотрите на Docker - http://docker.io.

Ответ 5

Я немного удивлен, что никто еще не использовал встроенную функциональность SSH в своем ответе... Я знаю, что я опоздал на 4 года, но это все еще может быть удобно :)

При использовании SSH вы должны использовать ключи для входа в систему; поскольку мы говорим о защите сервера, отключение входа по паролю должно быть одной из первых вещей, которые вы должны сделать. Таким образом, поскольку вы используете ключи, теперь у вас есть возможность разрешить только одну команду на ключ, добавив ее в файл authorized_keys:

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

only команда - это функция белого списка, которая позволяет пользователю выполнять только эти команды. Вам не нужно делать исключения в своих системах, изменяя двоичные разрешения по умолчанию (это адский ад...). Убедитесь, что вы установили в authorized_keys файл будет незаписываемой для пользователя.

Единственная команда - это скрипт, который должен быть установлен в /usr/bin/ с разрешениями 775.

Прочитайте все об этом: Единственный способ для принудительных команд SSH

Теперь, когда вы понимаете, как это работает, вы можете просто внести в белый список любую команду, которую вы позволите пользователю выполнить:

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

Или используйте файл .onlyrules с правильным синтаксисом, будьте осторожны, чтобы не использовать никаких жадных регулярных выражений.

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

Ответ 6

Я сталкивался с подобной ситуацией в своей организации, где мне приходилось ограничивать доступ людей только к определенным командам.

До сих пор я нашел 2 разных способа сделать это.

  1. Единственный подход
  2. Наличие другой оболочки в целом, а именно. рбаш, лшелл, докерш

Вот мои мысли о том же.

  1. Используйте единственный подход, если вы хотите, чтобы пользователи вошли в систему и выполнили определенную команду, а затем полностью покинули оболочку. Лучше вам соединить это с Rbash.

  2. Мне кажется, что из трех оболочек lshell будет проще всего реализовать, особенно если вы работаете в Ubuntu и ее производных. Вам просто нужно установить пакет через apt и затем отредактировать конфигурацию. Это самое простое.

Rbash хорош для базовых вещей, таких как блокирование перенаправления и определенных символов в кли, но для выполнения сложных вещей, таких как внесение в белый список определенных команд, вам нужно пройти лишнюю милю.

Dockersh - это совершенно новый и современный подход к ограничению оболочек. Здесь вы разрешаете все, но вы ограничиваете все действия пользователя контейнером.

В моем случае я должен был ограничить количество пользователей одной командой с отключенным перенаправлением на основе оболочки, отключением конвейера и т.д. Поэтому я выбрал lshell. Потребовалось почти 5 минут для настройки. Найти подробности здесь.

Ответ 7

Можете ли вы сказать мне, как я могу предотвратить конкретные команды, такие как следующие

Это не должно позволять git pull git push

Следует разрешить статус мерзавца

Я пробовал много вещей... но из-за пробела между двумя словами псевдоним рассматривает это как команду. и который не работает для меня.

Я применил следующие изменения в .bash_profile, но все не работает.

Не работает для страшного в git-статусе do alias $ scary = "echo 'not support'" done