Contadores de LXC não proveninados aninhados de Upstart que seu dono pode parar -- 14.04 campo com lxc campo com cgroup campo com unprivileged camp askubuntu Relacionado O problema

Nested unprivilaged lxc containers from upstart that its owner can stop


5
vote

problema

português

Em um host em execução ubuntu 14.04.5 lts Eu tenho um usuário chamado ci que pode criar um início de contêineres LXC sem reservas também executando ubuntu 14.04.5 lts . O usuário tem o intervalo subconjunto 200000-231071 . O arquivo de configuração de tal contêiner é:

  # Distribution configuration lxc.include = /usr/share/lxc/config/ubuntu.common.conf lxc.include = /usr/share/lxc/config/ubuntu.userns.conf lxc.arch = x86_64  # Nested lxc.mount.auto = cgroup lxc.aa_profile = lxc-container-default-with-nesting  # Container specific configuration lxc.id_map = u 0 200000 65536 lxc.id_map = u 100000 265536 65536 lxc.id_map = g 0 200000 65536 lxc.id_map = g 100000 265536 65536 lxc.rootfs = /home/ci/.local/share/lxc/ci/rootfs lxc.utsname = ci  # Network configuration lxc.network.type = veth lxc.network.flags = up lxc.network.link = lxcbr0 lxc.network.hwaddr = 00:16:3e:dd:f1:99    

O usuário pode criar e iniciar o contêiner improvilado sem problemas:

  ci@host:~$ lxc-create -t download -n ci -- -d ubuntu -r trusty -a amd64 ci@host:~$ lxc-start -n ci -d ci@host:~$ lxc-ls --fancy     NAME  STATE    IPV4                 IPV6  AUTOSTART     ---------------------------------------------------     ci    RUNNING  10.0.3.75, 10.0.4.1  -     NO    

No host, cgmanager está em execução:

  root@host ~ # ps ax | grep cgmanager     382 ?        Ss     0:01 /sbin/cgmanager --sigstop -m name=systemd    

no recipiente não provenjado ci , cgproxy está em execução:

  root@ci:~# ps ax | grep cgproxy     288 ?        Ss     0:00 /sbin/cgproxy --sigstop    

No recipiente não provenjado ci , um usuário nomeado jenkins com as faixas subconjuntas 100000-65535 pode criar e iniciar recipientes não perturbados dentro dele, ou seja, recipientes aninhados não perturbados, mas não sem alguns truques, que são:

    .
  1. Após o login com ssh como usuário jenkins no contêiner improvilado ci , o resultado de cat /proc/self/cgroup é:

      jenkins@ci:~$ cat /proc/self/cgroup     12:hugetlb:/user/1012.user/11.session/lxc/ci     11:net_prio:/user/1012.user/11.session/lxc/ci     10:perf_event:/user/1012.user/11.session/lxc/ci     9:net_cls:/user/1012.user/11.session/lxc/ci     8:freezer:/user/1012.user/11.session/lxc/ci     7:devices:/user/1012.user/11.session/lxc/ci     6:memory:/user/1012.user/11.session/lxc/ci     5:blkio:/user/1012.user/11.session/lxc/ci     4:name=systemd:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     3:cpuacct:/user/1012.user/11.session/lxc/ci     2:cpu:/user/1012.user/11.session/lxc/ci     1:cpuset:/user/1012.user/11.session/lxc/ci    
  2. Neste ponto, jenkins pode criar um contêiner, mas não pode iniciá-lo:

      jenkins@ci:~$ lxc-create -t download -n test -- -d ubuntu -r trusty -a amd64 jenkins@ci:~$ lxc-start -n test     lxc_container: cgmanager.c: lxc_cgmanager_create: 301 call to cgmanager_create_sync failed: invalid request     lxc_container: cgmanager.c: lxc_cgmanager_create: 303 Failed to create hugetlb:lxc/test     lxc_container: cgmanager.c: cgm_create: 650 Error creating cgroup hugetlb:lxc/test     lxc_container: start.c: lxc_spawn: 891 failed creating cgroups     lxc_container: start.c: __lxc_start: 1121 failed to spawn 'test'     lxc_container: lxc_start.c: main: 341 The container failed to start.     lxc_container: lxc_start.c: main: 345 Additional information can be obtained by setting the --logfile and --logpriority options.    
  3. Eu emitem no recipiente como root:

      restart systemd-logind    
  4. Agora como usuário jenkins no contêiner, eu saio e login novamente com ssh . O Cgroup mudou e agora posso criar e executar um contêiner:

      jenkins@ci:~$ cat /proc/self/cgroup     12:hugetlb:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     11:net_prio:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     10:perf_event:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     9:net_cls:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     8:freezer:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     7:devices:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     6:memory:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     5:blkio:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     4:name=systemd:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     3:cpuacct:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     2:cpu:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     1:cpuset:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session jenkins@ci:~$ lxc-create -t download -n test -- -d ubuntu -r trusty -a amd64 jenkins@ci:~$ lxc-start -n test -d jenkins@ci:~$ lxc-ls --fancy     NAME     STATE    IPV4       IPV6  AUTOSTART     --------------------------------------------     test     RUNNING  10.0.4.64  -     NO    

primeira pergunta : por que eu preciso restart systemd-logind e como posso evitar digitá-lo como raiz antes de ser capaz de criar recipientes não provenientes aninhados?

no recipiente ci , eu criei um arquivo de configuração de inicialização (um arquivo confiante upstart em /etc/init/jenkins.conf ) para executar o software Jenkins como usuário jenkins :

  ci@host:~$ lxc-create -t download -n ci -- -d ubuntu -r trusty -a amd64 ci@host:~$ lxc-start -n ci -d ci@host:~$ lxc-ls --fancy     NAME  STATE    IPV4                 IPV6  AUTOSTART     ---------------------------------------------------     ci    RUNNING  10.0.3.75, 10.0.4.1  -     NO 0   

no script que o processo jenkins problemas para iniciar um chamado jenkins 'construir , se eu adicionar a linha:

  ci@host:~$ lxc-create -t download -n ci -- -d ubuntu -r trusty -a amd64 ci@host:~$ lxc-start -n ci -d ci@host:~$ lxc-ls --fancy     NAME  STATE    IPV4                 IPV6  AUTOSTART     ---------------------------------------------------     ci    RUNNING  10.0.3.75, 10.0.4.1  -     NO 1   

O script pode criar e iniciar recipientes aninhados não perturbados, sendo seu cgroup:

  ci@host:~$ lxc-create -t download -n ci -- -d ubuntu -r trusty -a amd64 ci@host:~$ lxc-start -n ci -d ci@host:~$ lxc-ls --fancy     NAME  STATE    IPV4                 IPV6  AUTOSTART     ---------------------------------------------------     ci    RUNNING  10.0.3.75, 10.0.4.1  -     NO 2   

Mas um usuário jenkins logado com ssh não pode parar o contêiner criado pelo script. O seguinte nunca termina:

  ci@host:~$ lxc-create -t download -n ci -- -d ubuntu -r trusty -a amd64 ci@host:~$ lxc-start -n ci -d ci@host:~$ lxc-ls --fancy     NAME  STATE    IPV4                 IPV6  AUTOSTART     ---------------------------------------------------     ci    RUNNING  10.0.3.75, 10.0.4.1  -     NO 3   

segunda pergunta : como posso conseguir que o usuário jenkins pode parar qualquer contêiner criado pelo usuário jenkins de um script init como o acima?

english

In a host running Ubuntu 14.04.5 LTS I have an user named ci that can create an start unprivilaged lxc containers also running Ubuntu 14.04.5 LTS. The user has the subid range 200000-231071. The configuration file of such a container is:

# Distribution configuration lxc.include = /usr/share/lxc/config/ubuntu.common.conf lxc.include = /usr/share/lxc/config/ubuntu.userns.conf lxc.arch = x86_64  # Nested lxc.mount.auto = cgroup lxc.aa_profile = lxc-container-default-with-nesting  # Container specific configuration lxc.id_map = u 0 200000 65536 lxc.id_map = u 100000 265536 65536 lxc.id_map = g 0 200000 65536 lxc.id_map = g 100000 265536 65536 lxc.rootfs = /home/ci/.local/share/lxc/ci/rootfs lxc.utsname = ci  # Network configuration lxc.network.type = veth lxc.network.flags = up lxc.network.link = lxcbr0 lxc.network.hwaddr = 00:16:3e:dd:f1:99 

The user can create and start the unprivilaged container without issues:

ci@host:~$ lxc-create -t download -n ci -- -d ubuntu -r trusty -a amd64 ci@host:~$ lxc-start -n ci -d ci@host:~$ lxc-ls --fancy     NAME  STATE    IPV4                 IPV6  AUTOSTART     ---------------------------------------------------     ci    RUNNING  10.0.3.75, 10.0.4.1  -     NO 

In the host, cgmanager is running:

root@host ~ # ps ax | grep cgmanager     382 ?        Ss     0:01 /sbin/cgmanager --sigstop -m name=systemd 

In the unprivilaged container ci, cgproxy is running:

root@ci:~# ps ax | grep cgproxy     288 ?        Ss     0:00 /sbin/cgproxy --sigstop 

In the unprivilaged container ci, a user named jenkins with subid ranges 100000-65535 can create and start unprivilaged containers inside it, i.e. unprivilaged nested containers, but not without some tricks, which are:

  1. After logging in with ssh as user jenkins in the unprivilaged container ci, the result of cat /proc/self/cgroup is:

    jenkins@ci:~$ cat /proc/self/cgroup     12:hugetlb:/user/1012.user/11.session/lxc/ci     11:net_prio:/user/1012.user/11.session/lxc/ci     10:perf_event:/user/1012.user/11.session/lxc/ci     9:net_cls:/user/1012.user/11.session/lxc/ci     8:freezer:/user/1012.user/11.session/lxc/ci     7:devices:/user/1012.user/11.session/lxc/ci     6:memory:/user/1012.user/11.session/lxc/ci     5:blkio:/user/1012.user/11.session/lxc/ci     4:name=systemd:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     3:cpuacct:/user/1012.user/11.session/lxc/ci     2:cpu:/user/1012.user/11.session/lxc/ci     1:cpuset:/user/1012.user/11.session/lxc/ci 
  2. At this point, jenkins can create a container, but cannot start it:

    jenkins@ci:~$ lxc-create -t download -n test -- -d ubuntu -r trusty -a amd64 jenkins@ci:~$ lxc-start -n test     lxc_container: cgmanager.c: lxc_cgmanager_create: 301 call to cgmanager_create_sync failed: invalid request     lxc_container: cgmanager.c: lxc_cgmanager_create: 303 Failed to create hugetlb:lxc/test     lxc_container: cgmanager.c: cgm_create: 650 Error creating cgroup hugetlb:lxc/test     lxc_container: start.c: lxc_spawn: 891 failed creating cgroups     lxc_container: start.c: __lxc_start: 1121 failed to spawn 'test'     lxc_container: lxc_start.c: main: 341 The container failed to start.     lxc_container: lxc_start.c: main: 345 Additional information can be obtained by setting the --logfile and --logpriority options. 
  3. I issue in the container as root:

    restart systemd-logind 
  4. Now as user jenkins in the container, I log out and log in again with ssh. The cgroup has changed and now I can create and run a container:

    jenkins@ci:~$ cat /proc/self/cgroup     12:hugetlb:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     11:net_prio:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     10:perf_event:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     9:net_cls:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     8:freezer:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     7:devices:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     6:memory:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     5:blkio:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     4:name=systemd:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     3:cpuacct:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     2:cpu:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session     1:cpuset:/user/1012.user/11.session/lxc/ci/user/1012.user/11.session/lxc/ci/user/107.user/c1.session jenkins@ci:~$ lxc-create -t download -n test -- -d ubuntu -r trusty -a amd64 jenkins@ci:~$ lxc-start -n test -d jenkins@ci:~$ lxc-ls --fancy     NAME     STATE    IPV4       IPV6  AUTOSTART     --------------------------------------------     test     RUNNING  10.0.4.64  -     NO 

First question: why do I need restart systemd-logind and how can I avoid typing it as root before being able to create nested unprivilaged containers?

In the container ci, I have created an init configuration file (an upstart conf file at /etc/init/jenkins.conf) to run the software Jenkins as user jenkins:

description "jenkins"  start on filesystem and static-network-up stop on runlevel [016]  env USER="jenkins" env GROUP="jenkins" env HOME="/var/lib/jenkins" env JENKINS_LOG="/var/log/jenkins" env JENKINS_ROOT="/usr/share/jenkins" env JENKINS_RUN="/var/run/jenkins" env JENKINS_PIDFILE="jenkins.pid"  pre-start script     test -f $JENKINS_ROOT/jenkins.war || { stop ; exit 0; }     mkdir $JENKINS_RUN > /dev/null 2>&1  || true     chown -R $USER:$GROUP $JENKINS_RUN || true     mkdir $JENKINS_LOG > /dev/null 2>&1  || true     chown -R $USER:$GROUP $JENKINS_LOG || true end script  script     . /etc/default/jenkins     # export XDG_SESSION_ID="/run/user/`id -u $USER`"     export HOME     export USER     export GROUP     exec daemon --name=jenkins --foreground --inherit --user=$USER:$GROUP --pidfile=$JENKINS_RUN/$JENKINS_PIDFILE --output=$JENKINS_LOG -- $JAVA $JAVA_ARGS -jar $JENKINS_WAR $JENKINS_ARGS end script  post-start script     while [ ! -f $JENKINS_RUN/$JENKINS_PIDFILE ]; do sleep 1; done     PID=$(cat $JENKINS_RUN/$JENKINS_PIDFILE)     cgm create all $USER     cgm chown all $USER $(id -u $USER) $(id -g $USER)     # this need to be run in the jenkins job script:     # cgm movepid all $USER $$ end script  # vim: ft=upstart 

In the script that the process Jenkins issues to start a so called Jenkins' build, if I add the line:

cgm movepid all $USER $$ 

the script can create and start unprivilaged nested containers, being its cgroup:

+ cat /proc/self/cgroup 12:hugetlb:/user/1012.user/11.session/lxc/ci/jenkins 11:net_prio:/user/1012.user/11.session/lxc/ci/jenkins 10:perf_event:/user/1012.user/11.session/lxc/ci/jenkins 9:net_cls:/user/1012.user/11.session/lxc/ci/jenkins 8:freezer:/user/1012.user/11.session/lxc/ci/jenkins 7:devices:/user/1012.user/11.session/lxc/ci/jenkins 6:memory:/user/1012.user/11.session/lxc/ci/jenkins 5:blkio:/user/1012.user/11.session/lxc/ci/jenkins 4:name=systemd:/user/1012.user/11.session/lxc/ci/jenkins 3:cpuacct:/user/1012.user/11.session/lxc/ci/jenkins 2:cpu:/user/1012.user/11.session/lxc/ci/jenkins 1:cpuset:/user/1012.user/11.session/lxc/ci/jenkins 

but a user jenkins logged in with ssh cannot stop the container created by the script. The following never finishes:

jenkins@ci:~$ lxc-stop -n test 

Second question: how can I achieve that the user jenkins can stop any container created by the user jenkins from an init script like the above?

           
         
         

Lista de respostas


Perguntas relacionadas

17  Como construir aplicativo sem privilégios sudo?  ( How to build application without sudo privileges ) 
O que eu preciso para configurar em um servidor Ubuntu 9.10 para que um usuário possa criar aplicativos de lá escolha (ou seja ./configure, make & amp; & amp;...

1  "/Etc/init.d/networking reiniciar" com usuário não raiz  ( Etc init d networking restart with non root user ) 
Eu tenho um cliente fino com 112MB RAM, que inicializa o Ubuntu Server 12.04.1 de uma unidade USB com o Openbox e é usado pelos alunos para se comunicar com o...

3  Por que o Ubuntu executará um desligamento da GUI, embora seja profundamente na linha de comando? [duplicado]  ( Why can ubuntu perform a shutdown from the gui even though it is prive on the co ) 
. Esta pergunta já tem respostas aqui : fechado 9 anos atrás . . Duplicado possível: diferenç...

7  Não é possível executar comandos regulares sudo, tem que usar su agora  ( Cant perform regular sudo commands have to use su now ) 
Eu sou um novato Ubuntu eu acabei de instalar 10.10 e eu não sei o que fiz, mas agora para executar ações que necessárias sudo privilégios (abertos sináptic...

3  Como expandir o intervalo portuário privilegiado após 1024?  ( How to expand the privileged port range past 1024 ) 
Os números de porta abaixo de 1024 são reservados para superusuário, portanto, um usuário normal não pode se ligar a portas no intervalo. e uma variedade de...

0  PPTPD no recipiente não privilégio LXD  ( Pptpd on lxd unprivileged container ) 
Há lxd-3.0.3 sem privilégios (contêineres com deslocamento UID iniciado por raiz) em Ubuntu-18.04 (AMD64). No recipiente há Ubuntu-16.04.5 (AMD64). Como confi...

1  Como posso instalar um applet gnome sem privilégios?  ( How can i install a gnome applet without privileges ) 
Eu gostaria de instalar StackApplet , Mas eu não tenho privilégios superususer para instalar o arquivo deb e os administradores não vão instalá-lo para mim. ...

0  Os contêineres NAT bridged LXC roteam as chamadas HTTP para hospedar HTTP Server através da rede LAN?  ( Will nat bridged lxc unprivileged containers routes the http calls to host http ) 
. usuário A tem um servidor HTTP em execução na máquina do Ubuntu do host com ip "hostip" e porta 8081. agora usuário A cria um contêiner LXC sem privilégio...

1  Utilizador não privilegiado lançamento SSH?  ( Non privileged user launch ssh ) 
Meu servidor foi hackeado e, como resultado, os caras do servidor decidiram que meu usuário do Apache seria chamado 'Nonpriv', que não tem privilégios. Ante...

5  Contadores de LXC não proveninados aninhados de Upstart que seu dono pode parar  ( Nested unprivilaged lxc containers from upstart that its owner can stop ) 
Em um host em execução ubuntu 14.04.5 lts Eu tenho um usuário chamado ci que pode criar um início de contêineres LXC sem reservas também executando ubunt...




© 2022 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.