O gerenciamento de cgroups requer acesso root?

11

Estou tentando trabalhar com grupos de controle em dois sistemas operacionais diferentes (Ubuntu e CentOS). Há poucas preocupações que gostaria de fazer.

Estou tentando criar um grupo de controle usando o comando cgcreate e parece que ele requer acesso root na máquina. Todos os exemplos que vi até agora não dizem nada sobre a necessidade de ser o usuário root para criar ou modificar grupos de controle.

É realmente necessário ser o usuário root? O objetivo final é escrever um aplicativo C ++ que crie e gerencie grupos de controle para controlar recursos usando a API libcgroup. Mas o aplicativo C ++ não será executado por nenhum usuário root. Poderia ser qualquer usuário normal.

    
por Rambo 21.04.2015 / 21:53

4 respostas

2

Implicações de segurança disso, você pode definir o setuid bit

chmod +s /bin/cgcreate
chmod +s /bin/cgdelete

para fornecer aos usuários não-raiz que executam o poder da raiz do programa.

A recomendação seria remover o acesso normal do usuário

chmod 550 /bin/cgcreate
chmod 550 /bin/cgdelete

e crie um grupo especial que você deseja permitir usar o cgcreate IE cgusers ,

groupadd cgusers

e altere a participação do grupo nesses arquivos para esse grupo:

chgrp cgusers /bin/cgcreate
chgrp cgusers /bin/cgdelete

Tudo isso seria executado pelo usuário root. Depois disso, todos os usuários do grupo cgusers executarão cgcreate e cgdelete como raiz, e não como eles próprios. Você só precisa ter membros que gostaria de ter esse poder no grupo certo.

    
por 23.09.2015 / 00:37
2

O cenário normal é que você defina cgcreate , cgset , cgdelete , cgget , etc. como raiz . Eventualmente, o programa / script que deveria ser impedido de sugar para muitos recursos será executado como um usuário normal. Então, configure como root, use e execute como usuário.

Isso está sendo feito com os parâmetros -a e -t do comando cgcreate (executado como root). Então, quando você define um grupo. No meu caso:

cgcreate -t monero:monero -a monero:monero -g memory,cpu:monerogroup

em que monero é o nome de usuário do usuário futuro que executará e executará o programa com as restrições do cgroup. Para a pequena diferença entre os subparâmetros -a e -t , consulte as man pages de cgcreate .

man cgcreate

Na maioria dos casos, é o mesmo usuário.

Em seguida, configure as restrições (ainda como root):

cgset -r memory.limit_in_bytes=$((4*1024*1024*1024)) monerogroup

cgset -r cpu.shares=128 monerogroup

Verifique suas entradas se você quiser:

cgget -g memory:/monerogroup | grep bytes

E, eventualmente, mude de usuário, no meu caso, usuário monero, e da pasta correta:

cgexec -g memory,cpu:monerogroup ./monerod

O usuário não terá qualquer dificuldade com permissões ou algo assim conforme você o configura especificamente para ele.

    
por 07.09.2018 / 23:21
1

Os grupos em última instância são manipulados através do (s) sistema (s) de arquivos cgroup. A capacidade de criar cgroups deve ser simplesmente a capacidade de criar diretórios sob eles e gravar em arquivos. Se você montar as FSs do cgroup com permissões mais elaboradas, ou se você alterar suas permissões rapidamente, certos usuários devem ser capazes de fazer coisas. Obviamente, você não poderá adicionar os IDs de processo do processo de outros usuários ao arquivo de tarefas. Você só poderá adicionar seus usuários.

Dito isto, não tenho certeza se o acima é global. Ou seja há uma chance de que certos cgroups não suportem isso.

No geral, a melhor abordagem é usar um gerenciador de cgroups que pode ser instruído a associar tarefas a um cgroup. Eu acredito que o cgmanager faz algo assim.

    
por 23.09.2015 / 01:07
1

Resposta curta é não.

Para criação e atribuição de propriedade de um cgroup, você depende dos privilégios de root. Não há uma maneira confiável de contornar isso.

No entanto, você pode criar um cgroup e atribuir a propriedade a um determinado usuário ou grupo.

Utilizador

$ u=$(whoami)
$ sudo mkdir /sys/fs/cgroup/cpuset/${u}
$ sudo chown -R ${u}: /sys/fs/cgroup/cpuset/${u}

Grupo

$ g=MYGROUP && grep ^${g}: /etc/group || echo "Your group doesn't exist. Run \"mkgroup $g\" and repeat this command before you continue." 
$ sudo mkdir /sys/fs/cgroup/cpuset/${g}
$ sudo chgrp -R ${g} /sys/fs/cgroup/cpuset/${g}
    
por 27.06.2017 / 20:21