Slide 1

Slide 1 text

LXD Internals Luis M. Ibarra @clvx http://ubicando.pe

Slide 2

Slide 2 text

LXD ● Contenedor de sistema. ● Muchos procesos por contenedor. ● Evolución de LXC-TOOLS. ● Contenedores en modo no privilegiado por defecto. ● La configuración se almacena en sqlite3. ● Tienden a persistir como una máquina virtual completa.

Slide 3

Slide 3 text

Componentes Inicia la comunicación con el server LXD Escrito en GO LXD Cliente Server API REST Gestor de imágenes Migración Autenticación Kernel >= 3.12 Escrito en GO Utiliza liblxd

Slide 4

Slide 4 text

Archivos Importantes ● ~/.config/lxc/ ● Mantiene los certificados y configuración del cliente LXD. ● /var/lib/lxd ● devlxd/sock, api rest socket de comunicación con los contenedores. ● images/, mantiene las imágenes que gestiona el servidor. ● lxc/, mantiene el rootfs de los contenedores. ● lxd.db, base de datos sqlite con las configuraciones. ● unix.socket, api rest socket. ● server.crt, server.key; certificados del server. ● /var/log/lxd/ ● Logs por contenedor.

Slide 5

Slide 5 text

Contenedor LXD ● Compuesto de un: ● Rootfs. ● Archivo de configuración: ● Configura los recursos, dispositivos, seguridad, etc. ● JSON, basado en clave/valor. ● Perfiles para agrupar varios contenedores por un tipo de configuración. ● Los perfiles se pueden encadenar. ● El último parámetro definido en un perfil es el que tiene validez.

Slide 6

Slide 6 text

Instalación ● sudo add-apt-repository ppa:ubuntu-lxc/lxd-git-master && sudo apt-get update ● sudo apt-get install lxd ● Sugiero instalarlo en vivid(15.04).

Slide 7

Slide 7 text

Comandos

Slide 8

Slide 8 text

Componentes de un Contenedor ● Namespaces ● Cgroups ● Linux capabilities ● LSM(AppArmor/SELinux) ● Seccomp ● Networking

Slide 9

Slide 9 text

Namespaces: Mount ● Es el conjunto de montajes del sistema de archivos que son visibles por un proceso. ● La vista los montajes de un namespace difiere de los otros namespace. ● Aplicado pasando el flag CLONE_NEWNS en la llamada clone() o unshare().

Slide 10

Slide 10 text

Namespaces: PID ● Permite que procesos en diferentes PID namespaces pueden tener un número de identificador de proceso(PID) diferentes para cada namespace. ● Utilizado para implementar contenedores que puedan ser migrados a otros hosts manteniendo el mismo PID. ● Aplicado pasando el flag CLONE_NEWPID en la llamada clone() o unshare(). ● El espacio de nombre PID es jerárquico.

Slide 11

Slide 11 text

Namespaces: UTS ● Cada proceso en cada espacio de nombre tenga su propio identificador nodename, y domainname. ● Los valores de la arquitectura, kernel, y otros no se modifican. ● Aplicado pasando el flag CLONE_NEWUTS en la llamada clone() o unshare().

Slide 12

Slide 12 text

Namespaces: Network ● Cada espacio de nombre de red tiene su propia tabla de enrutamiento, pilas IPv4 e IPv6, firewalls, archivos de dispositivos de red, directorio /proc/net, directorio /sys/class/net, sockets de red. ● Un dispositivo de red física puede existir solo en un espacio de nombre de red. ● Aplicado pasando el flag CLONE_NEWNET en la llamada clone() o unshare().

Slide 13

Slide 13 text

Namespaces: Network Tipos de red: ● VETH. ● MACVLAN. ● VLAN. ● PHYS. ● EMPTY. Mayor info: http://containerops.org/2013/11/19/lxc-networking/

Slide 14

Slide 14 text

Linux Capabilities ● Las capacidades son un conjunto de bitmaps utilizados por un proceso para probar si tiene permitido realizar una operación privilegiada sobre los recursos del sistema operativo. ● Aplicados a procesos creados con execve() o a archivos ejecutables solamente. ● /proc/PID/status, para verificar las capacidades de un proceso. ● Aplicado por: ● Proceso. ● Archivo.

Slide 15

Slide 15 text

Linux Capabilities P'(permitido) = (P(heredable) & F(heredable)) |F(permitido) P'(efectivo) = F(efectivo) ? P'(permitido) : 0 P'(heredable) = P(heredable).

Slide 16

Slide 16 text

Namespaces: User ● Permiten mapear UID y GID entre espacios de nombres. ● Aíslan identificadores y atributos relacionados con seguridad; en particular, UID's y GID's, el directorio root, llaves del kernel y las capacidades. ● Aplicado pasando el flag CLONE_NEWUSER en la llamada clone() o unshare().

Slide 17

Slide 17 text

Cgroups ● Cgroup: Asocia un conjunto de tareas con un conjunto de parámetros para uno o más subsistemas. ● Subsistema: Representa un recurso del sistema al cual se le aplican límites a través de los cgroups. ● Jerarquía de cgroups: Conjunto de cgroups organizados en un árbol de directorios donde cada tarea pertenece a exactamente a un cgroup para un subsitema definido.

Slide 18

Slide 18 text

Regla 1: Una jerarquía puede tener más de un subsistema. Regla 2: Cualquier subsistema no puede ser adjuntado a una o varias jerarquías que ya tengan otro subsistema adjuntado.

Slide 19

Slide 19 text

Regla 3: Para cada cgroup que se crea, una tarea solo puede ser miembro de exactamente un solo cgroup en esa jerarquía, pero puede pertenecer a muchos cgroups en diferentes jerarquías. Regla 4: Cualquier proceso hijo automáticamente hereda el cgroup del proceso padre; no obstante, puede ser movido a cualquier otro cgroup, ya que el proceso hijo es totalmente independiente del proceso padre luego de la llamada a fork().

Slide 20

Slide 20 text

Cgroups: Subsistemas ● Cpuset ● Blkio ● Cpuacct ● Devices ● Freezer ● Hugetlb ● Memory ● net_cls ● net_prio ● Cpu ● perf_event

Slide 21

Slide 21 text

LSM(AppArmor/SELinux) ● Limita las capacidades de los usuarios incluyendo al usuario root en realizar operaciones que puedan afectar al host. ● Sin LSM, la política de seguridad a ejecutar por defecto son las capacidades de Linux. ● AppArmor: ● Confina programas a un conjunto limitado de recursos a través de perfiles que son cargados al kernel para realizar un control a nivel de programas sobre usuarios ● Los perfiles son aplicados a los procesos en la llamada de sistema exec(), incluso a los procesos root. ● No se puede confinar para procesos que ya están corriendo en el sistema.

Slide 22

Slide 22 text

Seccomp ● Permite restringir llamadas al sistema de un proceso reduciendo la exposición de las interfaces del kernel. ● 2 tipos de restricción: Estricta: solo se permiten las llamadas de sistema a read(), write(), exit(), sigreturn() de lo contrario resulta en la terminación del proceso. Filtro: Filtra llamadas al sistema enviando el número de la llamada de sistema y los argumentos de la llamada. Cualquier proceso hijo luego de clone() o fork() obtiene los filtros de su proceso padre.

Slide 23

Slide 23 text

Recomendaciones ● En la configuración por defecto, un solo bridge donde se conectan todos los contenedores. ● Múltiples asignaciones de UID/GID. ● Evita que otros contenedores sean afectados si algún contenedor ocupa todos los descriptores de archivos. ● Si se escapa del contenedor no afecta a los otros contenedores. ● Evita los puntos de montaje compartido entre el host y los contenedores.

Slide 24

Slide 24 text

Recomendaciones ● Limita los accesos a través de apparmor, linux capabilities y seccomp. ● Crea tus propias imágenes. ● Utiliza contenedores sin privilegio.

Slide 25

Slide 25 text

Bibliografía ● man 7 namespaces ● man 7 pid_namespaces ● man 7 apparmor ● man 7 capabilities ● man lxc.container.conf ● https://github.com/lxc/lxd#lxd- ● https://insights.ubuntu.com/2015/04/28/getting-started-with-lxd-the-container-lightervisor/ ● https://www.flockport.com/lxc-and-lxd-support-across-distributions/ ● https://github.com/lxc/lxd/tree/master/specs ● http://containerops.org/2013/11/19/lxc-networking/ ● https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_G uide/ch01.html ● http://www.opencloudblog.com/wp-content/uploads/2013/09/linuxswitch-veth.png