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.
- Montar la mayoría de sistemas de archivos.
- Crear dispositivos de nodo.
- 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
- LXC in Ubuntu’s Server Guide
https://help.ubuntu.com/lts/serverguide/lxc.html - LXC Getting Started in Linux Containers
https://linuxcontainers.org/lxc/getting-started/