Autorizzazioni utente all'interno e all'esterno dei contenitori LXC?


26

Sto eseguendo alcuni servizi all'interno dei container Docker LXC sul mio server e sto iniziando a fare davvero cose serie con loro.

Una cosa su cui non sono chiaro è come funzionano le autorizzazioni utente all'interno e all'esterno del contenitore. Se, ad esempio, sto eseguendo MySQL in un contenitore e la sua directory di dati è impostata su /data, che è un volume Docker, in che modo le autorizzazioni all'interno e all'esterno del contenitore influiscono sui criteri di accesso?

Ovviamente, l'idea è di eseguire MySQL come proprio utente nel contenitore (ad es. mysql:mysql) E dargli i diritti di lettura e scrittura a quella directory. Suppongo che questo sarebbe abbastanza semplice, solo chmodnella directory, ecc. Ma come funziona al di fuori del contenitore? Ora che ho questo volume condiviso Docker chiamato "dati", come posso gestirlo?

Sto specificamente cercando di essere in grado di eseguire un utente senza privilegi al di fuori del contenitore Docker che accederà periodicamente al volume condiviso di MySQL e eseguirà il backup dei dati.

Come posso impostare autorizzazioni, utenti e gruppi in modo che un utente specifico sull'host possa leggere / scrivere file e cartelle nel volume condiviso Docker?


2
Con userns (ma ancora nessun dockersupporto per questo) il contenitore LXC può essere eseguito come utente non privilegiato. Altrimenti l' rootutente all'interno del contenitore potrebbe potenzialmente esplodere se il contenitore è configurato in modo inappropriato. Vale roota dire su host è rootnel contenitore in un contenitore LXC privilegiato.
0xC0000022L,

1
roota proposito, può anche eseguire container non privilegiati . È importante che sia definita una mappatura per gli utenti .
0xC0000022L

Risposte:


21

Dopo il rilascio di 0,9 Docker è sceso LXCe utilizza il proprio ambiente di esecuzione, libcontainer. La tua domanda è un po 'vecchia ma immagino che la mia risposta si applichi ancora alla versione che stai utilizzando.

Risposta rapida: per comprendere le autorizzazioni dei volumi, è possibile prendere l'analogia di mount --bind Host-Dir Container-Dir. Quindi, per soddisfare le tue esigenze, puoi utilizzare qualsiasi metodo tradizionale per la gestione delle autorizzazioni. Immagino che ACL sia ciò di cui hai bisogno .

Risposta lunga: così come nel tuo esempio abbiamo un contenitore chiamato dock con un volume /data.

docker run -tid --name dock -v /usr/container/Databases/:/data \
    centos:latest /bin/bash

All'interno del container il nostro server MySQL è stato configurato per utilizzare la /datasua directory di dati. Quindi abbiamo i nostri database /dataall'interno del contenitore. E al di fuori del container sul sistema operativo host, abbiamo montato questo /datavolume /usr/container/Databases/e assegniamo un bob utente normale per eseguire i backup dei database. Dal computer host configureremo gli ACL per bob utente .

useradd -u 3000 bob
usermod -R o=--- /usr/container/Databases/
setfacl -R -m u:bob:rwx /usr/container/Databases/
setfacl -R -d -m u:bob:rwx /usr/container/Databases/

Per provarlo, facciamo un backup con bob utente .

su - bob
tar -cvf container-data.tar /usr/container/Databases/

E tar elencherà e puoi vedere che il nostro utente è stato in grado di accedere a tutti i file.

Ora dall'interno del contenitore, se controlli getfacl, noterai che invece di bob mostra 3000. Questo perché l'UID di bob è 3000 e non esiste tale utente nel contenitore, quindi visualizza semplicemente l'UID che riceve dai metadati . Ora se crei un utente nel tuo contenitore useradd -u 3000 bobnoterai che ora getfaclmostra il nome bob anziché 3000.

Riepilogo : le autorizzazioni utente assegnate dall'interno o dall'esterno del contenitore si riflettono in entrambi gli ambienti. Pertanto, per gestire le autorizzazioni dei volumi, gli UID nel computer host devono essere diversi dagli UID nel contenitore .


Docker per Ubuntu ha almeno un nome di pacchetto lxc-docker, significa che non sta usando LXC? Quanto sopra vale ancora in questo caso?
Naftuli Kay,

@NaftuliTzviKay oh, scusa. Quindi deve usare LXC (immagino che apt-get infopossano avere i dettagli) perché in Ubuntu c'è un altro pacchetto docker.ioche ho usato. Non sono andato con Ubuntu a lungo, dato che Docker e RedHat si sono uniti. Quindi è meglio andare con RHEL o CentOS come sistema operativo di base, altrimenti puoi semplicemente usare LXC.
Beginer,

Anche in lxc-dockerquesto sembra funzionare come previsto. Ho creato un utente con uid di 3000, ho toccato un file in un volume condiviso e sono stato in grado di vedere dal sistema operativo host che il file esisteva ed era di proprietà di un utente con ID 3000.
Naftuli Kay
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.