인증서 Azure Arc 지원 SQL Managed Instance 회전(간접 연결)

이 문서에서는 Azure CLI 또는 kubectl 명령을 사용하여 간접 연결 모드에서 Azure Arc 지원 SQL Managed Instances에 대해 사용자가 제공한 TLS(전송 계층 보안) 인증서를 회전하는 방법을 설명합니다.

이 문서의 예제에서는 OpenSSL을 사용합니다. OpenSSL은 범용 암호화 및 보안 통신을 위한 오픈 소스 명령줄 도구 키트입니다.

전제 조건

openssl을 사용하여 인증서 요청 생성

관리되는 인스턴스에서 자체 서명된 인증서를 사용하는 경우 필요한 모든 SAN(주체 대체 이름)을 추가합니다. SAN은 subjectAltName 필드를 사용해 다양한 값을 보안 인증서와 연결할 수 있는 X.509의 확장으로, SAN 필드를 사용하면 다중 도메인 SAN 또는 확장된 유효성 검사 다중 도메인 SSL 인증서와 같은 단일 SSL 인증서로 보호할 추가 호스트 이름(사이트, IP 주소, 일반 이름 등)을 지정할 수 있습니다.

인증서를 직접 생성하려면 CSR(인증서 서명 요청)를 만들어야 합니다. 인증서 구성에 필수 SAN이 포함된 일반 이름이 있고 CA 발급자가 있는지 확인합니다. 예시:

openssl req -newkey rsa:2048 -keyout your-private-key.key -out your-csr.csr

다음 명령을 실행하여 필수 SAN을 확인합니다.

openssl x509 -in /<cert path>/<filename>.pem -text

다음 예제에서는 이 명령을 보여 줍니다.

openssl x509 -in ./mssql-certificate.pem -text

이 명령은 다음 출력을 반환합니다.

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-----

예제 출력:

X509v3 Subject Alternative Name:
DNS:mi1-svc, DNS:mi1-svc.test.svc.cluster.local, DNS:mi1-svc.test.svc

서비스 인증서에 대한 Kubernetes 비밀 yaml 사양 만들기

  1. Linux 배포에서 base64와 함께 다음 명령을 사용하여 파일을 인코딩하면 데이터가 인코딩, 디코딩되어 데이터 전송 및 저장 프로세스가 더 간편해집니다.

    base64 /<path>/<file> > cert.txt 
    

    Windows 사용자의 경우 certutil 유틸리티를 사용하여 다음 명령으로 Base64 인코딩과 디코딩을 수행합니다.

    $certutil -encode -f input.txt b64-encoded.txt
    

    출력 파일에서 헤더를 수동으로 제거하거나, 다음 명령을 사용합니다.

    $findstr /v CERTIFICATE b64-encoded.txt> updated-b64.txt 
    
  2. yaml 사양 파일에 base64로 인코딩된 인증서와 프라이빗 키를 추가하여 Kubernetes 비밀을 만듭니다.

    apiVersion: v1
    kind: Secret
    metadata:
      name: <secretName>
    type: Opaque
    data:
      certificate.pem: < base64 encoded certificate >
      privatekey.pem: < base64 encoded private key >
    

Azure CLI를 통해 인증서 회전

인증서를 회전하기 위해 이전에 만든 Kubernetes 비밀을 입력하여 다음 명령을 사용합니다.

az sql mi-arc update -n <managed instance name> --k8s-namespace <arc> --use-k8s --service-cert-secret <your-cert-secret>

예시:

az sql mi-arc update -n mysqlmi --k8s-namespace <arc> --use-k8s --service-cert-secret mymi-cert-secret

다음 명령을 사용하여 PEM 형식 인증서 퍼블릭/프라이빗 키로 인증서를 회전합니다. 이 명령은 기본 서비스 인증서 이름을 생성합니다.

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>

예시:

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 매개 변수에 Kubernetes 서비스 인증서 비밀 이름을 입력할 수도 있습니다. 이 경우 업데이트된 비밀 이름으로 표시됩니다. 이 명령은 비밀이 있는지 확인합니다. 비밀이 없으면 명령이 비밀 이름을 만든 다음 관리되는 인스턴스에서 비밀을 회전합니다.

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>

예시:

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

kubectl 명령을 사용하여 인증서 회전

Kubernetes 비밀을 만든 후에는 다음과 같이 serviceCertificateSecret이 있는 SQL Managed Instance yaml 정의 security 섹션에 바인딩할 수 있습니다.

  security:
    adminLoginSecret: <your-admin-login-secret>
    serviceCertificateSecret: <your-cert-secret>

다음 .yaml 파일은 mysqlmi라는 SQL 인스턴스에서 서비스 인증서를 회전하고, my-service-cert라는 Kubernetes 비밀로 사양을 업데이트하는 예제입니다.

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

다음 kubectl 명령을 사용하여 이 설정을 적용할 수 있습니다.

   kubectl apply -f <my-sql-mi-yaml-file>