Rotación de SQL Managed Instance habilitado por Azure Arc (conectado indirectamente)
En este artículo se describe cómo rotar certificados de Seguridad de la capa de transporte (TLS) proporcionados por el usuario para SQL Managed Instance habilitado para Azure Arc en modo de conexión indirecta mediante la CLI de Azure o comandos kubectl
.
En los ejemplos de este artículo se usa OpenSSL. OpenSSL es un kit de herramientas de línea de comandos de código abierto para criptografía de uso general y comunicación segura.
Requisito previo
- Instalación de la utilidad openssl
- una instancia de SQL Managed Instance habilitado para Azure Arc en modo de conexión indirecta
Generación de una solicitud de certificado mediante openssl
Si la instancia administrada usa un certificado autofirmado, agregue todos los nombres alternativos de firmante (SAN) necesarios. SAN es una extensión de X.509 que permite asociar varios valores a un certificado de seguridad mediante un campo subjectAltName
. El campo SAN permite especificar nombres de host adicionales (sitios, direcciones IP, nombres comunes, etc.) que se protegerán mediante un único certificado SSL, como un SAN de varios dominios o un certificado SSL de varios dominios de validación extendida.
Para generar el certificado por su cuenta, debe crear una solicitud de firma de certificado (CSR). Compruebe que la configuración del certificado tiene un nombre común con los SAN necesarios y tiene un emisor de entidad de certificación. Por ejemplo:
openssl req -newkey rsa:2048 -keyout your-private-key.key -out your-csr.csr
Ejecute el siguiente comando para comprobar los SAN necesarios:
openssl x509 -in /<cert path>/<filename>.pem -text
El ejemplo siguiente demuestra este comando:
openssl x509 -in ./mssql-certificate.pem -text
El comando devuelve la siguiente salida:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 7686530591430793847 (0x6aac0ad91167da77)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = Cluster Certificate Authority
Validity
Not Before: Mmm dd hh:mm:ss yyyy GMT
Not After: Mmm dd hh:mm:ss yyyy GMT
Subject: CN = mi4-svc
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:ad:7e:16:3e:7d:b3:1e: ...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Extended Key Usage: critical
TLS Web Client Authentication, TLS Web Server Authentication
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Subject Alternative Name:
DNS:mi4-svc, DNS:mi4-svc.test.svc.cluster.local, DNS:mi4-svc.test.svc
Signature Algorithm: sha256WithRSAEncryption
7a:f8:a1:25:5c:1d:e2:b4: ...
-----BEGIN CERTIFICATE-----
MIIDNjCCAh6gAwIB ...==
-----END CERTIFICATE-----
Ejemplo:
X509v3 Subject Alternative Name:
DNS:mi1-svc, DNS:mi1-svc.test.svc.cluster.local, DNS:mi1-svc.test.svc
Creación de la especificación de YAML secreto de Kubernetes para el certificado de servicio
Codifique un archivo mediante el siguiente comando con Base64 en cualquier distribución de Linux; los datos se codifican y descodifican para facilitar la transmisión y el almacenamiento de datos.
base64 /<path>/<file> > cert.txt
Para usuarios de Windows, emplee la utilidad certutil para realizar la codificación y la descodificación en Base64 como el comando siguiente:
$certutil -encode -f input.txt b64-encoded.txt
Quite el encabezado del archivo de salida manualmente o mediante el siguiente comando:
$findstr /v CERTIFICATE b64-encoded.txt> updated-b64.txt
Agregue el certificado codificado en Base64 y la clave privada al archivo de especificación YAML para crear un secreto de Kubernetes:
apiVersion: v1 kind: Secret metadata: name: <secretName> type: Opaque data: certificate.pem: < base64 encoded certificate > privatekey.pem: < base64 encoded private key >
Rotación de certificados mediante la CLI de Azure
Use el comando siguiente y proporcione el secreto de Kubernetes que creó anteriormente para rotar el certificado:
az sql mi-arc update -n <managed instance name> --k8s-namespace <arc> --use-k8s --service-cert-secret <your-cert-secret>
Por ejemplo:
az sql mi-arc update -n mysqlmi --k8s-namespace <arc> --use-k8s --service-cert-secret mymi-cert-secret
Use el comando siguiente para rotar el certificado con las claves públicas y privadas de certificado con formato PEM. El comando genera un nombre de certificado de servicio predeterminado.
az sql mi-arc update -n <managed instance name> --k8s-namespace arc --use-k8s --cert-public-key-file <path-to-my-cert-public-key> --cert-private-key-file <path-to-my-cert-private-key> --k8s-namespace <your-k8s-namespace>
Por ejemplo:
az sql mi-arc update -n mysqlmi --k8s-namespace arc --use-k8s --cert-public-key-file ./mi1-1-cert --cert-private-key-file ./mi1-1-pvt
También puede proporcionar un nombre de secreto de certificado de servicio de Kubernetes para el parámetro --service-cert-secret
. En este caso, se toma como un nombre de secreto actualizado. El comando comprueba si el secreto existe. Si no es así, el comando crea un nombre de secreto y, luego, rota el secreto en la instancia administrada.
az sql mi-arc update -n <managed instance name> --k8s-namespace <arc> --use-k8s --cert-public-key-file <path-to-my-cert-public-key> --cert-private-key-file <path-to-my-cert-private-key> --service-cert-secret <path-to-mymi-cert-secret>
Por ejemplo:
az sql mi-arc update -n mysqlmi --k8s-namespace arc --use-k8s --cert-public-key-file ./mi1-1-cert --cert-private-key-file ./mi1-1-pvt --service-cert-secret mi1-12-1-cert-secret
Rotación del certificado con el comando kubectl
Una vez creado el secreto de Kubernetes, puede enlazarlo a la sección security
de la definición de YAML de SQL Managed Instance, donde serviceCertificateSecret
está ubicado de la siguiente manera:
security:
adminLoginSecret: <your-admin-login-secret>
serviceCertificateSecret: <your-cert-secret>
El archivo siguiente .yaml
es un ejemplo para rotar el certificado de servicio de la instancia de SQL llamada mysqlmi
y actualizar la especificación con un secreto de Kubernetes llamado my-service-cert
:
apiVersion: sql.arcdata.microsoft.com/v1
kind: sqlmanagedinstance
metadata:
name: mysqlmi
namespace: my-arc-namespace
spec:
spec:
dev: false
licenseType: LicenseIncluded
replicas: 1
security:
adminLoginSecret: mysqlmi-admin-login-secret
# Update the serviceCertificateSecret with name of the K8s secret
serviceCertificateSecret: my-service-cert
services:
primary:
type: NodePort
storage:
data:
volumes:
- size: 5Gi
logs:
volumes:
- size: 5Gi
tier: GeneralPurpose
Puede usar el siguiente comando kubectl para aplicar esta configuración:
kubectl apply -f <my-sql-mi-yaml-file>