guia_rapida_de_docker_swarm
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
guia_rapida_de_docker_swarm [2021/06/05 02:19] – busindre | guia_rapida_de_docker_swarm [2021/06/06 02:14] (current) – busindre | ||
---|---|---|---|
Line 12: | Line 12: | ||
Los servicios pueden usar réplicas o definirse como globales. Un servicio que usa réplicas permite configurar su número mientras que en el global, todos los nodos tendrán una tarea asignada. De agregarse nuevos nodos, estos recibirán la tarea automáticamente. | Los servicios pueden usar réplicas o definirse como globales. Un servicio que usa réplicas permite configurar su número mientras que en el global, todos los nodos tendrán una tarea asignada. De agregarse nuevos nodos, estos recibirán la tarea automáticamente. | ||
- | **Task** / **Tarea** es lo que el planificador llena generando un contenedor. Es decir, el contenedor es la instancia de la tarea. Si una tarea falla (health check) o termina, por ejemplo escuchando peticiones HTTP, el orquestador crea una nueva tarea de réplica que engendra un nuevo contenedor.Una tarea es un mecanismo unidireccional. Progresa | + | **Task** / **Tarea** es lo que el planificador llena generando un contenedor. Es decir, el contenedor es la instancia de la tarea. Si una tarea falla (health check) o termina, por ejemplo escuchando peticiones HTTP, el orquestador crea una nueva tarea de réplica que engendra un nuevo contenedor.Una tarea es un mecanismo unidireccional. Progresa a través de una serie de estados: asignado, preparado, en ejecución, etc. Si la tarea falla, el orquestador elimina la tarea y su contenedor y luego crea una nueva tarea para sustituirla según el estado deseado especificado por el servicio. |
**Stacks** en Docker Swarm son definiciones de servicios, volúmenes, redes, secretos, etc en un archivo de texto en formato YAML. Permite iniciar por tanto múltiples contenedores y elementos necesarios para su correcto funcionamiento. Viene a ser el docker compose de los entornos swarm, teniendo un formato casi idéntico. Los ficheros compose se deben desplegar en enjambres siempre mediante el comando docker " | **Stacks** en Docker Swarm son definiciones de servicios, volúmenes, redes, secretos, etc en un archivo de texto en formato YAML. Permite iniciar por tanto múltiples contenedores y elementos necesarios para su correcto funcionamiento. Viene a ser el docker compose de los entornos swarm, teniendo un formato casi idéntico. Los ficheros compose se deben desplegar en enjambres siempre mediante el comando docker " | ||
+ | |||
===== Características de un entorno Docker swarm ===== | ===== Características de un entorno Docker swarm ===== | ||
Line 44: | Line 45: | ||
* UDP Puerto 4789: Tráfico de red. | * UDP Puerto 4789: Tráfico de red. | ||
- | **Número de nodos manager recomendado en Docker Swarm (Ralf/Quorum)** | + | **Número de nodos manager recomendado en Docker Swarm (Raft/Quorum)** |
Los nodos gestores de un enjambre utilizan el algoritmo de consenso de " | Los nodos gestores de un enjambre utilizan el algoritmo de consenso de " | ||
Line 52: | Line 53: | ||
Si no se mantiene el quórum, perdiendo un nodo más del que nuestro clúster necesita, por ejemplo perder 3 nodos gestores de 5, el clúster no podrá ser administrado. las tareas del enjambre en los nodos trabajadores existentes siguen ejecutándose. Sin embargo, los nodos del enjambre no pueden añadirse, actualizarse o eliminarse, y las tareas nuevas o existentes no pueden iniciarse, detenerse, moverse o actualizarse. | Si no se mantiene el quórum, perdiendo un nodo más del que nuestro clúster necesita, por ejemplo perder 3 nodos gestores de 5, el clúster no podrá ser administrado. las tareas del enjambre en los nodos trabajadores existentes siguen ejecutándose. Sin embargo, los nodos del enjambre no pueden añadirse, actualizarse o eliminarse, y las tareas nuevas o existentes no pueden iniciarse, detenerse, moverse o actualizarse. | ||
- | En entornos grandes donde haya varias zonas de red y desde todas ellas deba estar el cluster | + | En entornos grandes donde haya varias zonas de red y desde todas ellas deba estar el clúster |
+ | |||
+ | Utilizando una implementación de Raft, los gestores mantienen un estado interno coherente de todo el enjambre y de todos los servicios que se ejecutan en él. Además del quórum, Raft permite también la " | ||
====== Crear un entorno swarm ====== | ====== Crear un entorno swarm ====== | ||
Line 68: | Line 71: | ||
</ | </ | ||
- | Cuando se crea un enjambre ejecutando " | + | **Entendiendo el proceso de inicializado de un entorno Docker swarm** |
+ | |||
+ | Cuando se crea un enjambre ejecutando " | ||
+ | |||
+ | Todo esto se utiliza para asegurar las comunicaciones con otros nodos que se unen al enjambre. Si se prefiere, se puede especificar una propia CA raíz generada por el usuario, utilizando la bandera %%--%%external-ca del comando " | ||
- | El nodo gestor también genera dos tokens para utilizar cuando se unen nodos adicionales al enjambre: un token de trabajador y un token de gestor. Cada token incluye el compendio del certificado de la CA raíz y un secreto generado aleatoriamente. Cuando un nodo se une al enjambre, el nodo que se une utiliza el compendio para validar el certificado de la CA raíz del gestor remoto. El gestor remoto utiliza el secreto para asegurarse de que el nodo que se une es un nodo aprobado. | + | El nodo gestor también genera dos tokens para utilizar cuando se unen nodos adicionales al enjambre: un token de trabajador y un token de gestor. Cada token incluye el compendio del certificado de la CA raíz y un secreto generado aleatoriamente. Cuando un nodo se une al enjambre, el nodo que se une utiliza el compendio para validar el certificado de la CA raíz del gestor remoto. El gestor remoto utiliza el secreto para asegurarse de que el nodo que se une es un nodo legítimo. |
- | Cada vez que un nuevo nodo se une al enjambre, el gestor | + | Cada vez que un nuevo nodo se une al enjambre, |
<code bash># La fecha de caducidad de los certificados será de 9 días (216 horas) | <code bash># La fecha de caducidad de los certificados será de 9 días (216 horas) | ||
Line 81: | Line 88: | ||
Certificados y llave privada en Docker Swarm. | Certificados y llave privada en Docker Swarm. | ||
- | * / | + | * / |
- | * / | + | * / |
- | * / | + | * / |
+ | * Llave privada rait de la CA del clúster se encuentra en el registro Raft. | ||
- | El certificado CA es el mismo en todos los nodos, mientras que los certificados individuales de cada nodo tienen la misma firma que el raíz. Es decir, swarm-root-ca.crt y swarm-node.crt tienen la misma firma ya que han sido firmados por el nodo manager elegido en el momento de inicialización del swarm. Cuando se usa el bloqueo de un enjambre Docker, lo que se hace es cifrar | + | El certificado CA es el mismo en todos los nodos, mientras que los certificados individuales de cada nodo tienen la misma firma de la CA. Es decir, swarm-root-ca.crt y swarm-node.crt tienen la misma firma ya que han sido firmados por el nodo manager elegido en el momento de inicialización del swarm. Cuando se usa el bloqueo de un enjambre Docker, lo que se hace es cifrar |
**Desplegar un servicio (Replicas / Global)** | **Desplegar un servicio (Replicas / Global)** | ||
Line 448: | Line 456: | ||
Un secreto es un bloque de datos, como una contraseña, | Un secreto es un bloque de datos, como una contraseña, | ||
- | Cuando se añada un secreto al enjambre, Docker envía el secreto al administrador del enjambre a través de una conexión TLS mutua. El secreto se almacena en el registro de Raft, que está cifrado. Todo el registro de Raft se replica en los demás nodos gestores, asegurando así la alta disponibilidad para los secretos. | + | Cuando se añada un secreto al enjambre, Docker envía el secreto al administrador del enjambre a través de una conexión TLS mutua. El secreto se almacena en el registro de Raft, que está siempre |
NOTA: Los secretos siempre están accesibles en texto claro en el mismo nodo donde fueron montados mediante tmpfs. Cuando el contenedor no está activo, ese directorio desaparece. | NOTA: Los secretos siempre están accesibles en texto claro en el mismo nodo donde fueron montados mediante tmpfs. Cuando el contenedor no está activo, ese directorio desaparece. | ||
Line 509: | Line 517: | ||
Las configuraciones de servicio permiten almacenar información no sensible, normalmente archivos de configuración, | Las configuraciones de servicio permiten almacenar información no sensible, normalmente archivos de configuración, | ||
- | Las configuraciones operan de manera similar a los secretos, excepto que no están | + | Las configuraciones operan de manera similar a los secretos, excepto que no están |
**Cómo gestiona Docker Swarm las configuraciones**. | **Cómo gestiona Docker Swarm las configuraciones**. | ||
Line 962: | Line 970: | ||
===== Bloquear el entorno Swarm (autolock: cifrado de llaves privada) ===== | ===== Bloquear el entorno Swarm (autolock: cifrado de llaves privada) ===== | ||
- | Los registros de Raft utilizados por los gestores de enjambres están encriptados en el disco por defecto. Este cifrado en reposo protege la configuración y los datos de su servicio de los atacantes que acceden a los registros cifrados de Raft. Una de las razones por las que se introdujo esta función fue para apoyar | + | Si no se tiene claro qué es lo que pasa al inicializar un enjambre docker |
- | Cuando | + | El almacén completo de raft como sabemos es el mismo en todos los nodos gestores, se propaga a todos los gestores cifrado únicamente a través de mTLS. Cada nodo gestor debe tener una copia idéntica de los registros, que se encuentra en la siguiente ruta / |
+ | |||
+ | Las llaves TLS/DEK están en la ruta / | ||
+ | |||
+ | Como ya se comentó, este fichero swarm-node.key tiene dos llaves privadas, la llave DEK en forma de cabecera en formato PEM y la llave TLS. | ||
+ | |||
+ | **Raft DEK (Data Encrypting Key)** | ||
+ | * Uso: Cifra el registro Raft. | ||
+ | * Única por nodo gestor. | ||
+ | * Se almacena como una cabecera PEM en la clave TLS que se almacena en / | ||
+ | * Se genera cuando el gestor se inicializa por primera vez, o en la rotación. | ||
+ | * Cifrado: No está cifrada por defecto pero se cifra al usar el bloqueo del enjambre. | ||
+ | * Rotación: Esta lave siempre rota cuando el clúster pasa de no autobloqueado a autobloqueado. | ||
+ | * Eliminación: | ||
+ | |||
+ | **Llave TLS** | ||
+ | * Uso: Cifra y autentica | ||
+ | * Única por nodo gestor. | ||
+ | * Se almacena en / | ||
+ | * Se genera cuando el nodo se une al enjambre por primera vez, o al renovar el certificado. | ||
+ | * Cifrado: No está cifrada por defecto pero se cifra al usar el bloqueo | ||
+ | |||
+ | Estas dos llaves son cifradas si se usa el bloqueo del clúster, esto se realiza mediante otra llave, la denominada " | ||
+ | |||
+ | **Manager unlock key** | ||
+ | |||
+ | * Uso: Cifra las llaves DEK y TLS (actúa como una KEK, o clave de cifrado). | ||
+ | * No es única por nodo gestor: la comparten todos los gestores del clúster. | ||
+ | * Se almacena en el resgitro Raft (así se propaga a todos los gestores). | ||
+ | * Se genera cuando el clúster se pone en autolock, o cuando la llave de desbloqueo se rota. | ||
+ | * Cifrado: Como el resto del registro Raft, al enviarse se usa TLS para cifrar | ||
+ | * Se puede rotar a través de la API. | ||
+ | * Se elimina cuando se desactiva el bloqueo automático. | ||
+ | |||
+ | Fichero swarm-node.key sin autolock. | ||
+ | <code swarm-node.key NO cifrado> | ||
+ | -----BEGIN PRIVATE KEY----- | ||
+ | kek-version: | ||
+ | raft-dek: EiC9cFBOPxkZDl8VqRI/ | ||
+ | |||
+ | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgBuGLymWVcAdlsVR0 | ||
+ | q8n+urqIPnFu+jscKNXoY7lkhhKhRANCAAT63Va7/ | ||
+ | Heo+CCIobsR6srfxMGyzFTxA5kbxgD24dJL+1pS/ | ||
+ | -----END PRIVATE KEY-----</ | ||
+ | |||
+ | Fichero swarm-node.key con autolock. | ||
+ | <code swarm-node.key cifrado> | ||
+ | -----BEGIN ENCRYPTED PRIVATE KEY----- | ||
+ | kek-version: | ||
+ | raft-dek: CAESMHie2K4PvoYXxTHVO2nvduabxZg9cSEKQAn/ | ||
+ | |||
+ | MIHeMEkGCSqGSIb3DQEFDTA8MBsGCSqGSIb3DQEFDDAOBAiLTl7MCLK0CAICCAAw | ||
+ | HQYJYIZIAWUDBAEqBBC3SVE2J6Hp/ | ||
+ | U4fOaEuwGyBbihnsG4qkbDAJmp5qLJa8VhPhBzlPsmtswVTFpSmV9zD0TOuPPXAG | ||
+ | DavgVl+k5y0nCCHUW/ | ||
+ | pwX17y2X6+/ | ||
+ | -----END ENCRYPTED PRIVATE KEY-----</ | ||
+ | |||
+ | Los registros de Raft utilizados por los gestores de enjambres están cifrados | ||
+ | |||
+ | Si el atacante tiene acceso a root, lógicamente siempre podrá consultar | ||
<code bash> | <code bash> | ||
- | # Incializar un entorno swarm bloqueando el entorno. (cifrando las llaves privadas). | + | # Incializar un entorno swarm bloqueando el entorno. (cifrando las llaves privadas |
docker swarm init --autolock | docker swarm init --autolock | ||
Line 973: | Line 1041: | ||
docker swarm update --autolock=true | docker swarm update --autolock=true | ||
- | Mostrar la key (lógicamente solo funciona cuando esté el bloqueo activado pero el entorno está desactivado). | + | Mostrar la Manager unlock |
# docker swarm unlock-key | # docker swarm unlock-key | ||
Line 987: | Line 1055: | ||
# Rota las llaves de bloqueo. | # Rota las llaves de bloqueo. | ||
docker swarm unlock-key --rotate | docker swarm unlock-key --rotate | ||
- | # Rota la llave CA del clúster. | + | # Rota la llave CA del clúster. |
docker swarm ca --rotate | docker swarm ca --rotate | ||
# Desactiva el bloqueo. | # Desactiva el bloqueo. | ||
docker swarm update --autolock=false</ | docker swarm update --autolock=false</ | ||
+ | |||
+ | Si se quiere realizar un volcado del registro Raft puede usarse swarm-rafttool (swamkit): https:// |
guia_rapida_de_docker_swarm.1622852369.txt.gz · Last modified: 2021/06/05 02:19 by busindre