Compartir a través de


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

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

  1. 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 
    
  2. 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>