Descripción general
Controlarás el acceso a los clústeres de GKE con la IAM. Crearás una política de seguridad de Pods para restringir la creación de Pods con privilegios y, luego, la probarás. Además, realizarás la rotación de la dirección IP y las credenciales.
Nota: En este lab, se usará el modo estándar de GKE. Además, se exponen políticas de seguridad de Pods y no se pueden crear políticas que anulen la configuración de seguridad integrada en GKE Autopilot.
Objetivos
En este lab, aprenderás a realizar las siguientes tareas:
- Usar la IAM para controlar el acceso a GKE
- Crear y usar las políticas de seguridad de Pods para controlar la creación de Pods
- Realizar la rotación de la dirección IP y las credenciales
Nota: Para este lab, Google Cloud Skills Boost te proporcionó dos nombres de usuario disponibles en el diálogo de Detalles de la conexión. En este lab, nos referiremos a estas cuentas como Username 1 y Username 2.
Tarea 1. Usa los roles de la IAM para otorgar acceso de administrador a todos los clústeres de GKE en el proyecto
Accede a la consola de Google Cloud como el primer usuario
- Accede a la consola de Google Cloud en una ventana de incógnito, como de costumbre, con la cuenta Username 1 que se proporcionó. Ten en cuenta que ambos nombres de usuario usan la misma contraseña.
- En la barra de título de la consola de Google Cloud, haz clic en Activar Cloud Shell (
).
- Haz clic en Continuar.
Después de un momento de aprovisionamiento, se mostrará el prompt de Cloud Shell.
Nota: Si sales de la cuenta Username 1, es posible que Google Cloud Skills Boost borre la cuenta Username 2. Por lo tanto, permanece en la cuenta Username 1 hasta finalizar este lab.
Accede y explora la consola de Google Cloud como el segundo usuario
- Abre otra pestaña en tu ventana de incógnito.
- Accede a console.cloud.google.com.
- Haz clic en el ícono de usuario en la esquina superior derecha de la pantalla y, luego, en Agregar cuenta.
- Accede a la consola de Google Cloud con la cuenta Username 2 que se proporcionó. Una vez más, ten en cuenta que ambos nombres de usuario usan la misma contraseña.
Nota: Asegúrate de estar en la pestaña de la cuenta Username 2 en la consola de Google Cloud.
-
Cuando accedas con la cuenta Username 2, en el menú de navegación (
), haz clic en Kubernetes Engine > Clústeres.
-
Asegúrate de que tu ID del proyecto del lab esté seleccionado en la parte superior de la página.
Ten en cuenta que la opción para crear un clúster está inhabilitada.

Nota: Actualmente, Username 2 tiene acceso al proyecto; sin embargo, solo posee el rol de Visualizador, lo cual hace que todos los recursos del proyecto sean visibles, pero de solo lectura.
Otorga el rol de administrador de GKE de la IAM a Username 2
Ahora permitirás que Username 2 cree un clúster de GKE e implemente cargas de trabajo a través de roles básicos que otorguen a un usuario permisos para administrar todos los clústeres de GKE y los recursos dentro de esos clústeres en este proyecto. La cuenta Username 1 tiene derechos de propietario del proyecto; usarás esa cuenta para otorgar más derechos a la cuenta Username 2.
- Vuelve a la pestaña de la cuenta Username 1 en la consola de Google Cloud.
Nota: Asegúrate de estar en la pestaña de la cuenta Username 1 en la consola de Google Cloud.
-
En el menú de navegación (
), haz clic en IAM y administración > IAM.
-
En la consola de IAM, localiza la fila que corresponde a Username 2 y, luego, haz clic en el ícono de lápiz en el extremo derecho de la fila para editar los permisos de usuario.
-
Ten en cuenta que el Username 2 actualmente tiene el rol Visualizador, lo que proporciona acceso de lectura a todos los recursos dentro del proyecto.
-
Haz clic en AGREGAR OTRO ROL para agregar otra selección desplegable de roles.
-
En el cuadro desplegable Selecciona un rol, ve a Kubernetes Engine > Administrador de clústeres de Kubernetes Engine.
-
Haz clic en GUARDAR.
Nota: Username 2 ahora tiene acceso para administrar todos los clústeres de GKE en el proyecto y para administrar los recursos dentro de esos clústeres. Si este nivel de acceso es demasiado amplio para tu organización, puedes restringir la autoridad del usuario dentro de un clúster de GKE a través del control de acceso basado en roles de Kubernetes.
Haz clic en Revisar mi progreso para verificar el objetivo.
Otorgar el rol de administrador de GKE de la IAM a Username 2
Prueba el acceso de Username 2
Ahora verificarás tu trabajo. Para ello, usarás la cuenta Username 2 para crear un clúster de GKE.
- Vuelve a la pestaña de la cuenta Username 2 en la consola de Google Cloud.
Nota: Asegúrate de estar en la pestaña de la cuenta Username 2 en la consola de Google Cloud.
- Cuando accedas con la cuenta Username 2, en el menú de navegación (
), haz clic en Kubernetes Engine > Clústeres.
Ahora deberías ver que la opción para crear un clúster está habilitada. Es posible que debas actualizar la pestaña del navegador web de la cuenta Username 2 para ver los cambios.
-
Haz clic en Crear para comenzar a crear un clúster de GKE.
-
Haz clic en Cambiar a clúster estándar y confirma lo mismo en la siguiente ventana emergente.
Recuerda: Para este lab, se debe usar el modo estándar de GKE.
-
Establece el nombre del clúster en standard-cluster-1 si ese no es el nombre predeterminado.
-
Verifica que se haya seleccionado un clúster zonal, en vez de uno regional.
-
Elige la zona para el clúster, si no es la zona predeterminada.
-
Deja el resto de los valores con su configuración predeterminada y haz clic en Crear.
El clúster comienza el aprovisionamiento, pero luego falla.
Nota: Este paso del lab está diseñado para que falle.
- Haz clic en el ícono de notificaciones ubicado en la barra de herramientas, en la parte superior de la pantalla, para ver el mensaje de error.
Username 2 aún carece de algunos derechos necesarios para implementar un clúster. Esto se debe a que GKE aprovecha las instancias de Google Cloud Compute Engine para los nodos.
Para implementar un clúster de GKE, un usuario también debe tener asignado el rol iam.serviceAccountUser en la cuenta de servicio predeterminada de Compute Engine.
Otórgale a Username 2 el rol iam.serviceAccountUser
Ahora usarás IAM para otorgarle a Username 2 el rol iam.serviceAccountUser, de modo que Username 2 pueda implementar correctamente un clúster de GKE.
- Vuelve a la pestaña de la cuenta Username 1 en la consola de Google Cloud.
Nota: Asegúrate de estar en la pestaña de la cuenta Username 1 en la consola de Google Cloud.
-
En el menú de navegación (
), haz clic en IAM y administración > Cuentas de servicio.
-
En la consola de IAM, haz clic en la fila que corresponde a la cuenta de servicio predeterminada de Compute Engine para seleccionarla.
-
Haz clic en Permiso para abrir el panel de información sobre los permisos.
-
En la página Permiso, haz clic en Otorgar acceso.
El panel de información de permisos se abrirá en el lado derecho de la ventana.
- Ingresa el nombre de usuario para Username 2 en el cuadro Principales nuevas. Puedes copiar este nombre desde la página de detalles del lab.
- En el cuadro Selecciona un rol, asegúrate de que Cuentas de servicio > Usuario de cuenta de servicio esté seleccionado.
- Haz clic en Guardar.
Haz clic en Revisar mi progreso para verificar el objetivo.
Otorgar el rol iam.serviceAccountUser a Username 2
Verifica que Username 2 pueda crear un clúster de GKE
Ahora verificarás tu trabajo. Para ello, usarás la cuenta Username 2 para crear un clúster de GKE.
- Vuelve a la pestaña de la cuenta Username 2 en la consola de Google Cloud.
Nota: Asegúrate de estar en la pestaña de la cuenta Username 2 en la consola de Google Cloud.
-
Cuando accedas con la cuenta Username 2, en el menú de navegación (
), haz clic en Kubernetes Engine > Clústeres. Es posible que debas actualizar la página en el navegador web.
-
Haz clic en Crear para comenzar a crear un clúster de GKE.
-
Haz clic en Cambiar a clúster estándar y confirma lo mismo en la siguiente ventana emergente.
-
Establece el nombre del clúster en standard-cluster-1 si ese no es el nombre predeterminado.
-
Verifica que se haya seleccionado un clúster zonal, en vez de uno regional.
-
Elige la zona para el clúster, si no es la zona predeterminada.
-
Deja el resto de los valores con su configuración predeterminada y haz clic en Crear.
Nota: Deberás esperar algunos minutos para que se complete la implementación del clúster.
Esta vez, el clúster se implementará correctamente.
Haz clic en Revisar mi progreso para verificar el objetivo.
Crear un clúster de GKE
Tarea 2: Define y usa la admisión de seguridad de Pods
PodSecurity es un controlador de admisión de Kubernetes que te permite aplicar Estándares de seguridad de Pods a los Pods que se ejecutan en tus clústeres de GKE. Los Estándares de seguridad de Pods son políticas de seguridad predefinidas que abarcan las necesidades de alto nivel de la seguridad de Pods en Kubernetes. Estas políticas van desde muy permisivas hasta muy restrictivas.
En esta tarea, crearás una política de seguridad de Pods que permita la creación de Pods sin privilegios en el espacio de nombres predeterminado del clúster. Los Pods sin privilegios no permiten que los usuarios ejecuten un código como raíz y tienen acceso limitado a los dispositivos en el host.
Crea un ClusterRole que pueda usarse posteriormente en un RoleBinding que vincule la política a las cuentas que requieren la capacidad de implementar Pods con acceso sin privilegios.
A los usuarios que requieran la capacidad de implementar Pods con privilegios, se les puede otorgar acceso a la PSP integrada que se proporciona para permitir que los usuarios administradores implementen Pods luego de que se habiliten las políticas de seguridad de Pods.
Cuando hayas configurado los componentes, habilitarás el controlador PodSecurityPolicy, que aplica estas políticas y, luego, evaluarás cómo afectan a los usuarios con diferentes privilegios.
Conéctate al clúster de GKE
- Vuelve a la pestaña de la cuenta Username 1 en la consola de Google Cloud.
Nota: Asegúrate de estar en la pestaña de la cuenta Username 1 en la consola de Google Cloud.
- En Cloud Shell, escribe el siguiente comando para crear variables de entorno para el nombre del clúster y la zona de Google Cloud que se usaron en la creación del clúster de este lab:
export my_zone={{{project_0.default_zone | ZONE }}}
export my_cluster=standard-cluster-1
- Configura el completado de línea de comando para la herramienta de línea de comandos de kubectl:
source <(kubectl completion bash)
- Configura el acceso al clúster para kubectl:
gcloud container clusters get-credentials $my_cluster --zone $my_zone
Aplica los Estándares de seguridad de Pods con PodSecurity
Para usar el controlador de admisión de PodSecurity, debes aplicar Estándares de seguridad de Pods específicos en modos determinados a espacios de nombres específicos.
Crea espacios de nombres nuevos
Crea espacios de nombres en el clúster:
kubectl create ns baseline-ns
kubectl create ns restricted-ns
Este comando crea los siguientes espacios de nombres:
- baseline-ns: Para cargas de trabajo permisivas
- restricted-ns: Para cargas de trabajo muy restrictivas
Usa etiquetas para aplicar políticas de seguridad
Aplica los siguientes Estándares de seguridad de Pods:
- baseline: Aplícalo a baseline-ns en el modo de advertencia.
- restricted: Aplícalo a restricted-ns en el modo de aplicación forzosa.
kubectl label --overwrite ns baseline-ns pod-security.kubernetes.io/warn=baseline
kubectl label --overwrite ns restricted-ns pod-security.kubernetes.io/enforce=restricted
Estos comandos logran el siguiente resultado:
- Se permiten las cargas de trabajo del espacio de nombres baseline-ns que incumplen la política de referencia, y el cliente muestra un mensaje de advertencia.
- Se rechazan las cargas de trabajo del espacio de nombres restricted-ns que incumplen la política de restricción, y GKE agrega una entrada a los registros de auditoría.
Verifica que se hayan agregado las etiquetas:
kubectl get ns --show-labels
El resultado es similar al siguiente:
baseline-ns Active 74s kubernetes.io/metadata.name=baseline-ns,pod-security.kubernetes.io/warn=baseline
restricted-ns Active 18s kubernetes.io/metadata.name=restricted-ns,pod-security.kubernetes.io/enforce=restricted
default Active 57m kubernetes.io/metadata.name=default
kube-public Active 57m kubernetes.io/metadata.name=kube-public
kube-system Active 57m kubernetes.io/metadata.name=kube-system
Haz clic en Revisar mi progreso para verificar el objetivo.
Crear los espacios de nombres y las etiquetas
Prueba las políticas configuradas
Para verificar que el controlador de admisión PodSecurity funcione según lo previsto, implementa una carga de trabajo que incumpla la política de referencia y de restricción en ambos espacios de nombres. En el siguiente manifiesto de ejemplo, se implementa un contenedor nginx que permite la elevación de privilegios.
- Crea y abre un archivo llamado
psa-workload.yaml
con nano usando el siguiente comando:
nano psa-workload.yaml
- Una vez que nano se abra, pega lo siguiente en el archivo
psa-workload.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
securityContext:
privileged: true
-
Presiona Ctrl + O y, luego, Intro para guardar el archivo editado.
-
Presiona Ctrl + X para salir del editor de texto nano.
-
Aplica el manifiesto al espacio de nombres baseline-ns:
kubectl apply -f psa-workload.yaml --namespace=baseline-ns
El resultado es similar al siguiente:
Warning: would violate PodSecurity "baseline:latest": privileged (container "nginx" must not set securityContext.privileged=true)
pod/nginx created
La política de referencia permite que el Pod se implemente en el espacio de nombres.
- Verifica que el Pod se haya implementado correctamente:
kubectl get pods --namespace=baseline-ns -l=app=nginx
- Aplica el manifiesto al espacio de nombres restricted-ns:
kubectl apply -f psa-workload.yaml --namespace=restricted-ns
El resultado es similar al siguiente:
Error from server (Forbidden): error when creating "workload.yaml": pods "nginx"
is forbidden: violates PodSecurity "restricted:latest": allowPrivilegeEscalation
!= false (container "nginx" must set securityContext.allowPrivilegeEscalation=false),
unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]),
runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true),
seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type
to "RuntimeDefault" or "Localhost")
El Pod no se implementará en el espacio de nombres. Se agrega una entrada de auditoría al registro.
Haz clic en Revisar mi progreso para verificar el objetivo.
Aplicar el manifiesto al espacio de nombres “restricted-ns”
Visualiza los incumplimientos de políticas en los registros de auditoría
Los incumplimientos de políticas que aparecen en los modos de auditoría y de aplicación forzosa se registran en los registros de auditoría para tu clúster. Puedes ver estos registros con el Explorador de registros de la consola de Google Cloud.
-
En la barra de título de la consola de Google Cloud, escribe Explorador de registros en el campo Buscar y, luego, haz clic en Explorador de registros en los resultados de la búsqueda.
-
En el campo Consulta, especifica lo siguiente:
resource.type="k8s_cluster"
protoPayload.response.reason="Forbidden"
protoPayload.resourceName="core/v1/namespaces/restricted-ns/pods/nginx"
-
Haz clic en Ejecutar consulta.
-
En la sección Resultados de la consulta, expande la entrada de registro Prohibido. Los detalles son similares a los siguientes:
{
...
protoPayload: {
@type: "type.googleapis.com/google.cloud.audit.AuditLog"
authenticationInfo: {1}
authorizationInfo: [1]
methodName: "io.k8s.core.v1.pods.create"
request: {6}
requestMetadata: {2}
resourceName: "core/v1/namespaces/restricted-ns/pods/nginx"
response: {
@type: "core.k8s.io/v1.Status"
apiVersion: "v1"
code: 403
details: {2}
kind: "Status"
message: "pods "nginx" is forbidden: violates PodSecurity "restricted:latest": privileged
(container "nginx" must not set securityContext.privileged=true),
allowPrivilegeEscalation != false (container "nginx" must set
securityContext.allowPrivilegeEscalation=false), unrestricted capabilities
(container "nginx" must set securityContext.capabilities.drop=["ALL"]),
runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true),
seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type
to "RuntimeDefault" or "Localhost")"
metadata: {0}
reason: "Forbidden"
status: "Failure"
}
serviceName: "k8s.io"
status: {2}
}
receiveTimestamp: "2022-12-01T19:19:25.353235326Z"
resource: {2}
timestamp: "2022-12-01T19:19:21.469360Z"
}
(Opcional) Tarea 3: Rota la dirección IP y las credenciales
Realiza la rotación de la dirección IP y las credenciales en tu clúster. Hacer esto regularmente es una práctica de seguridad para reducir la vida útil de las credenciales. Si bien existen comandos individuales para rotar la dirección IP y las credenciales entregadas, rotar las credenciales también rota la dirección IP.
- En Cloud Shell, ejecuta el siguiente comando:
gcloud container clusters update $my_cluster --zone $my_zone --start-credential-rotation
- Ingresa
Y
para continuar.
- Deja el entorno de Cloud Shell abierto hasta que la operación se complete.
Una vez completado el comando en Cloud Shell, el clúster iniciará el proceso para actualizar cada uno de los nodos. Ese proceso puede tardar hasta 15 minutos
en tu clúster. El proceso también actualiza automáticamente la entrada kubeconfig para el usuario actual.
- La instancia principal del clúster ahora entrega temporalmente la dirección IP nueva además de la dirección original.
Nota: Debes actualizar el archivo kubeconfig en algún otro sistema que use kubectl o la API para acceder a la instancia principal antes de completar el proceso de rotación y así evitar que se pierda el acceso.
- Ejecuta el siguiente comando para finalizar las tareas de rotación de credenciales y dirección IP:
gcloud container clusters update $my_cluster --zone $my_zone --complete-credential-rotation
Esto finaliza los procesos de rotación y quita la dirección IP original del clúster.
Nota: Si la rotación de credenciales no se completa y devuelve un mensaje de error, ejecuta el siguiente comando.
gcloud container clusters upgrade $my_cluster --node-pool=default-pool --zone $my_zone
-
Ingresa Y
para continuar.
-
Después de que el clúster se actualice correctamente, vuelve a ejecutar el siguiente comando:
gcloud container clusters update $my_cluster --zone $my_zone --complete-credential-rotation
Finalice su lab
Cuando haya completado el lab, haga clic en Finalizar lab. Google Cloud Skills Boost quitará los recursos que usó y limpiará la cuenta.
Tendrá la oportunidad de calificar su experiencia en el lab. Seleccione la cantidad de estrellas que corresponda, ingrese un comentario y haga clic en Enviar.
La cantidad de estrellas indica lo siguiente:
- 1 estrella = Muy insatisfecho
- 2 estrellas = Insatisfecho
- 3 estrellas = Neutral
- 4 estrellas = Satisfecho
- 5 estrellas = Muy satisfecho
Puede cerrar el cuadro de diálogo si no desea proporcionar comentarios.
Para enviar comentarios, sugerencias o correcciones, use la pestaña Asistencia.