(間接接続された) Azure Arc 対応 SQL Managed Instance で証明書をローテーションする
この記事では、Azure CLI または kubectl
コマンドを使用して、間接接続モードの Azure Arc 対応 SQL Managed Instance でユーザーが指定したトランスポート層セキュリティ (TLS) 証明書をローテーションする方法について説明します。
この記事の例では、OpenSSL を使用しています。 OpenSSL は、汎用的な暗号化とセキュリティで保護された通信を行うオープンソースのコマンド ライン ツールキットです。
前提条件
- openssl ユーティリティをインストールする
- 間接接続モードの Azure Arc 対応 SQL Managed Instance
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 仕様を作成する
任意の 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
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>