Skip to main content

Pregunta 41 | CKS Challenge 1 - Configuración Completa de Seguridad

¡Llévame al laboratorio!

Ten en cuenta que el estado de competición para los Desafíos CKS ha terminado. Por favor no envíes una solución. No será puntuada.

Hay 6 imágenes listadas en el diagrama. Usando Aquasec Trivy (que ya está instalado en el nodo controlplane), identifica la imagen que tiene el menor número de vulnerabilidades críticas y úsala para desplegar el deployment alpha-xyz.

Asegura este deployment aplicando el perfil AppArmor llamado custom-nginx.

Expón este deployment con un servicio de tipo ClusterIP y asegúrate de que solo se acepten conexiones entrantes desde el pod llamado middleware y todo lo demás sea rechazado.

Haz clic en cada icono (en el laboratorio) para ver más detalles. Una vez hecho, haz clic en el botón Check para probar tu trabajo.

Realiza las tareas en este orden:

namespace

Toda la acción tiene lugar en el namespace alpha

kubectl config set-context --current --namespace alpha

alpha-pv

  • Ya se ha creado un persistentVolume llamado alpha-pv. No lo modifiques. Inspecciona los parámetros usados para crearlo.
kubectl describe pv alpha-pv

Nota StorageClass, Access Modes, Capacity, VolumeMode

alpha-pvc

  • alpha-pvc debería estar vinculado a alpha-pv. Elimínalo y recréalo si es necesario.
kubectl get pvc alpha-pvc

El estado es pending, es decir, no se vinculará.

Elimina el PVC y recréalo con valores para storage class, access modes y capacity que coincidan con los del PV

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: alpha-pvc
namespace: alpha
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: local-storage
volumeMode: Filesystem

images

  • Las imágenes permitidas son: nginx:alpine, bitnami/nginx, nginx:1.13, nginx:1.17, nginx:1.16 y nginx:1.14. Usa trivy para encontrar la imagen con el menor número de vulnerabilidades CRITICAL.

Inspecciona todas las imágenes

docker image ls

Nota que hay imágenes adicionales además de las indicadas

Itera sobre las imágenes que queremos (filtrando las que no queremos), y escanéalas con trivy obteniendo la información que necesitamos

for i in $(docker image ls --format '{{.Repository}}:{{.Tag}}' | grep nginx | grep -v none)
do
echo -n "$i "
trivy i -s CRITICAL $i | grep Total | awk '{print $2}'
done

nginx:alpine 0 bitnami/nginx:latest 3 nginx:latest 27 nginx:1.17 43 nginx:1.16 43 nginx:1.14 64 nginx:1.13 85

Podemos ver que nginx:alpine tiene el menor (cero) críticos, ¡lo cual es algo esperado! Usaremos esta imagen cuando despleguemos el pod más adelante.

custom-nginx

  • Mueve el perfil AppArmor /root/usr.sbin.nginx a /etc/apparmor.d/usr.sbin.nginx en el nodo controlplane
  • Carga el perfil AppArmor llamado custom-nginx y asegúrate de que esté aplicado.
mv /root/usr.sbin.nginx /etc/apparmor.d/usr.sbin.nginx

apparmor_parser /etc/apparmor.d/usr.sbin.nginx

alpha-xyz

  • Crea un deployment llamado alpha-xyz que use la imagen con las menores vulnerabilidades 'CRITICAL' (Usa el archivo YAML de ejemplo ubicado en /root/alpha-xyz.yaml para crear el deployment. ¡Por favor asegúrate de usar los mismos nombres y etiquetas especificados en este archivo YAML de ejemplo!)
  • El Deployment tiene exactamente 1 réplica lista
  • data-volume está montado en /usr/share/nginx/html en el pod
  • El deployment alpha-xyz usa el perfil apparmor custom-nginx (aplicado al contenedor llamado nginx). Ten en cuenta que esta tarea se revela al hacer clic en la flecha entre custom-nginx y alpha-xyz

Edita el archivo dado /root/alpha-xyz.yaml y completa las propiedades necesarias. Necesitamos usar el PVC del paso 3, la imagen determinada en el paso 4 y el perfil apparmor del paso 5

apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: alpha-xyz
name: alpha-xyz
namespace: alpha
spec:
replicas: 1
selector:
matchLabels:
app: alpha-xyz
strategy: {}
template:
metadata:
annotations:
container.apparmor.security.beta.kubernetes.io/nginx: localhost/custom-nginx
labels:
app: alpha-xyz
spec:
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: alpha-pvc
containers:
- image: nginx:alpine
name: nginx
volumeMounts:
- name: data-volume
mountPath: /usr/share/nginx/html
kubectl apply -f /root/alpha-xyz.yaml

alpha-svc

  • Expón el alpha-xyz como un servicio de tipo ClusterIP llamado alpha-svc
  • alpha-svc debería estar expuesto en port: 80 y targetPort: 80
kubectl expose deployment alpha-xyz --type ClusterIP --name alpha-svc --port 80 --target-port 80

restrict-inbound

  • Crea una NetworkPolicy llamada restrict-inbound en el namespace alpha
  • Policy Type = Ingress
  • Acceso entrante solo permitido desde el pod llamado middleware con etiqueta app=middleware
  • Acceso entrante solo permitido al puerto TCP 80 en pods que coincidan con la política
  • La política debería aplicarse solo en pods con etiqueta app=alpha-xyz. Esta tarea se revela al hacer clic en la flecha entre restrict-inbound y alpha-xyz
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-inbound
namespace: alpha
spec:
podSelector:
matchLabels:
app: alpha-xyz
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: middleware
ports:
- port: 80

Aplica esta política

Una vez que se completen todas las tareas anteriores, haz clic en el botón Check.