El dispositivo aislado de Google Distributed Cloud (GDC) adopta ONTAP Select (OTS) como proveedor de almacenamiento definido por software. OTS tiene su propio sistema de autenticación en el que cada identidad (servicio principal o cliente) tiene un nombre y una clave asociados.
En este documento, se describen los pasos para rotar las claves y los certificados de autenticación que se deben realizar para lo siguiente:
- rotación de claves programada con regularidad para garantizar que el dispositivo sea seguro y cumpla con los requisitos
- exposición de la llave Debes rotar la clave expuesta lo antes posible.
Antes de comenzar
Asegúrate de tener el siguiente acceso:
- Acceso a la Consola del administrador del clúster de ONTAP
- Kubeconfig para el servidor de la API de administración
Rota las credenciales de IPsec (PSK)
A partir de la versión 9.10.1, ONTAP admite la autenticación basada en certificados para IPsec. Esta versión de GDC es la 9.14.1 y usa claves precompartidas.
En el caso del dispositivo, IPsec se implementa para dos tipos de tráfico de OTS:
- Tráfico externo entre hosts de metal desnudo y SVM.
- Tráfico interno entre nodos trabajadores
Los analizaremos por separado.
Requisitos previos
- Acceso a la Consola del administrador del clúster de ONTAP
- Una nueva clave precompartida
- Kubeconfig para el servidor de la API de administración
- Acceso a hosts para actualizar la configuración de StrongSwan
Impacto
Mientras se rotan las políticas de IPsec, los hosts experimentarán una pérdida de conectividad IP con el sistema de almacenamiento. Las conexiones se detendrán o, posiblemente, fallarán según el comportamiento de la aplicación. Si es posible, puedes pausar las cargas de trabajo del usuario durante la rotación, pero no es obligatorio. Las conexiones deberían restablecerse poco después de que se restablezcan los secretos.
Rotación de claves para el tráfico externo de OTS
Para validar la rotación, usa el siguiente comando y compara tu resultado:
export KUBECONFIG= #path to root-admin kubeconfig
kubectl get StorageEncryptionConnections -n gpc-system
Resultado:
NAME INVENTORYMACHINE STORAGEVIRTUALMACHINE STORAGECIDR PRESHAREDKEY READY AGE
bm-1ba9796c bm-1ba9796c root-admin 10.4.4.0/24 bm-1ba9796c-pre-shared-key True 6h16m
bm-96a5f32a bm-96a5f32a root-admin 10.4.4.0/24 bm-96a5f32a-pre-shared-key True 16h
bm-e07f4a4f bm-e07f4a4f root-admin 10.4.4.0/24 bm-e07f4a4f-pre-shared-key True 21h
Verifica que el campo READY
sea verdadero para el host específico en el que ejecutaste la secuencia de comandos anteriormente.
Rota manualmente la PSK si encuentras algún error durante la validación.
Ejecuta el siguiente comando:
export KUBECONFIG= #path to root-admin kubeconfig
mgmt_ip="$(kubectl get storagecluster -A -o jsonpath='{.items[0].spec.network.clusterManagement.ip}')" username="$(kubectl get secret storage-root-level1 -n gpc-system -o jsonpath='{.data.username}' | base64 -d)" password="$(kubectl get secret storage-root-level1 -n gpc-system -o jsonpath='{.data.password}' | base64 -d)"
Para ver la contraseña y copiarla en el portapapeles, haz lo siguiente:
echo $password
Accede a la consola de ONTAP:
ssh $username@$mgmt_ip
Cuando se te solicite la contraseña, pega la que copiaste en el paso anterior.
Usa la siguiente secuencia de comandos para la rotación de credenciales:
export KUBECONFIG= #path to root-admin kubeconfig
kubectl get StorageEncryptionConnections -n gpc-system
Resultado:
NAME INVENTORYMACHINE STORAGEVIRTUALMACHINE STORAGECIDR PRESHAREDKEY READY AGE bm-1ba9796c bm-1ba9796c root-admin 10.4.4.0/24 bm-1ba9796c-pre-shared-key True 6h16m bm-96a5f32a bm-96a5f32a root-admin 10.4.4.0/24 bm-96a5f32a-pre-shared-key True 16h bm-e07f4a4f bm-e07f4a4f root-admin 10.4.4.0/24 bm-e07f4a4f-pre-shared-key True 21h
Para cada host que desees rotar, puedes ejecutar lo siguiente:
export bm_host= //name of bm-host from above export secret="${bm_host}-pre-shared-key" export job_name="os-policy-config-host-ipsec-${bm_host}" export ns="gpc-system" export svm="$(kubectl get storageencryptionconnections "${bm_host}" -n "${ns}" -o jsonpath='{.spec.storageVirtualMachineRef.name}')"
Ahora confirma que ves todos los componentes de la conexión de encriptación del almacenamiento. Para las conexiones de clúster de administrador, ya sea root-admin o organization-admin, debes usar el clúster de root-admin.
kubectl get secrets -n "${ns}" "${secret}" kubectl get jobs -n "${ns}" "${job_name}"
Si ambos elementos están presentes, puedes continuar con el siguiente paso. Si no es así, detente y no continúes con la modificación de IPsec. Comunícate con el equipo de asistencia técnica.
kubectl delete secrets -n "${ns}" "${secret}" kubectl delete jobs "${job_name}" -n "${ns}"
Ahora usa el servidor de la API de Management para borrar el objeto storageencryptionconnection.
export KUBECONFIG= #path to root-admin kubeconfig
kubectl delete storageencryptionconnections "${bm_host}" annotation_key="reconcile_annotation_key" annotation_value="reconcile_annotation_value" kubectl patch storagevirtualmachines "${svm}" -n "${ns}" --type=merge -p "{\"metadata\":{\"annotations\":{\"$annotation_key\":\"$annotation_value\"}}}" kubectl patch storagevirtualmachines "${svm}" -n "${ns}" --type=json -p="[{\"op\": \"remove\", \"path\": \"/metadata/annotations/$annotation_key\"}]"
Rotación de claves para el tráfico interno de OTS
Del mismo modo, para validar la rotación, usa el siguiente comando y compara tu resultado:
export KUBECONFIG= #path to root-admin kubeconfig
kubectl get secret ots-internal-pre-shared-key -n gpc-system
Resultado:
NAME TYPE DATA AGE
ots-internal-pre-shared-key Opaque 1 18m
kubectl get jobs -n gpc-system | grep os-policy-config-host-ipsec
Resultado:
os-policy-config-host-ipsec-bm-3d33bb857t5bh Complete 1/1 17s 10m
os-policy-config-host-ipsec-bm-774fa8e6frgr7 Complete 1/1 30s 11m
os-policy-config-host-ipsec-bm-8e452fb29q5wd Complete 1/1 23s 11m
Verifica que todos los trabajos tengan el estado Complete
.
kubectl get StorageEncryptionConnections -n gpc-system
Resultado:
NAME INVENTORYMACHINE STORAGEVIRTUALMACHINE STORAGECIDR PRESHAREDKEY READY AGE
bm-3d33bb85 bm-3d33bb85 root-admin 10.4.4.0/24 bm-3d33bb85-pre-shared-key True 6h16m
bm-774fa8e6 bm-774fa8e6 root-admin 10.4.4.0/24 bm-774fa8e6-pre-shared-key True 16h
bm-8e452fb2 bm-8e452fb2 root-admin 10.4.4.0/24 bm-8e452fb2-pre-shared-key True 21h
Verifica que el campo READY
sea verdadero para todos los hosts.
Borra todos los CR del paso 2 en el orden indicado.
Borra el secreto del tráfico interno.
sh kubectl delete secret ots-internal-pre-shared-key -n gpc-system
Borra los tres trabajos de política del SO.
sh kubectl delete jobs os-policy-config-host-ipsec-bm-3d33bb857t5bh -n gpc-system kubectl delete jobs os-policy-config-host-ipsec-bm-774fa8e6frgr7 -n gpc-system kubectl delete jobs os-policy-config-host-ipsec-bm-8e452fb29q5wd -n gpc-system
Borra los tres objetos storageencryptionconnection
sh kubectl delete StorageEncryptionConnections bm-3d33bb85-root-admin -n gpc-system kubectl delete StorageEncryptionConnections bm-774fa8e6-root-admin -n gpc-system kubectl delete StorageEncryptionConnections bm-8e452fb2-root-admin -n gpc-system
Espera unos minutos (entre 3 y 5). Repite el paso 2 hasta que todos los CR estén en estado READY o Complete.
Rotar las teclas de volumen
En esta sección, se describen los pasos manuales para rotar las credenciales de volumen de OTS.
Antes de comenzar
Completa los siguientes pasos:
- Verifica que cumplas con los requisitos de la laptop.
- Asegúrate de poder acceder a la consola del clúster de OTS a través de BM01 o BM02.
Inicia la rotación de claves de volumen
En la consola de OTS, activa la rotación de claves única:
volume encryption rekey start -vserver SVM_name -volume volume_name
El siguiente comando cambia la clave de encriptación de vol1
en SVMvs1
:
cluster1::> volume encryption rekey start -vserver vs1 -volume vol1
Para ver los nombres de los servidores virtuales y los volúmenes, puedes usar el comando show
:
vserver show
volume show
Verifica la rotación de claves de volumen
Después de iniciar la rotación de claves, verifica el estado de la nueva clave:
volume encryption rekey show
Muestra el estado de la operación de cambio de clave:
cluster1::> volume encryption rekey show
Vserver Volume Start Time Status
------- ------ ------------------ ---------------------------
vs1 vol1 9/18/2017 17:51:41 Phase 2 of 2 is in progress.
Cuando se complete la operación de cambio de clave, verifica que el volumen esté habilitado para la encriptación:
volume show -is-encrypted true
Muestra los volúmenes encriptados en cluster1
:
cluster1::> volume show -is-encrypted true
Vserver Volume Aggregate State Type Size Available Used
------- ------ --------- ----- ---- ----- --------- ----
vs1 vol1 aggr2 online RW 200GB 160.0GB 20%
Rota los certificados de HSM externos
En esta sección, se describe cómo rotar y actualizar los certificados del HSM externo para ONTAP.
Requisitos previos
- Acceso de administrador al clúster de ONTAP o a las SVM pertinentes
- Contraseña actual
- Acceso de kubectl a los clústeres adecuados
Instrucciones
Crea una copia de seguridad de los certificados de HSM anteriores:
kubectl get secret aa-aa-external-hsm-creds -n gpc-system -o yaml > external-hsm-creds-old.yaml
Actualiza el secreto de los certificados del HSM en Kubernetes:
Copia el archivo YAML secreto anterior:
sh cp external-hsm-creds-old.yaml external-hsm-creds-new.yaml
Actualiza el nuevo archivo
external-hsm-creds-new.yaml
con las nuevas credenciales del HSM, incluido el certificado de la CA del servidor, el certificado de cliente público y la clave privada del cliente.Aplica el cambio y actualiza el objeto secreto del HSM.
kubectl apply -f external-hsm-creds-new.yaml
Actualiza los certificados de HSM en ONTAP:
Accede a la CLI de ONTAP.
Instala el nuevo certificado de la AC del servidor:
cluster::> security certificate install -type server-ca -vserver <>
Instala el nuevo certificado de cliente:
cluster::> security certificate install -type client -vserver <>
Actualiza la configuración del administrador de claves para usar los certificados recién instalados:
cluster::> security key-manager external modify -vserver <> -client-cert <> -server-ca-certs <>
Validación
Verifica el cambio con el estado del administrador de claves:
cluster::> security key-manager external show-status
Verifica si los servidores de claves siguen en estado
Available
.
Rota la credencial de administrador de almacenamiento
En esta sección, se describe cómo rotar y establecer el usuario y la contraseña del administrador de almacenamiento.
Requisitos previos
- Acceso de administrador al clúster de ONTAP o a las SVM pertinentes
- Contraseña actual
- Acceso de kubectl a los clústeres adecuados
Instrucciones
Comienza con el siguiente comando y, luego, sigue las indicaciones resultantes:
cluster::> security login password
Actualiza el secreto para que coincida con lo siguiente:
Opción 1 (interactiva):
kubectl edit secret -n <netapp_namespace> netapp_credential
Usa el editor para cambiar la contraseña al nuevo valor codificado en base64.
Opción 2 (parche con dependencia de jq):
k get secret -n <netapp_namespace> netapp_credential -o json | jq '.data["password"]="<new-base64-encoded-password>"' | kubectl apply -f -
Rota las credenciales de acceso de emergencia de ONTAP
Durante la configuración del almacenamiento de archivos y bloques, se crean cuatro cuentas de usuario de acceso de emergencia que se pueden usar para acceder a ONTAP directamente. Estas credenciales se pueden obtener como secretos en el servidor de la API de Management. Una vez que se usan esas credenciales, se deben rotar.
Durante la configuración, se crean dos tipos de secretos: nivel 1 y nivel 2. El nivel 1 es storage-root-level1 and storage-root-level1-backup
. El nivel 2 es storage-root-level2 and storage-root-level2-backup
. Los secretos de nivel 2 deben almacenarse en la caja fuerte, y cada nivel tiene dos secretos: uno normal y otro de respaldo. Si bien el software controla la eliminación de los secretos normales y de copia de seguridad de forma simultánea, recomendamos rotar solo uno de estos secretos de socios a la vez como una capa adicional de seguridad.
Si bien los secretos de nivel 1 se rotan automáticamente después de un período de 90 días, los secretos de nivel 2 no lo hacen. Cualquiera de los dos tipos de secretos se debe rotar manualmente con el siguiente proceso si se usa.
Requisitos previos
- Acceso requerido: Servidor de la API de Management
Validación
- La rotación de secretos se puede validar verificando si el secreto aún está marcado para su eliminación. Si no es así, significa que se rotó el secreto. Sigue el paso uno de las siguientes instrucciones para verificarlo.
Si el secreto es de nivel 2, cópialo en un medio físico y guárdalo en la caja fuerte. Luego, el secreto se debe marcar como persistente con la anotación
"disk.gdc.goog/persisted"
.kubectl annotate secrets <secret_name> -n gpc-system disk.gdc.goog/persisted=''
Sigue estas instrucciones para rotar manualmente el secreto si encuentras algún error durante la validación.
Instrucciones
Verifica si un secreto está marcado para su eliminación:
Ejecuta el siguiente comando:
kubectl get secret <secret_name> -n gpc-system -o yaml
Si el campo
deletionTimestamp
está presente en la respuesta, como en este ejemplo, el secreto se marca para su eliminación. De lo contrario, no lo es.apiVersion: v1 data: password: KFZbQTJdYjIwSUtVVV1aNytJJVM= username: cm9vdC1sdmwy immutable: true kind: Secret metadata: annotations: cluster-name: aa-aa-stge01 creationTimestamp: "2022-12-21T05:03:02Z" deletionGracePeriodSeconds: 0 deletionTimestamp: "2022-12-21T14:42:13Z" finalizers: - ontap.storage.private.gdc.goog/breakglass-finalizer labels: breakglass-secret: "true" name: storage-root-level2 namespace: gpc-system resourceVersion: "591897" uid: 6f331f8a-bf48-4d59-9725-6c99c5e766f7 type: Opaque
Rota el secreto después de usarlo para acceder a ONTAP:
- Verifica si existen las credenciales del socio y si no están marcadas para su eliminación. No continúes y vuelve a estos pasos en el futuro si se marca para su eliminación.
Si se rota el secreto de nivel 2, el secreto del socio debe marcarse como persistente agregando la anotación
disk.gdc.goog/persisted
:kubectl annotate secrets <secret_name> -n gpc-system disk.gdc.goog/persisted=''
Borra el secreto del clúster con el siguiente comando:
kubectl delete secret <secret_name> -n gpc-system
En este punto, comenzará el proceso de eliminación (y se puede confirmar si el secreto está marcado para su eliminación). Puede tardar casi una hora en borrarse y regenerarse.
Rota los certificados del administrador de almacenamiento y de la SVM
Estos son los certificados de servidor que GDC instala en el sistema ONTAP.
Hay un certificado para el administrador de almacenamiento, también conocido como la cuenta de administrador del clúster. Su nombre tiene como prefijo el nombre de host del sistema ONTAP y un hash único al final. Se instala en el servidor virtual de administrador del clúster. GDC usa este certificado de forma interna para tareas administrativas.
También hay varios certificados del servidor definidos para las SVM de ONTAP. Estos establecen la autenticidad para los clientes que se comunican con las SVM.
Todos los certificados se pueden rotar con el mismo proceso. Debido a una discrepancia en el certificado de la CA raíz en el clúster de administrador raíz, para los certificados de clúster y SVM, que se enumeran en las siguientes tablas, la rotación requiere rotar todos los certificados dentro de la lista respectiva. Esto significa que, si se debe rotar algún certificado del clúster, también se deben rotar todos los demás. Lo mismo se aplica a los certificados de SVM. Esta limitación se solucionará cuando se implemente la administración automática de certificados.
Requisitos previos
- Acceso de administrador al clúster de ONTAP o a las SVM pertinentes
- Acceso de kubectl a los clústeres de Kubernetes correspondientes
- Reinstala los certificados de client-ca que se describen en los pasos para instalar los certificados de client-ca.
Asignación entre certificados y secretos de Kubernetes
Para cada certificado instalado en ONTAP, hay un secreto de Kubernetes correspondiente en el servidor de la API de Management que contiene los detalles del certificado. GDC genera los certificados, y el proceso para reemplazar un certificado es simple: borra el secreto que corresponde a un certificado determinado, y el certificado se volverá a generar de inmediato. Luego, ese certificado nuevo se puede instalar en ONTAP de forma manual para reemplazar el anterior.
Usa kubectl get secrets -n <namespace> -s <secret> -o yaml
para inspeccionar el certificado en Kubernetes y verificar que coincida con los detalles en ONTAP que se ven desde security certificate show -vserver <svm_name>
. El espacio de nombres siempre será "gpc-system", y puedes consultar la tabla anterior para conocer el nombre del secreto.
También puedes ver la asignación del certificado al secreto de la siguiente manera:
kubectl get certificates -n <namespace>
Certificados de clúster relevantes
Nombre común de ONTAP | Vserver | Nombre del certificado de K8S | Nombre del Secret de Kubernetes | Descripción |
N/A | <hostname> | <hostname>-admin-cert | <hostname>-admin-cert-secret | Certificado de administrador del clúster |
N/A | <hostname> | <hostname>-server-cert | <hostname>-server-cert-secret | Certificado del servidor firmado por la entidad emisora de GDC que se usa como certificado del servidor de ONTAP |
N/A | <hostname> | <hostname>-read-only-cert | <hostname>-read-only-cert-secret | Acceso de supervisión de solo lectura |
Certificados de SVM pertinentes
Vserver | Nombre del certificado de K8S | Nombre del Secret de Kubernetes | Descripción |
root-admin | root-admin-server-cert | root-admin-server-cert-secret | Certificado del servidor firmado por la entidad emisora de GDC que se usa como certificado del servidor de SVM |
root-admin | root-admin-s3-server-cert | root-admin-s3-server-cert-secret | Certificado del servidor firmado por la entidad emisora de GDC que se usa como certificado del servidor de ONTAP S3 |
root-admin | root-admin-client-cert | root-admin-client-cert-secret | Acceso de administrador de SVM |
root-admin | root-admin-s3-identity-client-cert | root-admin-s3-identity-client-cert-secret | Acceso de identidad a S3 |
Validación
Certificado de Vserver
Después de rotar todos los certificados, verifica que el backend de Trident siga conectado correctamente para cada clúster asociado con el certificado del servidor rotado.
Ejecuta lo siguiente:
export KUBECONFIG= #path to root-admin kubeconfig
kubectl get tridentbackendconfigs -n netapp-trident
El resultado debería verse así:
NAME BACKEND NAME BACKEND UUID PHASE STATUS netapp-trident-backend-tbc-ontap-san iscsi-san a46ce1c7-26da-42c9-b475-e5e37a0911f8 Bound Success
Verifica que
PHASE
sea Bound y queStatus
sea Success.
Certificado de administrador raíz
Para probar el certificado de administrador, podemos crear una nueva StorageVirtualMachine de prueba y ver que GDC puede conciliarla de forma adecuada. Los pasos para hacerlo son los siguientes:
- Enumera las StorageVirtualMachines existentes y elige una para clonar como prueba.
- Extrae la especificación de Kubernetes para él.
- Edita la definición para cambiar el nombre y borrar los campos innecesarios.
- Aplica la definición de la prueba.
- Espera a que el estado de StorageVirtualMachine sea
Ready
. - Borra el StorageVirtualMachine de prueba.
- Borra la SVM real de ONTAP.
Ejemplo
En este ejemplo, se usa un espacio de nombres de NetApp de GDC gpc-system
y se clona organization-root-user
de forma temporal en una nueva SVM llamada test-svm
.
Enumera las SVM:
kubectl get storagevirtualmachines -n ngpc-system
Resultado:
NAME AGE organization-root-admin 13d
Extrae la especificación:
kubectl get storagevirtualmachines -n gpc-system -o yaml > svm.yaml
Edita la especificación para que se vea similar a la siguiente:
apiVersion: system.gpc.gke.io/v1alpha1 kind: StorageVirtualMachine metadata: labels: ontap.storage.gpc.gke.io/role: user name: test-svm namespace: netapp-alatl12-gpcstge02 spec: aggregates: - alatl12-gpcstge02-c1-aggr1 - alatl12-gpcstge02-c2-aggr1 clusterName: alatl12-gpcstge02 iscsiTarget: port: a0a-4 subnetName: root-svm-data nasServer: port: a0a-4 subnetName: root-svm-data svmNetwork: port: e0M subnetName: Default
Aplícalo al clúster:
kubectl create -f svm.yaml
Espera a que la nueva SVM esté lista. Observa periódicamente el resultado de los siguientes comandos:
kubectl get storagevirtualmachines -n gpc-system test-svm
El éxito se indica de la siguiente manera:
Conditions: Last Transition Time: 2022-03-30T21:30:27Z Message: Observed Generation: 1 Reason: SVMCreated Status: True Type: Ready
o
AnsibleJobSucceed
.Borra el recurso de SVM:
kubectl delete storagevirtualmachines -n gpc-system test-svm
Borra el archivo por completo de ONTAP. Borrar el recurso no lo quita de ONTAP.
Accede a la consola de NetApp y borra la SVM:
alatl12-gpcstge02::> vserver delete test-svm
Resultado:
Warning: When Vserver "test-svm" is deleted, the following objects are automatically removed as well: LIFs: 7 Routes: 2 Admin-created login accounts: 2 Do you want to continue? {y|n}: y [Job 3633] Success
Sigue las instrucciones que se indican a continuación para rotar manualmente el certificado de ONTAP si encuentras algún error durante la validación.
Instrucciones
Si el nombre del certificado de ONTAP anterior no es aplicable, no es necesario rotar nada en ONTAP. Inspecciona el certificado y el secreto en Kubernetes, y borra el secreto.
Genera un certificado nuevo y haz referencia a la tabla anterior para el nombre del secreto:
kubectl get certificates -n <namespace>
$ kubectl patch Certificates <cert_name> -n gpc-system \ --type=merge -p "{\"spec\":{\"privateKey\": {\"rotationPolicy\": \"Always\"}}}" $ kubectl delete secret -n <namespace> <secret_name>
Para ver los certificados instalados en un servidor virtual determinado, en el caso de los certificados instalados en ONTAP (no marcados como no aplicables), haz lo siguiente:
cluster::> security certificate show -vserver <svm_name> -type server
Inspecciona el secreto coincidente en Kubernetes (consulta la tabla anterior):
kubectl get certificates -n <namespace>
Cuando esté conforme con la coincidencia, borra el secreto para generar un certificado nuevo:
kubectl delete secret -n <namespace> <secret_name>
Vuelve a inspeccionar el secreto para ver que se regeneró un certificado nuevo. Una vez que se confirme, crea un nuevo certificado de servidor en ONTAP. Solo sigue estos pasos para los certificados anteriores con el sufijo "server-cert".
Extrae el nuevo cuerpo del certificado TLS con
kubectl
y otras herramientas directamente, y luego instálalo en ONTAP:$ gdch_cert_details -n <namespace> -s <secret_name> cluster::> security certificate install -vserver <svm_name> -type server
La primera instrucción será la siguiente:
Please enter Certificate: Press <Enter> when done
En el que debes ingresar
tls.crt
En caso de que haya varios bloques de certificados entls.crt
, ingresa el primer bloque y conserva los bloques de certificados restantes como certificados intermedios para referencia en el siguiente paso.El sistema mostrará el mensaje:
Please enter Private Key: Press <Enter> when done
. Pega el contenido de tu archivotls.key
y presiona Intro.A continuación, aparecerá el siguiente mensaje:
Do you want to continue entering root and/or intermediate certificates {y|n}:
Si tu archivotls.crt
contiene solo un certificado, escribeN
y presiona Intro. De lo contrario, escribeY
y presiona Intro.Si escribiste
Y
: Se te pedirá que ingreses certificados intermedios. Pégalos uno por uno desde tu archivotls.crt
y presiona Intro después de cada uno. Por último, pega el certificado raíz de tu archivoca.crt
y presiona Intro.Si escribiste
N
: (no es necesario realizar ninguna otra acción con respecto a los certificados en esta solicitud)Luego, ONTAP devolverá un número de serie. Registra este número, ya que representa el número de serie del nuevo certificado y la CA. En los pasos posteriores, se hará referencia a este número de serie como
<new\_server\_serial>
y<new\_ca>
. No sigas estos pasos relacionados con el certificado si estás configurando un certificado de servidor de S3.Consulta el estado actual de las configuraciones de SSL para el servidor virtual y el clúster. Ten a mano la CA emisora del certificado del servidor, el nombre común del certificado del servidor y el número de serie del certificado del servidor, ya que se hará referencia a ellos como
<old\_server\_common\_name>
,<old\_ca>
y<old\_server\_serial>
, respectivamente:cluster::> security ssl show -vserver <vserver>
Esto devuelve la información de SSL, con la información del certificado del servidor anterior. Puedes consultar esto más adelante para asegurarte de que se haya actualizado, después de modificar la configuración de SSL.
Modifica la configuración de SSL:
cluster::> security ssl modify -server-enabled -client-enabled true -vserver <svm_name> -serial <new_server_serial> -ca <new_ca>
Consulta el nuevo estado de la configuración de SSL para el servidor virtual y el clúster. Debería tener el número de serie actualizado del certificado del servidor ahora instalado:
cluster::> security ssl show -vserver <vserver>
Borra el certificado del servidor anterior después de verificar el paso anterior:
cluster::> security certificate delete -vserver <svm_name> -common-name <old_server_common_name> -ca <old_ca> -type server -serial <old_server_serial>
Certificados de CA de cliente
Recupera todos los certificados de CA del ConfigMap
trust-store-internal-only
en el espacio de nombresgpc-system
con el siguiente comando:kubectl get cm -n gpc-system trust-store-internal-only -o jsonpath='{.data.ca\.crt}'
Para cada certificado de CA recuperado en el paso anterior, ejecuta el siguiente comando en tu clúster de ONTAP:
cluster::> security certificate install -vserver <svm_name> -type client-ca
Se te pedirá que hagas lo siguiente:
Please enter Certificate: Press <Enter> when done.
Pega cada bloque de certificado recuperado en el paso 1 y presiona Intro. Repite este comando de instalación para cada certificado de CA.
Rota los certificados de Harvest
La generación de certificados de cosecha depende de <hostname>-read-only-cert-secret
.
Asegúrate de que <hostname>-read-only-cert-secret
esté girado antes de continuar.
Visualiza los certificados instalados para el pod de Harvest:
export KUBECONFIG= #path to root-admin kubeconfig
cluster_name="$(kubectl get storagecluster -A -o jsonpath='{.items[0].metadata.name}')" secret_name="$cluster_name"-read-only-cert-secret
export TLS_CRT="$(kubectl get secret -n gpc-system $secret_name -o jsonpath='{.data.tls\.crt}')"
export TLS_KEY="$(kubectl get secret -n gpc-system $secret_name -o jsonpath='{.data.tls\.key}')"
export CA_CRT="$(kubectl get secret -n gpc-system $secret_name -o jsonpath='{.data.ca\.crt}')"
Aplica un parche al secreto de credenciales de Harvest para proporcionar los certificados actualizados:
$ kubectl patch secret \ -n gpc-system netapp-harvest-configuration-credential \ -p "{\"data\":{\"tls.crt\":\"${TLS_CRT:?}\",\"tls.key\":\"${TLS_KEY:?}\",\"ca.crt\":\"${CA_CRT:?}\"}}"
Reinicia el servicio de Harvest para cargar la configuración actualizada:
kubectl delete pod -n gpc-system -l 'app=harvest.netapp.io'
Rota los certificados del sistema de archivos
Ejecuta el siguiente comando para volver a generar el certificado de file-storage-webhooks-serving-cert
y file-observability-backend-target-cert
.
kubectl delete secret file-storage-webhooks-serving-cert -n file-system
kubectl delete secret file-observability-backend-target-cert -n file-system
Reinicia los pods para cargar la configuración actualizada:
kubectl delete pod -n file-system -l 'app=file-observability-backend-controller'
kubectl delete pod file-storage-backend-controller -n file-system
Rota los certificados de Trident y ONTAP
Trident debe comunicarse con ONTAP. Esto se configura con el backend de Trident, que usa el certificado de cliente <svm\_name>-client-cert-secret>
definido anteriormente. La rotación de certificados de cliente no forma parte de Trident, pero Trident depende de partes de este certificado, que deben actualizarse.
Instrucciones
Para actualizar el certificado de la CA:
Exporta
KUBECONFIG
para que apunte al kubeconfig del clúster específico de los componentes de Trident en cuestión. Cada clúster tendrá Trident configurado.Toma el certificado de CA, codificado en Base64 desde el secreto client-cert, y almacénalo como una variable:
ca_cert=$(kubectl get secrets -n "${ns}" "${secret}" -o jsonpath='{.data.ca\.crt}')
Aplica un parche al objeto tridentBackendConfig:
kubectl patch tridentBackendConfigs netapp-trident-backend-tbc-ontap-san -n netapp-trident --type=merge -p "{\"spec\":{\"trustedCACertificate\":\"$ca_cert\"}}"
Para el certificado y la clave del cliente reales, haz lo siguiente:
Toma el certificado TLS codificado en Base64 del secreto client-cert y almacénalo como una variable:
tls_cert=$(kubectl get secrets -n "${ns}" "${secret}" -o jsonpath='{.data.tls\.crt}')
Toma la clave de TLS, codificada dos veces en base64 desde el secreto de certificado del cliente, y almacénala como una variable:
tls_key=$(kubectl get secrets -n "${ns}" "${secret}" -o jsonpath='{.data.tls\.key}' | base64 -w 0)
Actualiza el secreto de backend con la clave privada:
kubectl patch secrets netapp-trident-backend-tbc-ontap -n netapp-trident --type=merge -p "{\"data\":{\"clientPrivateKey\": \"$tls_key\"}}"
Aplica un parche a la configuración del backend con el certificado TLS:
kubectl patch tridentBackendConfigs netapp-trident-backend-tbc-ontap-san -n netapp-trident --type=merge -p "{\"spec\":{\"clientCertificate\":\"$tls_cert\"}}"
Rota los certificados del controlador de Trident
Los contenedores de Trident deben comunicarse con el operador de Trident. Esta comunicación se realiza a través de HTTPS, y los certificados del servidor y del cliente deben administrarse como parte de este proceso.
Validación
Confirma que el DaemonSet y la implementación (cuando corresponda) se ejecuten correctamente.
Sigue las instrucciones que se indican a continuación para rotar manualmente los certificados del servidor y del cliente si encuentras algún error durante la validación.
Instrucciones
Ni el servidor ni los certificados de cliente tienen un certificado correspondiente en el lado de ONTAP. Estos datos se encuentran estrictamente contenidos en los clústeres.
Borra el secreto correspondiente al certificado que vencerá.
kubectl delete secret -n netapp-trident <secret_name>
Reinicia el daemonset netapp-trident-csi:
kubectl rollout restart daemonset netapp-trident-csi -n netapp-trident
Para las rotaciones de certificados de servidor, también deberás reiniciar la implementación de netapp-trident-csi:
kubectl rollout restart deployments netapp-trident-csi -n netapp-trident
Certificado de CA de Trident
El certificado de CA se usa para proporcionar la autoridad certificadora para firmar los certificados del servidor y del cliente de Trident.
Nombre del certificado | Espacio de nombres | Secreto | Descripción |
netapp-trident-csi-cert | netapp-trident | netapp-trident-csi-cert | Certificado de CA de Trident |
Validación
Verás que se regeneró el secreto. Para que los certificados del cliente y del servidor surtan efecto, también puedes seguir las instrucciones anteriores para rotar los certificados del controlador de Trident después de rotar este certificado.
Sigue estas instrucciones para rotar manualmente el certificado de CA si encuentras algún error durante la validación.
Instrucciones
Para rotar esta clave, solo debes borrar el secreto de Kubernetes:
kubectl delete secret -n netapp-trident <secret_name>
Nodos de CSI y SVM de Trident (datos)
Es un conjunto de credenciales CHAP de iSCSI para todo el SVM que permite el acceso al plano de datos para el acceso a bloques. Esto no se aplica a los protocolos de archivos.
Servidor de la API de Management
Espacio de nombres | Secreto | Descripción |
gpc-system | <organization>-<type>-svm-credential | Se necesita la configuración de SVM para la instalación de Trident |
Servidor de la API de administración y administrador de la organización
Espacio de nombres | Secreto | Descripción |
gpc-system | <organization>-<type>-svm-credential | Se necesita la configuración de SVM para la instalación de Trident |
netapp-trident | netapp-trident-backend-tbc-ontap | Secreto necesario para administrar el backend de Trident |
Validación
Verifica que el backend aún esté configurado correctamente:
#export kubeconfig of org cluster export KUBECONFIG= #path to root-admin kubeconfig kubectl get tridentBackendConfigs -n netapp-trident
Verifica que el estado del backend sea
Success
.
Sigue estas instrucciones para rotar los secretos de forma manual si encuentras algún error durante la validación.
Instrucciones
Genera una nueva cadena aleatoria de 16 caracteres sin caracteres especiales para el secreto del iniciador y el secreto del iniciador de destino:
#export kubeconfig of Management API server
export KUBECONFIG= #path to root-admin kubeconfig
initiator_secret=$(head /dev/random | tr -dc A-Za-z0-9 | head -c16 | base64)
target_secret=$(head /dev/random | tr -dc A-Za-z0-9 | head -c16 | base64)
kubectl patch secrets -n gpc-system "$org-$type-svm-credential" --type=merge -p "{\"data\":{\"initiatorSecret\": \"$initiator_secret\", \"targetSecret\": \"$target_secret\"}}"
#export kubeconfig of org cluster
export KUBECONFIG= #path to root-admin kubeconfig
kubectl patch secrets -n netapp-trident netapp-trident-backend-tbc-ontap --type=merge -p "{\"data\":{\"chapInitiatorSecret\": \"$initiator_secret\", \"chapTargetInitiatorSecret\": \"$target_secret\"}}"
Clave AES de Trident
Trident usa internamente la clave AES para encriptar las credenciales de CHAP de iSCSI para su uso interno. Es una secuencia aleatoria de caracteres que debe tener 32 bytes de longitud.
Clústeres que ejecutan Trident (podrían ser clústeres raíz, de administrador de la organización, de usuario o del sistema)
Espacio de nombres | Secreto | Descripción |
netapp-trident | netapp-trident-aes-key | Clave AES que necesita Trident para encriptar las credenciales de CHAP de iSCSI |
Validación
Verifica que el backend aún esté configurado correctamente:
#export kubeconfig of org cluster export KUBECONFIG= #path to root-admin kubeconfig kubectl get tridentBackendConfigs -n netapp-trident
Verifica que el estado del backend sea
Success
.Intenta crear un volumen de prueba:
Crea un archivo YAML con la información del PVC:
echo " kind: PersistentVolumeClaim apiVersion: v1 metadata: name: block-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: standard-rwo" > pvc.yaml
Aplícalo al clúster de Kubernetes:
kubectl apply -f pvc.yaml
Verifica que no haya errores en los registros de CSI debido a la encriptación de iSCSI:
kubectl logs deploy/netapp-trident-csi -n netapp-trident -c trident-main | grep "Error encrypting"
Si no hubo errores, no verás ningún registro.
Limpia el archivo y el PVC:
kubectl delete -f pvc.yaml rm -f pvc.yaml
Sigue estas instrucciones para rotar la clave de forma manual si encuentras algún error durante la validación.
Instrucciones
Antes de rotar esta clave, asegúrate de que no haya pods pendientes con PV en el clúster. Si hay alguna, espera a que se aprovisionen por completo antes de rotar la clave.
Genera una nueva cadena aleatoria de 32 caracteres sin caracteres especiales para aesKey:
#export kubeconfig of org cluster
export KUBECONFIG= #path to root-admin kubeconfig
aes_key=$(head /dev/random | tr -dc A-Za-z0-9 | head -c32 | base64)
#save old key just in case of errors
old_key=$(kubectl get secrets -n netapp-trident "netapp-trident-aes-key" -o jsonpath='{.data.aesKey}')
kubectl patch secrets -n netapp-trident "netapp-trident-aes-key" --type=merge -p "{\"data\":{\"aesKey\": \"$aes_key\"}}"
kubectl rollout restart deployment netapp-trident-csi -n netapp-trident
Revertir
Si hay errores, revierte a las credenciales que se usaron por última vez:
kubectl patch secrets -n netapp-trident "netapp-trident-aes-key" --type=merge -p "{\"data\":{\"aesKey\": \"$old_key\"}}" kubectl rollout restart deployment netapp-trident-csi -n netapp-trident
Vuelve a realizar los pasos de verificación.