O gerenciamento de cgroups requer acesso root?

12

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

Estou tentando criar um grupo de controle usando o cgcreatecomando e parece que requer acesso root na máquina. Todos os exemplos que eu vi até agora não dizem nada sobre a necessidade de ser o usuário raiz 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. Pode ser qualquer usuário normal.

Rambo
fonte
1
O wiki.archlinux.org/index.php/Cgroups possui algumas informações, aparentemente você precisará de algumas configurações pelo root (ainda não olhou detalhadamente para mim no cgroups).
21515 Mat
Esse site não ajuda com os detalhes. É apenas uma visão geral de alto nível.
Rambo
1
Bem, ele diz que o root pode configurar grupos que são gerenciáveis ​​por usuários não root.
22415 Mat
Eu procurei extensivamente nos cgroups há algum tempo; essas informações podem ser úteis para você. No entanto, eu estava fazendo tudo como raiz, então não tenho a resposta para essa pergunta em particular.
Curinga
Você poderia fazer um grupo 'editcgroup', em seguida, permitir que todos nesse grupo a fazer 'sudo cgcreate' e 'sudo cgdelete'
John Militer

Respostas:

4

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

Isso está sendo feito com os parâmetros -ae -tdo cgcreatecomando (executado como root). Então, quando você configura um grupo. No meu caso:

cgcreate -t ​​monero: monero -a monero: monero -g memória, cpu: monerogroup

onde monero é o nome de usuário do futuro usuário que executará e executará o programa com as restrições do cgroup. Para a diferença fina entre os subparâmetros -ae, -tconsulte as páginas de manual de cgcreate.

man cgcreate

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

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

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

cgset -r cpu.shares = 128 monerogrupos

Marque suas entradas se desejar:

cgget -g memory: / monerogroup | bytes grep

E então, eventualmente, alterne o usuário, no meu caso, o usuário monero e da pasta correta:

cgexec -g memory, cpu: monerogroup ./monerod

O usuário não terá nenhuma dificuldade com as permissões ou então você o configurou especificamente para ele.

oceansailor
fonte
2

Implicações de segurança desta parte, você pode definir o setuidbit

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

para fornecer aos usuários não raiz que executam esse programa a capacidade de raiz.

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 associação ao grupo nesses arquivos para esse grupo:

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

Tudo isso seria executado pelo root, depois todos os usuários do cgusersgrupo executarão cgcreatee cgdeletecomo root em vez de como eles próprios. Você só precisa ter membros que você gostaria de ter esse poder no grupo certo.

Molho
fonte
1

Os Cgroups são finalmente tratados pelo (s) sistema (s) de arquivos cgroup. A capacidade de criar cgroups deve ser apenas a capacidade de criar diretórios sob esse / eles e gravar em arquivos. Se você montar os FSs do cgroup com permissões mais elaboradas ou alterar suas permissões rapidamente, determinados usuários deverão poder fazer as coisas. Obviamente, você não poderá adicionar os IDs do processo de outros usuários ao arquivo de tarefas. Você só poderá adicionar seu usuário.

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 cgroup que pode ser instruído a associar tarefas a um cgroup. Eu acredito que o cgmanager faz algo assim.

V13
fonte
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á maneira confiável de contornar isso.

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

Do 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}
William Sandin
fonte