LXC es el tiempo de ejecución de contenedores de Linux de bajo nivel, conocido y ampliamente probado. Está en desarrollo activo desde 2008 y ha demostrado su eficacia en entornos de producción críticos en todo el mundo. Algunos de sus principales contribuyentes son las mismas personas que ayudaron a implementar varias funciones de contenedorización conocidas dentro del kernel de Linux.
Tipo | Servicio | Estado |
---|---|---|
CI (Linux) | GitHub | |
CI (Linux) | Jenkins | |
Estado del proyecto | Mejores prácticas de ICI | |
Fuzzing | OSS-Fuzz | |
Fuzzing | CIFuz |
El enfoque principal de LXC son los contenedores del sistema. Es decir, contenedores que ofrecen un entorno lo más parecido posible al que se obtendría de una VM pero sin la sobrecarga que conlleva ejecutar un kernel independiente y simular todo el hardware.
Esto se logra mediante una combinación de características de seguridad del kernel, como espacios de nombres, control de acceso obligatorio y grupos de control.
Los contenedores sin privilegios son contenedores que se ejecutan sin ningún privilegio. Esto requiere soporte para espacios de nombres de usuario en el kernel en el que se ejecuta el contenedor. LXC fue el primer tiempo de ejecución que admitió contenedores sin privilegios después de que los espacios de nombres de usuario se fusionaran con el kernel principal.
En esencia, los espacios de nombres de usuario aíslan conjuntos determinados de UID y GID. Esto se logra estableciendo una asignación entre un rango de UID y GID en el host a un rango diferente (sin privilegios) de UID y GID en el contenedor. El kernel traducirá este mapeo de tal manera que dentro del contenedor todos los UID y GID aparezcan como se esperaría del host, mientras que en el host estos UID y GID de hecho no tienen privilegios. Por ejemplo, un proceso que se ejecuta como UID y GID 0 dentro del contenedor podría aparecer como UID y GID 100000 en el host. Los detalles de implementación y funcionamiento se pueden recopilar en la página de manual del espacio de nombres de usuario correspondiente.
Dado que los contenedores sin privilegios son una mejora de la seguridad, naturalmente vienen con algunas restricciones impuestas por el kernel. Para proporcionar un contenedor sin privilegios completamente funcional, LXC interactúa con 3 piezas de código setuid:
Todo lo demás se ejecuta como su propio usuario o como un uid que pertenece a su usuario.
En general, el objetivo de LXC es hacer uso de todas las funciones de seguridad disponibles en el kernel. Esto significa que la gestión de configuración de LXC permitirá a los usuarios experimentados ajustar minuciosamente LXC a sus necesidades.
Puede encontrar una introducción más detallada a la seguridad de LXC en el siguiente enlace
En principio, LXC se puede ejecutar sin ninguna de estas herramientas siempre que se aplique la configuración correcta. Sin embargo, la utilidad de dichos contenedores suele ser bastante limitada. Sólo para resaltar los dos problemas más comunes:
Red: sin depender de un ayudante setuid para configurar dispositivos de red apropiados para un usuario sin privilegios (consulte el binario lxc-user-nic
de LXC), la única opción es compartir el espacio de nombres de la red con el host. Aunque en principio esto debería ser seguro, compartir el espacio de nombres de la red del host sigue siendo un paso menos de aislamiento y aumenta el vector de ataque. Además, cuando el host y el contenedor comparten el mismo espacio de nombres de red, el kernel rechazará cualquier montaje sysfs. Esto generalmente significa que el binario de inicio dentro del contenedor no podrá iniciarse correctamente.
Espacios de nombres de usuario: como se describió anteriormente, los espacios de nombres de usuario son una gran mejora de seguridad. Sin embargo, sin depender de ayudantes privilegiados, los usuarios que no tienen privilegios en el host solo pueden asignar su propio UID a un contenedor. Sin embargo, un sistema POSIX estándar requiere que 65536 UID y GID estén disponibles para garantizar la funcionalidad completa.
LXC se configura mediante un simple conjunto de claves. Por ejemplo,
lxc.rootfs.path
lxc.mount.entry
Claves de configuración de espacios de nombres LXC mediante el uso de puntos individuales. Esto significa que claves de configuración complejas como lxc.net.0
exponen varias subclaves como lxc.net.0.type
, lxc.net.0.link
, lxc.net.0.ipv6.address
y otras para obtener información aún más precisa. configuración granulada.
LXC se utiliza como tiempo de ejecución predeterminado para Incus, un hipervisor de contenedores que expone una API REST estable y bien diseñada encima.
LXC se ejecuta en cualquier kernel desde 2.6.32 en adelante. Todo lo que requiere es un compilador de C funcional. LXC funciona en todas las arquitecturas que proporcionan las características necesarias del kernel. Esto incluye (pero no se limita a):
LXC también admite al menos las siguientes bibliotecas estándar de C:
LXC siempre se ha centrado en una sólida compatibilidad con versiones anteriores. De hecho, la API no se ha roto desde la versión 1.0.0
en adelante. El LXC principal se encuentra actualmente en la versión 4.*.*
.
El proyecto LXC tiene una buena reputación en el manejo de problemas de seguridad de manera rápida y eficiente. Si cree que ha encontrado un posible problema de seguridad, infórmelo por correo electrónico a security (at) linuxcontainers (punto) org.
Para más detalles por favor echa un vistazo a
Siempre damos la bienvenida a nuevos contribuyentes y estaremos encantados de brindarles orientación cuando sea necesario. LXC sigue las convenciones de codificación del kernel. Esto significa que solo requerimos que cada confirmación incluya una línea Signed-off-by
. El estilo de codificación que utilizamos es idéntico al utilizado por el kernel de Linux. Puede encontrar una introducción detallada en:
y también debería echar un vistazo al archivo CONTRIBUTING en este repositorio.
Si desea ser más activo, generalmente también es una buena idea aparecer en el canal IRC de LXC #lxc-dev en irc.libera.chat. Intentamos realizar todo el desarrollo de forma abierta y la discusión sobre nuevas funciones o errores se realiza en los números apropiados de GitHub o en IRC.
Cuando se piensa en realizar contribuciones críticas para la seguridad o cambios sustanciales, suele ser una buena idea hacer ping a los desarrolladores primero y preguntar si se aceptaría un PR.
LXC y sus proyectos relacionados se adhieren estrictamente a un esquema de control de versiones semántico.
La fuente de la última versión publicada siempre se puede descargar desde
Puede explorar el código fuente actualizado y cambiar el historial en línea
Sin considerar detalles específicos de distribución, un simple
meson setup -Dprefix=/usr build
meson compile -C build
suele ser suficiente.
Cuando descubre que necesita ayuda, los proyectos LXC le ofrecen varias opciones.
Mantenemos un foro de discusión en
donde puede obtener apoyo.
Puede encontrarnos en #lxc en irc.libera.chat.
Puede consultar uno de los dos archivos de listas de correo de LXC y registrarse si está interesado: