LINUX.ORG.RU

shell suid


0

1

Добрый день.

Система linux RedHat 5.5.

Пытаюсь красиво обойти проблему установки SUID/SGID бита на шелл-скрипты (что, как известно не работает). sudo использовать не хочется.

Задача: разрешить пользователям, входящим в некую группу убивать (kill, kill -9) процессы, принадлежащие другим пользователям этой же группы.

Написал простой шелл testkill.sh:

#!/bin/bash
if [ $1 -gt 1 ] && [ $1 -lt 65535 ]
        then
                /bin/kill $1
        else
                echo "usage testkill <process>"
fi

Далее, в сети нашел некий компилятор шелл-скриптов — http://www.datsi.fi.upm.es/~frosal/sources/shc.html, создал с помощью него исполняемый бинарник:

//то, что получилось - действительно бинарник
# file testkill.sh.x
testkill.sh.x: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

//установлен suid-бит
# ls -l testkill.sh.x
-rwsrwxr-x 1 test  test  9456 Sep  1 13:13 testkill.sh.x

//я вхожу в ту же группу, в которую входит хозяин процесса (test)
[tolik@srv1 ~]$ id
uid=500(tolik) gid=500(tolik) groups=500(tolik),603(test)

//узнаю PID, который хочу убить
[tolik@srv1 ~]$ ps -ef | grep ping
test      10975 10518  0 13:32 pts/0    00:00:00 ping localhost

//пытаюсь убить процесс
[tolik@srv1 ~]$ /test/testkill.sh.x 10975
kill 10975: Operation not permitted

Как видно, установка suid-бита на бинарник все равно игнорируется и я получаю «Operation not permitted»

Сам бинарник лежит в ФС, примонтированной без_опции nosuid.

Есть соображения, в чем может быть моя ошибка или может подскажете какой-нибудь другой рабочий вариант?


badwm> sudo использовать не хочется.

дурак

sdio ★★★★★ ()

#!/bin/bash -p И не нужен никакой компилятор.

Также, плюсую предыдущего комментатора.

anonymous ()
Ответ на: комментарий от sdio

sudo не хочется использовать по той причине, что PID убиваемого процесса заранее неизвестен, а давать права через sudo на kill любого процесса в системе не очень хорошо.

badwm ()
Ответ на: комментарий от badwm

Вот и пишите скрипт, который будет запускаться через sudo. В скрипте сделайте какие угодно проверки. А то, что вы сейчас написали, убивает любой скрипт, но если будет запущено от рута. А чтобы оно запустилось от рута, нужно сделать рута его владельцем и поставить SUID-бит.

mky ★★★★★ ()
Ответ на: комментарий от badwm

>sudo не хочется использовать по той причине, что PID убиваемого процесса заранее неизвестен, а давать права через sudo на kill любого процесса в системе не очень хорошо.

man sudoers

%группа ALL = (test) NOPASSWD: /bin/kill
#Юзеры из этой группы могут выполнять sudo -u test kill ... без ввода пароля.

nnz ★★★★ ()
Ответ на: комментарий от nnz

смена владельца бинарника на root'а и suid-бит делу не помог, uid во время его выполнения, почему-то не меняется (вставил вызов id перед kill):

[root@srv1 test]# ls -l testkill.sh.x
-rwsr-xr-x 1 root root 9416 Sep  1 18:07 testkill.sh.x

[tolik@srv1 ~]$ /test/testkill.sh.x 10975
uid=500(tolik) gid=500(tolik) groups=500(tolik),603(test)
kill 10975: Operation not permitted

nnz, спасибо, скорее всего так и сделаю.

Сейчас для меня уже вопрос стоит даже не столько в решении задачи, сколько в понимании процесса, касающегося suid-бита. Хочется разобраться таки, почему изначально предложенный мой подход не работает (почему не подменяется uid).

Если у кого-нибудь есть какие-нибудь мысли по этому поводу, поделитесь.

badwm ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.