LINUX.ORG.RU
решено ФорумAdmin

iotop и capabilities


1

1

С какой-то недавней версии iotop перестал запускаться от пользователя с ошибкой:

Netlink error: Operation not permitted (1)
iotop requires root or the NET_ADMIN capability.
Ну только от рута запускать - не вариант, поэтому решил разобраться с capabilities:
setcap cap_net_admin+ep /usr/bin/iotop
Однако никакого эффекта это не действие не возымело. Однако если сделать так с питоном (iotop на питоне написан):
setcap cap_net_admin+ep /usr/bin/python2.7
то всё работает.

Собственно, вопрос: а можно ли всё-таки сделать так, чтобы cap_net_admin была только у iotop'а, а не у всех скриптов, запускаемых питоном?

★★★★★

скопировать /usr/bin/python2.7 в /usr/bin/python2.7-cap1 ,

сделать setcap cap_net_admin+ep /usr/bin/python2.7-cap1

пропатчить первую строчку iotop с #!/usr/bin/python2.7 на #!/usr/bin/python2.7-cap1

?

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

Костыли-костылики, это было первое, что пришло в голову.

Ну это конечно не совсем костыли ... но не очень красивое решение. С другой стороны ждем еще решений :D

Надо покопать в строну враппера вроде sudo, но с capabilites

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

Можно написать однострочник на Си, делающий exec(«iotop»), скомпилить и дать ему NET_ADMIN capability. Тогда хотябы не должно быть проблем с пакетами/обновлениями.

mky ★★★★★
()

Меня больше интересует, почему установка capabilities не влияет на скрипты. Понятно, что скрипт выполняется интерпретатором, но почему capabilities скрипта не передаются интерпретатору?

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

i - inheritable - наследуемый, а не наследующий. По логике вещей этот флаг нужно устанавливать на wrapper, а не на python.

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

man

Inheritable:

This is a set of capabilities preserved across an execve(2). It provides a mechanism for a process to assign capabilities to the permitted set of the new program during an execve(2).

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

У меня получился не совсем однострочник:

#include <unistd.h>
#include <stdio.h>
#include <sys/capability.h>

int main ()
{
  cap_t cap_net_admin;
  int ret;
  cap_net_admin = cap_from_text ("cap_net_admin+i");
  ret = cap_set_proc (cap_net_admin);
  if (ret)
    {
      perror ("cap_set_proc");
      goto the_end;
    }
  ret = execl ("/usr/bin/python2.7", "python2.7", "/usr/bin/iotop", (char *) 0);
the_end:
  return ret;
}


На этот файл нужно установить  cap_setpcap+ep, на python2.7 cap_net_admin+ei
anarquista ★★★★★
()
Ответ на: комментарий от tiandrey

Установка на wrapper ничего не даст, нужно именно на python ставить. i на файле имеет смысл, только когда и процесс, выполняющий этот файл, имеет i.

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

Да, работа с capabilities оказалась сложнее, чем я думал. Спасибо!

За сим вопрос, наверное, следует закрыть.

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

Не так ужь и сложно.

Довольно простой способ это использовать pam. Пропишите себе, своему пользователю, inheritable cap_net_admin в capability.conf и установите cap_net_admin+ei на некоторые исполняемые файлы (/usr/bin/python).

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

Пользователь, для которого при аутентификации, в файле capability.conf выставлено i, сможет запускать с привилегиями файлы, для которых высталено +ei.

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

Я бы написал без проверок, всё одно, если cap-функции не сработают, ничего страшного не произойдёт, да и, вроде, можно делать exec() на скрипт.

int main (int argc, char *argv[], char *envp[]){
    cap_set_proc (cap_from_text ("cap_net_admin+i"));
    return execve("/usr/bin/iotop", argv, envp);
}

Компилировать с "-lcap", поместить под именем iotop в home пользователя. Установить capabilities на этот файл и на python как написано у вас.

Правда, обновление питона, наверное, удалит выставленные capabilities на файл /usr/bin/python2.7.

Выставлять через PAM я бы не рекомендовал, ведь тогда пользователь сможет запускать питон с NET_ADMIN, причём на выполнение любого скрипта, в том числе, изменяющего конфигурацию интерфейсов.

Получается, что проще вызвать iotop через sudo.

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

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

Насчёт настройки через PAM полностью согласен, собственно, для этого тему и создавал, так-то можно было просто оставить cap_net_admin+ep на питоне, и всё.

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