Pregunta 41 | CKS Challenge 1 - Configuración Completa de Seguridad
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-pvcdebería estar vinculado aalpha-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.16ynginx:1.14. Usatrivypara encontrar la imagen con el menor número de vulnerabilidadesCRITICAL.
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.nginxa/etc/apparmor.d/usr.sbin.nginxen el nodo controlplane - Carga el perfil AppArmor llamado
custom-nginxy 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-xyzque use la imagen con las menores vulnerabilidades 'CRITICAL' (Usa el archivo YAML de ejemplo ubicado en/root/alpha-xyz.yamlpara 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
1réplica lista data-volumeestá montado en/usr/share/nginx/htmlen el pod- El deployment
alpha-xyzusa el perfil apparmorcustom-nginx(aplicado al contenedor llamadonginx). Ten en cuenta que esta tarea se revela al hacer clic en la flecha entrecustom-nginxyalpha-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-xyzcomo un servicio de tipoClusterIPllamadoalpha-svc alpha-svcdebería estar expuesto enport: 80ytargetPort: 80
kubectl expose deployment alpha-xyz --type ClusterIP --name alpha-svc --port 80 --target-port 80
restrict-inbound
- Crea una NetworkPolicy llamada
restrict-inbounden el namespacealpha - Policy Type =
Ingress - Acceso entrante solo permitido desde el pod llamado
middlewarecon etiquetaapp=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 entrerestrict-inboundyalpha-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.