En esta página, se muestra cómo definir las restricciones del controlador de políticas mediante las plantillas de restricciones preexistentes que proporciona Google.
Esta página está destinada a los administradores de TI y operadores que desean asegurarse de que todos los recursos que se ejecutan dentro de la plataforma en la nube cumplan con los requisitos de cumplimiento de la organización. Para ello, deben proporcionar y mantener la automatización para auditar o aplicar el cumplimiento, y usar plantillas de configuración declarativa. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud, consulta Tareas y roles comunes de los usuarios de GKE Enterprise.
El controlador de políticas te permite aplicar una política para un clúster de Kubernetes mediante la definición de uno o más objetos de restricción. Después de que se instala una restricción, las solicitudes al servidor de la API se verifican en la restricción y se rechazan si no cumplen con ella. Los recursos preexistentes que no cumplan con esta se informarán en el tiempo de auditoría.
Cada restricción está respaldada por una plantilla de restricciones que define el esquema y la lógica de la restricción. Las plantillas de restricciones se pueden obtener de Google y de terceros, o bien puedes escribirlas por tu cuenta. Para obtener más información sobre cómo crear plantillas nuevas, consulta Escribe una plantilla de restricciones.
Antes de comenzar
Examina la biblioteca de plantillas de restricciones
Cuando defines una restricción, debes especificar la plantilla de restricciones que extiende. De forma predeterminada, se instala una biblioteca común de plantillas de restricciones desarrollada por Google, por lo que muchas organizaciones no necesitan crear plantillas de restricción personalizadas directamente en Rego. Las plantillas de restricciones proporcionadas por Google tienen la etiqueta configmanagement.gke.io/configmanagement
.
Para enumerar las restricciones, usa el siguiente comando:
kubectl get constrainttemplates \ -l="configmanagement.gke.io/configmanagement=config-management"
Para describir una plantilla de restricciones y verificar los parámetros que requiere, usa el siguiente comando:
kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME
También puedes ver todas las plantillas de restricciones en la biblioteca.
Define una restricción
Debes usar YAML para definir una restricción, y no necesitas entender ni escribir Rego. En cambio, una restricción invoca una plantilla de restricciones y le proporciona parámetros específicos de la restricción.
Si usas el Sincronizador de configuración con un repositorio jerárquico, te recomendamos que crees las restricciones en el directorio cluster/
.
Las restricciones tienen los siguientes campos:
- El
kind
en minúsculas coincide con el nombre de una plantilla de restricciones. - El campo
metadata.name
es el nombre de la restricción. - El campo
match
define a qué objetos se aplica la restricción. Todas las condiciones especificadas deben coincidir antes de que un objeto esté dentro del alcance de una restricción. Las condicionesmatch
se definen mediante los siguientes subcampos:kinds
son los tipos de recursos a los que se aplica la restricción, que se determinan mediante dos campos:apiGroups
es una lista de los grupos de la API de Kubernetes que coincidirán ykinds
es una lista de los tipos que coincidirán. Mediante "*", se realizan coincidencias con todo. Si al menos una entradaapiGroup
y una entradakind
coinciden, se cumple la condiciónkinds
.scope
acepta *, Cluster o Namespaced, lo que determina si se seleccionan los recursos con permiso de clúster o con permiso de espacio de nombres (el valor predeterminado es *).namespaces
es una lista de nombres de los espacios de nombres a los que puede pertenecer el objeto. El objeto debe pertenecer al menos a uno de estos espacios de nombres. Los recursos del espacio de nombres se tratan como si pertenecieran a sí mismos.excludedNamespaces
es una lista de espacios de nombres a los que el objeto no puede pertenecer.labelSelector
es un selector de etiquetas de Kubernetes con el que el objeto debe cumplir.namespaceSelector
es un selector de etiquetas en el espacio de nombres al que pertenece el objeto. Si el espacio de nombres no cumple con el objeto, no coincidirá. Los recursos del espacio de nombres se tratan como si pertenecieran a sí mismos.
- El campo
parameters
define los argumentos para la restricción, en función de lo que espera la plantilla de restricciones.
La siguiente restricción, llamada ns-must-have-geo
, invoca una plantilla de restricciones llamada K8sRequiredLabels
, que se incluye en la biblioteca de plantillas de restricciones proporcionada por Google. La restricción define los parámetros que la plantilla de restricciones usa para evaluar si los espacios de nombres tienen la etiqueta geo
establecida en algún valor.
# ns-must-have-geo.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: ns-must-have-geo
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Namespace"]
parameters:
labels:
- key: "geo"
Para crear la restricción, usa kubectl apply -f
:
kubectl apply -f ns-must-have-geo.yaml
Audita una restricción
Si la restricción se configura y se instala de forma adecuada, su campo status.byPod[].enforced
se establece en true
, ya sea que la restricción esté configurada para aplicar o solo auditar la restricción.
Las restricciones se aplican de forma predeterminada y el incumplimiento de una restricción impide una operación de clúster determinada. Puedes establecer la spec.enforcementAction
de una restricción en dryrun
para informar los incumplimientos en el campo status.violations
sin impedir la operación.
Para obtener más información sobre cómo auditar, consulta Audita mediante el uso de restricciones.
Advertencias durante la sincronización de restricciones
Si sincronizas tus restricciones con una fuente centralizada, como un repositorio de Git, con el Sincronizador de configuración o alguna otra herramienta de estilo GitOps, ten en cuenta las siguientes advertencias cuando realices la sincronización de restricciones.
Coherencia eventual
Puedes confirmar restricciones en una fuente de información, como un repositorio de Git, y limitar sus efectos con ClusterSelectors o NamespaceSelectors. Debido a que la sincronización es finalmente coherente, ten en cuenta las siguientes advertencias:
- Si una operación de clúster desencadena una restricción cuyo NamespaceSelector hace referencia a un espacio de nombres que no se haya sincronizado, la restricción se aplicará y se evitará la operación. En otras palabras, un espacio de nombres faltante “se cerrará en falla”.
- Si cambias las etiquetas de un espacio de nombres, puede que la memoria caché contenga datos desactualizados por un tiempo breve.
Minimiza la necesidad de cambiar el nombre de un espacio de nombres o sus etiquetas, y prueba las restricciones que afectan a un espacio de nombres con un cambio de nombre o de etiquetas para garantizar que funcionen como se espera.
Configura el controlador de políticas para restricciones referenciales
Antes de poder habilitar restricciones referenciales, debes crear una configuración que le indique a Policy Controller qué tipos de objetos debe observar, como los espacios de nombres.
Guarda el siguiente manifiesto YAML en un archivo y aplícalo con kubectl
. El manifiesto configura el controlador de políticas para que supervise los espacios de nombres y los ingresos.
Crea una entrada con group
, version
y kind
en spec.sync.syncOnly
, con los valores de cada tipo de objeto que deseas ver.
apiVersion: config.gatekeeper.sh/v1alpha1
kind: Config
metadata:
name: config
namespace: "gatekeeper-system"
spec:
sync:
syncOnly:
- group: ""
version: "v1"
kind: "Namespace"
- group: "extensions"
version: "v1beta1"
kind: "Ingress"
Habilita las restricciones referenciales
Una restricción referencial hace referencia a otro objeto en su definición. Por ejemplo, podrías crear una restricción que requiera que los objetos de entrada en un clúster tengan nombres de host únicos. La restricción es referencial si tu plantilla de restricciones contiene la string data.inventory
en su Rego.
Las restricciones referenciales se habilitan de forma predeterminada si instalas Policy Controller con la consola de Google Cloud. Si instalas Policy Controller con Google Cloud CLI, puedes elegir si habilitar las restricciones de referencia cuando instales Policy Controller. Solo se garantiza que las restricciones de referencia sean eventualmente coherentes, y esto crea riesgos:
En un servidor de API sobrecargado, el contenido de la memoria caché del controlador de políticas puede volverse obsoleto, lo que causaría una restricción referencial para "abrirse con errores", lo que significa que la acción de aplicación forzosa parece estar funcionando cuando no lo está. Por ejemplo, puedes crear entradas con nombres de host duplicados demasiado rápido como para permitir que el controlador de admisión detecte los duplicados.
El orden en el que se instalan las restricciones y el orden en el que se actualiza la memoria caché son aleatorios.
Puedes actualizar un clúster existente para permitir restricciones de referencia.
Console
Para inhabilitar las restricciones de referencias, completa los siguientes pasos:
- En la consola de Google Cloud, ve a la página Política de GKE Enterprise en la sección Administración de postura.
- En la pestaña Configuración, en la tabla del clúster, selecciona Editar edit en la columna Editar configuración.
- Expande el menú Editar configuración de Policy Controller.
- Selecciona la casilla de verificación Habilitar las plantillas de restricciones que hacen referencia a objetos distintos del que se está evaluando.
- Selecciona Guardar cambios.
Policy Controller de gcloud
Para habilitar la compatibilidad con las restricciones de referencias, ejecuta el siguiente comando:
gcloud container fleet policycontroller update \
--memberships=MEMBERSHIP_NAME \
--referential-rules
Reemplaza MEMBERSHIP_NAME
por el nombre de membresía del clúster registrado para habilitar las reglas de referencia. Puedes especificar varias membresías separadas por comas.
gcloud ConfigManagement
Para habilitar la compatibilidad con las restricciones referenciales, establece policyController.referentialRulesEnabled
como true
en tu archivo config-management.yaml
:
apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
name: config-management
namespace: config-management-system
spec:
clusterName: my-cluster
channel: dev
policyController:
enabled: true
referentialRulesEnabled: true
Inhabilita las restricciones referenciales
Cuando inhabilitas las restricciones referenciales, también se quitan del clúster las plantillas que las usan, junto con las restricciones que usan esas plantillas.
Console
Las restricciones referenciales se habilitan de forma predeterminada cuando instalas Policy Controller con la consola de Google Cloud. Para inhabilitar las restricciones de referencias, completa los siguientes pasos:
- En la consola de Google Cloud, ve a la página Política de GKE Enterprise en la sección Administración de postura.
- En la pestaña Configuración, en la tabla del clúster, selecciona Editar edit en la columna Editar configuración.
- Expande el menú Editar configuración de Policy Controller.
- Desmarca la casilla de verificación Habilitar las plantillas de restricciones que hacen referencia a objetos distintos del que se está evaluando.
- Selecciona Guardar cambios.
Policy Controller de gcloud
Para inhabilitar la compatibilidad con las restricciones de referencias, ejecuta el siguiente comando:
gcloud container fleet policycontroller update \
--memberships=MEMBERSHIP_NAME \
--no-referential-rules
Reemplaza MEMBERSHIP_NAME
por el nombre de membresía del clúster registrado para habilitar las reglas de referencia. Puedes especificar varias membresías separadas por comas.
gcloud ConfigManagement
Para inhabilitar las restricciones de referencia en un clúster, configura policyController.referentialRulesEnabled
como false
en tu archivo config-management.yaml
:
apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
name: config-management
namespace: config-management-system
spec:
clusterName: my-cluster
channel: dev
policyController:
enabled: true
referentialRulesEnabled: false
Enumera todas las restricciones
Para enumerar todas las restricciones instaladas en un clúster, usa el siguiente comando:
kubectl get constraint
También puedes ver una descripción general de las restricciones aplicadas en la consola de Google Cloud. Para obtener más información, consulta Métricas de Policy Controller.
Quita una restricción
Si deseas encontrar todas las restricciones que usan una plantilla de restricciones, usa el siguiente comando para enumerar todos los objetos con el mismo kind
que metadata.name
de la plantilla de restricciones:
kubectl get CONSTRAINT_TEMPLATE_NAME
Para quitar una restricción, especifica su kind
y su name
:
kubectl delete CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME
Cuando quitas una restricción, deja de aplicarse tan pronto como el servidor de API la marca como eliminada.
Quita todas las plantillas de restricciones
Console
Para inhabilitar la biblioteca de plantillas de restricciones, completa los siguientes pasos:
- En la consola de Google Cloud, ve a la página Política de GKE Enterprise en la sección Administración de postura.
- En la pestaña Configuración, en la tabla del clúster, selecciona Editar edit en la columna Editar configuración.
- En el menú Agregar o editar paquetes de políticas, desactiva la biblioteca de plantillas y todos los paquetes de políticas do_not_disturb_on.
- Selecciona Guardar cambios.
Policy Controller de gcloud
Para inhabilitar la biblioteca de plantillas de restricciones, ejecuta el siguiente comando:
gcloud container fleet policycontroller content templates disable \
--memberships=MEMBERSHIP_NAME
Reemplaza MEMBERSHIP_NAME
por el nombre de membresía del clúster registrado para inhabilitar la biblioteca de plantillas de restricciones. Puedes especificar varias membresías separadas por comas.
gcloud ConfigManagement
Establece spec.policyController.templateLibraryInstalled
en false
. Esto evita que Policy Controller vuelva a instalar la biblioteca de forma automática.
Para quitar todas las plantillas de restricciones y todas las restricciones, usa el siguiente comando:
kubectl delete constrainttemplate --all
Restablece la biblioteca de plantillas de restricciones
Console
Para habilitar la biblioteca de plantillas de restricciones, completa los siguientes pasos:
- En la consola de Google Cloud, ve a la página Política de GKE Enterprise en la sección Administración de postura.
- En la pestaña Configuración, en la tabla del clúster, selecciona Editar edit en la columna Editar configuración.
- En el menú Agregar o editar paquetes de políticas, activa la biblioteca de plantillas check_circle. También puedes habilitar uno o todos los paquetes de políticas.
- Selecciona Guardar cambios.
Policy Controller de gcloud
Para restablecer la biblioteca de plantillas de restricciones, ejecuta el siguiente comando:
gcloud container fleet policycontroller content templates enable \
--memberships=MEMBERSHIP_NAME
Reemplaza MEMBERSHIP_NAME
por el nombre de membresía del clúster registrado para habilitar la biblioteca de plantillas de restricciones. Puedes especificar varias membresías separadas por comas.
gcloud ConfigManagement
Si inhabilitaste la biblioteca de plantillas de restricciones o desinstalaste todas las plantillas de restricciones, puedes restaurarla si configuras spec.policyController.templateLibraryInstalled
como true
en la configuración de Policy Controller.
Para reiniciar el Pod del operador, usa el siguiente comando:
kubectl delete pod -n config-management-system -l k8s-app=config-management-operator
¿Qué sigue?
- Obtén más información sobre los paquetes de Policy Controller.
- Consulta la documentación de referencia de la biblioteca de plantillas de restricciones.
- Obtén más información sobre cómo crear restricciones personalizadas.
- Soluciona problemas del controlador de políticas.