Crear contenedores con usuarios sin privilegios utilizando LXC en Ubuntu

Introducción

Los contenedores creados por usuarios sin privilegios son muchos mas seguros en comparación con su contraparte creados por el usuario root ya que su administrador no corresponde directamente con el usuario administrador del huésped sino que sus usuarios son mapeados por unos UID y GID diferentes.  Por ejemplo, el root (0) de un contenedor será mapeado el huésped por un UID como 100000 por lo tanto, en el peor caso en que un atacante lograra salir del contenedor hasta el huésped, lo haría como un usuario sin privilegios.

Esto también trae consigo como efecto colateral negativo que las siguientes operaciones no sean permitidas.

  1. Montar la mayoría de sistemas de archivos.
  2. Crear dispositivos de nodo.
  3. Cualquier operación realizada por un uid/gid que no se encuentre en la lista de mapeo.

Adicionalmente esto produce que las plantillas de las distribuciones no funcionen y sea necesario utilizar la plantilla download que permite descargar imagenes preconstruidas de las distribuciones que funcionan en este tipo de ambiente.

Configuración para permitir contenedores por usuarios sin privilegios

$ mkdir -p ~/.config/lxc
$ echo "lxc.id_map = u 0 100000 65536" > ~/.config/lxc/default.conf
$ echo "lxc.id_map = g 0 100000 65536" >> ~/.config/lxc/default.conf
$ echo "lxc.network.type = veth" >> ~/.config/lxc/default.conf
$ echo "lxc.network.link = lxcbr0" >> ~/.config/lxc/default.conf
$ echo "$USER veth lxcbr0 10" | sudo tee -a /etc/lxc/lxc-usernet

Si se desea puede tomarse al archivo /etc/lxc/default.conf  como plantilla para la preparación del archivo de configuración local del usuario ~/.config/lxc/default.conf.

Los valores de lxc.id_map tanto para el grupo como para el usuario deberán coincidir con los registrados en and /etc/subgid y /etc/subuid respectivamente.  En caso que requiera ajustar estos rangos utilizar el siguiente comando.

$ sudo usermod -v 100000-200000 -w 100000-200000 NOMBRE_USUARIO

Comúnmente es necesario cerrar y volver a abrir la sesión del usuario actual o inclusive, reiniciar el sistema operativo para garantizar que el usuario se encuentre correctamente asignado a sus respectivos cgroups
(esto es especialmente importante si cgmanager no se había instalado antes de la instalación de LXC).

En caso de ser necesario, ajuste el permiso de ejecución en el directorio bajo el cual se almacena la configuración y los sistemas de archivos de los contenedores: ~/.local/share/lxc/.

$ sudo chmod -R o+X ~/.local

Administración de los contenedores

La administración de los contenedores se realiza tal y como se reseña en un artículo anterior, esta vez sin la necesidad del sudo ya que son contenedores creados por usuarios sin privilegios de administración.

A continuación se reseñan los comandos principales.

$ lxc-create -t download -n NOMBRE_CONTENEDOR — -d PLANTILLA -r VERSION -a ARQUITECTURA Crear un nuevo contenedor
$ lxc-start -n NOMBRE_CONTENEDOR -d Iniciar un contenedor
$ lxc-attach -n NOMBRE_CONTENEDOR
Acceder al shell de un contenedor desde el actual
$ lxc-stop -n NOMBRE_CONTENEDOR
Detener a un contenedor
$ lxc-destroy -n NOMBRE_CONTENEDOR
Destruir (remover) un contenedor existente

Recursos

  1. LXC in Ubuntu’s Server Guide
    https://help.ubuntu.com/lts/serverguide/lxc.html
  2. LXC Getting Started in Linux Containers
    https://linuxcontainers.org/lxc/getting-started/

Leave a Reply

Your email address will not be published. Required fields are marked *