Resolver problemas de seguridad en Cloud Service Mesh
En esta sección se explican los problemas habituales de Cloud Service Mesh con las APIs de Istio y cómo resolverlos. Si necesitas más ayuda, consulta el artículo Obtener asistencia.
En Cloud Service Mesh, la autoridad de certificación de Cloud Service Mesh o Istiod emite certificados a las cargas de trabajo de todos los clústeres de la malla. Las políticas de autenticación (por ejemplo, mTLS) y de autorización (por ejemplo, permitir o denegar) se envían a cada clúster. Estas políticas determinan qué cargas de trabajo pueden comunicarse y cómo.
Problemas de TLS
En las siguientes secciones se explica cómo resolver problemas relacionados con TLS en Cloud Service Mesh.
En los ejemplos de esta sección se usa la variable ${CTX}
, que es el nombre del contexto en el archivo de configuración predeterminado de Kubernetes que usas para acceder al clúster. Define la variable ${CTX}
como en el siguiente ejemplo:
export CTX=gke_PROJECT_ID_CLUSTER_LOCATION_CLUSTER_NAME
Verificar la implementación obligatoria de TLS
Verifica que no se permitan solicitudes de texto sin cifrar para un servicio cuando el servicio requiera conexiones TLS:
kubectl exec SOURCE_POD -n SOURCE_NAMESPACE -c \ SOURCE_CONTAINER -- curl -v DESTINATION_URL
Si el servicio requiere conexiones TLS, la solicitud de texto sin formato anterior debería fallar y generar un resultado similar al siguiente:
curl: (56) Recv failure: Connection reset by peer command terminated with exit code 56
Comprobar certificados mTLS
Cuando mTLS esté habilitado, comprueba el certificado mTLS de la carga de trabajo consultando el encabezado X-Forwarded-Client-Cert
. Para ello, sigue estos pasos:
Despliega el servicio de muestra
httpbin
, que puede mostrar los encabezados que recibe.Usa
curl
para ver el encabezadoX-Forwarded-Client-Cert
:kubectl exec --context=${CTX} SOURCE_POD -n SOURCE_NAMESPACE -c \ SOURCE_CONTAINER -- curl http://httpbin.sample:8000/headers -s | \ grep X-Forwarded-Client-Cert
El encabezado
X-Forwarded-Client-Cert
muestra la información de los certificados de mTLS, como en el siguiente ejemplo:X-Forwarded-Client-Cert": "By=spiffe://lt-multicluster-t2-5-15-2020.svc.id.goog/ns/sample/sa/httpbin;Hash=0781d68adfdab85b08b6758ed502f352464e81166f065cc6acde9433337b4494;Subject=\"OU=istio_v1_cloud_workload,O=Google LLC,L=Mountain View,ST=California,C=US\";URI=spiffe://lt-multicluster-t2-5-15-2020.svc.id.goog/ns/sample/sa/sleep
También puedes usar
openssl
en el panel acoplable para ver toda la cadena de certificados:kubectl debug --image istio/base --target istio-proxy -it --context=${CTX} SOURCE_POD \ -n SOURCE_NAMESPACE -- openssl s_client -alpn istio -showcerts -connect httpbin.sample:8000
El resultado mostrará la cadena de certificados. Si usas una AC de malla, comprueba que el CN del certificado raíz contenga
istio_v1_cloud_workload_root-signer-...
. Si usas Istiod como autoridad de certificación, comprueba que el certificado raíz esté configurado conO = <var>YOUR_TRUST_DOMAIN</var>
.
Errores de TLS bad certificate
en los registros de Istiod
Si ves errores de handshake TLS bad certificate
en los registros, puede indicar que Istiod no puede establecer una conexión TLS con un servicio.
Puedes usar la cadena de expresión regular TLS handshake error.*bad certificate
para encontrar estos errores en los registros.
Estos errores suelen ser informativos y temporales. Sin embargo, si persisten, puede que indiquen que hay un problema en tu sistema.
Comprueba que tu
istio-sidecar-injector
MutatingWebhookConfiguration
tenga un paquete de CA.El webhook del inyector de sidecar (que se usa para la inyección automática de sidecar) requiere un paquete de CA para establecer conexiones seguras con el servidor de la API e Istiod. istiod aplica este paquete de CA a la configuración, pero a veces se puede sobrescribir (por ejemplo, si vuelves a aplicar la configuración del webhook).
Verifica la presencia del paquete de CA:
kubectl get mutatingwebhookconfiguration -l app=sidecar-injector -o=jsonpath='{.items[0].webhooks[0].clientConfig.caBundle}'
Si el resultado no está vacío, el paquete de CA está configurado. Si falta el paquete de CA, reinicia
istiod
para que vuelva a analizar el webhook y reinstale el paquete de CA.
Registro de denegaciones de la política de autorización
Para obtener información sobre el registro de denegaciones de políticas de autorización, consulta Registro de denegaciones.
No se aplican las políticas de autorización
Si observas síntomas de que no se aplican las políticas de autorización, usa el siguiente comando para verificarlas:
kubectl exec --context=${CTX} -it SOURCE_POD -n SOURCE_NAMESPACE \ -c SOURCE_CONTAINER -- curl DESTINATION_URL
En el resultado, los mensajes access denied
indican que las políticas de autorización se aplican correctamente, como en el siguiente ejemplo:
RBAC: access denied
Si confirmas que no se aplican las políticas de autorización, deniega el acceso al espacio de nombres. En el siguiente ejemplo se deniega el acceso al espacio de nombres authz-ns
:
kubectl apply --context=${CTX} -f - <<EOF apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: deny-authz-ns namespace: authz-ns spec: {} EOF
Error "customresourcedefinitions.apiextensions.k8s.io is forbidden" en los registros de Istiod
Es posible que veas errores similares a los siguientes:
error failed to list CRDs: customresourcedefinitions.apiextensions.k8s.io is forbidden: User "system:serviceaccount:istio-system:istiod-service-account" cannot list resource "customresourcedefinitions" in API group "apiextensions.k8s.io" at the cluster scope
Puedes usar la cadena de expresión regular /error.*cannot list resource/
para encontrar estos errores en los registros.
Este error puede producirse cuando tu implementación de Istiod no tiene el enlace de gestión de identidades y accesos correcto o no tiene suficientes permisos de control de acceso basado en roles para leer un recurso personalizado.
Comprueba si falta un enlace de gestión de identidades y accesos en tu cuenta. Primero, asegúrate de haber configurado correctamente las credenciales y los permisos. A continuación, comprueba que el enlace de IAM esté presente con el siguiente comando. En este ejemplo, PROJECT_ID es el resultado de
gcloud config get-value project
y PROJECT_NUMBER es el resultado degcloud projects list --filter="project_id=${PROJECT_ID}" --format="value(project_number)"
:gcloud projects add-iam-policy-binding ${PROJECT_ID} --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-meshdataplane.iam.gserviceaccount.com" --role "roles/meshdataplane.serviceAgent"
Comprueba que las reglas de RBAC estén instaladas correctamente.
Si faltan las reglas de RBAC, vuelve a ejecutar
asmcli install
para volver a crearlas.Si las reglas de RBAC están presentes y los errores persisten, comprueba que
ClusterRoleBindings
yRoleBindings
adjunten las reglas de RBAC a la cuenta de servicio de Kubernetes correcta. Además, comprueba que tu implementación de istiod esté usando la cuenta de servicio especificada.
serverca
errores de proceso en los registros de Istiod
Es posible que veas errores similares a los siguientes:
Authentication failed: Authenticator ClientCertAuthenticator at index 0 got error
Puedes usar la cadena de expresión regular /serverca.*Authentication failed:.*JWT/
para encontrar estos errores en los registros.
Este error puede producirse cuando el emisor de JWT está mal configurado, cuando un cliente usa un token caducado o cuando algún otro problema de seguridad impide que una conexión se autentique correctamente en istiod.