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
Síguenos con el tutorial
Section titled “Síguenos con el tutorial”- En QuéPasalinux MySQL - Introducción a MySQL con Docker un vídeo práctico sobre MySQL y Docker
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.
Parte 1: Ejecutando Portainer
Section titled “Parte 1: Ejecutando Portainer”Requisitos
Section titled “Requisitos”- Docker instalado en tu sistema.
- Docker Compose instalado en tu sistema.
- Puertos 9000/tcp y 8000/tcp activados en el firewall de tu sistema
Pasos de Instalación y Ejecución
Section titled “Pasos de Instalación y Ejecución”-
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: portainerimage: portainer/portainer-ce:lts # Changed to lts as per your commandports:- "8000:8000"- "9000:9000"volumes:- /var/run/docker.sock:/var/run/docker.sock- portainer_data:/datarestart: alwaysvolumes:portainer_data:
-
-
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).
- El flag
-
-
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.
Consideraciones de Seguridad (Portainer)
Section titled “Consideraciones de Seguridad (Portainer)”- 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”Requisitos
Section titled “Requisitos”- Docker instalado en el host que deseas administrar con Portainer.
Pasos de Instalación y Ejecución
Section titled “Pasos de Instalación y Ejecución”-
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_agentimage: portainer/agent:2.27.2ports:- "9001:9001"volumes:- /var/run/docker.sock:/var/run/docker.sock- /var/lib/docker/volumes:/var/lib/docker/volumes- /:/hostrestart: always
-
-
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).
- El flag
-
-
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.
Notas Adicionales
Section titled “Notas Adicionales”- 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/)
Parte 3: Aplicando reglas de SElinux
Section titled “Parte 3: Aplicando reglas de SElinux”Módulo SELinux para Portainer en Docker
Section titled “Módulo SELinux para Portainer en Docker”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.
Descripción
Section titled “Descripción”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 comocontainer_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 comocontainer_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.
Requisitos
Section titled “Requisitos”- Un sistema operativo con SELinux habilitado (por ejemplo, Red Hat Enterprise Linux, CentOS, Fedora).
- Las herramientas de SELinux instaladas (
policycoreutils
,checkpolicy
).
Instrucciones de Instalación
Section titled “Instrucciones de Instalación”-
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
-
-
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.tesemodule_package -o docker-portainer.pp -m docker-portainer.mod
-
-
Instalar el módulo de política:
-
Instala el módulo
.pp
usandosemodule
:Terminal window sudo semodule -i docker-portainer.pp
-
-
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
.
- Si el módulo se instaló correctamente, este comando mostrará una línea que contiene
-
Consideraciones de Seguridad
Section titled “Consideraciones de Seguridad”- 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.
Desinstalación
Section titled “Desinstalación”Para desinstalar el módulo, ejecuta:
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.
Descripción
Section titled “Descripción”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 comocontainer_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 comocontainer_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.
Requisitos
Section titled “Requisitos”- Un sistema operativo con SELinux habilitado (por ejemplo, Red Hat Enterprise Linux, CentOS, Fedora).
- Las herramientas de SELinux instaladas (
policycoreutils
,checkpolicy
).
Instrucciones de Instalación
Section titled “Instrucciones de Instalación”-
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
-
-
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.tesemodule_package -o portainer-agent.pp -m portainer-agent.mod
-
-
Instalar el módulo de política:
-
Instala el módulo
.pp
usandosemodule
:Terminal window sudo semodule -i portainer-agent.pp
-
-
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
.
- Si el módulo se instaló correctamente, este comando mostrará una línea que contiene
-
Consideraciones de Seguridad
Section titled “Consideraciones de Seguridad”- 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.
Desinstalación
Section titled “Desinstalación”Para desinstalar el módulo, ejecuta:
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).
Descripción
Section titled “Descripción”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.
Requisitos
Section titled “Requisitos”- Un sistema Linux con Firewalld instalado y habilitado.
- Acceso con privilegios de administrador (sudo).
Instrucciones
Section titled “Instrucciones”-
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/tcpsudo firewall-cmd --permanent --add-port=8000/tcp
-
-
Recargar Firewalld:
-
Después de agregar los puertos, recarga la configuración de Firewalld para aplicar los cambios:
Terminal window sudo firewall-cmd --reload
-
-
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
y9000/tcp
.
- La salida debería incluir
-
Consideraciones de Seguridad
Section titled “Consideraciones de Seguridad”- 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 zonapublic
. - 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.
Desactivar los puertos
Section titled “Desactivar los puertos”Para desactivar los puertos, ejecuta:
sudo firewall-cmd --permanent --remove-port=9000/tcpsudo firewall-cmd --permanent --remove-port=8000/tcpsudo 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).
Descripción
Section titled “Descripción”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
Requisitos
Section titled “Requisitos”- Un sistema Linux con Firewalld instalado y habilitado.
- Acceso con privilegios de administrador (sudo).
Instrucciones
Section titled “Instrucciones”-
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
-
-
Recargar Firewalld:
-
Después de agregar el puerto, recarga la configuración de Firewalld para aplicar los cambios:
Terminal window sudo firewall-cmd --reload
-
-
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
.
- La salida debería incluir
-
Consideraciones de Seguridad
Section titled “Consideraciones de Seguridad”- 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 zonapublic
. - 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.
Desactivar los puertos
Section titled “Desactivar los puertos”Para desactivar los puertos, ejecuta:
sudo firewall-cmd --permanent --remove-port=9000/tcpsudo firewall-cmd --permanent --remove-port=8000/tcpsudo firewall-cmd --reload