No container LXD, posso montar uma imagem de disco de tal forma que seja privada para o container?

1

Dentro de um contêiner LXD, criei um arquivo de imagem de disco e finalmente descobri como montá-lo. No entanto, um efeito colateral da montagem da imagem a torna visível e legível para o sistema operacional do host.

Existe alguma maneira de montar esta imagem dentro do contêiner, mas mantê-la privada para o contêiner?

Ubuntu 16.04.3 LTS (GNU / Linux 4.4.0-93-genérico x86_64) lxd versão 2.17

    
por TiberiusKirk 05.09.2017 / 20:55

1 resposta

0

Eu poderia ocultar uma montagem criando explicitamente um novo namespace de montagem particular. Primeiro, eu habilitei dispositivos de loop e montagem como em este método .

$ lxc exec z1 touch foo
$ lxc exec z1 truncate -s 100M foo
$ lxc exec z1 mkfs.ext4 foo
mke2fs 1.43.4 (31-Jan-2017)
Discarding device blocks: done
Creating filesystem with 102400 1k blocks and 25688 inodes
Filesystem UUID: 79152d07-1b5e-4b60-b716-84e72a1cce50
Superblock backups stored on blocks:
    8193, 24577, 40961, 57345, 73729

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

$ lxc exec z1 mount foo /mnt
$ lxc exec z1 touch /mnt/foo

Com essa configuração, o ponto de montagem não é facilmente visível fora do contêiner (não está listado a saída mount , por exemplo). Eu tive que acessá-lo usando /proc/<pid-of-container-process>/cwd (que por sua vez era acessível apenas para root, mas não para o meu usuário regular, que pode executar lxc comandos):

$ grep /mnt /proc/*/mounts | head
/proc/13782/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/13858/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14266/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14394/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14397/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14398/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14406/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14407/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14420/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0
/proc/14421/mounts:/dev/loop2 /mnt ext4 rw,relatime,data=ordered 0 0

$ ls /proc/14421/cwd/mnt
ls: cannot access '/proc/14421/cwd/mnt': Permission denied
$ sudo ls /proc/14421/cwd/mnt  # a process in the container
foo  lost+found

Agora, crie um namespace de montagem particular usando unshare :

$ lxc exec z1 bash
root@z1:~# umount /mnt
root@z1:~# unshare --mount -- /bin/bash
root@z1:~# mount --make-private foo /mnt
root@z1:~# ls /mnt
foo  lost+found
root@z1:~# exit
root@z1:~# ls /mnt
root@z1:~# exit

Agora, esses comandos não produziram saída:

$ sudo ls /proc/14421/cwd/mnt
$ grep /mnt /proc/*/mounts | head

Mas agora todos os processos no contêiner que precisam de acesso a esse ponto de montagem precisam ser executados nesse namespace de montagem. Isso pode ser feito usando nsenter , por exemplo.

    
por muru 06.09.2017 / 07:39