En esta página se explica cómo definir restricciones de Policy Controller mediante las plantillas de restricciones predefinidas que proporciona Google.
Esta página está dirigida a administradores de TI y operadores que quieran asegurarse de que todos los recursos que se ejecutan en la plataforma en la nube cumplen los requisitos de cumplimiento de la organización. Para ello, deben proporcionar y mantener la automatización para auditar o aplicar, y usar plantillas de configuración declarativa. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas habituales de los usuarios de GKE. Google Cloud
Policy Controller te permite aplicar políticas en un clúster de Kubernetes definiendo uno o varios objetos de restricción. Una vez que se instala una restricción, las solicitudes al servidor de la API se comprueban con la restricción y se rechazan si no la cumplen. Los recursos no conformes que ya existían se notifican en el momento de la auditoría.
Cada restricción se basa en una plantilla de restricción que define el esquema y la lógica de la restricción. Las plantillas de restricciones pueden proceder de Google y de terceros, o bien puedes escribir las tuyas propias. Para obtener más información sobre cómo crear plantillas, consulta el artículo Escribir una plantilla de restricción.
Antes de empezar
Consultar la biblioteca de plantillas de restricciones
Cuando defines una restricción, especificas la plantilla de restricción
que amplía. De forma predeterminada, se instala una biblioteca de plantillas de restricciones comunes desarrollada por Google, y muchas organizaciones no necesitan crear plantillas de restricciones personalizadas directamente en Rego. Las plantillas de restricción 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 restricción y comprobar sus parámetros obligatorios, usa el siguiente comando:
kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME
También puedes ver todas las plantillas de restricción de la biblioteca.
Definir una restricción
Las restricciones se definen mediante YAML, por lo que no es necesario entender ni escribir Rego. En su lugar, una restricción invoca una plantilla de restricción y le proporciona parámetros específicos de la restricción.
Si usas Config Sync con un repositorio jerárquico, te recomendamos que crees las restricciones en el directorio cluster/
.
Las restricciones tienen los siguientes campos:
- El valor en minúsculas
kind
coincide con el nombre de una plantilla de restricción. metadata.name
es el nombre de la restricción.- El campo
match
define a qué objetos se aplica la restricción. Deben cumplirse todas las condiciones especificadas para que un objeto esté dentro del ámbito de una restricción.match
Las condiciones se definen mediante los siguientes subcampos:kinds
son los tipos de recursos a los que se aplica la restricción, determinados por dos campos:apiGroups
es una lista de grupos de APIs de Kubernetes que coinciden ykinds
es una lista de tipos que coinciden. "*" coincide con todo. Si coinciden al menos una entrada deapiGroup
y una dekind
, se cumple la condiciónkinds
.scope
acepta *, Cluster o Namespaced, lo que determina si se seleccionan recursos de ámbito de clúster o de ámbito de espacio de nombres (el valor predeterminado es *).namespaces
es una lista de nombres de 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 de espacio de nombres se tratan como si pertenecieran a sí mismos.excludedNamespaces
es una lista de espacios de nombres a los que no puede pertenecer el objeto.labelSelector
es un selector de etiquetas de Kubernetes que debe cumplir el objeto.namespaceSelector
es un selector de etiquetas del espacio de nombres al que pertenece el objeto. Si el espacio de nombres no cumple los requisitos del objeto, no coincidirá. Los recursos de espacio de nombres se tratan como si se pertenecieran a sí mismos.
- El campo
parameters
define los argumentos de la restricción en función de lo que espera la plantilla de restricción.
La siguiente restricción, llamada ns-must-have-geo
, invoca una plantilla de restricción
llamada K8sRequiredLabels
, que se incluye en la
biblioteca de plantillas de restricciones
proporcionada por Google. La restricción define los parámetros que utiliza la plantilla de restricción para evaluar si los espacios de nombres tienen la etiqueta geo
definida con 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
Auditar una restricción
Si la restricción se ha configurado e instalado correctamente, su campo status.byPod[].enforced
se define como true
, independientemente de si la restricción se ha configurado para aplicarla o solo para probarla.
Las restricciones se aplican de forma predeterminada y, si se infringe una, se impide una operación de clúster determinada. Puedes definir el spec.enforcementAction
de una restricción en dryrun
para que se notifiquen las infracciones en el campo status.violations
sin impedir la operación.
Para obtener más información sobre la auditoría, consulta Auditar mediante restricciones.
Advertencias al sincronizar restricciones
Si sincronizas tus restricciones con una fuente centralizada, como un repositorio de Git, con Config Sync u otra herramienta de estilo GitOps, ten en cuenta las siguientes advertencias al sincronizar las restricciones.
Coherencia eventual
Puedes confirmar las restricciones en una fuente de información principal, como un repositorio de Git, y limitar sus efectos mediante ClusterSelectors o NamespaceSelectors. Como la sincronización es eventualmente coherente, ten en cuenta las siguientes advertencias:
- Si una operación de clúster activa una restricción cuyo NamespaceSelector hace referencia a un espacio de nombres que no se ha sincronizado, la restricción se aplica y se impide la operación. Es decir, si falta un espacio de nombres, se considera que la operación ha fallado.
- Si cambia las etiquetas de un espacio de nombres, es posible que la caché contenga datos obsoletos durante un breve periodo.
Minimiza la necesidad de cambiar el nombre de un espacio de nombres o de modificar sus etiquetas, y prueba las restricciones que afectan a un espacio de nombres cuyo nombre o etiquetas se han cambiado para asegurarte de que funcionan correctamente.
Configurar Policy Controller para las restricciones referenciales
Para poder habilitar las restricciones referenciales, debes crear una configuración que indique a Policy Controller qué tipos de objetos debe monitorizar, como los espacios de nombres.
Guarda el siguiente manifiesto YAML en un archivo y aplícalo con kubectl
. El manifiesto configura Policy Controller para monitorizar espacios de nombres y recursos Ingress.
Crea una entrada con group
, version
y kind
en spec.sync.syncOnly
,
con los valores de cada tipo de objeto que quieras monitorizar.
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"
Habilitar restricciones de integridad referencial
.Una restricción referencial hace referencia a otro objeto en su definición. Por ejemplo, puedes crear una restricción que requiera que los objetos Ingress de un clúster tengan nombres de host únicos. La restricción es referencial si su plantilla de restricción contiene la cadena data.inventory
en su Rego.
Las restricciones referenciales están habilitadas de forma predeterminada si instalas Policy Controller mediante la consola Google Cloud . Si instalas Policy Controller con Google Cloud CLI, puedes elegir si quieres habilitar las restricciones referenciales cuando instales Policy Controller. Las restricciones referenciales solo tienen la garantía de ser coherentes con el tiempo, lo que conlleva riesgos:
En un servidor de APIs sobrecargado, el contenido de la caché de Policy Controller puede quedar obsoleto, lo que provoca que una restricción referencial se "abra", lo que significa que la acción de cumplimiento parece funcionar cuando no lo hace. Por ejemplo, puedes crear Ingresses con nombres de host duplicados demasiado rápido para 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 caché son aleatorios.
Puedes actualizar un clúster para permitir las restricciones referenciales.
Consola
Para inhabilitar las restricciones referenciales, sigue estos pasos:
- En la consola, vaya a la página Política de la sección Gestión de postura. Google Cloud
- En la pestaña Configuración, en la tabla de clústeres, seleccione Editar edit en la columna Editar configuración.
- Despliega el menú Editar configuración de Policy Controller.
- Seleccione la casilla Habilitar plantillas de restricción que hagan referencia a objetos distintos al que se está evaluando.
- Selecciona Guardar cambios.
gcloud
Para habilitar la compatibilidad con las restricciones referenciales, ejecuta el siguiente comando:
gcloud container fleet policycontroller update \
--memberships=MEMBERSHIP_NAME \
--referential-rules
Sustituye MEMBERSHIP_NAME
por el nombre de pertenencia del clúster registrado para habilitar las reglas referenciales. Puedes especificar varias suscripciones separadas por comas.
Inhabilitar restricciones referenciales
Cuando inhabilitas las restricciones referenciales, las plantillas que las usan también se eliminan del clúster, así como las restricciones que usan esas plantillas.
Consola
Las restricciones referenciales están habilitadas de forma predeterminada cuando instalas Policy Controller con la consola Google Cloud . Para inhabilitar las restricciones referenciales, sigue estos pasos:
- En la consola, vaya a la página Política de la sección Gestión de postura. Google Cloud
- En la pestaña Configuración, en la tabla de clústeres, seleccione Editar edit en la columna Editar configuración.
- Despliega el menú Editar configuración de Policy Controller.
- Desmarque la casilla Habilitar plantillas de restricción que hagan referencia a objetos distintos al que se está evaluando.
- Selecciona Guardar cambios.
gcloud
Para inhabilitar la compatibilidad con las restricciones referenciales, ejecuta el siguiente comando:
gcloud container fleet policycontroller update \
--memberships=MEMBERSHIP_NAME \
--no-referential-rules
Sustituye MEMBERSHIP_NAME
por el nombre de pertenencia del clúster registrado para habilitar las reglas referenciales. Puedes especificar varias suscripciones separadas por comas.
Mostrar todas las restricciones
Para enumerar todas las restricciones instaladas en un clúster, usa el siguiente comando:
kubectl get constraint
También puedes ver un resumen de las restricciones aplicadas en la Google Cloud consola. Para obtener más información, consulta Métricas de Policy Controller.
Quitar una restricción
Para encontrar todas las restricciones que usan una plantilla de restricción, usa el siguiente comando para enumerar todos los objetos con el mismo kind
que la plantilla de restricción metadata.name
:
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 en cuanto el servidor de la API la marca como eliminada.
Quitar todas las plantillas de restricciones
Consola
Para inhabilitar la biblioteca de plantillas de restricción, sigue estos pasos:
- En la consola, vaya a la página Política de la sección Gestión de postura. Google Cloud
- En la pestaña Configuración, en la tabla de clústeres, seleccione Editar edit en la columna Editar configuración.
- En el menú Añadir o editar paquetes de políticas, desactive la biblioteca de plantillas y todos los paquetes de políticas do_not_disturb_on.
- Selecciona Guardar cambios.
gcloud
Para inhabilitar la biblioteca de plantillas de restricciones, ejecuta el siguiente comando:
gcloud container fleet policycontroller content templates disable \
--memberships=MEMBERSHIP_NAME
Sustituye MEMBERSHIP_NAME
por el nombre de la pertenencia del clúster registrado en el que quieras inhabilitar la biblioteca de plantillas de restricciones. Puedes especificar varias membresías separadas por comas.
Restaurar la biblioteca de plantillas de restricciones
Consola
Para habilitar la biblioteca de plantillas de restricción, sigue estos pasos:
- En la consola, vaya a la página Política de la sección Gestión de postura. Google Cloud
- En la pestaña Configuración, en la tabla de clústeres, seleccione Editar edit en la columna Editar configuración.
- En el menú Añadir o editar paquetes de políticas, activa la biblioteca de plantillas check_circle. También puedes habilitar todos los paquetes de políticas o solo algunos.
- Selecciona Guardar cambios.
gcloud
Para restaurar la biblioteca de plantillas de restricción, ejecuta el siguiente comando:
gcloud container fleet policycontroller content templates enable \
--memberships=MEMBERSHIP_NAME
Sustituye MEMBERSHIP_NAME
por el nombre de pertenencia del clúster registrado para habilitar la biblioteca de plantillas de restricción. Puedes especificar varias membresías separadas por comas.
Siguientes pasos
- Consulte información sobre los paquetes de Policy Controller.
- Consulta la documentación de referencia de la biblioteca de plantillas de restricciones.
- Consulta cómo crear restricciones personalizadas.
- Solucionar problemas de Policy Controller.