docker_rootless
Rol de Ansible para Docker sin root
Un rol de Ansible para instalar y configurar un demonio de Docker que se ejecute como un usuario sin privilegios (no root).
No utilices nada de esto sin antes probar en un entorno no operativo.
El modo sin root permite ejecutar el demonio de Docker y los contenedores como un usuario no root para mitigar posibles vulnerabilidades en el demonio y el tiempo de ejecución del contenedor. (docker)
Nota Hay un artefacto SLSA presente bajo el flujo de trabajo de acción slsa para verificación.
Requisitos
---
roles:
- name: konstruktoid.docker_rootless
version: v0.53.0
src: https://github.com/konstruktoid/ansible-role-docker-rootless.git
scm: git
Ejemplo de Playbook
---
- hosts: all
any_errors_fatal: true
tasks:
- name: Incluir el rol konstruktoid.docker_rootless
ansible.builtin.import_role:
name: konstruktoid.docker_rootless
Variables del Rol con valores por defecto
---
docker_add_alias: true
docker_allow_ping: false
docker_allow_privileged_ports: false
docker_compose: false
docker_compose_arch: x86_64
docker_compose_release: v2.29.2
docker_compose_release_shasum: d037bd4937bf18fba67cff4366e084ee125a3e15c25657ee1aeceff8db3672b4
docker_compose_url: https://github.com/docker/compose/releases/download
docker_daemon_json_template: daemon.json.j2
docker_driver_network: slirp4netns
docker_driver_port: builtin
docker_release: 27.1.2
docker_release_rootless_shasum: 5565502b4fab26266327f5a018185f5a98cc1714c975b943dcb7c4365cdcdb25
docker_release_shasum: a7fff574037af22bd0239e7e5601c312d9fe9c55e2b9cf5ddea86d5499a4de88
docker_repository_template: docker.repo.j2
docker_rootful_enabled: false
docker_rootful: false
docker_rootful_opts: false
docker_rootful_service_template: docker_rootful.service.j2
docker_rootless_script_template: docker_rootless.sh.j2
docker_rootless_service_template: docker_rootless.service.j2
docker_service_restart: true
docker_url: https://download.docker.com/linux/static/stable/x86_64
docker_user_bashrc: false
docker_user: dockeruser
Antes de usar este rol, debes decidir si deseas instalar Docker utilizando los paquetes disponibles para la distribución, también conocido como instalación "con root", ya que requiere permisos de root
y instala el demonio de Docker original, o si deseas descargar los binarios estáticos y hacer una instalación manual.
Si estableces docker_rootful: false
, descargarás los binarios estáticos y harás una instalación manual, sin requerir permisos de root
.
Si docker_rootful: true
, entonces docker_rootful_enabled
decidirá si el demonio debe habilitarse como un servicio o no.
docker_service_restart
reiniciará el servicio sin root después de que los binarios de Docker hayan sido extraídos. Esto puede afectar a cualquier contenedor en ejecución.
Utilizar docker_rootful: true
y docker_rootful_enabled: true
resultará en una instalación estándar de Docker, con un demonio adicional de Docker, que se ejecuta como un usuario no root.
Ten en cuenta que Debian 10 y versiones anteriores requieren
docker_rootful: false
debido a dependencias faltantes.
Las variables docker_url
, docker_release
, docker_compose_url
y docker_compose_release
definen dónde puedes encontrar los binarios relevantes y qué versión debes usar al hacer una instalación manual.
Puedes definir el nombre del usuario de Docker que se creará con la variable docker_user
. Este usuario descargará e instalará los binarios si docker_rootful: false
, o en caso contrario, será el que ejecute el script de instalación sin root y inicie un demonio aislado.
Ten en cuenta que el único propósito del
docker_user
es ejecutar el demonio de Docker y los contenedores relacionados, y no para la administración del sistema o como un usuario regular.
docker_release_shasum
, docker_release_rootless_shasum
y docker_compose_release_shasum
se utilizan para verificar los archivos cuando se descargan utilizando el módulo get_url. El docker_release_shasum
se utiliza para el archivo .tgz
de Docker y docker_release_rootless_shasum
para el paquete docker-ce-rootless-extras
.
docker_rootful_opts
son las opciones que se aplicarán al demonio de Docker si se está ejecutando en modo root. Si no se establece, se utilizarán las configuraciones en docker_rootful_service_template
.
Si docker_add_alias: true
, se añadirá un alias docker
en el archivo .bashrc
o .bash_aliases
del usuario de Ansible. Si es false
, se creará un script llamado docker_rootless.sh
en el directorio de inicio del usuario de Ansible. Esto funciona como un sustituto del comando docker
para que el usuario de Ansible pueda ejecutar la instalación de Docker sin root desde el docker_user
.
Si docker_compose: true
, entonces se instalará el complemento de Docker compose
o docker-compose
. docker_compose_arch
se utiliza para definir la arquitectura del binario docker-compose
.
Si docker_user_bashrc: true
, un archivo .bashrc con autocompletado para los comandos docker
y docker compose
se colocará dentro del hogar del docker_user
.
La variable docker_allow_privileged_ports
configura si se permite exponer puertos privilegiados (< 1024).
La variable docker_allow_ping
configura si los usuarios no privilegiados pueden abrir sockets de eco ICMP.
En algunas distribuciones, esto no está permitido, y por lo tanto, los contenedores no pueden hacer ping al exterior.
Las variables docker_driver_network
y docker_driver_port
configuran el controlador de red o el controlador de puerto de RootlessKit, respectivamente. Esto es útil para optimizar el rendimiento de la red y necesario si se requiere la propagación de la dirección IP de origen. Por defecto, el controlador de puerto builtin
no expone la verdadera IP de origen; en su lugar, todas las conexiones parecen provenir de la puerta de enlace de Docker (por ejemplo, 172.19.0.1). Establecer docker_driver_port: slirp4netns
habilitará la propagación de la IP de origen.
Las variables con el sufijo *_template
son las ubicaciones de las plantillas en uso, para facilitar su reemplazo por versiones personalizadas.
La plantilla más importante es probablemente docker_daemon_json_template: daemon.json.j2
, que es la ubicación de la plantilla del archivo de configuración daemon.json
de Docker.
Gestión de contenedores
Contenedor independiente
Ejecutar contenedores no es muy diferente de cuando se utiliza un demonio de Docker con root, pero aún debes convertirte en el usuario no privilegiado y adaptar cualquier ruta a los directorios de trabajo del usuario.
Si se usa docker_add_alias: true
, el comando docker
estará disponible como de costumbre para el usuario de Ansible. Escribe alias
en la terminal para ver la configuración de los comandos.
- name: Registrar información del usuario de Docker
become: true
ansible.builtin.user:
name: "{{ docker_user }}"
check_mode: true
register: docker_user_info
- name: Bloque de ejemplo de contenedor
environment:
XDG_RUNTIME_DIR: "/run/user/{{ docker_user_info.uid }}"
PATH: "{{ docker_user_info.home }}/bin:{{ ansible_env.PATH }}"
DOCKER_HOST: "unix:///run/user/{{ docker_user_info.uid }}/docker.sock"
block:
- name: Contenedor Nginx
become: true
become_user: "{{ docker_user }}"
community.docker.docker_container:
name: nginx
image: konstruktoid/nginx
state: started
cap_drop: all
capabilities:
- chown
- dac_override
- net_bind_service
- setgid
- setuid
pull: true
hostname: "{{ ansible_nodename }}"
container_default_behavior: compatibility
Servicio de Docker Compose
- name: Registrar información del usuario de Docker
become: true
ansible.builtin.user:
name: "{{ docker_user }}"
check_mode: true
register: docker_user_info
- name: Bloque de ejemplo de docker compose
become: true
become_user: "{{ docker_user }}"
environment:
XDG_RUNTIME_DIR: /run/user/{{ docker_user_info.uid }}
PATH: "{{ docker_user_info.home }}/bin:{{ ansible_env.PATH }}"
DOCKER_HOST: "unix:///run/user/{{ docker_user_info.uid }}/docker.sock"
block:
- name: Instalar dependencias de pip
ansible.builtin.pip:
name:
- docker<7 # https://github.com/docker/docker-py/issues/3194
- docker-compose
- name: Crear y iniciar servicios
community.docker.docker_compose:
project_src: /var/tmp/
files: "{{ docker_user }}-docker-compose.yml"
register: compose_output
Pruebas con molecule
Si tienes instalado Ansible Molecule con el plugin de vagrant y el software relacionado, se admite ejecutar molecule test
.
tox -l
listará todos los entornos de prueba tox
disponibles.
Contribuciones
¿Quieres contribuir? ¡Genial! Las contribuciones siempre son bienvenidas, sin importar cuán grandes o pequeñas sean. Si encuentras algo extraño, siéntete libre de enviar un problema, mejorar el código creando una solicitud de extracción, o patrocinando este proyecto.
Licencia
Licencia Apache Versión 2.0
Información del autor
Docker daemon installation, with rootless support
ansible-galaxy install docker_rootless