Azure Kubernetes Service의 Istio 기반 서비스 메시 추가 기능을 위한 CA 인증서 플러그 인
Azure Kubernetes Service용 Istio 기반 서비스 메시 추가 기능에서 기본적으로 Istio CA(인증 기관)는 자체 서명된 루트 인증서와 키를 생성하고 이를 사용하여 워크로드 인증서에 서명합니다. 루트 CA 키를 보호하려면 오프라인으로 보안 컴퓨터에서 실행되는 루트 CA를 사용해야 합니다. 루트 CA를 사용하여 각 클러스터에서 실행되는 Istio CA에 중간 인증서를 발급할 수 있습니다. Istio CA는 관리자가 지정한 인증서와 키를 사용하여 워크로드 인증서에 서명하고 관리자가 지정한 루트 인증서를 신뢰할 수 있는 루트로 워크로드에 배포할 수 있습니다. 이 문서에서는 Azure Kubernetes Service용 Istio 기반 서비스 메시 추가 기능에서 Istio CA에 대한 자체 인증서와 키를 가져오는 방법을 설명합니다.
이 문서에서는 Azure Key Vault를 사용하여 Istio 기반 서비스 메시 추가 기능에 대한 입력으로 제공되는 루트 인증서, 서명 인증서 및 키를 사용하여 Istio 인증 기관을 구성하는 방법을 설명합니다.
시작하기 전에
Azure CLI 버전 확인
추가 기능을 사용하려면 Azure CLI 버전 2.57.0 이상이 설치되어 있어야 합니다. az --version
을 실행하여 버전을 확인할 수 있습니다. 설치 또는 업그레이드하려면 [Azure CLI 설치][azure-cli-install]을 참조하세요.
Azure Key Vault 설정
Istio 추가 기능에 인증서와 키 입력을 제공하려면 Azure Key Vault 리소스가 필요합니다.
루트 인증서, 중간 인증서, 중간 키 및 인증서 체인을 오프라인으로 생성해야 합니다. 여기의 1~3단계에는 이러한 파일을 생성하는 방법에 대한 예가 있습니다.
인증서와 키를 사용하여 Azure Key Vault에서 비밀을 만듭니다.
az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem> az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path-to-folder/cert-chain.pem>
클러스터의 비밀 자격 증명 모음 CSI 드라이버용 Azure Key Vault 공급자를 사용하도록 설정합니다.
az aks enable-addons --addons azure-keyvault-secrets-provider --resource-group $RESOURCE_GROUP --name $CLUSTER
참고 항목
인증서를 회전할 때 비밀이 클러스터에 동기화되는 속도를 제어하려면 Azure Key Vault 비밀 공급자 추가 기능의
--rotation-poll-interval
매개 변수를 사용할 수 있습니다. 예:az aks addon update --resource-group $RESOURCE_GROUP --name $CLUSTER --addon azure-keyvault-secrets-provider --enable-secret-rotation --rotation-poll-interval 20s
Azure Key Vault 리소스에 액세스할 수 있도록 추가 기능의 사용자 할당 관리 ID에 권한을 부여합니다.
OBJECT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId' -o tsv) az keyvault set-policy --name $AKV_NAME --object-id $OBJECT_ID --secret-permissions get
참고 항목
Vault 액세스 정책 대신 권한 모델에 대한 Azure RBAC 권한 부여를 사용하여 Key Vault를 만든 경우 여기 지침에 따라 관리 ID에 대한 권한을 만듭니다. 추가 기능의 사용자 할당 관리 ID의
Key Vault Secrets User
에 대한 Azure 역할 할당을 추가합니다.
플러그 인 CA 인증서로 Istio 기반 서비스 메시 추가 기능 설정
이전에 만들어진 Azure Key Vault 비밀을 참조하면서 기존 AKS 클러스터에 대해 Istio 서비스 메시 추가 기능을 사용하도록 설정합니다.
az aks mesh enable --resource-group $RESOURCE_GROUP --name $CLUSTER \ --root-cert-object-name root-cert \ --ca-cert-object-name ca-cert \ --ca-key-object-name ca-key \ --cert-chain-object-name cert-chain \ --key-vault-id /subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.KeyVault/vaults/$AKV_NAME
참고 항목
Istio CA에서 생성된 자체 서명 루트 인증서를 사용하는 Istio 추가 기능이 있는 기존 클러스터의 경우 플러그 인 CA로 전환하는 것이 지원되지 않습니다. 플러그 인 CA 입력을 통과하려면 먼저 이러한 클러스터에서 메시를 사용하지 않도록 설정한 다음 위 명령을 사용하여 다시 사용하도록 설정해야 합니다.
클러스터에
cacerts
가 만들어졌는지 확인합니다.kubectl get secret -n aks-istio-system
예상 출력:
NAME TYPE DATA AGE cacerts opaque 4 13h sh.helm.release.v1.azure-service-mesh-istio-discovery.v380 helm.sh/release.v1 1 2m15s sh.helm.release.v1.azure-service-mesh-istio-discovery.v381 helm.sh/release.v1 1 8s
Istio 컨트롤 플레인이 사용자 지정 인증 기관을 선택했는지 확인합니다.
kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController | grep x509
예상 출력은 다음과 유사해야 합니다.
2023-11-06T15:49:15.493732Z info x509 cert - Issuer: "CN=Intermediate CA - A1,O=Istio,L=cluster-A1", Subject: "", SN: e191d220af347c7e164ec418d75ed19e, NotBefore: "2023-11-06T15:47:15Z", NotAfter: "2033-11-03T15:49:15Z" 2023-11-06T15:49:15.493764Z info x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Intermediate CA - A1,O=Istio,L=cluster-A1", SN: 885034cba2894f61036f2956fd9d0ed337dc636, NotBefore: "2023-11-04T01:40:02Z", NotAfter: "2033-11-01T01:40:02Z" 2023-11-06T15:49:15.493795Z info x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Root A,O=Istio", SN: 18e2ee4089c5a7363ec306627d21d9bb212bed3e, NotBefore: "2023-11-04T01:38:27Z", NotAfter: "2033-11-01T01:38:27Z"
인증 기관 회전
보안이나 정책상의 이유로 인증 기관을 주기적으로 회전해야 할 수도 있습니다. 이 섹션에서는 중간 CA 및 루트 CA 회전 시나리오를 처리하는 방법을 안내합니다.
중간 인증 기관 회전
루트 CA를 동일하게 유지하면서 중간 CA를 회전할 수 있습니다. 새 인증서 및 키 파일을 사용하여 Azure Key Vault 리소스의 비밀을 업데이트합니다.
az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem> az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
--rotation-poll-interval
의 기간 동안 기다리세요. Azure Key Vault 리소스에서 업데이트된 새 중간 CA를 기반으로 클러스터에서cacerts
비밀이 새로 고쳐졌는지 확인합니다.kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController
예상 출력은 다음과 유사해야 합니다.
2023-11-07T06:16:21.091844Z info Update Istiod cacerts 2023-11-07T06:16:21.091901Z info Using istiod file format for signing ca files 2023-11-07T06:16:21.354423Z info Istiod has detected the newly added intermediate CA and updated its key and certs accordingly 2023-11-07T06:16:21.354910Z info x509 cert - Issuer: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", Subject: "", SN: b2753c6a23b54d8364e780bf664672ce, NotBefore: "2023-11-07T06:14:21Z", NotAfter: "2033-11-04T06:16:21Z" 2023-11-07T06:16:21.354967Z info x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Intermediate CA - A2,O=Istio,L=cluster-A2", SN: 17f36ace6496ac2df88e15878610a0725bcf8ae9, NotBefore: "2023-11-04T01:40:22Z", NotAfter: "2033-11-01T01:40:22Z" 2023-11-07T06:16:21.355007Z info x509 cert - Issuer: "CN=Root A,O=Istio", Subject: "CN=Root A,O=Istio", SN: 18e2ee4089c5a7363ec306627d21d9bb212bed3e, NotBefore: "2023-11-04T01:38:27Z", NotAfter: "2033-11-01T01:38:27Z" 2023-11-07T06:16:21.355012Z info Istiod certificates are reloaded
워크로드는 기본적으로 24시간 동안 유효한 Istio 컨트롤 플레인으로부터 인증서를 받습니다. Pod를 다시 시작하지 않으면 모든 워크로드가 24시간 내에 새 중간 CA를 기반으로 새 리프 인증서를 가져옵니다. 이러한 모든 워크로드가 새 중간 CA에서 즉시 새 리프 인증서를 가져오도록 하려면 워크로드를 다시 시작해야 합니다.
kubectl rollout restart deployment <deployment name> -n <deployment namespace>
루트 인증 기관 회전
이전 루트 인증서와 새 루트 인증서가 연결된 루트 인증서 파일을 사용하여 Azure Key Vault 비밀을 업데이트해야 합니다.
az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem> az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
root-cert.pem
의 콘텐츠는 다음 형식을 따릅니다.-----BEGIN CERTIFICATE----- <contents of old root certificate> -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- <contents of new root certificate> -----END CERTIFICATE-----
인증서가 클러스터에 동기화되면 로그를 확인
istiod
합니다.kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system
예상 출력:
2023-11-07T06:42:00.287916Z info Updating new ROOT-CA 2023-11-07T06:42:00.287928Z info update root cert and generate new dns certs 2023-11-07T06:42:00.288254Z info Update trust anchor with new root cert 2023-11-07T06:42:00.288279Z info trustBundle updating Source IstioCA with certs 2023-11-07T06:42:00.288298Z info Istiod has detected the newly added intermediate CA and updated its key and certs accordingly 2023-11-07T06:42:00.288303Z info Istiod certificates are reloaded
24시간(리프 인증서 유효성의 기본 시간) 동안 기다리거나 모든 워크로드를 강제로 다시 시작해야 합니다. 이렇게 하면 모든 워크로드가 mTLS 확인을 위해 이전 인증 기관과 새 인증 기관을 모두 인식합니다.
kubectl rollout restart deployment <deployment name> -n <deployment namespace>
이제 새 CA로만(이전 CA 없이) Azure Key Vault 비밀을 업데이트할 수 있습니다.
az keyvault secret set --vault-name $AKV_NAME --name root-cert --file <path-to-folder/root-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-cert --file <path-to-folder/ca-cert.pem> az keyvault secret set --vault-name $AKV_NAME --name ca-key --file <path-to-folder/ca-key.pem> az keyvault secret set --vault-name $AKV_NAME --name cert-chain --file <path/cert-chain.pem>
인증서가 클러스터에 동기화되면 로그를 확인
istiod
합니다.kubectl logs deploy/istiod-asm-1-17 -c discovery -n aks-istio-system | grep -v validationController
예상 출력:
2023-11-07T08:01:17.780299Z info x509 cert - Issuer: "CN=Intermediate CA - B1,O=Istio,L=cluster-B1", Subject: "", SN: 1159747c72cc7ac7a54880cd49b8df0a, NotBefore: "2023-11-07T07:59:17Z", NotAfter: "2033-11-04T08:01:17Z" 2023-11-07T08:01:17.780330Z info x509 cert - Issuer: "CN=Root B,O=Istio", Subject: "CN=Intermediate CA - B1,O=Istio,L=cluster-B1", SN: 2aba0c438652a1f9beae4249457023013948c7e2, NotBefore: "2023-11-04T01:42:12Z", NotAfter: "2033-11-01T01:42:12Z" 2023-11-07T08:01:17.780345Z info x509 cert - Issuer: "CN=Root B,O=Istio", Subject: "CN=Root B,O=Istio", SN: 3f9da6ddc4cb03749c3f43243a4b701ce5eb4e96, NotBefore: "2023-11-04T01:41:54Z", NotAfter: "2033-11-01T01:41:54Z"
이 문서에 표시된 출력 예에서 루트 A(추가 기능을 사용하도록 설정할 때 사용됨)에서 루트 B로 이동했음을 확인할 수 있습니다.
24시간 동안 다시 기다리거나 모든 워크로드를 강제로 다시 시작할 수 있습니다. 강제로 다시 시작하면 워크로드가 새 루트 CA에서 즉시 새 리프 인증서를 가져옵니다.
kubectl rollout restart deployment <deployment name> -n <deployment namespace>
Azure Kubernetes Service