次の方法で共有


(間接接続された) Azure Arc 対応 SQL Managed Instance で証明書をローテーションする

この記事では、Azure CLI または kubectl コマンドを使用して、間接接続モードの Azure Arc 対応 SQL Managed Instance でユーザーが指定したトランスポート層セキュリティ (TLS) 証明書をローテーションする方法について説明します。

この記事の例では、OpenSSL を使用しています。 OpenSSL は、汎用的な暗号化とセキュリティで保護された通信を行うオープンソースのコマンド ライン ツールキットです。

前提条件

openssl を使用して証明書要求を生成する

マネージド インスタンスで自己署名証明書を使用する場合は、必要なすべてのサブジェクト代替名 (SAN) を追加します。 SAN は X.509 の拡張機能であり、subjectAltName フィールドを使用してさまざまな値をセキュリティ証明書に関連付けます。この 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. Base64 でエンコードされた証明書と秘密キーを yaml 仕様ファイルに追加して、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 シークレットを作成すると、SQL Managed Instance の yaml 定義 security セクション (以下のとおり serviceCertificateSecret がある) にバインドできます。

  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>