Esiste un modo sicuro per attivare i comandi in un altro contenitore nello stesso pod Kubernetes?

Aug 23 2020

Sto creando un servizio agente che accetta chiamate di rete e può attivare comandi in qualsiasi altro contenitore nello stesso pod. Questo, ovviamente, non è il solito caso d'uso dei pod, ma so che alcuni strumenti CI fanno qualcosa di simile, come Jenkins ed è il plug-in Kubernetes.

Attualmente, lo faccio funzionare usando kubectl nel contenitore dell'agente e lo faccio funzionare kubectl exec <pod> -c <container> -- <command>e funziona bene. Ma sembra una grande opportunità per le vulnerabilità.

Affinché l'agente possa accedere a kubectl come exec, deve disporre dei privilegi pod/execche gli danno accesso a tutti i pod nello stesso spazio dei nomi.

rules:
- apiGroups: [""]
  resources: ["pods", "pods/exec"]
  verbs: ["get", "list", "watch", "create"]

Se non ci sono modi migliori per affrontare questo problema, inserirò semplicemente i comandi exec nel mio agente in modo tale che accetti solo le chiamate allo stesso pod.

Ma la mia grande preoccupazione è l'esecuzione di codice sconosciuto dall'agente e ottenere l'accesso a più di quanto dovrebbe. Nell'esempio di Jenkins, se qualcuno ha una pipeline che verifica il proprio codice ed era dannoso e includeva un test che utilizza effettivamente la libreria kubernetes-client e chiama gli altri pod nello spazio dei nomi, come lo impediresti pur abilitando il comunicazione da container a container?

Apprezzerei qualsiasi suggerimento!

Risposte

3 Rico Aug 23 2020 at 17:59

Sembra che tu voglia eseguire i comandi nel pod ma non vuoi premere il kube-apiserver. Inoltre, sembra che la tua applicazione stia ascoltando un trigger (su una sorta di broker o applicazione uniforme) ed esegua il comando.

Il mio suggerimento sarebbe di avere solo l'applicazione 'scucire' eseguire il comando stesso invece di aver kubectleseguito sullo stesso contenitore con exec. Non hai specificato la lingua in cui è scritta la tua applicazione, ma le lingue più comuni hanno una libreria per eseguire una chiamata di sistema exec o gestire i processi. cioè Golang , Python , ecc.

✌️