Giteas act_runner rootless: Fehler

1 Minuten Lesezeit

Das Fehlerbild

Der docker-in-docker act_runner stürzt kurz nach dem Start mit folgender Fehlermeldung ab:

schallbert@machine:~# docker logs gitea-runner
# [...]
[rootlesskit:parent] error: failed to start the child: fork/exec /proc/self/exe: operation not permitted

Mögliche Ursachen

Problem mit Kernel-Berechtigungen

Der act_runner muss bei der Docker-in-Docker Konfiguration selbst einen eigenen Docker Daemon betreiben. Nur so kann der Runner für die Actions eigene Container erstellen. Dies ist aus Sicherheitsgründen erst einmal nicht erlaubt:

Im Kontext des act_runner führt eine Action Code aus, der selbst Teil des Repository ist. Wird unbemerkt Schadcode in die Action eingeschleust, z.B. von einem “Collaborator”, so kann dieser bei einer Docker-Installation ohne DinD über den unter Umständen mit root-Rechten ausgestatteten Docker-Daemon dockerd direkt auf das Hostsystem durchgreifen.

Bei Anwendung des DinD-Konzeptes kann dies lediglich zum Zugriff auf den dockerd innerhalb des act_runner Containers mit eingeschränkten Rechten führen - immer noch nicht gut, aber vertretbar: Bei Neustart des Containers ist der Status quo ante wiederhergestellt.

Um dem DinD-Container jetzt die Möglichkeit zu geben eigene Actions aufzusetzen, muss in der Konfiguration privileged = true gesetzt werden. Die docker-compose.yml sollte jetzt also wie folgt aussehen:

# docker-compose.yml
# section gitea/act-runner

runner:
    image: gitea/act_runner:latest-dind-rootless
    container_name: gitea-runner
    privileged: true
    environment:
      - CONFIG_FILE=/config.yml
      - GITEA_INSTANCE_URL=<your-gitea-url>
      - GITEA_RUNNER_NAME=<your-runners-name>
      - GITEA_RUNNER_REGISTRATION_TOKEN=<redacted>
    networks:
      - gitea
    depends_on:
      gitea:
        condition: service_healthy # required so runner can attach to gitea
        restart: true
    volumes:
      - /opt/gitea/runner/config.yml:/config.yml
      - /opt/gitea/runner/data:/data
      - </host/build/artifacts:/tmp/container/artifacts>
    restart: unless-stopped

Apparmor

https://docs.docker.com/engine/security/apparmor/

echo 'kernel.apparmor_restrict_unprivileged_userns = 0' | sudo tee /etc/sysctl.d/20-apparmor-donotrestrict.conf
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
sudo shutdown -r now

Hilfe kam aus der Gitea-Community. Mit der Vorgängerversion 0.2.11 läuft act_runner sauber hoch. Trotzdem wird er aus mir unbekannten Gründen auf Gitea als 0.2.12 angezeigt.