Conectar Certificados de CA
Esta tarea muestra cómo los administradores pueden configurar la autoridad de certificación (CA) de Istio con un certificado raíz, un certificado de firma y una clave.
Por defecto, la CA de Istio genera un certificado raíz y una clave autofirmados y los utiliza para firmar los certificados de los workloads. Para proteger la clave de la CA raíz, debe utilizar una CA raíz que se ejecute en una máquina segura sin conexión, y utilizar la CA raíz para emitir certificados intermedios a las CA de Istio que se ejecutan en cada cluster. Una CA de Istio puede firmar certificados de workloads utilizando el certificado y la clave especificados por el administrador, y distribuir un certificado raíz especificado por el administrador a los workloads como la raíz de confianza.
El siguiente gráfico demuestra la jerarquía de CA recomendada en una malla que contiene dos clusters.
Esta tarea demuestra cómo generar y conectar los certificados y la clave para la CA de Istio. Estos pasos se pueden repetir para aprovisionar certificados y claves para las CA de Istio que se ejecutan en cada cluster.
Conectar certificados y clave en el cluster
En el directorio de nivel superior del paquete de instalación de Istio, cree un directorio para guardar los certificados y las claves:
$ mkdir -p certs $ pushd certs
Genere el certificado raíz y la clave:
$ make -f ../tools/certs/Makefile.selfsigned.mk root-ca
Esto generará los siguientes ficheros:
root-cert.pem
: el certificado raíz generadoroot-key.pem
: la clave raíz generadaroot-ca.conf
: la configuración paraopenssl
para generar el certificado raízroot-cert.csr
: el CSR generado para el certificado raíz
Para cada cluster, genere un certificado intermedio y una clave para la CA de Istio. El siguiente es un ejemplo para
cluster1
:$ make -f ../tools/certs/Makefile.selfsigned.mk cluster1-cacerts
Esto generará los siguientes ficheros en un directorio llamado
cluster1
:ca-cert.pem
: los certificados intermedios generadosca-key.pem
: la clave intermedia generadacert-chain.pem
: la cadena de certificados generada que utiliza istiodroot-cert.pem
: el certificado raíz
Puede reemplazar
cluster1
con una cadena de su elección. Por ejemplo, con el argumentocluster2-cacerts
, puede crear certificados y claves en un directorio llamadocluster2
.Si está haciendo esto en una máquina sin conexión, copie el directorio generado a una máquina con acceso a los clusters.
En cada cluster, cree un secreto
cacerts
que incluya todos los ficheros de entradaca-cert.pem
,ca-key.pem
,root-cert.pem
ycert-chain.pem
. Por ejemplo, paracluster1
:$ kubectl create namespace istio-system $ kubectl create secret generic cacerts -n istio-system \ --from-file=cluster1/ca-cert.pem \ --from-file=cluster1/ca-key.pem \ --from-file=cluster1/root-cert.pem \ --from-file=cluster1/cert-chain.pem
Vuelva al directorio de nivel superior de la instalación de Istio:
$ popd
Desplegar Istio
Despliegue Istio utilizando el perfil
demo
.La CA de Istio leerá los certificados y la clave de los ficheros montados en secreto.
$ istioctl install --set profile=demo
Desplegar services de ejemplo
Despliegue los services de ejemplo
httpbin
ycurl
.$ kubectl create ns foo $ kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml) -n foo $ kubectl apply -f <(istioctl kube-inject -f samples/curl/curl.yaml) -n foo
Despliegue una política para los workloads en el namespace
foo
para que solo acepten tráfico mTLS.$ kubectl apply -n foo -f - <<EOF apiVersion: security.istio.io/v1 kind: PeerAuthentication metadata: name: "default" spec: mtls: mode: STRICT EOF
Verificación de los certificados
En esta sección, verificamos que los certificados de los workloads están firmados por los certificados que conectamos a la CA.
Esto requiere que tenga openssl
instalado en su máquina.
Espere 20 segundos para que la política mTLS surta efecto antes de recuperar la cadena de certificados de
httpbin
. Como el certificado de CA utilizado en este ejemplo es autofirmado, el errorverify error:num=19:self signed certificate in certificate chain
devuelto por el comando openssl es esperado.$ sleep 20; kubectl exec "$(kubectl get pod -l app=curl -n foo -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo -- openssl s_client -showcerts -connect httpbin.foo:8000 > httpbin-proxy-cert.txt
Analice los certificados en la cadena de certificados.
$ sed -n '/-----BEGIN CERTIFICATE-----/{:start /-----END CERTIFICATE-----/!{N;b start};/.*/p}' httpbin-proxy-cert.txt > certs.pem $ awk 'BEGIN {counter=0;} /BEGIN CERT/{counter++} { print > "proxy-cert-" counter ".pem"}' < certs.pem
Verifique que el certificado raíz es el mismo que el especificado por el administrador:
$ openssl x509 -in certs/cluster1/root-cert.pem -text -noout > /tmp/root-cert.crt.txt $ openssl x509 -in ./proxy-cert-3.pem -text -noout > /tmp/pod-root-cert.crt.txt $ diff -s /tmp/root-cert.crt.txt /tmp/pod-root-cert.crt.txt Files /tmp/root-cert.crt.txt and /tmp/pod-root-cert.crt.txt are identical
Verifique que el certificado de CA es el mismo que el especificado por el administrador:
$ openssl x509 -in certs/cluster1/ca-cert.pem -text -noout > /tmp/ca-cert.crt.txt $ openssl x509 -in ./proxy-cert-2.pem -text -noout > /tmp/pod-cert-chain-ca.crt.txt $ diff -s /tmp/ca-cert.crt.txt /tmp/pod-cert-chain-ca.crt.txt Files /tmp/ca-cert.crt.txt and /tmp/pod-cert-chain-ca.crt.txt are identical
Verifique la cadena de certificados desde el certificado raíz hasta el certificado del workload:
$ openssl verify -CAfile <(cat certs/cluster1/ca-cert.pem certs/cluster1/root-cert.pem) ./proxy-cert-1.pem ./proxy-cert-1.pem: OK
Limpieza
Elimine los certificados, claves y ficheros intermedios de su disco local:
$ rm -rf certs
Elimine el secreto
cacerts
:$ kubectl delete secret cacerts -n istio-system
Elimine la política de autenticación del namespace
foo
:$ kubectl delete peerauthentication -n foo default
Elimine las applications de ejemplo
curl
yhttpbin
:$ kubectl delete -f samples/curl/curl.yaml -n foo $ kubectl delete -f samples/httpbin/httpbin.yaml -n foo
Desinstale Istio del cluster:
$ istioctl uninstall --purge -y
Elimine el namespace
foo
yistio-system
del cluster:$ kubectl delete ns foo istio-system