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 un mesh 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 certsGenere el certificado raíz y la clave:
$ make -f ../tools/certs/Makefile.selfsigned.mk root-caEsto generará los siguientes ficheros:
root-cert.pem: el certificado raíz generadoroot-key.pem: la clave raíz generadaroot-ca.conf: la configuración paraopensslpara 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-cacertsEsto 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
cluster1con 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
cacertsque incluya todos los ficheros de entradaca-cert.pem,ca-key.pem,root-cert.pemycert-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.pemVuelva 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
httpbinycurl.$ 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 fooDespliegue una política para los workloads en el namespace
foopara 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 chaindevuelto 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.txtAnalice 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.pemVerifique 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 identicalVerifique 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 identicalVerifique 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 certsElimine el secreto
cacerts:$ kubectl delete secret cacerts -n istio-systemElimine la política de autenticación del namespace
foo:$ kubectl delete peerauthentication -n foo defaultElimine las applications de ejemplo
curlyhttpbin:$ kubectl delete -f samples/curl/curl.yaml -n foo $ kubectl delete -f samples/httpbin/httpbin.yaml -n fooDesinstale Istio del cluster:
$ istioctl uninstall --purge -yElimine el namespace
fooyistio-systemdel cluster:$ kubectl delete ns foo istio-system