fix(agent): give compose.override.yaml the owner of the stack instead of root #24

Closed
opened 2026-10-13 07:17:06 +00:00 by shcizo · 0 comments
Owner

Beskrivning

Agenten kör som root i containern. Varje Compose-jobb skriver compose.override.yaml via en temporär fil och os.Rename (internal/agent/updater/override.go:82-98), så filen skapas på nytt och ägs av root:root efter varje jobb. Ägarbyten som någon gjort för hand försvinner vid nästa uppdatering. Den som äger stacken behöver sudo för att redigera eller ta bort filen.

Förväntat beteende

Override-filen får samma ägare (uid:gid) som stacken den hör till.

Teknisk orsak

os.CreateTemp skapar filen med processens uid (0). Rename behåller den temporära filens ägare.

Förslag till lösning

I override.go, efter tmp.Chmod(0o644) och före Rename, gör tmp.Chown(uid, gid) där ägaren hämtas så här:

  1. från den befintliga compose.override.yaml, om den finns
  2. annars från stackens första compose-fil (den första i config_files), som är en bättre signal än katalogen eftersom katalogen kan ägas av root, till exempel /opt/stacks

Om Chown misslyckas, till exempel för att agenten inte kör som root, ska jobbet inte fallera. Felet ska skrivas i jobbets output och loggas på Warn-nivå.

Tester: ägaren tas från den befintliga filen, annars från compose-filen, och ett misslyckat Chown stoppar inte jobbet. Ett riktigt ägarbyte kräver root, så själva hämtningen av ägaren testas via en funktionsvariabel eller ett litet interface som går att byta ut i testerna.

Scope

Ingår inte: att köra agenten som en annan användare än root. Docker-socketen ger root-rättigheter på värden ändå.

## Beskrivning Agenten kör som root i containern. Varje Compose-jobb skriver `compose.override.yaml` via en temporär fil och `os.Rename` (`internal/agent/updater/override.go:82-98`), så filen skapas på nytt och ägs av `root:root` efter varje jobb. Ägarbyten som någon gjort för hand försvinner vid nästa uppdatering. Den som äger stacken behöver `sudo` för att redigera eller ta bort filen. ## Förväntat beteende Override-filen får samma ägare (uid:gid) som stacken den hör till. ## Teknisk orsak `os.CreateTemp` skapar filen med processens uid (0). `Rename` behåller den temporära filens ägare. ## Förslag till lösning I `override.go`, efter `tmp.Chmod(0o644)` och före `Rename`, gör `tmp.Chown(uid, gid)` där ägaren hämtas så här: 1. från den befintliga `compose.override.yaml`, om den finns 2. annars från stackens första compose-fil (den första i `config_files`), som är en bättre signal än katalogen eftersom katalogen kan ägas av root, till exempel `/opt/stacks` Om `Chown` misslyckas, till exempel för att agenten inte kör som root, ska jobbet inte fallera. Felet ska skrivas i jobbets output och loggas på Warn-nivå. Tester: ägaren tas från den befintliga filen, annars från compose-filen, och ett misslyckat `Chown` stoppar inte jobbet. Ett riktigt ägarbyte kräver root, så själva hämtningen av ägaren testas via en funktionsvariabel eller ett litet interface som går att byta ut i testerna. ## Scope Ingår inte: att köra agenten som en annan användare än root. Docker-socketen ger root-rättigheter på värden ändå.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: shcizo/package-updater#24