Dando aos usuários privilégios de planejamento

1

Eu tenho um código que usa sched_setscheduler de sched.h

sched_param sched;
sched.sched_priority = 70;
sched_setscheduler(getpid(), SCHED_FIFO, &sched);

No entanto, essa função falhará a menos que eu execute o aplicativo com sudo . Prefiro não executar o aplicativo com root privileges.

Existe uma maneira de eu conceder a um usuário ou processar acesso a essa função sem conceder permissões de root completas?

- Editar -

derobert deu uma ótima resposta sobre o uso de recursos. Em postinst , simplesmente adiciono:

setcap cap_sys_nice+ep /path/to/myapp

O problema aqui é:

bin$ ./myapp
./myapp error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory

O programa perde a capacidade de carregar dinamicamente bibliotecas a partir de $LD_LIBRARY_PATH ou (no meu caso) outras bibliotecas apontadas por rpath . Isso parece ser o comportamento pretendido . Existe uma maneira de contornar isso?

Eu tentei setcap cap_setpcap+ep myapp usando prctl(PR_CAPBSET_DROP, CAP_SETPCAP); antes de fazer qualquer carregamento dinâmico, mas isso não parece ajudar.

    
por Stewart 13.07.2018 / 12:37

2 respostas

0

Eu tenho uma solução, embora seja um pouco estranho e expõe um buraco no sistema operacional.

Durante postinst , I:

cp $(which chrt) bin/chrt
setcap cap_sys_nice+ep bin/chrt

Em seguida, no código, inicio um processo com:

bin/chrt -o -p 70 getpid()

O buraco que acabamos de expor é que qualquer um que use esta versão do chrt pode fazer isso sem privilégios de administrador. Como estou executando este é um ambiente de destino muito controlado, estou bem com esse buraco, mas eu não recomendaria a ele quem não tem controle sobre o ambiente de destino.

    
por 20.09.2018 / 15:01
1

Alterando seu agendador & a prioridade deve apenas precisar da capacidade CAP_SYS_NICE ; veja os Privilégios e limites de recursos do sched (7) . Provavelmente, você também vai querer consultar a manpage para sched_setscheduler , que menciona sched (7).

Existem algumas maneiras de dar ao seu programa essa capacidade; o mais fácil é provavelmente setcap :

# setcap cap_sys_nice=ep /usr/local/bin/your-program

Isso funciona de maneira semelhante ao set-user-id, mas é muito mais limitado (já que apenas fornece um recurso). Obviamente, o CAP_SYS_NICE dá ao programa permissão para travar o sistema (comendo todo o tempo da CPU com tarefas em tempo real).

Outras formas incluem o uso de um wrapper de execução como raiz (que baixa todas as outras permissões) ou elevação usando, por exemplo, RealtimeKit / PolicyKit.

(Para mais informações sobre capacidades, sugiro iniciar com as capacidades (7) ).

    
por 13.07.2018 / 13:26