Skip to content

Docker - Portainer y Portainer_Agent

Un manual para novatos y expertos sobre Docker y Docker Compose un proyecto opensource bastante potente y eficiente utilizado para la gestión de contenedores

Volver a Página Principal

Ver Codigo en GitLab


Ejecutando Portainer y el Agente de Portainer con Docker Compose

Section titled “Ejecutando Portainer y el Agente de Portainer con Docker Compose”

Este README proporciona instrucciones para ejecutar tanto Portainer (el gestor central) como el Agente de Portainer usando Docker Compose. El Agente de Portainer permite que tu instancia de Portainer administre otros hosts Docker.

  • Docker instalado en tu sistema.
  • Docker Compose instalado en tu sistema.
  • Puertos 9000/tcp y 8000/tcp activados en el firewall de tu sistema
  1. Crear el archivo docker-compose.yml (para Portainer):

    • Crea un archivo llamado docker-compose.yml en un directorio de tu elección.

    • Copia y pega el siguiente contenido en el archivo:

      services:
      portainer:
      container_name: portainer
      image: portainer/portainer-ce:lts # Changed to lts as per your command
      ports:
      - "8000:8000"
      - "9000:9000"
      volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
      restart: always
      volumes:
      portainer_data:
  2. Ejecutar Docker Compose (para Portainer):

    • Abre una terminal y navega al directorio donde guardaste el archivo docker-compose.yml.

    • Ejecuta el siguiente comando para iniciar Portainer:

      Terminal window
      docker-compose up -d
      • El flag -d ejecuta los contenedores en modo detached (en segundo plano).
  3. Acceder a Portainer:

    • Una vez que los contenedores estén en funcionamiento, puedes acceder a Portainer a través de tu navegador web.
    • Para acceder mediante HTTP, abre http://<tu_ip_del_servidor>:8000.
    • Para acceder mediante HTTPS, abre http://<tu_ip_del_servidor>:9000.
    • Se recomienda acceder mediante HTTPS para mayor seguridad.
    • La primera vez que accedas a Portainer, se te pedirá que crees un usuario administrador.
  • HTTPS: Se recomienda encarecidamente utilizar HTTPS (puerto 9443) para acceder a Portainer.
  • Acceso al Docker Socket: El montaje del volumen /var/run/docker.sock otorga a Portainer acceso completo al demonio de Docker. Esto es necesario para que Portainer funcione, pero también presenta un riesgo de seguridad. Asegúrate de proteger tu servidor y restringir el acceso a Portainer.
  • Autenticación: Configura contraseñas seguras y restringe el acceso a la interfaz de Portainer a usuarios de confianza.
  • Actualizaciones: Mantén Portainer actualizado para beneficiarte de las últimas correcciones de seguridad y funcionalidades.

Parte 2: Ejecutando el Agente de Portainer

Section titled “Parte 2: Ejecutando el Agente de Portainer”
  • Docker instalado en el host que deseas administrar con Portainer.
  1. Crear el archivo docker-compose.yml (para el Agente de Portainer):

    • Crea un archivo llamado docker-compose.yml en el host que deseas administrar.

    • Copia y pega el siguiente contenido en el archivo:

      services:
      portainer_agent:
      container_name: portainer_agent
      image: portainer/agent:2.27.2
      ports:
      - "9001:9001"
      volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
      - /:/host
      restart: always
  2. Ejecutar Docker Compose (para el Agente de Portainer):

    • Abre una terminal en el host donde creaste el docker-compose.yml para el agente.

    • Ejecuta el siguiente comando para iniciar el agente:

      Terminal window
      docker-compose up -d
      • El flag -d ejecuta los contenedores en modo detached (en segundo plano).
  3. Conectar Portainer al Agente:

    • En la interfaz web de Portainer, navega a la sección “Environments”.
    • Elige la opción para “Agregar entorno”.
    • Selecciona “Docker Standalone”.
    • Configura la conexión con la IP y el puerto de tu Agente.

Consideraciones de Seguridad (Agente de Portainer)

Section titled “Consideraciones de Seguridad (Agente de Portainer)”
  • Acceso al Docker Socket: Al igual que con Portainer, el montaje del volumen /var/run/docker.sock otorga al Agente acceso completo al demonio de Docker. Esto conlleva riesgos de seguridad.
  • Acceso Completo al Sistema Host (MUY IMPORTANTE): El montaje del volumen /:/host otorga al Agente (y, por lo tanto, a cualquier persona que controle Portainer) acceso total al sistema de archivos del host. Este es un riesgo de seguridad MUY GRAVE. Evita usar este montaje a menos que sepas exactamente lo que estás haciendo y comprendas las implicaciones de seguridad.
  • Red de Confianza: Implementa el Agente en una red de confianza, idealmente aislada de redes no confiables.
  • Control de Acceso a Portainer: El control de acceso a Portainer es fundamental para la seguridad general de tu sistema Docker.
  • Actualizaciones: Mantén el Agente de Portainer actualizado.
  • La versión del Agente de Portainer especificada es 2.27.2. Asegúrate de que esta versión sea compatible con tu versión de Portainer.
  • Considera alternativas al montaje completo del sistema de archivos (/:/host) si te preocupa la seguridad. Investiga si hay formas más seguras de lograr la funcionalidad deseada.
  • Consulta la documentación oficial de Portainer para obtener información más detallada y actualizada: [https://www.portainer.io/documentation/](https://www.portainer.io/documentation/)

Este README proporciona instrucciones para crear e instalar un módulo SELinux personalizado que permite a los contenedores Docker que ejecutan Portainer interactuar correctamente con el socket de Docker y el runtime del contenedor.

El módulo SELinux docker-portainer otorga los siguientes permisos al dominio container_t, que se utiliza para los contenedores Docker:

  • write en archivos de socket (sock_file) etiquetados como container_var_run_t. Esto permite que Portainer escriba en el socket de Docker (docker.sock).
  • connectto en sockets de flujo Unix (unix_stream_socket) etiquetados como container_runtime_t. Esto es necesario para la comunicación con el runtime del contenedor.

Estos permisos son necesarios para que Portainer funcione correctamente dentro de un entorno SELinux reforzado.

  • Un sistema operativo con SELinux habilitado (por ejemplo, Red Hat Enterprise Linux, CentOS, Fedora).
  • Las herramientas de SELinux instaladas (policycoreutils, checkpolicy).
  1. Crear el archivo de política fuente (docker-portainer.te):

    • Crea un archivo llamado docker-portainer.te con el siguiente contenido:

      module docker-portainer 1.0;
      require {
      type container_t;
      type container_runtime_t;
      type container_var_run_t;
      class sock_file write;
      class unix_stream_socket connectto;
      }
      #============= container_t ==============
      allow container_t container_runtime_t:unix_stream_socket connectto;
      allow container_t container_var_run_t:sock_file write;
    • O bien si has clonado el proyecto entra a la carpeta Portainer donde encontrarás el archivo docker-portainer.te

  2. Compilar el módulo de política:

    • Ejecuta los siguientes comandos para compilar el archivo .te en un módulo de política .pp:

      Terminal window
      checkmodule -M -m -o docker-portainer.mod docker-portainer.te
      semodule_package -o docker-portainer.pp -m docker-portainer.mod
  3. Instalar el módulo de política:

    • Instala el módulo .pp usando semodule:

      Terminal window
      sudo semodule -i docker-portainer.pp
  4. Verificar la instalación (opcional):

    • Verifica que el módulo se ha cargado correctamente:

      Terminal window
      sudo semodule -l | grep docker-portainer
      • Si el módulo se instaló correctamente, este comando mostrará una línea que contiene docker-portainer.
  • Principio de mínimo privilegio: Asegúrate de que los contenedores que ejecutan Portainer realmente necesiten estos permisos. Si es posible, restringe aún más los permisos.
  • Auditoría: Monitorea los registros de auditoría de SELinux (/var/log/audit/audit.log) para detectar cualquier actividad inesperada.
  • Contexto de Cgroups: El contexto container_t tiene los cgroups especificos, que son importantes para la seguridad de los contenedores.

Para desinstalar el módulo, ejecuta:

Terminal window
sudo semodule -r docker-portainer

Módulo SELinux para Portainer Agent en Docker

Section titled “Módulo SELinux para Portainer Agent en Docker”

Este README proporciona instrucciones para crear e instalar un módulo SELinux personalizado que permite al Portainer Agent dentro de un contenedor Docker interactuar correctamente con el socket de Docker y el runtime del contenedor.

El módulo SELinux portainer-agent otorga los siguientes permisos al dominio container_t, que se utiliza para los contenedores Docker que ejecutan el Portainer Agent:

  • write en archivos de socket (sock_file) etiquetados como container_var_run_t. Esto permite al Portainer Agent escribir en el socket de Docker (docker.sock).
  • connectto en sockets de flujo Unix (unix_stream_socket) etiquetados como container_runtime_t. Esto es necesario para la comunicación con el runtime del contenedor.

Estos permisos son necesarios para que el Portainer Agent funcione correctamente dentro de un entorno SELinux reforzado.

  • Un sistema operativo con SELinux habilitado (por ejemplo, Red Hat Enterprise Linux, CentOS, Fedora).
  • Las herramientas de SELinux instaladas (policycoreutils, checkpolicy).
  1. Crear el archivo de política fuente (portainer-agent.te):

    • Crea un archivo llamado portainer-agent.te con el siguiente contenido:

      module portainer-agent 1.0;
      require {
      type container_runtime_t;
      type container_var_run_t;
      type container_t;
      class sock_file write;
      class unix_stream_socket connectto;
      }
      #============= container_t ==============
      allow container_t container_runtime_t:unix_stream_socket connectto;
      allow container_t container_var_run_t:sock_file write;
    • O bien si clonaste el proyecto entra en la carpeta “Portainer-Agent” donde encontrarás el archivo portainer-agent.te

  2. Compilar el módulo de política:

    • Ejecuta los siguientes comandos para compilar el archivo .te en un módulo de política .pp:

      Terminal window
      checkmodule -M -m -o portainer-agent.mod portainer-agent.te
      semodule_package -o portainer-agent.pp -m portainer-agent.mod
  3. Instalar el módulo de política:

    • Instala el módulo .pp usando semodule:

      Terminal window
      sudo semodule -i portainer-agent.pp
  4. Verificar la instalación (opcional):

    • Verifica que el módulo se ha cargado correctamente:

      Terminal window
      sudo semodule -l | grep portainer-agent
      • Si el módulo se instaló correctamente, este comando mostrará una línea que contiene portainer-agent.
  • Principio de mínimo privilegio: Asegúrate de que los contenedores que ejecutan el Portainer Agent realmente necesiten estos permisos. Si es posible, restringe aún más los permisos.
  • Auditoría: Monitorea los registros de auditoría de SELinux (/var/log/audit/audit.log) para detectar cualquier actividad inesperada.
  • Contexto de Cgroups: El contexto container_t tiene los cgroups especificos, que son importantes para la seguridad de los contenedores.

Para desinstalar el módulo, ejecuta:

Terminal window
sudo semodule -r portainer-agent

Parte 4: Activando puertos de Firewall con firewalld

Section titled “Parte 4: Activando puertos de Firewall con firewalld”

Abrir Puertos 9000/TCP y 8000/TCP en Firewalld para Docker-Portainer

Section titled “Abrir Puertos 9000/TCP y 8000/TCP en Firewalld para Docker-Portainer”

Este README proporciona instrucciones para abrir los puertos 9000/TCP y 8000/TCP en Firewalld, el firewall dinámico predeterminado en muchas distribuciones de Linux (como Fedora, CentOS y Red Hat Enterprise Linux).

Abrir los puertos 9000/TCP y 8000/TCP permite que el tráfico TCP entrante se dirija a los servicios que escuchan en estos puertos. Esto puede ser necesario para aplicaciones como servidores web, API u otros servicios que requieren acceso de red.

  • Un sistema Linux con Firewalld instalado y habilitado.
  • Acceso con privilegios de administrador (sudo).
  1. Abrir los puertos permanentemente:

    • Ejecuta los siguientes comandos para abrir los puertos 9000/TCP y 8000/TCP de forma permanente en Firewalld. Esto asegura que los puertos permanecerán abiertos incluso después de reiniciar el sistema.

      Terminal window
      sudo firewall-cmd --permanent --add-port=9000/tcp
      sudo firewall-cmd --permanent --add-port=8000/tcp
  2. Recargar Firewalld:

    • Después de agregar los puertos, recarga la configuración de Firewalld para aplicar los cambios:

      Terminal window
      sudo firewall-cmd --reload
  3. Verificar los puertos abiertos (opcional):

    • Para verificar que los puertos se han abierto correctamente, puedes listar las reglas de Firewalld:

      Terminal window
      sudo firewall-cmd --list-ports
      • La salida debería incluir 8000/tcp y 9000/tcp.
  • Principio de mínimo privilegio: Solo abre los puertos que sean absolutamente necesarios.
  • Zonas de Firewalld: Considera abrir los puertos solo en la zona apropiada. Por ejemplo, si los servicios solo deben ser accesibles desde la red local, abre los puertos en la zona trusted o una zona personalizada en lugar de la zona public.
  • Servicios específicos: puedes agregar los puertos a servicios especificos, para no abrir puertos innecesariamente, ejemplo:
    • sudo firewall-cmd --permanent --add-service=mi_servicio
    • Donde mi_servicio contenga los puertos que necesites.

Para desactivar los puertos, ejecuta:

Terminal window
sudo firewall-cmd --permanent --remove-port=9000/tcp
sudo firewall-cmd --permanent --remove-port=8000/tcp
sudo firewall-cmd --reload

Abrir Puerto 9001/TCP en Firewalld para Docker-Portainer-Agent

Section titled “Abrir Puerto 9001/TCP en Firewalld para Docker-Portainer-Agent”

Este README proporciona instrucciones para abrir los puertos 9001/TCP en Firewalld, el firewall dinámico predeterminado en muchas distribuciones de Linux (como Fedora, CentOS y Red Hat Enterprise Linux).

Abrir el puerto 9001/TCP permite que el tráfico TCP entrante se dirija a los servicios que escuchan en estos puertos. Esto puede ser necesario para aplicaciones como servidores web, API u otros servicios que requieren acceso de red. En el caso del agente de transmisión de Portainer este puerto es necesario para poder conectar a un host externo desde nuestro Docker-Portainer por lo que en cada servidor externo que deseas monitorear debes ejecutar las intrucciones descritas a continuación para habilitar el puerto 9001/tcp

  • Un sistema Linux con Firewalld instalado y habilitado.
  • Acceso con privilegios de administrador (sudo).
  1. Abrir los puertos permanentemente:

    • Ejecuta los siguientes comandos para abrir el puerto 9001/TCP de forma permanente en Firewalld. Esto asegura que el puerto permanecerá abierto incluso después de reiniciar el sistema.

      Terminal window
      sudo firewall-cmd --permanent --add-port=9001/tcp
  2. Recargar Firewalld:

    • Después de agregar el puerto, recarga la configuración de Firewalld para aplicar los cambios:

      Terminal window
      sudo firewall-cmd --reload
  3. Verificar los puertos abiertos (opcional):

    • Para verificar que los puertos se han abierto correctamente, puedes listar las reglas de Firewalld:

      Terminal window
      sudo firewall-cmd --list-ports
      • La salida debería incluir 9001/tcp.
  • Principio de mínimo privilegio: Solo abre los puertos que sean absolutamente necesarios.
  • Zonas de Firewalld: Considera abrir los puertos solo en la zona apropiada. Por ejemplo, si los servicios solo deben ser accesibles desde la red local, abre los puertos en la zona trusted o una zona personalizada en lugar de la zona public.
  • Servicios específicos: puedes agregar los puertos a servicios especificos, para no abrir puertos innecesariamente, ejemplo:
    • sudo firewall-cmd --permanent --add-service=mi_servicio
    • Donde mi_servicio contenga los puertos que necesites.

Para desactivar los puertos, ejecuta:

Terminal window
sudo firewall-cmd --permanent --remove-port=9000/tcp
sudo firewall-cmd --permanent --remove-port=8000/tcp
sudo firewall-cmd --reload