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

https://github.com/konstruktoid

Acerca del proyecto

Docker daemon installation, with rootless support

Instalar
ansible-galaxy install docker_rootless
Licencia
apache-2.0
Descargas
7.5k
Propietario