Установка root -только прав доступа к файлам / dev и сборке двоичного файла - PullRequest
2 голосов
/ 14 января 2020

Как часть процесса сборки, я хочу выполнить следующие две команды:

sudo chmod a+r /dev/cpu/*/msr
sudo setcap cap_sys_rawio=ep ./bench

Это устанавливает файлы /dev/cpu/*/msr, представленные модулем ядра msr, на чтение для всех, и устанавливает дополнительные разрешения для двоичного файла ./bench (созданного как часть сборки), необходимого для чтения этих файлов.

Проблема заключается в том, что для этого требуются разрешения root, следовательно, sudo.

Я бы хотел что-то вроде скрипта setuid root, который выполняет эти две конкретные c вещи, но скрипты setuid root не рекомендуются и отключены в современных Linux.

Какие у меня есть варианты для простого решения?

Решение, которое работает только для второй строки (setcap), также интересно, потому что оно мне нужно для запуска каждый build, тогда как chmod нужно запускать только один раз за загрузку.

1 Ответ

3 голосов
/ 14 января 2020

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

#include <stdio.h>
#include <unistd.h>

int main(void) {
    char *const envp[] = {NULL};
    execle("/sbin/setcap", "setcap", "cap_sys_rawio=ep", "./bench", NULL, envp);
    perror("execle");
    return 1;
}

Примечания:

  • Это безопасно, поскольку оно игнорирует свою среду ( включая PATH) и не вызывает оболочку, но она все равно может быть запущена из любого места, поэтому нет гарантии, что именно является ./bench. Возможно, вы захотите жестко закодировать абсолютный путь.
  • Вы можете использовать один и тот же прием для запуска нескольких команд, но тогда вам нужно попасть в fork и wait. ( Не используйте system, так как это вызывает оболочку и отменяет цель запрета сценариев setuid!)
  • Вместо вызова двоичного файла setcap, вы можете использовать libcap работает вместо , но это будет немного сложнее.
  • Вы можете использовать glob для расширения /dev/cpu/*/msr, как это делает оболочка, если вы хотите выполнить первую часть, а затем stat и chown, чтобы избежать необходимости exec.
...