Pregunta 19 | Sistema de Archivos Raíz Inmutable
Usar contexto: kubectl config use-context workload-prod
El Deployment immutable-deployment en el Namespace team-purple debe ejecutarse de forma inmutable, se crea desde el archivo /opt/course/19/immutable-deployment.yaml. Incluso después de una intrusión exitosa, no debería ser posible para un atacante modificar el sistema de archivos del contenedor en ejecución.
Modifica el Deployment de manera que ningún proceso dentro del contenedor pueda modificar el sistema de archivos local, solo el directorio /tmp debe ser escribible. No modifiques la imagen Docker.
Guarda el YAML actualizado en /opt/course/19/immutable-deployment-new.yaml y actualiza el Deployment en ejecución.
Respuesta:
Los procesos en contenedores pueden escribir en el sistema de archivos local por defecto. Esto aumenta la superficie de ataque cuando un proceso no malicioso es secuestrado. Prevenir que las aplicaciones escriban en disco o solo permitirlo en ciertos directorios puede mitigar el riesgo. Si hay por ejemplo un error en Nginx que permite a un atacante sobrescribir cualquier archivo dentro del contenedor, entonces esto solo funciona si el proceso Nginx mismo puede escribir en el sistema de archivos en primer lugar.
Hacer el sistema de archivos raíz de solo lectura puede hacerse en la imagen Docker misma o en una declaración de Pod.
Primero verifiquemos el Deployment immutable-deployment en el Namespace team-purple:
➜ k -n team-purple edit deploy -o yaml
# kubectl -n team-purple edit deploy -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: team-purple
name: immutable-deployment
labels:
app: immutable-deployment
...
spec:
replicas: 1
selector:
matchLabels:
app: immutable-deployment
template:
metadata:
labels:
app: immutable-deployment
spec:
containers:
- image: busybox:1.32.0
command: ['sh', '-c', 'tail -f /dev/null']
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
...
El contenedor tiene acceso de escritura al Sistema de Archivos Raíz, ya que no hay restricciones definidas para los Pods o contenedores por un SecurityContext existente. Y según la tarea no se nos permite alterar la imagen Docker.
Así que modificamos el manifiesto YAML para incluir los cambios requeridos:
cp /opt/course/19/immutable-deployment.yaml /opt/course/19/immutable-deployment-new.yaml
vim /opt/course/19/immutable-deployment-new.yaml
# /opt/course/19/immutable-deployment-new.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: team-purple
name: immutable-deployment
labels:
app: immutable-deployment
spec:
replicas: 1
selector:
matchLabels:
app: immutable-deployment
template:
metadata:
labels:
app: immutable-deployment
spec:
containers:
- image: busybox:1.32.0
command: ['sh', '-c', 'tail -f /dev/null']
imagePullPolicy: IfNotPresent
name: busybox
securityContext: # añadir
readOnlyRootFilesystem: true # añadir
volumeMounts: # añadir
- mountPath: /tmp # añadir
name: temp-vol # añadir
volumes: # añadir
- name: temp-vol # añadir
emptyDir: {} # añadir
restartPolicy: Always
Los SecurityContexts pueden establecerse a nivel de Pod o contenedor, aquí se solicitó el último. Forzar readOnlyRootFilesystem: true hará el sistema de archivos raíz de solo lectura. Luego podemos permitir que algunos directorios sean escribibles usando un volumen emptyDir.
Una vez realizados los cambios, actualicemos el Deployment:
➜ k delete -f /opt/course/19/immutable-deployment-new.yaml
deployment.apps "immutable-deployment" deleted
➜ k create -f /opt/course/19/immutable-deployment-new.yaml
deployment.apps/immutable-deployment created
# Podemos verificar si los cambios requeridos se propagan:
➜ k -n team-purple exec immutable-deployment-5b7ff8d464-j2nrj -- touch /abc.txt
touch: /abc.txt: Read-only file system
command terminated with exit code 1
➜ k -n team-purple exec immutable-deployment-5b7ff8d464-j2nrj -- touch /var/abc.txt
touch: /var/abc.txt: Read-only file system
command terminated with exit code 1
➜ k -n team-purple exec immutable-deployment-5b7ff8d464-j2nrj -- touch /etc/abc.txt
touch: /etc/abc.txt: Read-only file system
command terminated with exit code 1
➜ k -n team-purple exec immutable-deployment-5b7ff8d464-j2nrj -- touch /tmp/abc.txt
➜ k -n team-purple exec immutable-deployment-5b7ff8d464-j2nrj -- ls /tmp
abc.txt
El Deployment ha sido actualizado para que el sistema de archivos del contenedor sea de solo lectura, y el YAML actualizado se ha colocado en la ubicación requerida. ¡Perfecto!